@pyreon/document 0.13.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/lib/analysis/index.js.html +1 -1
  2. package/lib/{chunk-ErZ26oRB.js → chunk-B4VCYm32.js} +1 -1
  3. package/lib/{dist-CYL41kqQ.js → dist-dSdlKzJ8.js} +10 -4
  4. package/lib/{dist-CYL41kqQ.js.map → dist-dSdlKzJ8.js.map} +1 -1
  5. package/lib/{docx-CcB3jYd3.js → docx-D_wt3a7y.js} +2 -2
  6. package/lib/{docx-CcB3jYd3.js.map → docx-D_wt3a7y.js.map} +1 -1
  7. package/lib/{exceljs-BYETsesT.js → exceljs-Bj6LWg5N.js} +56 -42
  8. package/lib/exceljs-Bj6LWg5N.js.map +1 -0
  9. package/lib/index.js +10 -10
  10. package/lib/{pdf-IuBgTb3T.js → pdf-NApJCU6I.js} +4 -4
  11. package/lib/{pdf-IuBgTb3T.js.map → pdf-NApJCU6I.js.map} +1 -1
  12. package/lib/{pdfmake-CKMX5URW.js → pdfmake-DPyTSQ91.js} +14 -6
  13. package/lib/{pdfmake-CKMX5URW.js.map → pdfmake-DPyTSQ91.js.map} +1 -1
  14. package/lib/{pptx-DXiMiYFM.js → pptx-DLhvPIMn.js} +2 -2
  15. package/lib/{pptx-DXiMiYFM.js.map → pptx-DLhvPIMn.js.map} +1 -1
  16. package/lib/{pptxgen.es-FsqHs8mD.js → pptxgen.es-CFrPYgTY.js} +28 -23
  17. package/lib/{pptxgen.es-FsqHs8mD.js.map → pptxgen.es-CFrPYgTY.js.map} +1 -1
  18. package/lib/{svg-BKxumy-p.js → svg-uFnPWNCU.js} +2 -3
  19. package/lib/{svg-BKxumy-p.js.map → svg-uFnPWNCU.js.map} +1 -1
  20. package/lib/{vfs_fonts-Cap07Jg3.js → vfs_fonts-BSrGAfkk.js} +2 -2
  21. package/lib/{vfs_fonts-Cap07Jg3.js.map → vfs_fonts-BSrGAfkk.js.map} +1 -1
  22. package/lib/{xlsx-Cvu4LBNy.js → xlsx-D8XqTBoR.js} +2 -2
  23. package/lib/{xlsx-Cvu4LBNy.js.map → xlsx-D8XqTBoR.js.map} +1 -1
  24. package/package.json +5 -5
  25. package/lib/exceljs-BYETsesT.js.map +0 -1
