pdf-gen-js 1.0.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 (51) hide show
  1. package/README.md +179 -0
  2. package/bin/cli.js +74 -0
  3. package/dist/config.d.ts +20 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +24 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/generator.d.ts +44 -0
  8. package/dist/generator.d.ts.map +1 -0
  9. package/dist/generator.js +144 -0
  10. package/dist/generator.js.map +1 -0
  11. package/dist/index.d.ts +24 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +32 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/templates/certificate.d.ts +17 -0
  16. package/dist/templates/certificate.d.ts.map +1 -0
  17. package/dist/templates/certificate.js +78 -0
  18. package/dist/templates/certificate.js.map +1 -0
  19. package/dist/templates/invoice.d.ts +31 -0
  20. package/dist/templates/invoice.d.ts.map +1 -0
  21. package/dist/templates/invoice.js +115 -0
  22. package/dist/templates/invoice.js.map +1 -0
  23. package/dist/templates/receipt.d.ts +26 -0
  24. package/dist/templates/receipt.d.ts.map +1 -0
  25. package/dist/templates/receipt.js +93 -0
  26. package/dist/templates/receipt.js.map +1 -0
  27. package/dist/theme.d.ts +21 -0
  28. package/dist/theme.d.ts.map +1 -0
  29. package/dist/theme.js +26 -0
  30. package/dist/theme.js.map +1 -0
  31. package/dist/types.d.ts +7 -0
  32. package/dist/types.d.ts.map +1 -0
  33. package/dist/types.js +9 -0
  34. package/dist/types.js.map +1 -0
  35. package/dist/utils/image.d.ts +32 -0
  36. package/dist/utils/image.d.ts.map +1 -0
  37. package/dist/utils/image.js +98 -0
  38. package/dist/utils/image.js.map +1 -0
  39. package/dist/utils/logo.d.ts +15 -0
  40. package/dist/utils/logo.d.ts.map +1 -0
  41. package/dist/utils/logo.js +16 -0
  42. package/dist/utils/logo.js.map +1 -0
  43. package/dist/utils/table.d.ts +23 -0
  44. package/dist/utils/table.d.ts.map +1 -0
  45. package/dist/utils/table.js +83 -0
  46. package/dist/utils/table.js.map +1 -0
  47. package/dist/utils/validate.d.ts +6 -0
  48. package/dist/utils/validate.d.ts.map +1 -0
  49. package/dist/utils/validate.js +35 -0
  50. package/dist/utils/validate.js.map +1 -0
  51. package/package.json +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo.d.ts","sourceRoot":"","sources":["../../src/utils/logo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpG,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yGAAyG;AACzG,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAMjG;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.embedImage = void 0;
