npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

renderer-service

v1.3.0

Published

File generator worker and shared package.

Readme

Сервис рендеринга (генерации файлов)

Назначение - генерация файлов в формате pdf, xlsx и csv. Возможно добавление других форматов. На вход сервис получает:

  1. Шаблон в формате handlebars + хелперы на js.
  2. json-данные
  3. Опции (не обязательно) В результате своей работы сервис формирует файл с уникальным именем (нечитаемый хэш) и кладёт его в указанную в настройках папку.

Состав репозитория

В монорепозитории присутствуют две логические единицы: собственно приложение и npm-пакет к нему.


Зависимости

Для корректной работы приложения требуется:

  • REDIS. Доступ к приложению осуществляется redis при помощи пакета @skeleton/e-tasks <добавить ссылку на документацию>
  • Системные библиотеки:
    • CentOS: libXrender, fontconfig, libXext
    • Ubuntu: libxrender1, fontconfig, libxext-dev Иногда (редко - был один случай на CentOS) библиотек в системе не оказывается, а без них wkhtmltopdf не может работать.

Приложение

render-worker

Модуль основанный на @skeleton-nest/e-tasks. Вся работоспособность сводится к следующему:

  1. Воркер выбирает новую задачу из очереди.
  2. На основе шаблона handlebars (лежат в /src/reports, сбилженные в /dist/reports/reports.json) и данных, переданных в задаче, генерирует файл.
  3. Сохраняет файл на диск, результат выполнения задачи - имя файла.

Настройка и запуск.

Requirements: см. выше.

  1. Клонируем репозиторий.
  2. Устанавливаем зависимости:
npm install
npm run bootstrap # Как для любого монорепозитория.

Иногда модуль wkhtmltopdf долго загружается, нужно подождать.

  1. Создаём конфиги при помощи @skeleton/cli:
npm run gen-config
# ВРЕМЕННО! До версии 1.7.0 @skeleton/cli Конфиги генерируются в корне репозитория.
# Их необходимо переместить в units/application.
mv .env units/renderer-worker

Глобальная установка cli больше не требуется.

  1. Собираем приложение npm run build.

  2. Запуск приложения

npm run start

Поддерживаемые стили при экспорте в XLSX

Строки таблицы <tr>

| Поле | Допустимые значения | Примечание | | ---------------- | :-----------------: | :-------------------------:| | height, min-height, max-height | от 1px до 100500px | При выводе на excel указанное число делится на 10. Размер может быть только один в перечисленном приоритете | | text-align | 'center', 'left', 'right', 'justify' | Настраивается только горизонтальное расположение, вертикальное всегда middle | | word-wrap | break-word | Разрешает перенос строк | | border-style| solid | Ставит в xlsx обводку всех ячеек в строке черной тонкой | | border-inheritance-type | solid | Кастомный тег, ставить, если нужно чтобы была вся строка была в обрамлении, даже с пустыми ячейками |

Столбцы таблицы <th>

| Поле | Допустимые значения | Примечание | | ----------------- | :-----------------: | :-------------------------:| | width, min-width, max-width | от 1px до 100500px | При выводе на excel указанное число делится на 10. Размер может быть только один в перечисленном приоритете | | text-align | center, left, right, justify | Настраивается только горизонтальное расположение, вертикальное всегда middle | | word-wrap | break-word | Разрешает перенос строк | | border-style| solid | Ставит в xlsx обводку всех ячеек в строке черной тонкой | | font-weight | любое | Делает текст жирным | | font-size | от 1 до N | Устанавливает размер шрифта | | colspan | от 1 до N | Мержит указанное количество ячеек начиная с текущей. Парсер пока не умеет корректно работать с смерженными ячейками. Пустые ячейки нужно указывать явно в шаблоне, иначе произойдет перезаписывание. |

Ячейки таблицы <td>

| Поле | Допустимые значения | Примечание | | ---------------- | :-----------------: | :-------------------------:| | text-align | center, left, right, justify | Настраивается только горизонтальное расположение, вертикальное всегда middle | | word-wrap | break-word | Разрешает перенос строк | | border-style| solid | Ставит в xlsx обводку всех ячеек в строке черной тонкой | | font-weight | любое | Делает текст жирным | | font-size | от 1 до N | Устанавливает размер шрифта | | colspan | от 1 до N | Мержит указанное количество ячеек начиная с текущей. Парсер пока не умеет корректно работать с смерженными ячейками. Пустые ячейки нужно указывать явно в шаблоне, иначе произойдет перезаписывание. |


Создание своего рецепта в jsreport

jsreport используется в проекте для генерации отчета из шаблонов (pug, handlebars) в html и для последующей генерации отчета из html в другие форматы (xlsx, pdf, etc). По ряду причин существующий рецепт для генерации из html в xlsx не подходит. Решено было написать свой. Находится в src/renderer-worker/recipe-html-to-xlsx.

Написание своего рецепта описано в документации тут. Для этого надо:

  • Создать папку с рецептом.

Название папки не играет роли, jsreport сам сканирует папку проекта и находит все кастомные рецепты.

  • Создать конфиг рецепта.

Должен находиться в корне папки в файле с названием jsreport.config.ts. Содержание файла должно быть следующим (пример на typescript):

export = {
  name: '<recipe-name>',
  dependencies: 'templates',
  main: './main.js'
}

Здесь name - имя рецепта, передается также в функцию render, по нему jsreport понимает, какой именно рецепт использовать. main - путь к скрипту с рецептом. Важно, чтобы путь был указан к транспилированному js файлу, т.к. jsreport добавляет рецепты в рантайме.

  • Создать файл с рецептом.

Содержание файла должно быть следующим (пример на typescript):

export = (reporter: any, definition: any) => {
  reporter.extensionsManager.recipes.push({
    name: `<recipe-name>`,
    execute: async (request: any, response: any) => {
      // Действия по преобразованию response.content
      const result = await convert(response.content)

      response.content = result
    }
  })
}

Тут происходит добавление рецепта к существующим рецептам. name должен соответствовать названию рецепту из конфига. Функция execute должна выполнять сам код рецепта. Поле response.content содержит html в виде строки. Необходимо её преобразовать в нужный формат и перезаписать поле.

В остальном инициализация jsreportcore происходит как обычно, он сам сканирует папки проекта и ищет рецепты.


Опции генерации

При создании задачи на рендер НЕ через сервис, в объект задачи можно положить новое поле options для генерации. Например:

"options": {
 "pdfOptions": {
   "orientation": "landscape"
 }
}

orientation может быть landscape и portrait


быстрый запуск

npm install npm run bootstrap npm run gen-config mv .env units/renderer-worker npm run build npm run start