@arslankhan/doc-forge 0.0.0-stage → 0.1.1

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 (246) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +13 -0
  3. package/LICENSING.md +80 -0
  4. package/README.md +547 -2
  5. package/RELEASE.md +50 -0
  6. package/dist/binding-path.d.ts +15 -0
  7. package/dist/binding-path.d.ts.map +1 -0
  8. package/dist/binding-path.js +37 -0
  9. package/dist/binding-path.js.map +1 -0
  10. package/dist/binding.d.ts +91 -0
  11. package/dist/binding.d.ts.map +1 -0
  12. package/dist/binding.js +229 -0
  13. package/dist/binding.js.map +1 -0
  14. package/dist/designer/Canvas.d.ts +51 -0
  15. package/dist/designer/Canvas.d.ts.map +1 -0
  16. package/dist/designer/Canvas.js +188 -0
  17. package/dist/designer/Canvas.js.map +1 -0
  18. package/dist/designer/DocumentDesigner.d.ts +14 -0
  19. package/dist/designer/DocumentDesigner.d.ts.map +1 -0
  20. package/dist/designer/DocumentDesigner.js +351 -0
  21. package/dist/designer/DocumentDesigner.js.map +1 -0
  22. package/dist/designer/HtmlPreview.d.ts +9 -0
  23. package/dist/designer/HtmlPreview.d.ts.map +1 -0
  24. package/dist/designer/HtmlPreview.js +20 -0
  25. package/dist/designer/HtmlPreview.js.map +1 -0
  26. package/dist/designer/ImageBindingFields.d.ts +11 -0
  27. package/dist/designer/ImageBindingFields.d.ts.map +1 -0
  28. package/dist/designer/ImageBindingFields.js +106 -0
  29. package/dist/designer/ImageBindingFields.js.map +1 -0
  30. package/dist/designer/InvoiceFields.d.ts +13 -0
  31. package/dist/designer/InvoiceFields.d.ts.map +1 -0
  32. package/dist/designer/InvoiceFields.js +85 -0
  33. package/dist/designer/InvoiceFields.js.map +1 -0
  34. package/dist/designer/PreviewDataDialog.d.ts +13 -0
  35. package/dist/designer/PreviewDataDialog.d.ts.map +1 -0
  36. package/dist/designer/PreviewDataDialog.js +16 -0
  37. package/dist/designer/PreviewDataDialog.js.map +1 -0
  38. package/dist/designer/PropertiesPanel.d.ts +15 -0
  39. package/dist/designer/PropertiesPanel.d.ts.map +1 -0
  40. package/dist/designer/PropertiesPanel.js +63 -0
  41. package/dist/designer/PropertiesPanel.js.map +1 -0
  42. package/dist/designer/ReportFields.d.ts +14 -0
  43. package/dist/designer/ReportFields.d.ts.map +1 -0
  44. package/dist/designer/ReportFields.js +257 -0
  45. package/dist/designer/ReportFields.js.map +1 -0
  46. package/dist/designer/StyleFields.d.ts +16 -0
  47. package/dist/designer/StyleFields.d.ts.map +1 -0
  48. package/dist/designer/StyleFields.js +138 -0
  49. package/dist/designer/StyleFields.js.map +1 -0
  50. package/dist/designer/TextBindingFields.d.ts +11 -0
  51. package/dist/designer/TextBindingFields.d.ts.map +1 -0
  52. package/dist/designer/TextBindingFields.js +105 -0
  53. package/dist/designer/TextBindingFields.js.map +1 -0
  54. package/dist/designer/Toolbar.d.ts +52 -0
  55. package/dist/designer/Toolbar.d.ts.map +1 -0
  56. package/dist/designer/Toolbar.js +62 -0
  57. package/dist/designer/Toolbar.js.map +1 -0
  58. package/dist/designer/Toolbox.d.ts +8 -0
  59. package/dist/designer/Toolbox.d.ts.map +1 -0
  60. package/dist/designer/Toolbox.js +43 -0
  61. package/dist/designer/Toolbox.js.map +1 -0
  62. package/dist/designer/border-preview.d.ts +15 -0
  63. package/dist/designer/border-preview.d.ts.map +1 -0
  64. package/dist/designer/border-preview.js +34 -0
  65. package/dist/designer/border-preview.js.map +1 -0
  66. package/dist/designer/history.d.ts +13 -0
  67. package/dist/designer/history.d.ts.map +1 -0
  68. package/dist/designer/history.js +51 -0
  69. package/dist/designer/history.js.map +1 -0
  70. package/dist/designer/index.d.ts +5 -0
  71. package/dist/designer/index.d.ts.map +1 -0
  72. package/dist/designer/index.js +3 -0
  73. package/dist/designer/index.js.map +1 -0
  74. package/dist/designer/page-geometry.d.ts +35 -0
  75. package/dist/designer/page-geometry.d.ts.map +1 -0
  76. package/dist/designer/page-geometry.js +123 -0
  77. package/dist/designer/page-geometry.js.map +1 -0
  78. package/dist/designer/styles.d.ts +3 -0
  79. package/dist/designer/styles.d.ts.map +1 -0
  80. package/dist/designer/styles.js +594 -0
  81. package/dist/designer/styles.js.map +1 -0
  82. package/dist/designer/template-edits.d.ts +26 -0
  83. package/dist/designer/template-edits.d.ts.map +1 -0
  84. package/dist/designer/template-edits.js +323 -0
  85. package/dist/designer/template-edits.js.map +1 -0
  86. package/dist/designer/theme.d.ts +31 -0
  87. package/dist/designer/theme.d.ts.map +1 -0
  88. package/dist/designer/theme.js +92 -0
  89. package/dist/designer/theme.js.map +1 -0
  90. package/dist/examples/bound-invoice.d.ts +143 -0
  91. package/dist/examples/bound-invoice.d.ts.map +1 -0
  92. package/dist/examples/bound-invoice.js +99 -0
  93. package/dist/examples/bound-invoice.js.map +1 -0
  94. package/dist/examples/full-invoice-data.d.ts +81 -0
  95. package/dist/examples/full-invoice-data.d.ts.map +1 -0
  96. package/dist/examples/full-invoice-data.js +86 -0
  97. package/dist/examples/full-invoice-data.js.map +1 -0
  98. package/dist/examples/full-invoice.d.ts +402 -0
  99. package/dist/examples/full-invoice.d.ts.map +1 -0
  100. package/dist/examples/full-invoice.js +199 -0
  101. package/dist/examples/full-invoice.js.map +1 -0
  102. package/dist/examples/invoice-data.d.ts +51 -0
  103. package/dist/examples/invoice-data.d.ts.map +1 -0
  104. package/dist/examples/invoice-data.js +51 -0
  105. package/dist/examples/invoice-data.js.map +1 -0
  106. package/dist/examples/invoice.d.ts +90 -0
  107. package/dist/examples/invoice.d.ts.map +1 -0
  108. package/dist/examples/invoice.js +62 -0
  109. package/dist/examples/invoice.js.map +1 -0
  110. package/dist/examples/jobs-report-data.d.ts +84 -0
  111. package/dist/examples/jobs-report-data.d.ts.map +1 -0
  112. package/dist/examples/jobs-report-data.js +79 -0
  113. package/dist/examples/jobs-report-data.js.map +1 -0
  114. package/dist/examples/jobs-report.d.ts +182 -0
  115. package/dist/examples/jobs-report.d.ts.map +1 -0
  116. package/dist/examples/jobs-report.js +96 -0
  117. package/dist/examples/jobs-report.js.map +1 -0
  118. package/dist/index.d.ts +31 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +21 -0
  121. package/dist/index.js.map +1 -0
  122. package/dist/invoice/calculate.d.ts +59 -0
  123. package/dist/invoice/calculate.d.ts.map +1 -0
  124. package/dist/invoice/calculate.js +270 -0
  125. package/dist/invoice/calculate.js.map +1 -0
  126. package/dist/invoice/context.d.ts +15 -0
  127. package/dist/invoice/context.d.ts.map +1 -0
  128. package/dist/invoice/context.js +79 -0
  129. package/dist/invoice/context.js.map +1 -0
  130. package/dist/invoice/format.d.ts +10 -0
  131. package/dist/invoice/format.d.ts.map +1 -0
  132. package/dist/invoice/format.js +95 -0
  133. package/dist/invoice/format.js.map +1 -0
  134. package/dist/license/capabilities.d.ts +17 -0
  135. package/dist/license/capabilities.d.ts.map +1 -0
  136. package/dist/license/capabilities.js +46 -0
  137. package/dist/license/capabilities.js.map +1 -0
  138. package/dist/license/client.d.ts +109 -0
  139. package/dist/license/client.d.ts.map +1 -0
  140. package/dist/license/client.js +346 -0
  141. package/dist/license/client.js.map +1 -0
  142. package/dist/license/codec.d.ts +5 -0
  143. package/dist/license/codec.d.ts.map +1 -0
  144. package/dist/license/codec.js +26 -0
  145. package/dist/license/codec.js.map +1 -0
  146. package/dist/license/errors.d.ts +11 -0
  147. package/dist/license/errors.d.ts.map +1 -0
  148. package/dist/license/errors.js +19 -0
  149. package/dist/license/errors.js.map +1 -0
  150. package/dist/license/features.d.ts +20 -0
  151. package/dist/license/features.d.ts.map +1 -0
  152. package/dist/license/features.js +28 -0
  153. package/dist/license/features.js.map +1 -0
  154. package/dist/license/index.d.ts +16 -0
  155. package/dist/license/index.d.ts.map +1 -0
  156. package/dist/license/index.js +9 -0
  157. package/dist/license/index.js.map +1 -0
  158. package/dist/license/provider.d.ts +59 -0
  159. package/dist/license/provider.d.ts.map +1 -0
  160. package/dist/license/provider.js +150 -0
  161. package/dist/license/provider.js.map +1 -0
  162. package/dist/license/redact.d.ts +4 -0
  163. package/dist/license/redact.d.ts.map +1 -0
  164. package/dist/license/redact.js +15 -0
  165. package/dist/license/redact.js.map +1 -0
  166. package/dist/license/store.d.ts +26 -0
  167. package/dist/license/store.d.ts.map +1 -0
  168. package/dist/license/store.js +90 -0
  169. package/dist/license/store.js.map +1 -0
  170. package/dist/license/token.d.ts +45 -0
  171. package/dist/license/token.d.ts.map +1 -0
  172. package/dist/license/token.js +195 -0
  173. package/dist/license/token.js.map +1 -0
  174. package/dist/pdf/browser-blocked.d.ts +12 -0
  175. package/dist/pdf/browser-blocked.d.ts.map +1 -0
  176. package/dist/pdf/browser-blocked.js +25 -0
  177. package/dist/pdf/browser-blocked.js.map +1 -0
  178. package/dist/pdf/browser.d.ts +12 -0
  179. package/dist/pdf/browser.d.ts.map +1 -0
  180. package/dist/pdf/browser.js +69 -0
  181. package/dist/pdf/browser.js.map +1 -0
  182. package/dist/pdf/errors.d.ts +6 -0
  183. package/dist/pdf/errors.d.ts.map +1 -0
  184. package/dist/pdf/errors.js +11 -0
  185. package/dist/pdf/errors.js.map +1 -0
  186. package/dist/pdf/index.d.ts +10 -0
  187. package/dist/pdf/index.d.ts.map +1 -0
  188. package/dist/pdf/index.js +9 -0
  189. package/dist/pdf/index.js.map +1 -0
  190. package/dist/pdf/options.d.ts +143 -0
  191. package/dist/pdf/options.d.ts.map +1 -0
  192. package/dist/pdf/options.js +322 -0
  193. package/dist/pdf/options.js.map +1 -0
  194. package/dist/pdf/render-pdf.d.ts +13 -0
  195. package/dist/pdf/render-pdf.d.ts.map +1 -0
  196. package/dist/pdf/render-pdf.js +195 -0
  197. package/dist/pdf/render-pdf.js.map +1 -0
  198. package/dist/render/appearance.d.ts +25 -0
  199. package/dist/render/appearance.d.ts.map +1 -0
  200. package/dist/render/appearance.js +149 -0
  201. package/dist/render/appearance.js.map +1 -0
  202. package/dist/render/css.d.ts +17 -0
  203. package/dist/render/css.d.ts.map +1 -0
  204. package/dist/render/css.js +170 -0
  205. package/dist/render/css.js.map +1 -0
  206. package/dist/render/errors.d.ts +6 -0
  207. package/dist/render/errors.d.ts.map +1 -0
  208. package/dist/render/errors.js +11 -0
  209. package/dist/render/errors.js.map +1 -0
  210. package/dist/render/escape.d.ts +7 -0
  211. package/dist/render/escape.d.ts.map +1 -0
  212. package/dist/render/escape.js +27 -0
  213. package/dist/render/escape.js.map +1 -0
  214. package/dist/render/image-policy.d.ts +21 -0
  215. package/dist/render/image-policy.d.ts.map +1 -0
  216. package/dist/render/image-policy.js +62 -0
  217. package/dist/render/image-policy.js.map +1 -0
  218. package/dist/render/render-html.d.ts +28 -0
  219. package/dist/render/render-html.d.ts.map +1 -0
  220. package/dist/render/render-html.js +364 -0
  221. package/dist/render/render-html.js.map +1 -0
  222. package/dist/render/render-report.d.ts +23 -0
  223. package/dist/render/render-report.d.ts.map +1 -0
  224. package/dist/render/render-report.js +313 -0
  225. package/dist/render/render-report.js.map +1 -0
  226. package/dist/report/process.d.ts +48 -0
  227. package/dist/report/process.d.ts.map +1 -0
  228. package/dist/report/process.js +347 -0
  229. package/dist/report/process.js.map +1 -0
  230. package/dist/schema.d.ts +30 -0
  231. package/dist/schema.d.ts.map +1 -0
  232. package/dist/schema.js +8 -0
  233. package/dist/schema.js.map +1 -0
  234. package/dist/serialize.d.ts +13 -0
  235. package/dist/serialize.d.ts.map +1 -0
  236. package/dist/serialize.js +42 -0
  237. package/dist/serialize.js.map +1 -0
  238. package/dist/types.d.ts +335 -0
  239. package/dist/types.d.ts.map +1 -0
  240. package/dist/types.js +40 -0
  241. package/dist/types.js.map +1 -0
  242. package/dist/validate.d.ts +15 -0
  243. package/dist/validate.d.ts.map +1 -0
  244. package/dist/validate.js +977 -0
  245. package/dist/validate.js.map +1 -0
  246. package/package.json +105 -4