4
+ exports.resolveLogo = resolveLogo;
5
+ const image_1 = require("./image");
6
+ Object.defineProperty(exports, "embedImage", { enumerable: true, get: function () { return image_1.embedImage; } });
7
+ /** Normalizes a template's `logo` field (bare path/Buffer, or `{src,width,height}`) to a fixed shape. */
8
+ function resolveLogo(logo, defaultSize) {
9
+ if (!logo)
10
+ return null;
11
+ if (typeof logo === 'string' || Buffer.isBuffer(logo)) {
12
+ return { src: logo, width: defaultSize, height: defaultSize };
13
+ }
14
+ return { src: logo.src, width: logo.width ?? defaultSize, height: logo.height ?? defaultSize };
15
+ }
16
+ //# sourceMappingURL=logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo.js","sourceRoot":"","sources":["../../src/utils/logo.ts"],"names":[],"mappings":";;;AAWA,kCAMC;AAjBD,mCAAqC;AAmB5B,2FAnBA,kBAAU,OAmBA;AATnB,yGAAyG;AACzG,SAAgB,WAAW,CAAC,IAA2B,EAAE,WAAmB;IAC1E,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;AACjG,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { PDFConfig } from '../config';
2
+ import { Theme } from '../theme';
3
+ import { PDFDoc } from '../types';
4
+ export interface TableColumn {
5
+ header: string;
6
+ key?: string;
7
+ width?: number;
8
+ align?: 'left' | 'center' | 'right';
9
+ }
10
+ export interface TableOptions {
11
+ rowHeight?: number;
12
+ headerHeight?: number;
13
+ striped?: boolean;
14
+ fontSize?: number;
15
+ startY?: number;
16
+ }
17
+ /**
18
+ * Draws a table with word-wrapped cells, an optional striped body, and automatic
19
+ * page breaks when a row would run past the bottom margin. Returns the Y position
20
+ * immediately below the finished table.
21
+ */
22
+ export declare function drawTable(doc: PDFDoc, config: PDFConfig, theme: Theme, columns: TableColumn[], rows: Array<Record<string, any> | any[]>, options?: TableOptions): number;
23
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/utils/table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,WAAW,EAAE,EACtB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,EACxC,OAAO,GAAE,YAAiB,GACzB,MAAM,CAqFR"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.drawTable = drawTable;
4
+ /**
5
+ * Draws a table with word-wrapped cells, an optional striped body, and automatic
6
+ * page breaks when a row would run past the bottom margin. Returns the Y position
7
+ * immediately below the finished table.
8
+ */
9
+ function drawTable(doc, config, theme, columns, rows, options = {}) {
10
+ const x = config.margins.left;
11
+ const totalWidth = doc.page.width - config.margins.left - config.margins.right;
12
+ const headerHeight = options.headerHeight ?? 26;
13
+ const fontSize = options.fontSize ?? 10;
14
+ const striped = options.striped ?? true;
15
+ const explicitWidth = columns.reduce((sum, c) => sum + (c.width || 0), 0);
16
+ const flexColumns = columns.filter((c) => !c.width).length;
17
+ const flexWidth = flexColumns > 0 ? (totalWidth - explicitWidth) / flexColumns : 0;
18
+ const widths = columns.map((c) => c.width || flexWidth);
19
+ const cellValue = (row, col, idx) => {
20
+ const raw = Array.isArray(row) ? row[idx] : row[col.key];
21
+ return raw === undefined || raw === null ? '' : String(raw);
22
+ };
23
+ const rowLineCount = (row) => {
24
+ let maxLines = 1;
25
+ columns.forEach((col, i) => {
26
+ const text = cellValue(row, col, i);
27
+ const height = doc.heightOfString(text, { width: widths[i] - 12 });
28
+ const lines = Math.ceil(height / (fontSize * 1.3));
29
+ maxLines = Math.max(maxLines, lines || 1);
30
+ });
31
+ return maxLines;
32
+ };
33
+ const drawHeader = (y) => {
34
+ doc.rect(x, y, totalWidth, headerHeight).fill(theme.tableHeaderBg);
35
+ doc.fillColor(theme.tableHeaderText).font('Helvetica-Bold').fontSize(fontSize);
36
+ let colX = x;
37
+ columns.forEach((col, i) => {
38
+ doc.text(col.header, colX + 6, y + headerHeight / 2 - fontSize / 2, {
39
+ width: widths[i] - 12,
40
+ align: col.align || 'left'
41
+ });
42
+ colX += widths[i];
43
+ });
44
+ return y + headerHeight;
45
+ };
46
+ let y = options.startY ?? doc.y;
47
+ if (y + headerHeight > doc.page.height - config.margins.bottom) {
48
+ doc.addPage();
49
+ y = config.margins.top;
50
+ }
51
+ y = drawHeader(y);
52
+ rows.forEach((row, rowIdx) => {
53
+ const lines = rowLineCount(row);
54
+ const rowHeight = Math.max(options.rowHeight ?? 22, lines * fontSize * 1.3 + 10);
55
+ if (y + rowHeight > doc.page.height - config.margins.bottom) {
56
+ doc.addPage();
57
+ y = drawHeader(config.margins.top);
58
+ }
59
+ if (striped && rowIdx % 2 === 1) {
60
+ doc.rect(x, y, totalWidth, rowHeight).fill(theme.tableStripeBg);
61
+ }
62
+ doc.fillColor(theme.text).font('Helvetica').fontSize(fontSize);
63
+ let colX = x;
64
+ columns.forEach((col, i) => {
65
+ doc.text(cellValue(row, col, i), colX + 6, y + 6, {
66
+ width: widths[i] - 12,
67
+ align: col.align || 'left'
68
+ });
69
+ colX += widths[i];
70
+ });
71
+ doc
72
+ .strokeColor(theme.border)
73
+ .lineWidth(0.5)
74
+ .moveTo(x, y + rowHeight)
75
+ .lineTo(x + totalWidth, y + rowHeight)
76
+ .stroke();
77
+ y += rowHeight;
78
+ });
79
+ doc.x = x;
80
+ doc.y = y;
81
+ return y;
82
+ }
83
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/utils/table.ts"],"names":[],"mappings":";;AAwBA,8BA4FC;AAjGD;;;;GAIG;AACH,SAAgB,SAAS,CACvB,GAAW,EACX,MAAiB,EACjB,KAAY,EACZ,OAAsB,EACtB,IAAwC,EACxC,UAAwB,EAAE;IAE1B,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9B,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;IAC/E,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IAExC,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC3D,MAAM,SAAS,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,aAAa,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;IAExD,MAAM,SAAS,GAAG,CAAC,GAAgC,EAAE,GAAgB,EAAE,GAAW,EAAU,EAAE;QAC5F,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAa,CAAC,CAAC;QACnE,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,GAAgC,EAAU,EAAE;QAChE,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACzB,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC;YACnD,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,CAAS,EAAU,EAAE;QACvC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACnE,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/E,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACzB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE;gBAClE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE;gBACrB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,MAAM;aAC3B,CAAC,CAAC;YACH,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,YAAY,CAAC;IAC1B,CAAC,CAAC;IAEF,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC/D,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;IACzB,CAAC;IACD,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAElB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,EAAE,KAAK,GAAG,QAAQ,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;QAEjF,IAAI,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC5D,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,OAAO,IAAI,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClE,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACzB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;gBAChD,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE;gBACrB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,MAAM;aAC3B,CAAC,CAAC;YACH,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,GAAG;aACA,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;aACzB,SAAS,CAAC,GAAG,CAAC;aACd,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;aACxB,MAAM,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,SAAS,CAAC;aACrC,MAAM,EAAE,CAAC;QAEZ,CAAC,IAAI,SAAS,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function requireFields(data: Record<string, any>, fields: string[], templateName: string): void;
2
+ /** Accepts a Date instance or a date string/ISO string and returns a Date. */
3
+ export declare function toDate(value: Date | string | undefined, fallback?: Date): Date;
4
+ export declare function formatDate(value: Date | string | undefined): string;
5
+ export declare function formatCurrency(amount: number, currency?: string): string;
6
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAKrG;AAED,8EAA8E;AAC9E,wBAAgB,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,EAAE,QAAQ,GAAE,IAAiB,GAAG,IAAI,CAO1F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAEnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAc,GAAG,MAAM,CAM/E"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requireFields = requireFields;
4
+ exports.toDate = toDate;
5
+ exports.formatDate = formatDate;
6
+ exports.formatCurrency = formatCurrency;
7
+ function requireFields(data, fields, templateName) {
8
+ const missing = fields.filter((f) => data[f] === undefined || data[f] === null || data[f] === '');
9
+ if (missing.length > 0) {
10
+ throw new Error(`Missing required field(s) for "${templateName}" template: ${missing.join(', ')}`);
11
+ }
12
+ }
13
+ /** Accepts a Date instance or a date string/ISO string and returns a Date. */
14
+ function toDate(value, fallback = new Date()) {
15
+ if (value instanceof Date)
16
+ return value;
17
+ if (typeof value === 'string') {
18
+ const parsed = new Date(value);
19
+ if (!isNaN(parsed.getTime()))
20
+ return parsed;
21
+ }
22
+ return fallback;
23
+ }
24
+ function formatDate(value) {
25
+ return toDate(value).toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' });
26
+ }
27
+ function formatCurrency(amount, currency = 'USD') {
28
+ try {
29
+ return new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(amount);
30
+ }
31
+ catch {
32
+ return `$${amount.toFixed(2)}`;
33
+ }
34
+ }
35
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":";;AAAA,sCAKC;AAGD,wBAOC;AAED,gCAEC;AAED,wCAMC;AA3BD,SAAgB,aAAa,CAAC,IAAyB,EAAE,MAAgB,EAAE,YAAoB;IAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAClG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,kCAAkC,YAAY,eAAe,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,SAAgB,MAAM,CAAC,KAAgC,EAAE,WAAiB,IAAI,IAAI,EAAE;IAClF,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAAE,OAAO,MAAM,CAAC;IAC9C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,UAAU,CAAC,KAAgC;IACzD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;AACzG,CAAC;AAED,SAAgB,cAAc,CAAC,MAAc,EAAE,WAAmB,KAAK;IACrE,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACjC,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "pdf-gen-js",
3
+ "version": "1.0.0",
4
+ "description": "JavaScript/TypeScript PDF generation with templates",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "pdf-gen": "bin/cli.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "bin"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "prepublishOnly": "npm run build && npm test",
17
+ "test": "npm run build && node --test",
18
+ "dev": "tsc --watch"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/Ahmedz182/universal-pdf-gen.git",
23
+ "directory": "packages/pdf-gen-js"
24
+ },
25
+ "homepage": "https://github.com/Ahmedz182/universal-pdf-gen#readme",
26
+ "bugs": {
27
+ "url": "https://github.com/Ahmedz182/universal-pdf-gen/issues"
28
+ },
29
+ "dependencies": {
30
+ "pdfkit": "^0.13.0",
31
+ "sharp": "^0.35.4",
32
+ "svg-to-pdfkit": "^0.1.8"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^20.0.0",
36
+ "@types/pdfkit": "^0.12.0",
37
+ "typescript": "^5.0.0"
38
+ },
39
+ "keywords": [
40
+ "pdf",
41
+ "generation",
42
+ "templates",
43
+ "invoice",
44
+ "certificate"
45
+ ],
46
+ "author": "Ahmed Fayyaz",
47
+ "license": "MIT"
48
+ }