Instalação no projeto

Há dois caminhos: meta-pacote (tudo) ou pacotes individuais (recomendado em produção enxuta).

1) Meta-pacote

npm install @crystal-node/runtime

Isso puxa automaticamente core, controller, todos os engines e routes.

Ainda assim, instale os peers do engine que for usar:

# Puppeteer
npm install puppeteer vash
# + pdf-lib se usar suppress/merge por página

# wkhtmltopdf
npm install vash
# + binário wkhtmltopdf no PATH

# WeasyPrint
npm install vash pdf-lib
# + WeasyPrint no SO

# Rotas Express
npm install express

# Devbox (res.pdf) — em geral só o runtime

2) Instalação individual (recomendada)

Instale só o que o relatório precisa. Dependências @crystal-node/* internas vêm sozinhas.

Puppeteer

npm install @crystal-node/engine-puppeteer @crystal-node/controller puppeteer vash
# opcional:
npm install pdf-lib
const { reportControllerDotnetrequest } = require('@crystal-node/controller');
const { crystalFunctionsRuntime } = require('@crystal-node/core'); // já vem com o engine
const reportEngine = require('@crystal-node/engine-puppeteer');

const model = reportControllerDotnetrequest.buildReportModel(
  req, __dirname, crystalFunctionsRuntime
);
await reportEngine.renderReportPdf(model, res, {
  reportDir: __dirname,
  pdf: { marginTop: 28, marginBottom: 14 }
});

Devbox

npm install @crystal-node/engine-devbox

Puxa core, controller e engine-wkhtmltopdf (fallback de suppress).

wkhtmltopdf

npm install @crystal-node/engine-wkhtmltopdf @crystal-node/controller vash

WeasyPrint

npm install @crystal-node/engine-weasyprint @crystal-node/controller vash pdf-lib

Só rotas

npm install @crystal-node/routes express

O que NÃO precisa instalar à mão

Você instalaJá vem junto
@crystal-node/engine-puppeteer @crystal-node/core
@crystal-node/engine-devbox core, controller, engine-wkhtmltopdf
@crystal-node/runtime todos os pacotes @crystal-node/* desta família

Se fizer require de um engine sem o peer (ex.: Puppeteer sem puppeteer), a falha só ocorre na hora de gerar o PDF — com mensagem pedindo o pacote.