@@ -0,0 +1,322 @@
1
+ import { createTemplate } from "../serialize.js";
2
+ import { standardPageDimensions } from "../types.js";
3
+ import { PdfRenderError } from "./errors.js";
4
+ export const PDF_PAPER_SIZES = ["A4", "A3", "Letter", "Legal", "custom"];
5
+ const A3_MM = { width: 297, height: 420 };
6
+ /** Validates PDF options and merges them onto a detached template copy. */
7
+ export function resolvePdfSettings(template, options) {
8
+ const validated = createTemplate(template);
9
+ const next = applyPageOverride(validated, options.page);
10
+ const box = pageBox(next);
11
+ const timeout = readTimeout(options.timeout);
12
+ const scale = readScale(options.scale);
13
+ const preferCssPageSize = readBoolean(options.preferCssPageSize, "preferCssPageSize");
14
+ if (options.printBackground !== undefined && typeof options.printBackground !== "boolean") {
15
+ throw new PdfRenderError("invalid_option", "printBackground must be a boolean.");
16
+ }
17
+ const printBackground = options.printBackground ?? true;
18
+ const imageNetwork = readBoolean(options.imageNetwork, "imageNetwork") === true;
19
+ const metadata = readMetadata(options.metadata);
20
+ readLaunch(options.launch);
21
+ readTemplateHtml(options.headerTemplate, "headerTemplate");
22
+ readTemplateHtml(options.footerTemplate, "footerTemplate");
23
+ if (options.beforePdf !== undefined && typeof options.beforePdf !== "function") {
24
+ throw new PdfRenderError("invalid_option", "beforePdf must be a function.");
25
+ }
26
+ if (options.browser !== undefined && typeof options.browser.newContext !== "function") {
27
+ throw new PdfRenderError("invalid_option", "browser must be a Playwright browser.");
28
+ }
29
+ if (options.title !== undefined && typeof options.title !== "string") {
30
+ throw new PdfRenderError("invalid_option", "title must be a string.");
31
+ }
32
+ const wantsNumbers = next.documentType === "report" && next.report?.showPageNumber === true;
33
+ const displayHeaderFooter = options.displayHeaderFooter ??
34
+ (wantsNumbers || options.headerTemplate !== undefined || options.footerTemplate !== undefined);
35
+ if (typeof displayHeaderFooter !== "boolean") {
36
+ throw new PdfRenderError("invalid_option", "displayHeaderFooter must be a boolean.");
37
+ }
38
+ const marginsWereSet = options.page?.margins !== undefined;
39
+ const margin = pdfMargin(next, box, marginsWereSet, displayHeaderFooter);
40
+ const fitted = insetFixedPage(next, box, marginsWereSet);
41
+ return {
42
+ template: fitted,
43
+ timeout,
44
+ scale,
45
+ printBackground,
46
+ preferCssPageSize: preferCssPageSize === true,
47
+ width: cssLength(box.width, box.unit),
48
+ height: cssLength(box.height, box.unit),
49
+ margin,
50
+ displayHeaderFooter,
51
+ headerTemplate: options.headerTemplate,
52
+ footerTemplate: options.footerTemplate,
53
+ metadata,
54
+ imageSources: options.imageSources ?? {},
55
+ imageNetwork,
56
+ title: options.title,
57
+ additionalCss: options.additionalCss,
58
+ invoice: options.invoice,
59
+ };
60
+ }
61
+ function applyPageOverride(template, override) {
62
+ if (override === undefined) {
63
+ return template;
64
+ }
65
+ if (typeof override !== "object" || override === null) {
66
+ throw new PdfRenderError("invalid_option", "page must be an object.");
67
+ }
68
+ const page = {
69
+ ...template.page,
70
+ margins: { ...template.page.margins },
71
+ dimensions: template.page.dimensions ? { ...template.page.dimensions } : undefined,
72
+ };
73
+ const orientation = override.orientation ?? page.orientation;
74
+ if (override.orientation !== undefined && override.orientation !== "portrait" && override.orientation !== "landscape") {
75
+ throw new PdfRenderError("invalid_option", 'orientation must be "portrait" or "landscape".');
76
+ }
77
+ if (override.paperSize !== undefined && !PDF_PAPER_SIZES.includes(override.paperSize)) {
78
+ throw new PdfRenderError("invalid_option", 'paperSize must be "A4", "A3", "Letter", "Legal", or "custom".');
79
+ }
80
+ if (override.dimensions !== undefined && override.paperSize !== undefined && override.paperSize !== "custom") {
81
+ throw new PdfRenderError("invalid_option", "Set dimensions only when paperSize is custom.");
82
+ }
83
+ if (override.dimensions !== undefined) {
84
+ page.paperSize = "custom";
85
+ page.orientation = orientation;
86
+ page.dimensions = readDimensions(override.dimensions);
87
+ }
88
+ else if (override.paperSize === "custom") {
89
+ throw new PdfRenderError("invalid_option", "A custom PDF page requires dimensions.");
90
+ }
91
+ else if (override.paperSize === "A3") {
92
+ page.paperSize = "custom";
93
+ page.orientation = orientation;
94
+ page.dimensions = oriented(A3_MM.width, A3_MM.height, orientation);
95
+ }
96
+ else if (override.paperSize !== undefined) {
97
+ page.paperSize = override.paperSize;
98
+ page.orientation = orientation;
99
+ page.dimensions = standardPageDimensions(override.paperSize, orientation);
100
+ }
101
+ else if (override.orientation !== undefined && override.orientation !== template.page.orientation) {
102
+ page.orientation = orientation;
103
+ if (page.paperSize === "custom") {
104
+ if (!page.dimensions) {
105
+ throw new PdfRenderError("invalid_option", "A custom page needs dimensions before its orientation can change.");
106
+ }
107
+ page.dimensions = {
108
+ width: page.dimensions.height,
109
+ height: page.dimensions.width,
110
+ unit: page.dimensions.unit,
111
+ };
112
+ }
113
+ else {
114
+ page.dimensions = standardPageDimensions(page.paperSize, orientation);
115
+ }
116
+ }
117
+ if (override.margins !== undefined) {
118
+ page.margins = mergeMargins(page.margins, override.margins);
119
+ }
120
+ return { ...template, page };
121
+ }
122
+ function pageBox(template) {
123
+ const page = template.page;
124
+ if (page.dimensions) {
125
+ return {
126
+ width: page.dimensions.width,
127
+ height: page.dimensions.height,
128
+ unit: page.dimensions.unit,
129
+ margins: page.margins,
130
+ };
131
+ }
132
+ if (page.paperSize === "custom") {
133
+ throw new PdfRenderError("invalid_option", "Custom paper sizes require dimensions.");
134
+ }
135
+ const dimensions = standardPageDimensions(page.paperSize, page.orientation);
136
+ return { width: dimensions.width, height: dimensions.height, unit: dimensions.unit, margins: page.margins };
137
+ }
138
+ function insetFixedPage(template, box, marginsWereSet) {
139
+ if (template.documentType === "report" || !marginsWereSet) {
140
+ return template;
141
+ }
142
+ const width = box.width - box.margins.left - box.margins.right;
143
+ const height = box.height - box.margins.top - box.margins.bottom;
144
+ if (width <= 0 || height <= 0) {
145
+ throw new PdfRenderError("invalid_option", "PDF margins leave no room for the page.");
146
+ }
147
+ return {
148
+ ...template,
149
+ page: {
150
+ ...template.page,
151
+ paperSize: "custom",
152
+ dimensions: { width, height, unit: box.unit },
153
+ },
154
+ };
155
+ }
156
+ function pdfMargin(template, box, marginsWereSet, displayHeaderFooter) {
157
+ const useTemplate = template.documentType === "report" || marginsWereSet;
158
+ const margins = useTemplate ? box.margins : { top: 0, right: 0, bottom: 0, left: 0 };
159
+ if (displayHeaderFooter) {
160
+ for (const edge of ["top", "right", "bottom", "left"]) {
161
+ if (toMm(margins[edge], useTemplate ? box.unit : "mm") < 10) {
162
+ throw new PdfRenderError("invalid_option", "PDF headers and footers need at least 10mm on every margin. Set page.margins before printing page numbers.");
163
+ }
164
+ }
165
+ }
166
+ const unit = useTemplate ? box.unit : "mm";
167
+ return {
168
+ top: cssLength(margins.top, unit),
169
+ right: cssLength(margins.right, unit),
170
+ bottom: cssLength(margins.bottom, unit),
171
+ left: cssLength(margins.left, unit),
172
+ };
173
+ }
174
+ function mergeMargins(base, override) {
175
+ if (typeof override !== "object" || override === null) {
176
+ throw new PdfRenderError("invalid_option", "margins must be an object.");
177
+ }
178
+ const next = { ...base };
179
+ for (const edge of ["top", "right", "bottom", "left"]) {
180
+ if (override[edge] !== undefined) {
181
+ next[edge] = readMargin(override[edge], edge);
182
+ }
183
+ }
184
+ return next;
185
+ }
186
+ function readMargin(value, edge) {
187
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
188
+ throw new PdfRenderError("invalid_option", `Margin ${edge} must be a finite number greater than or equal to 0.`);
189
+ }
190
+ return value;
191
+ }
192
+ function readDimensions(value) {
193
+ if (typeof value !== "object" || value === null) {
194
+ throw new PdfRenderError("invalid_option", "dimensions must be an object.");
195
+ }
196
+ const unit = value.unit;
197
+ if (unit !== "mm" && unit !== "pt" && unit !== "in" && unit !== "px") {
198
+ throw new PdfRenderError("invalid_option", 'dimensions.unit must be "mm", "pt", "in", or "px".');
199
+ }
200
+ for (const side of ["width", "height"]) {
201
+ const length = value[side];
202
+ if (typeof length !== "number" || !Number.isFinite(length) || length <= 0 || toMm(length, unit) > 2000) {
203
+ throw new PdfRenderError("invalid_option", `dimensions.${side} must be a finite length greater than 0 and at most 2000mm.`);
204
+ }
205
+ }
206
+ return { width: value.width, height: value.height, unit };
207
+ }
208
+ function oriented(width, height, orientation) {
209
+ if (orientation === "landscape") {
210
+ return { width: height, height: width, unit: "mm" };
211
+ }
212
+ return { width, height, unit: "mm" };
213
+ }
214
+ function readTimeout(value) {
215
+ if (value === undefined) {
216
+ return 30_000;
217
+ }
218
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 1 || value > 120_000) {
219
+ throw new PdfRenderError("invalid_option", "timeout must be a finite number of milliseconds from 1 through 120000.");
220
+ }
221
+ return value;
222
+ }
223
+ function readScale(value) {
224
+ if (value === undefined) {
225
+ return 1;
226
+ }
227
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0.1 || value > 2) {
228
+ throw new PdfRenderError("invalid_option", "scale must be a finite number from 0.1 through 2.");
229
+ }
230
+ return value;
231
+ }
232
+ function readBoolean(value, label) {
233
+ if (value === undefined) {
234
+ return undefined;
235
+ }
236
+ if (typeof value !== "boolean") {
237
+ throw new PdfRenderError("invalid_option", `${label} must be a boolean.`);
238
+ }
239
+ return value;
240
+ }
241
+ function readMetadata(value) {
242
+ if (value === undefined) {
243
+ return undefined;
244
+ }
245
+ if (typeof value !== "object" || value === null) {
246
+ throw new PdfRenderError("invalid_option", "metadata must be an object.");
247
+ }
248
+ for (const key of ["title", "author", "subject"]) {
249
+ if (value[key] !== undefined) {
250
+ readMetadataString(value[key], key);
251
+ }
252
+ }
253
+ if (value.keywords !== undefined && typeof value.keywords !== "string" && !Array.isArray(value.keywords)) {
254
+ throw new PdfRenderError("invalid_option", "metadata.keywords must be a string or an array of strings.");
255
+ }
256
+ if (Array.isArray(value.keywords)) {
257
+ for (const keyword of value.keywords) {
258
+ readMetadataString(keyword, "keywords");
259
+ }
260
+ }
261
+ else if (typeof value.keywords === "string") {
262
+ readMetadataString(value.keywords, "keywords");
263
+ }
264
+ return value;
265
+ }
266
+ function readMetadataString(value, label) {
267
+ if (typeof value !== "string" || value.length > 200 || /[\u0000-\u001F\u007F]/.test(value)) {
268
+ throw new PdfRenderError("invalid_option", `metadata.${label} must be text of at most 200 characters.`);
269
+ }
270
+ }
271
+ function readLaunch(value) {
272
+ if (value === undefined) {
273
+ return;
274
+ }
275
+ if (typeof value !== "object" || value === null) {
276
+ throw new PdfRenderError("invalid_option", "launch must be an object.");
277
+ }
278
+ if (value.headless !== undefined && typeof value.headless !== "boolean") {
279
+ throw new PdfRenderError("invalid_option", "launch.headless must be a boolean.");
280
+ }
281
+ if (value.executablePath !== undefined && (typeof value.executablePath !== "string" || value.executablePath.trim().length === 0 || value.executablePath.includes("\0"))) {
282
+ throw new PdfRenderError("invalid_option", "launch.executablePath must be a non-empty path.");
283
+ }
284
+ if (value.args !== undefined) {
285
+ if (!Array.isArray(value.args) || value.args.length > 40) {
286
+ throw new PdfRenderError("invalid_option", "launch.args must be an array of at most 40 strings.");
287
+ }
288
+ for (const arg of value.args) {
289
+ if (typeof arg !== "string" || arg.length > 200 || /[\u0000-\u001F\u007F]/.test(arg)) {
290
+ throw new PdfRenderError("invalid_option", "Each launch arg must be a single line of at most 200 characters.");
291
+ }
292
+ }
293
+ }
294
+ }
295
+ export function readTemplateHtml(value, label) {
296
+ if (value === undefined) {
297
+ return;
298
+ }
299
+ if (typeof value !== "string" || value.length > 4000) {
300
+ throw new PdfRenderError("invalid_option", `${label} must be HTML of at most 4000 characters.`);
301
+ }
302
+ if (/<script|javascript:|on[a-z]+\s*=/i.test(value)) {
303
+ throw new PdfRenderError("invalid_option", `${label} cannot contain script or event-handler markup.`);
304
+ }
305
+ }
306
+ function cssLength(value, unit) {
307
+ const rounded = Math.round(value * 1000) / 1000;
308
+ return `${rounded}${unit}`;
309
+ }
310
+ function toMm(value, unit) {
311
+ if (unit === "mm") {
312
+ return value;
313
+ }
314
+ if (unit === "in") {
315
+ return value * 25.4;
316
+ }
317
+ if (unit === "pt") {
318
+ return (value * 25.4) / 72;
319
+ }
320
+ return (value * 25.4) / 96;
321
+ }
322
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/pdf/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { DocumentTemplate } from "../schema.js";
2
+ import { closePdfBrowser, openPdfBrowser } from "./browser.js";
3
+ import { type PdfRenderOptions } from "./options.js";
4
+ /**
5
+ * Renders a template and JSON data to a PDF buffer.
6
+ * Invoice totals and report rows are produced by the existing modules through `renderToHTML`.
7
+ * The template and the data object are not modified.
8
+ */
9
+ export declare function renderToPDF(template: DocumentTemplate, data: unknown, options?: PdfRenderOptions): Promise<Buffer>;
10
+ /** Writes a PDF to `filePath`. The path is used only because the caller supplied it. */
11
+ export declare function renderToPdfFile(template: DocumentTemplate, data: unknown, filePath: string, options?: PdfRenderOptions): Promise<void>;
12
+ export { closePdfBrowser, openPdfBrowser };
13
+ //# sourceMappingURL=render-pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-pdf.d.ts","sourceRoot":"","sources":["../../src/pdf/render-pdf.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,eAAe,EAAoB,cAAc,EAAE,MAAM,cAAc,CAAC;AAEjF,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAUzE;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4E5H;AAED,wFAAwF;AACxF,wBAAsB,eAAe,CACnC,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,195 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import { resolveBinding } from "../binding.js";
3
+ import { prepareInvoiceContext } from "../invoice/context.js";
4
+ import { formatScalar } from "../invoice/format.js";
5
+ import { imageSourceDecision } from "../render/image-policy.js";
6
+ import { renderToHTML } from "../render/render-html.js";
7
+ import { escapeHtml } from "../render/escape.js";
8
+ import { closePdfBrowser, launchPdfBrowser, openPdfBrowser } from "./browser.js";
9
+ import { PdfRenderError } from "./errors.js";
10
+ import { resolvePdfSettings } from "./options.js";
11
+ const PDF_CSS = `
12
+ html, body { margin: 0 !important; background: #ffffff !important; }
13
+ .dfr-page { margin: 0 !important; box-shadow: none !important; }
14
+ .dfr-page:not(.dfr-report) { overflow: hidden !important; }
15
+ .dfr-margins { display: none !important; }
16
+ @page { margin: 0 !important; }
17
+ `.trim();
18
+ /**
19
+ * Renders a template and JSON data to a PDF buffer.
20
+ * Invoice totals and report rows are produced by the existing modules through `renderToHTML`.
21
+ * The template and the data object are not modified.
22
+ */
23
+ export async function renderToPDF(template, data, options = {}) {
24
+ const settings = resolvePdfSettings(template, options);
25
+ const headerFooter = headerFooterTemplates(settings.template, data, settings.displayHeaderFooter, options);
26
+ const css = [PDF_CSS, headerFooter.hideDocumentFooter ? "@media print { .dfr-page-footer { display: none !important; } }" : "", settings.additionalCss]
27
+ .filter((part) => part !== undefined && part.length > 0)
28
+ .join("\n");
29
+ const html = renderToHTML(settings.template, data, {
30
+ title: settings.title,
31
+ imageSources: settings.imageSources,
32
+ invoice: settings.invoice,
33
+ additionalCss: css,
34
+ });
35
+ const owned = options.browser === undefined && options.launch !== undefined;
36
+ const browser = options.browser ?? (owned ? await launchPdfBrowser(options.launch) : await openPdfBrowser());
37
+ const context = await browser.newContext({ javaScriptEnabled: false });
38
+ let page;
39
+ try {
40
+ page = await context.newPage();
41
+ await page.route("**/*", async (route) => {
42
+ const url = route.request().url();
43
+ if (url.startsWith("data:") || url.startsWith("about:")) {
44
+ await route.continue();
45
+ return;
46
+ }
47
+ if (settings.imageNetwork && imageSourceDecision(url, settings.imageSources) === "allow" && /^https:\/\//i.test(url)) {
48
+ await route.continue();
49
+ return;
50
+ }
51
+ await route.abort();
52
+ });
53
+ await runStep(page.setContent(html, { waitUntil: "load", timeout: settings.timeout }), settings.timeout, "The document did not finish loading before the timeout.");
54
+ if (options.beforePdf) {
55
+ await runStep(Promise.resolve(options.beforePdf(page)), settings.timeout, "The document was not ready before the timeout.");
56
+ }
57
+ const printed = await runStep(page.pdf({
58
+ width: settings.width,
59
+ height: settings.height,
60
+ margin: settings.margin,
61
+ printBackground: settings.printBackground,
62
+ preferCSSPageSize: settings.preferCssPageSize,
63
+ scale: settings.scale,
64
+ displayHeaderFooter: settings.displayHeaderFooter,
65
+ headerTemplate: headerFooter.header,
66
+ footerTemplate: headerFooter.footer,
67
+ timeout: settings.timeout,
68
+ }), settings.timeout, "The PDF was not produced before the timeout.");
69
+ return Buffer.from(await applyMetadata(printed, settings.metadata, settings.title ?? settings.template.name));
70
+ }
71
+ catch (error) {
72
+ if (error instanceof PdfRenderError) {
73
+ throw error;
74
+ }
75
+ if (isTimeout(error)) {
76
+ throw new PdfRenderError("timeout", "The document did not finish loading before the timeout.");
77
+ }
78
+ const message = error instanceof Error ? error.message.split("\n")[0] : "The PDF could not be rendered.";
79
+ throw new PdfRenderError("render_failed", message);
80
+ }
81
+ finally {
82
+ await page?.close().catch(() => undefined);
83
+ await context.close().catch(() => undefined);
84
+ if (owned) {
85
+ await browser.close().catch(() => undefined);
86
+ }
87
+ }
88
+ }
89
+ /** Writes a PDF to `filePath`. The path is used only because the caller supplied it. */
90
+ export async function renderToPdfFile(template, data, filePath, options = {}) {
91
+ if (typeof filePath !== "string" || filePath.trim().length === 0 || filePath.includes("\0")) {
92
+ throw new PdfRenderError("invalid_option", "filePath must be a non-empty path.");
93
+ }
94
+ const pdf = await renderToPDF(template, data, options);
95
+ await writeFile(filePath, pdf);
96
+ }
97
+ export { closePdfBrowser, openPdfBrowser };
98
+ function headerFooterTemplates(template, data, displayHeaderFooter, options) {
99
+ if (!displayHeaderFooter) {
100
+ return { hideDocumentFooter: false };
101
+ }
102
+ const view = template.documentType === "invoice"
103
+ ? prepareInvoiceContext(data, options.invoice ?? { fractionDigits: template.invoice?.fractionDigits })
104
+ : data;
105
+ const header = options.headerTemplate ?? marginBox(bandLine(template.report?.pageHeader, view));
106
+ const pageNumber = template.documentType === "report" && template.report?.showPageNumber
107
+ ? "Page <span class=\"pageNumber\"></span> of <span class=\"totalPages\"></span>"
108
+ : "";
109
+ const footerText = bandLine(template.report?.pageFooter, view);
110
+ const footer = options.footerTemplate ?? marginBox([footerText, pageNumber].filter((part) => part.length > 0).join(" "));
111
+ return { header, footer, hideDocumentFooter: true };
112
+ }
113
+ function marginBox(content) {
114
+ return `<div style="font-family: Helvetica, Arial, sans-serif; font-size: 9px; width: 100%; padding: 0 8mm; color: #1c2430;">${content}</div>`;
115
+ }
116
+ function bandLine(entries, data) {
117
+ if (!entries) {
118
+ return "";
119
+ }
120
+ return entries
121
+ .filter((entry) => entry.type === "text")
122
+ .map((entry) => escapeHtml(entry.binding ? boundText(entry.binding, data) : entry.text ?? ""))
123
+ .filter((text) => text.length > 0)
124
+ .join(" ");
125
+ }
126
+ function boundText(binding, data) {
127
+ const lookup = resolveBinding(data, binding.path);
128
+ if (lookup.status === "found") {
129
+ const formatted = formatScalar(lookup.value, binding.format, currencyFrom(binding, data));
130
+ if (formatted !== null) {
131
+ return `${binding.prefix ?? ""}${formatted}${binding.suffix ?? ""}`;
132
+ }
133
+ }
134
+ if (binding.fallback !== undefined) {
135
+ return `${binding.prefix ?? ""}${binding.fallback}${binding.suffix ?? ""}`;
136
+ }
137
+ return "";
138
+ }
139
+ function currencyFrom(binding, data) {
140
+ if (binding.format?.style !== "currency") {
141
+ return undefined;
142
+ }
143
+ if (binding.format.currency) {
144
+ return binding.format.currency;
145
+ }
146
+ for (const path of ["invoice.currency", "report.currency"]) {
147
+ const lookup = resolveBinding(data, path);
148
+ if (lookup.status === "found" && typeof lookup.value === "string") {
149
+ return lookup.value;
150
+ }
151
+ }
152
+ return undefined;
153
+ }
154
+ async function applyMetadata(pdf, metadata, fallbackTitle) {
155
+ if (metadata === undefined) {
156
+ return pdf;
157
+ }
158
+ const { PDFDocument } = await import("pdf-lib");
159
+ const document = await PDFDocument.load(pdf);
160
+ document.setTitle(metadata.title ?? fallbackTitle);
161
+ if (metadata.author !== undefined) {
162
+ document.setAuthor(metadata.author);
163
+ }
164
+ if (metadata.subject !== undefined) {
165
+ document.setSubject(metadata.subject);
166
+ }
167
+ if (metadata.keywords !== undefined) {
168
+ document.setKeywords(Array.isArray(metadata.keywords) ? [...metadata.keywords] : [metadata.keywords]);
169
+ }
170
+ return document.save();
171
+ }
172
+ async function runStep(promise, timeout, message) {
173
+ let timer;
174
+ const guarded = promise.then((value) => value, (error) => {
175
+ throw error;
176
+ });
177
+ guarded.catch(() => undefined);
178
+ try {
179
+ return await Promise.race([
180
+ guarded,
181
+ new Promise((_, reject) => {
182
+ timer = setTimeout(() => reject(new PdfRenderError("timeout", message)), timeout);
183
+ }),
184
+ ]);
185
+ }
186
+ finally {
187
+ if (timer !== undefined) {
188
+ clearTimeout(timer);
189
+ }
190
+ }
191
+ }
192
+ function isTimeout(error) {
193
+ return error instanceof Error && (error.name === "TimeoutError" || /Timeout/i.test(error.message));
194
+ }
195
+ //# sourceMappingURL=render-pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-pdf.js","sourceRoot":"","sources":["../../src/pdf/render-pdf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type JsonValue } from "../binding.js";
2
+ import type { ElementStyle, ReportColumn, ReportTableElement } from "../types.js";
3
+ /**
4
+ * Style precedence for one report cell, from lowest to highest:
5
+ * 1. Table text defaults from `element.style` (color, font, vertical alignment).
6
+ * 2. Role defaults: header, group, subtotal, and grand total.
7
+ * 3. Role style: `headerStyle`, `bodyStyle`, `groupStyle`, `subtotalStyle`, or `grandTotalStyle`.
8
+ * 4. Zebra background for record rows that do not already set a background.
9
+ * 5. The first matching `rowRules` entry, for record rows only.
10
+ * 6. Column `headerStyle` or `style`, then the column's `align` when text alignment is still unset.
11
+ *
12
+ * A later layer replaces only the properties it sets. Padding edges and border sides merge per edge.
13
+ */
14
+ export declare function reportCellStyle(element: ReportTableElement, column: ReportColumn | undefined, kind: "header" | "record" | "group" | "subtotal" | "grand" | "empty", record: {
15
+ [key: string]: JsonValue;
16
+ } | undefined, stripe: string | undefined): ElementStyle;
17
+ export declare function stripeColor(element: ReportTableElement, recordIndex: number): string | undefined;
18
+ /** Later layers replace earlier ones. Nested padding and border edges merge. */
19
+ export declare function mergeStyles(...layers: Array<ElementStyle | undefined>): ElementStyle;
20
+ /**
21
+ * Border fields for a table cell.
22
+ * An overlay such as a header style replaces only the border fields it sets.
23
+ */
24
+ export declare function cellBorderStyle(base: ElementStyle | undefined, overlay: ElementStyle | undefined): ElementStyle;
25
+ //# sourceMappingURL=appearance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../../src/render/appearance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EAGV,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,EACpE,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,SAAS,EAChD,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,YAAY,CA8Bd;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQhG;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,YAAY,CAqBpF;AASD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,SAAS,GAAG,YAAY,CAE/G"}