package/lib/index.js CHANGED
@@ -29,12 +29,12 @@ registerRenderer("email", () => import("./email-D0bbfWq4.js").then((m) => m.emai
29
29
  registerRenderer("md", () => import("./markdown-BYkSLplL.js").then((m) => m.markdownRenderer));
30
30
  registerRenderer("text", () => import("./text-l1XNXBOC.js").then((m) => m.textRenderer));
31
31
  registerRenderer("csv", () => import("./csv-COrS4qdy.js").then((m) => m.csvRenderer));
32
- registerRenderer("pdf", () => import("./pdf-IuBgTb3T.js").then((m) => m.pdfRenderer));
33
- registerRenderer("docx", () => import("./docx-CcB3jYd3.js").then((m) => m.docxRenderer));
34
- registerRenderer("xlsx", () => import("./xlsx-Cvu4LBNy.js").then((m) => m.xlsxRenderer));
35
- registerRenderer("pptx", () => import("./pptx-DXiMiYFM.js").then((m) => m.pptxRenderer));
32
+ registerRenderer("pdf", () => import("./pdf-NApJCU6I.js").then((m) => m.pdfRenderer));
33
+ registerRenderer("docx", () => import("./docx-D_wt3a7y.js").then((m) => m.docxRenderer));
34
+ registerRenderer("xlsx", () => import("./xlsx-D8XqTBoR.js").then((m) => m.xlsxRenderer));
35
+ registerRenderer("pptx", () => import("./pptx-DLhvPIMn.js").then((m) => m.pptxRenderer));
36
36
  registerRenderer("slack", () => import("./slack-BI3EQwYm.js").then((m) => m.slackRenderer));
37
- registerRenderer("svg", () => import("./svg-BKxumy-p.js").then((m) => m.svgRenderer));
37
+ registerRenderer("svg", () => import("./svg-uFnPWNCU.js").then((m) => m.svgRenderer));
38
38
  registerRenderer("teams", () => import("./teams-Cwz9lce0.js").then((m) => m.teamsRenderer));
39
39
  registerRenderer("discord", () => import("./discord-BLUnkEh9.js").then((m) => m.discordRenderer));
40
40
  registerRenderer("telegram", () => import("./telegram-gYFqyMXb.js").then((m) => m.telegramRenderer));
@@ -77,12 +77,12 @@ function _resetRenderers() {
77
77
  registerRenderer("md", () => import("./markdown-BYkSLplL.js").then((m) => m.markdownRenderer));
78
78
  registerRenderer("text", () => import("./text-l1XNXBOC.js").then((m) => m.textRenderer));
79
79
  registerRenderer("csv", () => import("./csv-COrS4qdy.js").then((m) => m.csvRenderer));
80
- registerRenderer("pdf", () => import("./pdf-IuBgTb3T.js").then((m) => m.pdfRenderer));
81
- registerRenderer("docx", () => import("./docx-CcB3jYd3.js").then((m) => m.docxRenderer));
82
- registerRenderer("xlsx", () => import("./xlsx-Cvu4LBNy.js").then((m) => m.xlsxRenderer));
83
- registerRenderer("pptx", () => import("./pptx-DXiMiYFM.js").then((m) => m.pptxRenderer));
80
+ registerRenderer("pdf", () => import("./pdf-NApJCU6I.js").then((m) => m.pdfRenderer));
81
+ registerRenderer("docx", () => import("./docx-D_wt3a7y.js").then((m) => m.docxRenderer));
82
+ registerRenderer("xlsx", () => import("./xlsx-D8XqTBoR.js").then((m) => m.xlsxRenderer));
83
+ registerRenderer("pptx", () => import("./pptx-DLhvPIMn.js").then((m) => m.pptxRenderer));
84
84
  registerRenderer("slack", () => import("./slack-BI3EQwYm.js").then((m) => m.slackRenderer));
85
- registerRenderer("svg", () => import("./svg-BKxumy-p.js").then((m) => m.svgRenderer));
85
+ registerRenderer("svg", () => import("./svg-uFnPWNCU.js").then((m) => m.svgRenderer));
86
86
  registerRenderer("teams", () => import("./teams-Cwz9lce0.js").then((m) => m.teamsRenderer));
87
87
  registerRenderer("discord", () => import("./discord-BLUnkEh9.js").then((m) => m.discordRenderer));
88
88
  registerRenderer("telegram", () => import("./telegram-gYFqyMXb.js").then((m) => m.telegramRenderer));
@@ -1,4 +1,4 @@
1
- import { o as __toESM } from "./chunk-ErZ26oRB.js";
1
+ import { o as __toESM } from "./chunk-B4VCYm32.js";
2
2
 
3
3
  //#region src/renderers/pdf.ts
4
4
  /**
@@ -372,8 +372,8 @@ const pdfRenderer = { async render(node, _options) {
372
372
  let pdfMakeModule;
373
373
  let pdfFontsModule;
374
374
  try {
375
- pdfMakeModule = await import("./pdfmake-CKMX5URW.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
376
- pdfFontsModule = await import("./vfs_fonts-Cap07Jg3.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
375
+ pdfMakeModule = await import("./pdfmake-DPyTSQ91.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
376
+ pdfFontsModule = await import("./vfs_fonts-BSrGAfkk.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
377
377
  } catch {
378
378
  throw new Error("[@pyreon/document] PDF renderer requires \"pdfmake\" package. Install it: bun add pdfmake");
379
379
  }
@@ -422,4 +422,4 @@ const pdfRenderer = { async render(node, _options) {
422
422
 
423
423
  //#endregion
424
424
  export { pdfRenderer };
425
- //# sourceMappingURL=pdf-IuBgTb3T.js.map
425
+ //# sourceMappingURL=pdf-NApJCU6I.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-IuBgTb3T.js","names":[],"sources":["../src/renderers/pdf.ts"],"sourcesContent":["import type { DocChild, DocNode, DocumentRenderer, RenderOptions, TableColumn } from '../types'\n\n/**\n * PDF renderer — lazy-loads pdfmake on first use.\n * pdfmake handles pagination, tables, text wrapping, and font embedding.\n *\n * @example\n * ```ts\n * import { render, Document, Page, Heading } from '@pyreon/document'\n *\n * const doc = Document({\n * title: 'Report',\n * children: Page({ children: Heading({ children: 'Hello' }) }),\n * })\n * const pdf = await render(doc, 'pdf') // → Uint8Array\n * ```\n */\n\nfunction resolveColumn(col: string | TableColumn): TableColumn {\n return typeof col === 'string' ? { header: col } : col\n}\n\nfunction getTextContent(children: DocChild[]): string {\n return children\n .map((c) => (typeof c === 'string' ? c : getTextContent((c as DocNode).children)))\n .join('')\n}\n\ntype PdfContent = Record<string, unknown> | string | PdfContent[]\n\n/** pdfmake expects page sizes as `{ width, height }` objects. */\nconst PAGE_SIZES: Record<string, { width: number; height: number }> = {\n A3: { width: 841.89, height: 1190.55 },\n A4: { width: 595.28, height: 841.89 },\n A5: { width: 419.53, height: 595.28 },\n letter: { width: 612, height: 792 },\n legal: { width: 612, height: 1008 },\n tabloid: { width: 792, height: 1224 },\n}\n\n/**\n * Resolve an image `src` for pdfmake.\n *\n * - `data:` URIs are passed through directly (pdfmake supports base64).\n * - `http(s)://` URLs cannot be resolved at render time in the browser.\n * A placeholder text node is returned instead.\n * - Relative / absolute paths (e.g. `/logo.png`) cannot be resolved without\n * a server-side fetch, so they are skipped with a placeholder.\n */\nfunction resolveImageSrc(\n src: string,\n): { image: string } | { text: string; italics: true; color: string } {\n if (src.startsWith('data:')) {\n return { image: src }\n }\n if (src.startsWith('http://') || src.startsWith('https://')) {\n return { text: `[Image: ${src}]`, italics: true, color: '#999999' }\n }\n // Local path — cannot resolve in browser\n return { text: `[Image: ${src}]`, italics: true, color: '#999999' }\n}\n\nfunction nodeToContent(node: DocNode): PdfContent | PdfContent[] | null {\n const p = node.props\n\n switch (node.type) {\n case 'document':\n case 'page':\n return node.children\n .map((c) => (typeof c === 'string' ? c : nodeToContent(c)))\n .filter((c): c is PdfContent => c != null)\n\n case 'section': {\n const content = node.children\n .map((c) => (typeof c === 'string' ? c : nodeToContent(c)))\n .filter((c): c is PdfContent => c != null)\n .flat()\n\n if (p.direction === 'row') {\n return {\n columns: node.children\n .filter((c): c is DocNode => typeof c !== 'string')\n .map((child) => ({\n stack: [nodeToContent(child)].flat().filter(Boolean),\n width: child.props.width === '*' || !child.props.width ? '*' : child.props.width,\n })),\n columnGap: (p.gap as number) ?? 0,\n }\n }\n\n return content\n }\n\n case 'row': {\n return {\n columns: node.children\n .filter((c): c is DocNode => typeof c !== 'string')\n .map((child) => ({\n stack: [nodeToContent(child)].flat().filter(Boolean),\n width: child.props.width ?? '*',\n })),\n columnGap: (p.gap as number) ?? 0,\n }\n }\n\n case 'column':\n return node.children\n .map((c) => (typeof c === 'string' ? c : nodeToContent(c)))\n .filter((c): c is PdfContent => c != null)\n .flat()\n\n case 'heading': {\n const level = (p.level as number) ?? 1\n const sizes: Record<number, number> = {\n 1: 24,\n 2: 20,\n 3: 18,\n 4: 16,\n 5: 14,\n 6: 12,\n }\n return {\n text: getTextContent(node.children),\n fontSize: sizes[level] ?? 18,\n bold: true,\n color: (p.color as string) ?? '#000000',\n alignment: (p.align as string) ?? 'left',\n margin: [0, level === 1 ? 0 : 8, 0, 8],\n }\n }\n\n case 'text':\n return {\n text: getTextContent(node.children),\n fontSize: (p.size as number) ?? 12,\n color: (p.color as string) ?? '#333333',\n bold: p.bold ?? false,\n italics: p.italic ?? false,\n decoration: p.underline ? 'underline' : p.strikethrough ? 'lineThrough' : undefined,\n alignment: (p.align as string) ?? 'left',\n lineHeight: (p.lineHeight as number) ?? 1.4,\n margin: [0, 0, 0, 8],\n }\n\n case 'link':\n return {\n text: getTextContent(node.children),\n link: p.href as string,\n color: (p.color as string) ?? '#4f46e5',\n decoration: 'underline',\n }\n\n case 'image': {\n const src = p.src as string\n const resolved = resolveImageSrc(src)\n\n if ('image' in resolved) {\n const result: Record<string, unknown> = {\n image: resolved.image,\n fit: [p.width ?? 500, p.height ?? 400],\n margin: [0, 0, 0, 8],\n }\n if (p.align === 'center') result.alignment = 'center'\n if (p.align === 'right') result.alignment = 'right'\n return result\n }\n\n // Placeholder for non-resolvable images\n return { ...resolved, margin: [0, 0, 0, 8] }\n }\n\n case 'table': {\n const columns = ((p.columns ?? []) as (string | TableColumn)[]).map(resolveColumn)\n const rows = (p.rows ?? []) as (string | number)[][]\n const hs = p.headerStyle as { background?: string; color?: string } | undefined\n\n const headerRow = columns.map((col) => ({\n text: col.header,\n bold: true,\n fillColor: hs?.background ?? '#f5f5f5',\n color: hs?.color ?? '#000000',\n alignment: col.align ?? 'left',\n }))\n\n const dataRows = rows.map((row, rowIdx) =>\n columns.map((col, colIdx) => ({\n text: String(row[colIdx] ?? ''),\n alignment: col.align ?? 'left',\n fillColor: p.striped && rowIdx % 2 === 1 ? '#f9f9f9' : undefined,\n })),\n )\n\n const widths = columns.map((col) => {\n if (!col.width) return '*'\n if (typeof col.width === 'string' && col.width.endsWith('%')) {\n return col.width\n }\n return col.width\n })\n\n return {\n table: {\n headerRows: 1,\n widths,\n body: [headerRow, ...dataRows],\n },\n layout: p.bordered ? undefined : 'lightHorizontalLines',\n unbreakable: p.keepTogether ?? false,\n margin: [0, 0, 0, 12],\n }\n }\n\n case 'list': {\n const items = node.children\n .filter((c): c is DocNode => typeof c !== 'string')\n .map((item) => getTextContent(item.children))\n\n return p.ordered ? { ol: items, margin: [0, 0, 0, 8] } : { ul: items, margin: [0, 0, 0, 8] }\n }\n\n case 'list-item':\n return getTextContent(node.children)\n\n case 'code':\n return {\n text: getTextContent(node.children),\n font: 'Courier',\n fontSize: 10,\n background: '#f5f5f5',\n margin: [0, 0, 0, 8],\n }\n\n case 'page-break':\n return { text: '', pageBreak: 'after' }\n\n case 'divider':\n return {\n canvas: [\n {\n type: 'line',\n x1: 0,\n y1: 0,\n x2: 515,\n y2: 0,\n lineWidth: (p.thickness as number) ?? 1,\n lineColor: (p.color as string) ?? '#dddddd',\n },\n ],\n margin: [0, 8, 0, 8],\n }\n\n case 'spacer':\n return { text: '', margin: [0, (p.height as number) ?? 12, 0, 0] }\n\n case 'button':\n return {\n text: getTextContent(node.children),\n link: p.href as string,\n bold: true,\n color: (p.color as string) ?? '#ffffff',\n background: (p.background as string) ?? '#4f46e5',\n margin: [0, 8, 0, 8],\n }\n\n case 'quote':\n return {\n table: {\n widths: [4, '*'],\n body: [\n [\n { text: '', fillColor: (p.borderColor as string) ?? '#dddddd' },\n {\n text: getTextContent(node.children),\n italics: true,\n color: '#555555',\n margin: [8, 4, 0, 4],\n },\n ],\n ],\n },\n layout: 'noBorders',\n margin: [0, 4, 0, 8],\n }\n\n default:\n return null\n }\n}\n\nfunction resolveMargin(\n margin: number | [number, number] | [number, number, number, number] | undefined,\n): [number, number, number, number] {\n if (margin == null) return [40, 40, 40, 40]\n if (typeof margin === 'number') return [margin, margin, margin, margin]\n if (margin.length === 2) return [margin[1], margin[0], margin[1], margin[0]]\n return margin\n}\n\n/**\n * Render header/footer DocNodes into pdfmake content for page headers/footers.\n *\n * pdfmake header/footer functions receive `(currentPage, pageCount, pageSize)`\n * and must return a content object. We flatten the DocNode into static content.\n */\nfunction renderHeaderFooter(node: DocNode | undefined): PdfContent | undefined {\n if (!node) return undefined\n const content = nodeToContent(node)\n if (content == null) return undefined\n if (Array.isArray(content)) return { stack: content, margin: [40, 10, 40, 0] }\n if (typeof content === 'object') return { ...content, margin: [40, 10, 40, 0] }\n return { text: content, margin: [40, 10, 40, 0] }\n}\n\nexport const pdfRenderer: DocumentRenderer = {\n async render(node: DocNode, _options?: RenderOptions): Promise<Uint8Array> {\n // Lazy-load pdfmake — handle ESM/CJS interop\n let pdfMakeModule: any\n let pdfFontsModule: any\n try {\n pdfMakeModule = await import('pdfmake/build/pdfmake')\n pdfFontsModule = await import('pdfmake/build/vfs_fonts')\n } catch {\n throw new Error(\n '[@pyreon/document] PDF renderer requires \"pdfmake\" package. Install it: bun add pdfmake',\n )\n }\n\n // Resolve the actual exports (handle .default for ESM wrappers).\n // pdfmake's default export is a singleton instance of browser_extensions_pdfmake.\n // ESM interop may wrap it in an extra .default layer.\n let pdfMake: any = pdfMakeModule.default ?? pdfMakeModule\n if (pdfMake.default && typeof pdfMake.default.createPdf === 'function') {\n pdfMake = pdfMake.default\n }\n const pdfFonts: any = pdfFontsModule.default ?? pdfFontsModule\n\n // Assign virtual filesystem for fonts\n if (pdfMake.vfs == null) {\n pdfMake.vfs = pdfFonts.pdfMake?.vfs ?? pdfFonts.vfs\n }\n\n // Find page config\n const pageNode = node.children.find(\n (c): c is DocNode => typeof c !== 'string' && c.type === 'page',\n )\n const pageSize = (pageNode?.props.size as string) ?? 'A4'\n const pageOrientation = (pageNode?.props.orientation as string) ?? 'portrait'\n const pageMargin = resolveMargin(\n pageNode?.props.margin as\n | number\n | [number, number]\n | [number, number, number, number]\n | undefined,\n )\n\n const content = [nodeToContent(node)].flat().filter(Boolean) as PdfContent[]\n\n // Build header/footer from PageProps if present\n const headerFn = renderHeaderFooter(pageNode?.props.header as DocNode | undefined)\n const footerFn = renderHeaderFooter(pageNode?.props.footer as DocNode | undefined)\n\n const docDefinition: Record<string, unknown> = {\n pageSize: PAGE_SIZES[pageSize] ?? PAGE_SIZES.A4,\n pageOrientation,\n pageMargins: pageMargin,\n info: {\n title: (node.props.title as string) ?? '',\n author: (node.props.author as string) ?? '',\n subject: (node.props.subject as string) ?? '',\n keywords: (node.props.keywords as string[])?.join(', ') ?? '',\n },\n content,\n defaultStyle: {\n fontSize: 12,\n lineHeight: 1.4,\n },\n // Keep sections together — break before a heading if it would be\n // orphaned at the bottom of a page.\n pageBreakBefore: (\n currentNode: { headlineLevel?: number },\n helpers: { getFollowingNodesOnPage?: () => unknown[] },\n ) => {\n if (currentNode.headlineLevel && helpers.getFollowingNodesOnPage) {\n const following = helpers.getFollowingNodesOnPage()\n if (following.length === 0) return true\n }\n return false\n },\n }\n\n if (headerFn) docDefinition.header = headerFn\n if (footerFn) docDefinition.footer = footerFn\n\n try {\n const pdf = pdfMake.createPdf(docDefinition)\n const buffer = await pdf.getBuffer()\n return new Uint8Array(buffer)\n } catch (err) {\n throw new Error(`[@pyreon/document] PDF generation failed: ${err}`)\n }\n },\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,SAAS,cAAc,KAAwC;AAC7D,QAAO,OAAO,QAAQ,WAAW,EAAE,QAAQ,KAAK,GAAG;;AAGrD,SAAS,eAAe,UAA8B;AACpD,QAAO,SACJ,KAAK,MAAO,OAAO,MAAM,WAAW,IAAI,eAAgB,EAAc,SAAS,CAAE,CACjF,KAAK,GAAG;;;AAMb,MAAM,aAAgE;CACpE,IAAI;EAAE,OAAO;EAAQ,QAAQ;EAAS;CACtC,IAAI;EAAE,OAAO;EAAQ,QAAQ;EAAQ;CACrC,IAAI;EAAE,OAAO;EAAQ,QAAQ;EAAQ;CACrC,QAAQ;EAAE,OAAO;EAAK,QAAQ;EAAK;CACnC,OAAO;EAAE,OAAO;EAAK,QAAQ;EAAM;CACnC,SAAS;EAAE,OAAO;EAAK,QAAQ;EAAM;CACtC;;;;;;;;;;AAWD,SAAS,gBACP,KACoE;AACpE,KAAI,IAAI,WAAW,QAAQ,CACzB,QAAO,EAAE,OAAO,KAAK;AAEvB,KAAI,IAAI,WAAW,UAAU,IAAI,IAAI,WAAW,WAAW,CACzD,QAAO;EAAE,MAAM,WAAW,IAAI;EAAI,SAAS;EAAM,OAAO;EAAW;AAGrE,QAAO;EAAE,MAAM,WAAW,IAAI;EAAI,SAAS;EAAM,OAAO;EAAW;;AAGrE,SAAS,cAAc,MAAiD;CACtE,MAAM,IAAI,KAAK;AAEf,SAAQ,KAAK,MAAb;EACE,KAAK;EACL,KAAK,OACH,QAAO,KAAK,SACT,KAAK,MAAO,OAAO,MAAM,WAAW,IAAI,cAAc,EAAE,CAAE,CAC1D,QAAQ,MAAuB,KAAK,KAAK;EAE9C,KAAK,WAAW;GACd,MAAM,UAAU,KAAK,SAClB,KAAK,MAAO,OAAO,MAAM,WAAW,IAAI,cAAc,EAAE,CAAE,CAC1D,QAAQ,MAAuB,KAAK,KAAK,CACzC,MAAM;AAET,OAAI,EAAE,cAAc,MAClB,QAAO;IACL,SAAS,KAAK,SACX,QAAQ,MAAoB,OAAO,MAAM,SAAS,CAClD,KAAK,WAAW;KACf,OAAO,CAAC,cAAc,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,QAAQ;KACpD,OAAO,MAAM,MAAM,UAAU,OAAO,CAAC,MAAM,MAAM,QAAQ,MAAM,MAAM,MAAM;KAC5E,EAAE;IACL,WAAY,EAAE,OAAkB;IACjC;AAGH,UAAO;;EAGT,KAAK,MACH,QAAO;GACL,SAAS,KAAK,SACX,QAAQ,MAAoB,OAAO,MAAM,SAAS,CAClD,KAAK,WAAW;IACf,OAAO,CAAC,cAAc,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,QAAQ;IACpD,OAAO,MAAM,MAAM,SAAS;IAC7B,EAAE;GACL,WAAY,EAAE,OAAkB;GACjC;EAGH,KAAK,SACH,QAAO,KAAK,SACT,KAAK,MAAO,OAAO,MAAM,WAAW,IAAI,cAAc,EAAE,CAAE,CAC1D,QAAQ,MAAuB,KAAK,KAAK,CACzC,MAAM;EAEX,KAAK,WAAW;GACd,MAAM,QAAS,EAAE,SAAoB;AASrC,UAAO;IACL,MAAM,eAAe,KAAK,SAAS;IACnC,UAVoC;KACpC,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;KACJ,CAGiB,UAAU;IAC1B,MAAM;IACN,OAAQ,EAAE,SAAoB;IAC9B,WAAY,EAAE,SAAoB;IAClC,QAAQ;KAAC;KAAG,UAAU,IAAI,IAAI;KAAG;KAAG;KAAE;IACvC;;EAGH,KAAK,OACH,QAAO;GACL,MAAM,eAAe,KAAK,SAAS;GACnC,UAAW,EAAE,QAAmB;GAChC,OAAQ,EAAE,SAAoB;GAC9B,MAAM,EAAE,QAAQ;GAChB,SAAS,EAAE,UAAU;GACrB,YAAY,EAAE,YAAY,cAAc,EAAE,gBAAgB,gBAAgB;GAC1E,WAAY,EAAE,SAAoB;GAClC,YAAa,EAAE,cAAyB;GACxC,QAAQ;IAAC;IAAG;IAAG;IAAG;IAAE;GACrB;EAEH,KAAK,OACH,QAAO;GACL,MAAM,eAAe,KAAK,SAAS;GACnC,MAAM,EAAE;GACR,OAAQ,EAAE,SAAoB;GAC9B,YAAY;GACb;EAEH,KAAK,SAAS;GACZ,MAAM,MAAM,EAAE;GACd,MAAM,WAAW,gBAAgB,IAAI;AAErC,OAAI,WAAW,UAAU;IACvB,MAAM,SAAkC;KACtC,OAAO,SAAS;KAChB,KAAK,CAAC,EAAE,SAAS,KAAK,EAAE,UAAU,IAAI;KACtC,QAAQ;MAAC;MAAG;MAAG;MAAG;MAAE;KACrB;AACD,QAAI,EAAE,UAAU,SAAU,QAAO,YAAY;AAC7C,QAAI,EAAE,UAAU,QAAS,QAAO,YAAY;AAC5C,WAAO;;AAIT,UAAO;IAAE,GAAG;IAAU,QAAQ;KAAC;KAAG;KAAG;KAAG;KAAE;IAAE;;EAG9C,KAAK,SAAS;GACZ,MAAM,WAAY,EAAE,WAAW,EAAE,EAA+B,IAAI,cAAc;GAClF,MAAM,OAAQ,EAAE,QAAQ,EAAE;GAC1B,MAAM,KAAK,EAAE;GAEb,MAAM,YAAY,QAAQ,KAAK,SAAS;IACtC,MAAM,IAAI;IACV,MAAM;IACN,WAAW,IAAI,cAAc;IAC7B,OAAO,IAAI,SAAS;IACpB,WAAW,IAAI,SAAS;IACzB,EAAE;GAEH,MAAM,WAAW,KAAK,KAAK,KAAK,WAC9B,QAAQ,KAAK,KAAK,YAAY;IAC5B,MAAM,OAAO,IAAI,WAAW,GAAG;IAC/B,WAAW,IAAI,SAAS;IACxB,WAAW,EAAE,WAAW,SAAS,MAAM,IAAI,YAAY;IACxD,EAAE,CACJ;AAUD,UAAO;IACL,OAAO;KACL,YAAY;KACZ,QAXW,QAAQ,KAAK,QAAQ;AAClC,UAAI,CAAC,IAAI,MAAO,QAAO;AACvB,UAAI,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,SAAS,IAAI,CAC1D,QAAO,IAAI;AAEb,aAAO,IAAI;OACX;KAME,MAAM,CAAC,WAAW,GAAG,SAAS;KAC/B;IACD,QAAQ,EAAE,WAAW,SAAY;IACjC,aAAa,EAAE,gBAAgB;IAC/B,QAAQ;KAAC;KAAG;KAAG;KAAG;KAAG;IACtB;;EAGH,KAAK,QAAQ;GACX,MAAM,QAAQ,KAAK,SAChB,QAAQ,MAAoB,OAAO,MAAM,SAAS,CAClD,KAAK,SAAS,eAAe,KAAK,SAAS,CAAC;AAE/C,UAAO,EAAE,UAAU;IAAE,IAAI;IAAO,QAAQ;KAAC;KAAG;KAAG;KAAG;KAAE;IAAE,GAAG;IAAE,IAAI;IAAO,QAAQ;KAAC;KAAG;KAAG;KAAG;KAAE;IAAE;;EAG9F,KAAK,YACH,QAAO,eAAe,KAAK,SAAS;EAEtC,KAAK,OACH,QAAO;GACL,MAAM,eAAe,KAAK,SAAS;GACnC,MAAM;GACN,UAAU;GACV,YAAY;GACZ,QAAQ;IAAC;IAAG;IAAG;IAAG;IAAE;GACrB;EAEH,KAAK,aACH,QAAO;GAAE,MAAM;GAAI,WAAW;GAAS;EAEzC,KAAK,UACH,QAAO;GACL,QAAQ,CACN;IACE,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,WAAY,EAAE,aAAwB;IACtC,WAAY,EAAE,SAAoB;IACnC,CACF;GACD,QAAQ;IAAC;IAAG;IAAG;IAAG;IAAE;GACrB;EAEH,KAAK,SACH,QAAO;GAAE,MAAM;GAAI,QAAQ;IAAC;IAAI,EAAE,UAAqB;IAAI;IAAG;IAAE;GAAE;EAEpE,KAAK,SACH,QAAO;GACL,MAAM,eAAe,KAAK,SAAS;GACnC,MAAM,EAAE;GACR,MAAM;GACN,OAAQ,EAAE,SAAoB;GAC9B,YAAa,EAAE,cAAyB;GACxC,QAAQ;IAAC;IAAG;IAAG;IAAG;IAAE;GACrB;EAEH,KAAK,QACH,QAAO;GACL,OAAO;IACL,QAAQ,CAAC,GAAG,IAAI;IAChB,MAAM,CACJ,CACE;KAAE,MAAM;KAAI,WAAY,EAAE,eAA0B;KAAW,EAC/D;KACE,MAAM,eAAe,KAAK,SAAS;KACnC,SAAS;KACT,OAAO;KACP,QAAQ;MAAC;MAAG;MAAG;MAAG;MAAE;KACrB,CACF,CACF;IACF;GACD,QAAQ;GACR,QAAQ;IAAC;IAAG;IAAG;IAAG;IAAE;GACrB;EAEH,QACE,QAAO;;;AAIb,SAAS,cACP,QACkC;AAClC,KAAI,UAAU,KAAM,QAAO;EAAC;EAAI;EAAI;EAAI;EAAG;AAC3C,KAAI,OAAO,WAAW,SAAU,QAAO;EAAC;EAAQ;EAAQ;EAAQ;EAAO;AACvE,KAAI,OAAO,WAAW,EAAG,QAAO;EAAC,OAAO;EAAI,OAAO;EAAI,OAAO;EAAI,OAAO;EAAG;AAC5E,QAAO;;;;;;;;AAST,SAAS,mBAAmB,MAAmD;AAC7E,KAAI,CAAC,KAAM,QAAO;CAClB,MAAM,UAAU,cAAc,KAAK;AACnC,KAAI,WAAW,KAAM,QAAO;AAC5B,KAAI,MAAM,QAAQ,QAAQ,CAAE,QAAO;EAAE,OAAO;EAAS,QAAQ;GAAC;GAAI;GAAI;GAAI;GAAE;EAAE;AAC9E,KAAI,OAAO,YAAY,SAAU,QAAO;EAAE,GAAG;EAAS,QAAQ;GAAC;GAAI;GAAI;GAAI;GAAE;EAAE;AAC/E,QAAO;EAAE,MAAM;EAAS,QAAQ;GAAC;GAAI;GAAI;GAAI;GAAE;EAAE;;AAGnD,MAAa,cAAgC,EAC3C,MAAM,OAAO,MAAe,UAA+C;CAEzE,IAAI;CACJ,IAAI;AACJ,KAAI;AACF,kBAAgB,MAAM,OAAO;AAC7B,mBAAiB,MAAM,OAAO;SACxB;AACN,QAAM,IAAI,MACR,4FACD;;CAMH,IAAI,UAAe,cAAc,WAAW;AAC5C,KAAI,QAAQ,WAAW,OAAO,QAAQ,QAAQ,cAAc,WAC1D,WAAU,QAAQ;CAEpB,MAAM,WAAgB,eAAe,WAAW;AAGhD,KAAI,QAAQ,OAAO,KACjB,SAAQ,MAAM,SAAS,SAAS,OAAO,SAAS;CAIlD,MAAM,WAAW,KAAK,SAAS,MAC5B,MAAoB,OAAO,MAAM,YAAY,EAAE,SAAS,OAC1D;CACD,MAAM,WAAY,UAAU,MAAM,QAAmB;CACrD,MAAM,kBAAmB,UAAU,MAAM,eAA0B;CACnE,MAAM,aAAa,cACjB,UAAU,MAAM,OAKjB;CAED,MAAM,UAAU,CAAC,cAAc,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,QAAQ;CAG5D,MAAM,WAAW,mBAAmB,UAAU,MAAM,OAA8B;CAClF,MAAM,WAAW,mBAAmB,UAAU,MAAM,OAA8B;CAElF,MAAM,gBAAyC;EAC7C,UAAU,WAAW,aAAa,WAAW;EAC7C;EACA,aAAa;EACb,MAAM;GACJ,OAAQ,KAAK,MAAM,SAAoB;GACvC,QAAS,KAAK,MAAM,UAAqB;GACzC,SAAU,KAAK,MAAM,WAAsB;GAC3C,UAAW,KAAK,MAAM,UAAuB,KAAK,KAAK,IAAI;GAC5D;EACD;EACA,cAAc;GACZ,UAAU;GACV,YAAY;GACb;EAGD,kBACE,aACA,YACG;AACH,OAAI,YAAY,iBAAiB,QAAQ,yBAEvC;QADkB,QAAQ,yBAAyB,CACrC,WAAW,EAAG,QAAO;;AAErC,UAAO;;EAEV;AAED,KAAI,SAAU,eAAc,SAAS;AACrC,KAAI,SAAU,eAAc,SAAS;AAErC,KAAI;EAEF,MAAM,SAAS,MADH,QAAQ,UAAU,cAAc,CACnB,WAAW;AACpC,SAAO,IAAI,WAAW,OAAO;UACtB,KAAK;AACZ,QAAM,IAAI,MAAM,6CAA6C,MAAM;;GAGxE"}
1
+ {"version":3,"file":"pdf-NApJCU6I.js","names":[],"sources":["../src/renderers/pdf.ts"],"sourcesContent":["import type { DocChild, DocNode, DocumentRenderer, RenderOptions, TableColumn } from '../types'\n\n/**\n * PDF renderer — lazy-loads pdfmake on first use.\n * pdfmake handles pagination, tables, text wrapping, and font embedding.\n *\n * @example\n * ```ts\n * import { render, Document, Page, Heading } from '@pyreon/document'\n *\n * const doc = Document({\n * title: 'Report',\n * children: Page({ children: Heading({ children: 'Hello' }) }),\n * })\n * const pdf = await render(doc, 'pdf') // → Uint8Array\n * ```\n */\n\nfunction resolveColumn(col: string | TableColumn): TableColumn {\n return typeof col === 'string' ? { header: col } : col\n}\n\nfunction getTextContent(children: DocChild[]): string {\n return children\n .map((c) => (typeof c === 'string' ? c : getTextContent((c as DocNode).children)))\n .join('')\n}\n\ntype PdfContent = Record<string, unknown> | string | PdfContent[]\n\n/** pdfmake expects page sizes as `{ width, height }` objects. */\nconst PAGE_SIZES: Record<string, { width: number; height: number }> = {\n A3: { width: 841.89, height: 1190.55 },\n A4: { width: 595.28, height: 841.89 },\n A5: { width: 419.53, height: 595.28 },\n letter: { width: 612, height: 792 },\n legal: { width: 612, height: 1008 },\n tabloid: { width: 792, height: 1224 },\n}\n\n/**\n * Resolve an image `src` for pdfmake.\n *\n * - `data:` URIs are passed through directly (pdfmake supports base64).\n * - `http(s)://` URLs cannot be resolved at render time in the browser.\n * A placeholder text node is returned instead.\n * - Relative / absolute paths (e.g. `/logo.png`) cannot be resolved without\n * a server-side fetch, so they are skipped with a placeholder.\n */\nfunction resolveImageSrc(\n src: string,\n): { image: string } | { text: string; italics: true; color: string } {\n if (src.startsWith('data:')) {\n return { image: src }\n }\n if (src.startsWith('http://') || src.startsWith('https://')) {\n return { text: `[Image: ${src}]`, italics: true, color: '#999999' }\n }\n // Local path — cannot resolve in browser\n return { text: `[Image: ${src}]`, italics: true, color: '#999999' }\n}\n\nfunction nodeToContent(node: DocNode): PdfContent | PdfContent[] | null {\n const p = node.props\n\n switch (node.type) {\n case 'document':\n case 'page':\n return node.children\n .map((c) => (typeof c === 'string' ? c : nodeToContent(c)))\n .filter((c): c is PdfContent => c != null)\n\n case 'section': {\n const content = node.children\n .map((c) => (typeof c === 'string' ? c : nodeToContent(c)))\n .filter((c): c is PdfContent => c != null)\n .flat()\n\n if (p.direction === 'row') {\n return {\n columns: node.children\n .filter((c): c is DocNode => typeof c !== 'string')\n .map((child) => ({\n stack: [nodeToContent(child)].flat().filter(Boolean),\n width: child.props.width === '*' || !child.props.width ? '*' : child.props.width,\n })),\n columnGap: (p.gap as number) ?? 0,\n }\n }\n\n return content\n }\n\n case 'row': {\n return {\n columns: node.children\n .filter((c): c is DocNode => typeof c !== 'string')\n .map((child) => ({\n stack: [nodeToContent(child)].flat().filter(Boolean),\n width: child.props.width ?? '*',\n })),\n columnGap: (p.gap as number) ?? 0,\n }\n }\n\n case 'column':\n return node.children\n .map((c) => (typeof c === 'string' ? c : nodeToContent(c)))\n .filter((c): c is PdfContent => c != null)\n .flat()\n\n case 'heading': {\n const level = (p.level as number) ?? 1\n const sizes: Record<number, number> = {\n 1: 24,\n 2: 20,\n 3: 18,\n 4: 16,\n 5: 14,\n 6: 12,\n }\n return {\n text: getTextContent(node.children),\n fontSize: sizes[level] ?? 18,\n bold: true,\n color: (p.color as string) ?? '#000000',\n alignment: (p.align as string) ?? 'left',\n margin: [0, level === 1 ? 0 : 8, 0, 8],\n }\n }\n\n case 'text':\n return {\n text: getTextContent(node.children),\n fontSize: (p.size as number) ?? 12,\n color: (p.color as string) ?? '#333333',\n bold: p.bold ?? false,\n italics: p.italic ?? false,\n decoration: p.underline ? 'underline' : p.strikethrough ? 'lineThrough' : undefined,\n alignment: (p.align as string) ?? 'left',\n lineHeight: (p.lineHeight as number) ?? 1.4,\n margin: [0, 0, 0, 8],\n }\n\n case 'link':\n return {\n text: getTextContent(node.children),\n link: p.href as string,\n color: (p.color as string) ?? '#4f46e5',\n decoration: 'underline',\n }\n\n case 'image': {\n const src = p.src as string\n const resolved = resolveImageSrc(src)\n\n if ('image' in resolved) {\n const result: Record<string, unknown> = {\n image: resolved.image,\n fit: [p.width ?? 500, p.height ?? 400],\n margin: [0, 0, 0, 8],\n }\n if (p.align === 'center') result.alignment = 'center'\n if (p.align === 'right') result.alignment = 'right'\n return result\n }\n\n // Placeholder for non-resolvable images\n return { ...resolved, margin: [0, 0, 0, 8] }\n }\n\n case 'table': {\n const columns = ((p.columns ?? []) as (string | TableColumn)[]).map(resolveColumn)\n const rows = (p.rows ?? []) as (string | number)[][]\n const hs = p.headerStyle as { background?: string; color?: string } | undefined\n\n const headerRow = columns.map((col) => ({\n text: col.header,\n bold: true,\n fillColor: hs?.background ?? '#f5f5f5',\n color: hs?.color ?? '#000000',\n alignment: col.align ?? 'left',\n }))\n\n const dataRows = rows.map((row, rowIdx) =>\n columns.map((col, colIdx) => ({\n text: String(row[colIdx] ?? ''),\n alignment: col.align ?? 'left',\n fillColor: p.striped && rowIdx % 2 === 1 ? '#f9f9f9' : undefined,\n })),\n )\n\n const widths = columns.map((col) => {\n if (!col.width) return '*'\n if (typeof col.width === 'string' && col.width.endsWith('%')) {\n return col.width\n }\n return col.width\n })\n\n return {\n table: {\n headerRows: 1,\n widths,\n body: [headerRow, ...dataRows],\n },\n layout: p.bordered ? undefined : 'lightHorizontalLines',\n unbreakable: p.keepTogether ?? false,\n margin: [0, 0, 0, 12],\n }\n }\n\n case 'list': {\n const items = node.children\n .filter((c): c is DocNode => typeof c !== 'string')\n .map((item) => getTextContent(item.children))\n\n return p.ordered ? { ol: items, margin: [0, 0, 0, 8] } : { ul: items, margin: [0, 0, 0, 8] }\n }\n\n case 'list-item':\n return getTextContent(node.children)\n\n case 'code':\n return {\n text: getTextContent(node.children),\n font: 'Courier',\n fontSize: 10,\n background: '#f5f5f5',\n margin: [0, 0, 0, 8],\n }\n\n case 'page-break':\n return { text: '', pageBreak: 'after' }\n\n case 'divider':\n return {\n canvas: [\n {\n type: 'line',\n x1: 0,\n y1: 0,\n x2: 515,\n y2: 0,\n lineWidth: (p.thickness as number) ?? 1,\n lineColor: (p.color as string) ?? '#dddddd',\n },\n ],\n margin: [0, 8, 0, 8],\n }\n\n case 'spacer':\n return { text: '', margin: [0, (p.height as number) ?? 12, 0, 0] }\n\n case 'button':\n return {\n text: getTextContent(node.children),\n link: p.href as string,\n bold: true,\n color: (p.color as string) ?? '#ffffff',\n background: (p.background as string) ?? '#4f46e5',\n margin: [0, 8, 0, 8],\n }\n\n case 'quote':\n return {\n table: {\n widths: [4, '*'],\n body: [\n [\n { text: '', fillColor: (p.borderColor as string) ?? '#dddddd' },\n {\n text: getTextContent(node.children),\n italics: true,\n color: '#555555',\n margin: [8, 4, 0, 4],\n },\n ],\n ],\n },\n layout: 'noBorders',\n margin: [0, 4, 0, 8],\n }\n\n default:\n return null\n }\n}\n\nfunction resolveMargin(\n margin: number | [number, number] | [number, number, number, number] | undefined,\n): [number, number, number, number] {\n if (margin == null) return [40, 40, 40, 40]\n if (typeof margin === 'number') return [margin, margin, margin, margin]\n if (margin.length === 2) return [margin[1], margin[0], margin[1], margin[0]]\n return margin\n}\n\n/**\n * Render header/footer DocNodes into pdfmake content for page headers/footers.\n *\n * pdfmake header/footer functions receive `(currentPage, pageCount, pageSize)`\n * and must return a content object. We flatten the DocNode into static content.\n */\nfunction renderHeaderFooter(node: DocNode | undefined): PdfContent | undefined {\n if (!node) return undefined\n const content = nodeToContent(node)\n if (content == null) return undefined\n if (Array.isArray(content)) return { stack: content, margin: [40, 10, 40, 0] }\n if (typeof content === 'object') return { ...content, margin: [40, 10, 40, 0] }\n return { text: content, margin: [40, 10, 40, 0] }\n}\n\nexport const pdfRenderer: DocumentRenderer = {\n async render(node: DocNode, _options?: RenderOptions): Promise<Uint8Array> {\n // Lazy-load pdfmake — handle ESM/CJS interop\n let pdfMakeModule: any\n let pdfFontsModule: any\n try {\n pdfMakeModule = await import('pdfmake/build/pdfmake')\n pdfFontsModule = await import('pdfmake/build/vfs_fonts')\n } catch {\n throw new Error(\n '[@pyreon/document] PDF renderer requires \"pdfmake\" package. Install it: bun add pdfmake',\n )\n }\n\n // Resolve the actual exports (handle .default for ESM wrappers).\n // pdfmake's default export is a singleton instance of browser_extensions_pdfmake.\n // ESM interop may wrap it in an extra .default layer.\n let pdfMake: any = pdfMakeModule.default ?? pdfMakeModule\n if (pdfMake.default && typeof pdfMake.default.createPdf === 'function') {\n pdfMake = pdfMake.default\n }\n const pdfFonts: any = pdfFontsModule.default ?? pdfFontsModule\n\n // Assign virtual filesystem for fonts\n if (pdfMake.vfs == null) {\n pdfMake.vfs = pdfFonts.pdfMake?.vfs ?? pdfFonts.vfs\n }\n\n // Find page config\n const pageNode = node.children.find(\n (c): c is DocNode => typeof c !== 'string' && c.type === 'page',\n )\n const pageSize = (pageNode?.props.size as string) ?? 'A4'\n const pageOrientation = (pageNode?.props.orientation as string) ?? 'portrait'\n const pageMargin = resolveMargin(\n pageNode?.props.margin as\n | number\n | [number, number]\n | [number, number, number, number]\n | undefined,\n )\n\n const content = [nodeToContent(node)].flat().filter(Boolean) as PdfContent[]\n\n // Build header/footer from PageProps if present\n const headerFn = renderHeaderFooter(pageNode?.props.header as DocNode | undefined)\n const footerFn = renderHeaderFooter(pageNode?.props.footer as DocNode | undefined)\n\n const docDefinition: Record<string, unknown> = {\n pageSize: PAGE_SIZES[pageSize] ?? PAGE_SIZES.A4,\n pageOrientation,\n pageMargins: pageMargin,\n info: {\n title: (node.props.title as string) ?? '',\n author: (node.props.author as string) ?? '',\n subject: (node.props.subject as string) ?? '',\n keywords: (node.props.keywords as string[])?.join(', ') ?? '',\n },\n content,\n defaultStyle: {\n fontSize: 12,\n lineHeight: 1.4,\n },\n // Keep sections together — break before a heading if it would be\n // orphaned at the bottom of a page.\n pageBreakBefore: (\n currentNode: { headlineLevel?: number },\n helpers: { getFollowingNodesOnPage?: () => unknown[] },\n ) => {\n if (currentNode.headlineLevel && helpers.getFollowingNodesOnPage) {\n const following = helpers.getFollowingNodesOnPage()\n if (following.length === 0) return true\n }\n return false\n },\n }\n\n if (headerFn) docDefinition.header = headerFn\n if (footerFn) docDefinition.footer = footerFn\n\n try {\n const pdf = pdfMake.createPdf(docDefinition)\n const buffer = await pdf.getBuffer()\n return new Uint8Array(buffer)\n } catch (err) {\n throw new Error(`[@pyreon/document] PDF generation failed: ${err}`)\n }\n },\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as __commonJSMin } from "./chunk-ErZ26oRB.js";
1
+ import { t as __commonJSMin } from "./chunk-B4VCYm32.js";
2
2
 
3
3
  //#region ../../../node_modules/.bun/pdfmake@0.3.7/node_modules/pdfmake/build/pdfmake.js
4
4
  var require_pdfmake = /* @__PURE__ */ __commonJSMin(((exports, module) => {
@@ -19504,7 +19504,8 @@ end\
19504
19504
  pos += 2;
19505
19505
  this.width = this.data.readUInt16BE(pos);
19506
19506
  pos += 2;
19507
- this.colorSpace = COLOR_SPACE_MAP[this.data[pos++]];
19507
+ const channels = this.data[pos++];
19508
+ this.colorSpace = COLOR_SPACE_MAP[channels];
19508
19509
  this.obj = null;
19509
19510
  }
19510
19511
  embed(document) {
@@ -37742,7 +37743,8 @@ while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] &
37742
37743
  this.ended = false;
37743
37744
  this.finished = false;
37744
37745
  this.destroyed = false;
37745
- this.decodeStrings = !(options.decodeStrings === false);
37746
+ var noDecode = options.decodeStrings === false;
37747
+ this.decodeStrings = !noDecode;
37746
37748
  this.defaultEncoding = options.defaultEncoding || "utf8";
37747
37749
  this.length = 0;
37748
37750
  this.writing = false;
@@ -44804,7 +44806,10 @@ while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] &
44804
44806
  decode() {
44805
44807
  this.stream.pos;
44806
44808
  let top = $5b547cf9e5da519b$export$2e2bcd8739ae039.decode(this.stream);
44807
- for (let key in top) this[key] = top[key];
44809
+ for (let key in top) {
44810
+ let val = top[key];
44811
+ this[key] = val;
44812
+ }
44808
44813
  if (this.version < 2) {
44809
44814
  if (this.topDictIndex.length !== 1) throw new Error("Only a single font is allowed in CFF");
44810
44815
  this.topDict = this.topDictIndex[0];
@@ -54270,7 +54275,10 @@ while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] &
54270
54275
  constructor(opts = {}) {
54271
54276
  this.enumerable = true;
54272
54277
  this.configurable = true;
54273
- for (let key in opts) this[key] = opts[key];
54278
+ for (let key in opts) {
54279
+ const val = opts[key];
54280
+ this[key] = val;
54281
+ }
54274
54282
  }
54275
54283
  }
54276
54284
  class $8ea28a08eae2a116$export$c4be6576ca6fe4aa extends $8d21f7fa58802901$export$ef88aa0d34c34520 {
@@ -55506,4 +55514,4 @@ while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] &
55506
55514
  //#endregion
55507
55515
  export default require_pdfmake();
55508
55516
 
55509
- //# sourceMappingURL=pdfmake-CKMX5URW.js.map
55517
+ //# sourceMappingURL=pdfmake-DPyTSQ91.js.map