@sme.up/doc-alchemist 1.5.0-SNAPSHOT-20251118133453 → 1.5.0-SNAPSHOT-20251121152517

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.
package/README.md CHANGED
@@ -9,7 +9,7 @@ A comprehensive TypeScript library for generating documents from SmeupDataTable
9
9
  - **Chart Generation**: Create interactive charts (bar, line, pie, scatter) from data tables
10
10
  - **Data Table Support**: Convert SmeupDataTable structures to multiple formats
11
11
  - **Data Tree Support**: Convert SmeupDataTree structures with hierarchical representation
12
- - **Scheda PDF Export**: Generate complex PDF documents with charts and structured layouts
12
+ - **PdfMake Rendering**: Render `pdfmake` document definitions to PDF including adapter support for SmeUP table formats and FUN-based table resolution (see `pdfmakeDocumentToPdfData`).
13
13
 
14
14
  ## Installation
15
15
 
@@ -24,7 +24,6 @@ import {
24
24
  dataTableToExcelData,
25
25
  dataTreeToExcelData,
26
26
  dataTableToPdfData,
27
- schedaToPdfData,
28
27
  dataTableToChart,
29
28
  } from "@sme.up/doc-alchemist";
30
29
  import { SupportedExportFormats } from "@sme.up/doc-alchemist";
@@ -166,16 +165,45 @@ Converts SmeupDataTable to PDF binary data with professional formatting.
166
165
 
167
166
  **Returns:** `Promise<Buffer | Uint8Array>`
168
167
 
169
- #### `schedaToPdfData(sch, managerData)`
168
+ #### `pdfmakeDocumentToPdfData(document, context)`
170
169
 
171
- Converts SmeupSch (scheda) structure to PDF with charts and structured layouts.
170
+ Renders a `pdfmake` document definition into PDF binary data. This function extends the standard `pdfmake` workflow by supporting:
171
+
172
+ - native `pdfmake` document definitions (tables, columns, text, etc.);
173
+ - SmeUP structured tables (when a `table.data` object uses `SmeupDataTable`/`SmeupDataTree` formats) via the adapter chain;
174
+ - FUN-based table definitions: a `table` node can specify a `fun` string which is resolved by the optional `getSmeupDataStructure` callback in the converter context.
172
175
 
173
176
  **Parameters:**
174
177
 
175
- - `sch`: SmeupSch object containing sections and components
176
- - `managerData`: Configuration object with locale and theme settings
178
+ - `document`: A `pdfmake`-style document definition object. Table entries may be plain `pdfmake` tables, or adapter-aware objects with `table.data` (Smeup format) or `table.fun` (FUN string).
179
+ - `context` (optional): Partial `PdfMakeConverterContext` including:
180
+ - `webupManagerData`: formatting/localization options (see `WebupManagerData`);
181
+ - `getSmeupDataStructure(fun: string)`: async function used to resolve FUN strings into Smeup data structures when `table.fun` is present.
182
+
183
+ **Returns:** `Promise<Buffer>` — PDF binary data ready to be written to disk.
184
+
185
+ **Example (based on `debug-pdfmake.ts`):**
186
+
187
+ ```ts
188
+ import { pdfmakeDocumentToPdfData, WebupManagerData } from "./src/index";
189
+
190
+ const webupManagerData: WebupManagerData = { mathLocale: "it-IT", datesLocale: "it-IT" };
177
191
 
178
- **Returns:** `Promise<Buffer>`
192
+ // native pdfmake doc
193
+ const tableDoc = { content: [ { text: "Data", fontSize: 20 }, { table: { headerRows: 1, body: [["A","B"],["1","2"]] } } ] };
194
+ const pdf1 = await pdfmakeDocumentToPdfData(tableDoc, { webupManagerData });
195
+
196
+ // smeup table (adapter will convert to pdfmake table)
197
+ const smeupDoc = { content: [ { table: { data: { type: "SmeupDataTable", columns: [...], rows: [...] } } } ] };
198
+ const pdf2 = await pdfmakeDocumentToPdfData(smeupDoc, { webupManagerData });
199
+
200
+ // FUN-based table (adapter will call getSmeupDataStructure to fetch data)
201
+ const funDoc = { content: [ { table: { fun: "F(EXB;SERV;MET)" } } ] };
202
+ const pdf3 = await pdfmakeDocumentToPdfData(funDoc, {
203
+ webupManagerData,
204
+ getSmeupDataStructure: async (fun) => { /* resolve and return SmeupDataTable */ },
205
+ });
206
+ ```
179
207
 
180
208
  #### `dataTableToChart(dataTable, chartType, chartOptions)`
181
209
 
@@ -260,8 +288,9 @@ npm start
260
288
 
261
289
  # Run specific debug examples
262
290
  npx tsx debug-charts.ts # Generate chart examples
263
- npx tsx debug-pdf.ts # Generate PDF examples
264
- npx tsx debug-sch.ts # Generate scheda PDF examples
291
+ npx tsx debug-pdf.ts # Generate PDF examples of matrix
292
+ npx tsx debug-pdfmake.ts # Generate PDF examples by using pdfmake
293
+
265
294
 
266
295
  # Output files will be saved to ./output/ directory
267
296
  ```
@@ -382,45 +411,6 @@ const barChart = await dataTableToChart(dataTable, "bar", {
382
411
  });
383
412
  ```
384
413
 
385
- ### Scheda PDF with Multiple Charts
386
-
387
- ```typescript
388
- import { schedaToPdfData } from "@sme.up/doc-alchemist";
389
-
390
- const scheda = {
391
- layout: "column",
392
- sections: [
393
- {
394
- layout: "row",
395
- dim: "50",
396
- components: [
397
- {
398
- type: "EXA",
399
- title: "Sales Trend",
400
- data: salesDataTable,
401
- options: {
402
- EXA: [
403
- {
404
- Width: "800",
405
- Height: "400",
406
- Series: "SALES",
407
- },
408
- ],
409
- },
410
- },
411
- ],
412
- },
413
- // Additional sections...
414
- ],
415
- };
416
-
417
- const schedaPdfBuffer = await schedaToPdfData(scheda, {
418
- mathLocale: "it-IT",
419
- datesLocale: "it-IT",
420
- themeBackground: "",
421
- });
422
- ```
423
-
424
414
  ## Dependencies
425
415
 
426
416
  This library includes the following key dependencies:
@@ -431,6 +421,7 @@ This library includes the following key dependencies:
431
421
  - **ECharts**: For chart generation
432
422
  - **Canvas**: For server-side image rendering
433
423
  - **PDF-lib**: For PDF manipulation and merging
424
+ - **pdfmake**: For rendering `pdfmake` document definitions to PDF
434
425
 
435
426
  ## Browser vs Node.js Support
436
427
 
@@ -0,0 +1,11 @@
1
+ import { PdfMakeConverterContext, PdfmakeAdapter, AdapterRegistry } from "./pdfmake.types";
2
+ /**
3
+ * Processes a document recursively, applying adapters to matching elements.
4
+ *
5
+ * @param element - The current element to process
6
+ * @param adapters - Map of element types to their adapter functions
7
+ * @param context - Current processing context
8
+ * @returns The transformed element
9
+ */
10
+ export declare function processDocument(element: unknown, adapters: Map<string, PdfmakeAdapter>, context: PdfMakeConverterContext): Promise<unknown>;
11
+ export declare const preProcessPdfMakeDocument: (documentDefinition: Record<string, unknown>, registry?: AdapterRegistry, context?: Partial<PdfMakeConverterContext>) => Promise<Record<string, unknown>>;
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.preProcessPdfMakeDocument = void 0;
4
+ exports.processDocument = processDocument;
5
+ const pdfmake_types_1 = require("./pdfmake.types");
6
+ /**
7
+ * Helper to check if a value is a plain object
8
+ */
9
+ function isPlainObject(value) {
10
+ return (typeof value === "object" &&
11
+ value !== null &&
12
+ !Array.isArray(value) &&
13
+ Object.prototype.toString.call(value) === "[object Object]");
14
+ }
15
+ /**
16
+ * Processes a document recursively, applying adapters to matching elements.
17
+ *
18
+ * @param element - The current element to process
19
+ * @param adapters - Map of element types to their adapter functions
20
+ * @param context - Current processing context
21
+ * @returns The transformed element
22
+ */
23
+ async function processDocument(element, adapters, context) {
24
+ // Handle null/undefined
25
+ if (element == null) {
26
+ return element;
27
+ }
28
+ try {
29
+ // Handle arrays - process each item
30
+ if (Array.isArray(element)) {
31
+ return await Promise.all(element.map((item, index) => processDocument(item, adapters, {
32
+ ...context,
33
+ path: [...context.path, String(index)],
34
+ depth: context.depth + 1,
35
+ })));
36
+ }
37
+ // Handle plain objects
38
+ if (isPlainObject(element)) {
39
+ // Try to apply adapters based on element type
40
+ const elementType = element.type;
41
+ if (elementType && adapters.has(elementType)) {
42
+ const adapter = adapters.get(elementType);
43
+ element = await adapter(element, context);
44
+ // After transformation, element might not be a plain object anymore
45
+ if (!isPlainObject(element)) {
46
+ return element;
47
+ }
48
+ }
49
+ // Also try adapters based on properties (e.g., "table" property)
50
+ for (const [key, adapter] of adapters.entries()) {
51
+ // Skip type-based adapters already processed
52
+ if (key === elementType)
53
+ continue;
54
+ // Apply adapter if it matches a property name
55
+ if (key in element) {
56
+ const transformed = await adapter(element, context);
57
+ // Only accept transformation if adapter actually changed something
58
+ if (transformed !== element) {
59
+ element = transformed;
60
+ // After transformation, element might not be a plain object anymore
61
+ if (!isPlainObject(element)) {
62
+ return element;
63
+ }
64
+ break; // Only apply first matching adapter
65
+ }
66
+ }
67
+ }
68
+ // Recursively process all properties
69
+ const processed = {};
70
+ for (const [key, value] of Object.entries(element)) {
71
+ processed[key] = await processDocument(value, adapters, {
72
+ ...context,
73
+ path: [...context.path, key],
74
+ depth: context.depth + 1,
75
+ });
76
+ }
77
+ return processed;
78
+ }
79
+ // Primitive values - return as-is
80
+ return element;
81
+ }
82
+ catch (err) {
83
+ throw new pdfmake_types_1.AdapterError(err, element);
84
+ }
85
+ }
86
+ const preProcessPdfMakeDocument = async (documentDefinition, registry, context) => {
87
+ if (!registry) {
88
+ return Promise.resolve(documentDefinition);
89
+ }
90
+ else {
91
+ return (await registry?.process(documentDefinition, context));
92
+ }
93
+ };
94
+ exports.preProcessPdfMakeDocument = preProcessPdfMakeDocument;
95
+ //# sourceMappingURL=adapter-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-processor.js","sourceRoot":"","sources":["../../../../src/converters/pdf/pdfmake/adapter-processor.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n PdfMakeConverterContext,\n AdapterError,\n PdfmakeAdapter,\n AdapterRegistry,\n} from \"./pdfmake.types\";\n\n/**\n * Helper to check if a value is a plain object\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === \"[object Object]\"\n );\n}\n\n/**\n * Processes a document recursively, applying adapters to matching elements.\n *\n * @param element - The current element to process\n * @param adapters - Map of element types to their adapter functions\n * @param context - Current processing context\n * @returns The transformed element\n */\nexport async function processDocument(\n element: unknown,\n adapters: Map<string, PdfmakeAdapter>,\n context: PdfMakeConverterContext,\n): Promise<unknown> {\n // Handle null/undefined\n if (element == null) {\n return element;\n }\n try {\n // Handle arrays - process each item\n if (Array.isArray(element)) {\n return await Promise.all(\n element.map((item, index) =>\n processDocument(item, adapters, {\n ...context,\n path: [...context.path, String(index)],\n depth: context.depth + 1,\n }),\n ),\n );\n }\n\n // Handle plain objects\n if (isPlainObject(element)) {\n // Try to apply adapters based on element type\n const elementType = element.type as string | undefined;\n if (elementType && adapters.has(elementType)) {\n const adapter = adapters.get(elementType)!;\n element = await adapter(element, context);\n\n // After transformation, element might not be a plain object anymore\n if (!isPlainObject(element)) {\n return element;\n }\n }\n\n // Also try adapters based on properties (e.g., \"table\" property)\n for (const [key, adapter] of adapters.entries()) {\n // Skip type-based adapters already processed\n if (key === elementType) continue;\n\n // Apply adapter if it matches a property name\n if (key in element) {\n const transformed = await adapter(element, context);\n // Only accept transformation if adapter actually changed something\n if (transformed !== element) {\n element = transformed;\n // After transformation, element might not be a plain object anymore\n if (!isPlainObject(element)) {\n return element;\n }\n break; // Only apply first matching adapter\n }\n }\n }\n\n // Recursively process all properties\n const processed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(\n element as Record<string, unknown>,\n )) {\n processed[key] = await processDocument(value, adapters, {\n ...context,\n path: [...context.path, key],\n depth: context.depth + 1,\n });\n }\n return processed;\n }\n\n // Primitive values - return as-is\n return element;\n } catch (err) {\n throw new AdapterError(err as string, element);\n }\n}\n\nexport const preProcessPdfMakeDocument = async (\n documentDefinition: Record<string, unknown>,\n registry?: AdapterRegistry,\n context?: Partial<PdfMakeConverterContext>,\n): Promise<Record<string, unknown>> => {\n if (!registry) {\n return Promise.resolve(documentDefinition);\n } else {\n return (await registry?.process(documentDefinition, context)) as Record<\n string,\n unknown\n >;\n }\n};\n"]}
@@ -0,0 +1,22 @@
1
+ import { AdapterRegistry } from "./pdfmake.types";
2
+ /**
3
+ * Creates a new adapter registry for runtime registration and processing of pdfmake adapters.
4
+ * Each registry is independent and maintains its own set of adapters.
5
+ *
6
+ * @returns A new AdapterRegistry instance
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const registry = createAdapterRegistry();
11
+ *
12
+ * // Register an adapter for tables
13
+ * registry.register('table', (element, context) => {
14
+ * // Transform custom table format to pdfmake format
15
+ * return { table: { body: transformData(element.data) } };
16
+ * });
17
+ *
18
+ * // Process a document
19
+ * const transformed = registry.process(documentDefinition, { webupManagerData });
20
+ * ```
21
+ */
22
+ export declare function createAdapterRegistry(): AdapterRegistry;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAdapterRegistry = createAdapterRegistry;
4
+ const adapter_processor_1 = require("./adapter-processor");
5
+ /**
6
+ * Creates a new adapter registry for runtime registration and processing of pdfmake adapters.
7
+ * Each registry is independent and maintains its own set of adapters.
8
+ *
9
+ * @returns A new AdapterRegistry instance
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const registry = createAdapterRegistry();
14
+ *
15
+ * // Register an adapter for tables
16
+ * registry.register('table', (element, context) => {
17
+ * // Transform custom table format to pdfmake format
18
+ * return { table: { body: transformData(element.data) } };
19
+ * });
20
+ *
21
+ * // Process a document
22
+ * const transformed = registry.process(documentDefinition, { webupManagerData });
23
+ * ```
24
+ */
25
+ function createAdapterRegistry() {
26
+ const adapters = new Map();
27
+ return {
28
+ register(elementType, adapter) {
29
+ adapters.set(elementType, adapter);
30
+ },
31
+ unregister(elementType) {
32
+ adapters.delete(elementType);
33
+ },
34
+ async process(document, context) {
35
+ const fullContext = {
36
+ webupManagerData: context?.webupManagerData,
37
+ getSmeupDataStructure: context?.getSmeupDataStructure,
38
+ path: context?.path ?? [],
39
+ depth: context?.depth ?? 0,
40
+ };
41
+ const processed = await (0, adapter_processor_1.processDocument)(document, adapters, fullContext);
42
+ return processed;
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=adapter-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-registry.js","sourceRoot":"","sources":["../../../../src/converters/pdf/pdfmake/adapter-registry.ts"],"names":[],"mappings":";;AA2BA,sDA0BC;AAhDD,2DAAsD;AAEtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,qBAAqB;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEnD,OAAO;QACL,QAAQ,CAAC,WAAmB,EAAE,OAAuB;YACnD,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;QAED,UAAU,CAAC,WAAmB;YAC5B,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,OAAO,CACX,QAAiB,EACjB,OAA0C;YAE1C,MAAM,WAAW,GAA4B;gBAC3C,gBAAgB,EAAE,OAAO,EAAE,gBAAgB;gBAC3C,qBAAqB,EAAE,OAAO,EAAE,qBAAqB;gBACrD,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE;gBACzB,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;aAC3B,CAAC;YACF,MAAM,SAAS,GAAG,MAAM,IAAA,mCAAe,EAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YACzE,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import {\n AdapterRegistry,\n PdfmakeAdapter,\n PdfMakeConverterContext,\n} from \"./pdfmake.types\";\nimport { processDocument } from \"./adapter-processor\";\n\n/**\n * Creates a new adapter registry for runtime registration and processing of pdfmake adapters.\n * Each registry is independent and maintains its own set of adapters.\n *\n * @returns A new AdapterRegistry instance\n *\n * @example\n * ```typescript\n * const registry = createAdapterRegistry();\n *\n * // Register an adapter for tables\n * registry.register('table', (element, context) => {\n * // Transform custom table format to pdfmake format\n * return { table: { body: transformData(element.data) } };\n * });\n *\n * // Process a document\n * const transformed = registry.process(documentDefinition, { webupManagerData });\n * ```\n */\nexport function createAdapterRegistry(): AdapterRegistry {\n const adapters = new Map<string, PdfmakeAdapter>();\n\n return {\n register(elementType: string, adapter: PdfmakeAdapter): void {\n adapters.set(elementType, adapter);\n },\n\n unregister(elementType: string): void {\n adapters.delete(elementType);\n },\n\n async process(\n document: unknown,\n context?: Partial<PdfMakeConverterContext>,\n ): Promise<unknown> {\n const fullContext: PdfMakeConverterContext = {\n webupManagerData: context?.webupManagerData,\n getSmeupDataStructure: context?.getSmeupDataStructure,\n path: context?.path ?? [],\n depth: context?.depth ?? 0,\n };\n const processed = await processDocument(document, adapters, fullContext);\n return processed;\n },\n };\n}\n"]}
@@ -0,0 +1,35 @@
1
+ import { WebupManagerData } from "../../../types";
2
+ import { SmeupDataStructure } from "../../../types/data-structures/smeupDataStructure";
3
+ /**
4
+ * Context passed to adapter functions during document processing.
5
+ */
6
+ export interface PdfMakeConverterContext<T extends SmeupDataStructure = SmeupDataStructure> {
7
+ /** WebUp manager data containing locale and theme settings */
8
+ webupManagerData?: WebupManagerData;
9
+ /** Path in the document tree (e.g., ['content', 0, 'table']) */
10
+ path: string[];
11
+ /** Current depth in the document tree */
12
+ depth: number;
13
+ getSmeupDataStructure?: (fun: string) => Promise<T>;
14
+ }
15
+ /**
16
+ * Function that transforms an element from custom format to pdfmake standard format.
17
+ * Adapters are pure functions that receive an element and context, and return the transformed element.
18
+ * Can be synchronous or asynchronous.
19
+ */
20
+ export type PdfmakeAdapter = (element: unknown, context: PdfMakeConverterContext) => unknown | Promise<unknown>;
21
+ /**
22
+ * Registry interface for managing pdfmake adapters at runtime.
23
+ */
24
+ export interface AdapterRegistry {
25
+ /** Register an adapter for a specific element type */
26
+ register: (elementType: string, adapter: PdfmakeAdapter) => void;
27
+ /** Unregister an adapter for a specific element type */
28
+ unregister: (elementType: string) => void;
29
+ /** Process a document by applying registered adapters */
30
+ process: (document: unknown, context?: Partial<PdfMakeConverterContext>) => Promise<unknown>;
31
+ }
32
+ export declare class AdapterError extends Error {
33
+ element: unknown;
34
+ constructor(message: string, element: unknown);
35
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdapterError = void 0;
4
+ class AdapterError extends Error {
5
+ element;
6
+ constructor(message, element) {
7
+ super(message);
8
+ this.element = element;
9
+ Object.setPrototypeOf(this, AdapterError.prototype);
10
+ }
11
+ }
12
+ exports.AdapterError = AdapterError;
13
+ //# sourceMappingURL=pdfmake.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfmake.types.js","sourceRoot":"","sources":["../../../../src/converters/pdf/pdfmake/pdfmake.types.ts"],"names":[],"mappings":";;;AA2CA,MAAa,YAAa,SAAQ,KAAK;IACrC,OAAO,CAAU;IACjB,YAAY,OAAe,EAAE,OAAgB;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;CACF;AAPD,oCAOC","sourcesContent":["import { WebupManagerData } from \"../../../types\";\nimport { SmeupDataStructure } from \"../../../types/data-structures/smeupDataStructure\";\n\n/**\n * Context passed to adapter functions during document processing.\n */\nexport interface PdfMakeConverterContext<\n T extends SmeupDataStructure = SmeupDataStructure,\n> {\n /** WebUp manager data containing locale and theme settings */\n webupManagerData?: WebupManagerData;\n /** Path in the document tree (e.g., ['content', 0, 'table']) */\n path: string[];\n /** Current depth in the document tree */\n depth: number;\n getSmeupDataStructure?: (fun: string) => Promise<T>;\n}\n\n/**\n * Function that transforms an element from custom format to pdfmake standard format.\n * Adapters are pure functions that receive an element and context, and return the transformed element.\n * Can be synchronous or asynchronous.\n */\nexport type PdfmakeAdapter = (\n element: unknown,\n context: PdfMakeConverterContext,\n) => unknown | Promise<unknown>;\n\n/**\n * Registry interface for managing pdfmake adapters at runtime.\n */\nexport interface AdapterRegistry {\n /** Register an adapter for a specific element type */\n register: (elementType: string, adapter: PdfmakeAdapter) => void;\n /** Unregister an adapter for a specific element type */\n unregister: (elementType: string) => void;\n /** Process a document by applying registered adapters */\n process: (\n document: unknown,\n context?: Partial<PdfMakeConverterContext>,\n ) => Promise<unknown>;\n}\n\nexport class AdapterError extends Error {\n element: unknown;\n constructor(message: string, element: unknown) {\n super(message);\n this.element = element;\n Object.setPrototypeOf(this, AdapterError.prototype);\n }\n}\n"]}
@@ -0,0 +1,31 @@
1
+ import { PdfMakeConverterContext } from "./pdfmake.types";
2
+ /**
3
+ * Adapts a Smeup table structure to the PDFMake table format.
4
+ *
5
+ * This adapter function checks if the provided element contains a table with data.
6
+ * If so, it transforms the table's columns and rows into the PDFMake `body` format,
7
+ * where the first row is the header (column titles) and subsequent rows are the data.
8
+ * All properties of the original table except `data` are preserved.
9
+ *
10
+ * @returns A function that takes an element and returns the adapted element for PDFMake,
11
+ * or the original element if it does not contain a valid table with data.
12
+ */
13
+ export declare function smeupTableToPdfMakeTableAdapter(): (element: unknown) => unknown;
14
+ /**
15
+ * Adapter function for converting a table element with a `fun` property to a Smeup table structure.
16
+ *
17
+ * This function returns an asynchronous converter that checks if the provided element contains
18
+ * a table with a `fun` property. If present, it uses the `getSmeupDataStructure` function from
19
+ * the context to fetch the table data corresponding to the `fun` string, and replaces the original
20
+ * table's `fun` property with the fetched data under the `data` property. All other properties
21
+ * of the table are preserved.
22
+ *
23
+ * @returns An asynchronous function that takes an element and a context, and returns the adapted element.
24
+ *
25
+ * @throws If the context does not provide a `getSmeupDataStructure` function when the `fun` property is used.
26
+ *
27
+ * @param element - The input element to be adapted.
28
+ * @param context - The conversion context, which must provide `getSmeupDataStructure` if the `fun` property is present.
29
+ */
30
+ export declare function funToSmeupTableAdapter(): (element: unknown, context: PdfMakeConverterContext) => Promise<unknown>;
31
+ export declare function dataTableAdapter(): (element: unknown, context: PdfMakeConverterContext) => Promise<unknown>;
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.smeupTableToPdfMakeTableAdapter = smeupTableToPdfMakeTableAdapter;
4
+ exports.funToSmeupTableAdapter = funToSmeupTableAdapter;
5
+ exports.dataTableAdapter = dataTableAdapter;
6
+ const smeupDataStructure_1 = require("../../../types/data-structures/smeupDataStructure");
7
+ function hasData(element) {
8
+ return (typeof element === "object" &&
9
+ element !== null &&
10
+ "table" in element &&
11
+ typeof element.table === "object" &&
12
+ element.table !== null &&
13
+ "data" in element.table);
14
+ }
15
+ function hasTableWithDataTable(element) {
16
+ return (hasData(element) &&
17
+ typeof element.table.data === "object" &&
18
+ element.table.data !== null &&
19
+ "type" in element.table.data &&
20
+ element.table.data.type ===
21
+ smeupDataStructure_1.SmeupDataStructureType.SmeupDataTable &&
22
+ "rows" in element.table.data &&
23
+ "columns" in
24
+ element.table.data);
25
+ }
26
+ function hasTableWithFun(element) {
27
+ return (typeof element.table.fun === "string" &&
28
+ element.table.fun.length > 0);
29
+ }
30
+ /**
31
+ * Adapts a Smeup table structure to the PDFMake table format.
32
+ *
33
+ * This adapter function checks if the provided element contains a table with data.
34
+ * If so, it transforms the table's columns and rows into the PDFMake `body` format,
35
+ * where the first row is the header (column titles) and subsequent rows are the data.
36
+ * All properties of the original table except `data` are preserved.
37
+ *
38
+ * @returns A function that takes an element and returns the adapted element for PDFMake,
39
+ * or the original element if it does not contain a valid table with data.
40
+ */
41
+ function smeupTableToPdfMakeTableAdapter() {
42
+ return (element) => {
43
+ if (!hasTableWithDataTable(element)) {
44
+ return element;
45
+ }
46
+ const { columns, rows } = element.table.data;
47
+ // Build header row from column titles
48
+ const headerRow = columns.map(col => col.title);
49
+ // Build data rows by extracting values in column order
50
+ const dataRows = rows.map(row => columns.map(col => {
51
+ const cell = row.cells?.[col.name];
52
+ const value = cell?.value;
53
+ // Convert to string representation for PDF
54
+ return value != null ? String(value) : "";
55
+ }));
56
+ // Combine header and data rows
57
+ const body = [headerRow, ...dataRows];
58
+ // Extract all properties except 'data' from the table object
59
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
60
+ const { data, ...tableRest } = element.table;
61
+ return {
62
+ ...element,
63
+ table: {
64
+ ...tableRest,
65
+ body,
66
+ },
67
+ };
68
+ };
69
+ }
70
+ /**
71
+ * Adapter function for converting a table element with a `fun` property to a Smeup table structure.
72
+ *
73
+ * This function returns an asynchronous converter that checks if the provided element contains
74
+ * a table with a `fun` property. If present, it uses the `getSmeupDataStructure` function from
75
+ * the context to fetch the table data corresponding to the `fun` string, and replaces the original
76
+ * table's `fun` property with the fetched data under the `data` property. All other properties
77
+ * of the table are preserved.
78
+ *
79
+ * @returns An asynchronous function that takes an element and a context, and returns the adapted element.
80
+ *
81
+ * @throws If the context does not provide a `getSmeupDataStructure` function when the `fun` property is used.
82
+ *
83
+ * @param element - The input element to be adapted.
84
+ * @param context - The conversion context, which must provide `getSmeupDataStructure` if the `fun` property is present.
85
+ */
86
+ function funToSmeupTableAdapter() {
87
+ return async (element, context) => {
88
+ if (!hasTableWithFun(element)) {
89
+ return element;
90
+ }
91
+ else {
92
+ if (!context.getSmeupDataStructure) {
93
+ throw new Error("getSmeupDataStructure function is required in context when the fun property is used");
94
+ }
95
+ else {
96
+ const funStr = element.table.fun;
97
+ const dataTable = await context.getSmeupDataStructure(funStr);
98
+ // Extract all properties except 'fun' from the table object
99
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
100
+ const { fun, ...tableRest } = element.table;
101
+ return {
102
+ ...element,
103
+ table: {
104
+ ...tableRest,
105
+ data: dataTable,
106
+ },
107
+ };
108
+ }
109
+ }
110
+ };
111
+ }
112
+ function dataTableAdapter() {
113
+ return async (element, context) => {
114
+ const adaptedElement = await funToSmeupTableAdapter()(element, context);
115
+ return await smeupTableToPdfMakeTableAdapter()(adaptedElement);
116
+ };
117
+ }
118
+ //# sourceMappingURL=table-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-adapter.js","sourceRoot":"","sources":["../../../../src/converters/pdf/pdfmake/table-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { SmeupDataStructureType } from \"../../../types/data-structures/smeupDataStructure\";\nimport { SmeupDataTable } from \"../../../types/data-structures/smeupDataTable\";\nimport { PdfMakeConverterContext } from \"./pdfmake.types\";\n\nfunction hasData(element: unknown): element is { table: { data: unknown } } {\n return (\n typeof element === \"object\" &&\n element !== null &&\n \"table\" in element &&\n typeof (element as { table: unknown }).table === \"object\" &&\n (element as { table: unknown }).table !== null &&\n \"data\" in (element as { table: { data: unknown } }).table\n );\n}\n\nfunction hasTableWithDataTable(\n element: unknown,\n): element is { table: { data: SmeupDataTable } } {\n return (\n hasData(element) &&\n typeof (element as { table: { data: unknown } }).table.data === \"object\" &&\n (element as { table: { data: unknown } }).table.data !== null &&\n \"type\" in (element as { table: { data: { type: unknown } } }).table.data &&\n (element as { table: { data: { type: unknown } } }).table.data.type ===\n SmeupDataStructureType.SmeupDataTable &&\n \"rows\" in (element as { table: { data: { rows: unknown } } }).table.data &&\n \"columns\" in\n (element as { table: { data: { columns: unknown } } }).table.data\n );\n}\n\nfunction hasTableWithFun(\n element: unknown,\n): element is { table: { fun: string } } {\n return (\n typeof (element as { table: { fun: string } }).table.fun === \"string\" &&\n (element as { table: { fun: string } }).table.fun.length > 0\n );\n}\n\n/**\n * Adapts a Smeup table structure to the PDFMake table format.\n *\n * This adapter function checks if the provided element contains a table with data.\n * If so, it transforms the table's columns and rows into the PDFMake `body` format,\n * where the first row is the header (column titles) and subsequent rows are the data.\n * All properties of the original table except `data` are preserved.\n *\n * @returns A function that takes an element and returns the adapted element for PDFMake,\n * or the original element if it does not contain a valid table with data.\n */\nexport function smeupTableToPdfMakeTableAdapter() {\n return (element: unknown): unknown => {\n if (!hasTableWithDataTable(element)) {\n return element;\n }\n\n const { columns, rows } = element.table.data;\n\n // Build header row from column titles\n const headerRow = columns.map(col => col.title);\n\n // Build data rows by extracting values in column order\n const dataRows = rows.map(row =>\n columns.map(col => {\n const cell = row.cells?.[col.name];\n const value = cell?.value;\n // Convert to string representation for PDF\n return value != null ? String(value) : \"\";\n }),\n );\n\n // Combine header and data rows\n const body = [headerRow, ...dataRows];\n\n // Extract all properties except 'data' from the table object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { data, ...tableRest } = element.table;\n\n return {\n ...element,\n table: {\n ...tableRest,\n body,\n },\n };\n };\n}\n\n/**\n * Adapter function for converting a table element with a `fun` property to a Smeup table structure.\n *\n * This function returns an asynchronous converter that checks if the provided element contains\n * a table with a `fun` property. If present, it uses the `getSmeupDataStructure` function from\n * the context to fetch the table data corresponding to the `fun` string, and replaces the original\n * table's `fun` property with the fetched data under the `data` property. All other properties\n * of the table are preserved.\n *\n * @returns An asynchronous function that takes an element and a context, and returns the adapted element.\n *\n * @throws If the context does not provide a `getSmeupDataStructure` function when the `fun` property is used.\n *\n * @param element - The input element to be adapted.\n * @param context - The conversion context, which must provide `getSmeupDataStructure` if the `fun` property is present.\n */\nexport function funToSmeupTableAdapter() {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n if (!hasTableWithFun(element)) {\n return element;\n } else {\n if (!context.getSmeupDataStructure) {\n throw new Error(\n \"getSmeupDataStructure function is required in context when the fun property is used\",\n );\n } else {\n const funStr = element.table.fun;\n const dataTable = await context.getSmeupDataStructure(funStr);\n // Extract all properties except 'fun' from the table object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { fun, ...tableRest } = element.table;\n\n return {\n ...element,\n table: {\n ...tableRest,\n data: dataTable,\n },\n };\n }\n }\n };\n}\n\nexport function dataTableAdapter() {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n const adaptedElement = await funToSmeupTableAdapter()(element, context);\n return await smeupTableToPdfMakeTableAdapter()(adaptedElement);\n };\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { TDocumentDefinitions } from "pdfmake/interfaces";
2
+ /**
3
+ * Renders a pdfmake document definition to a PDF Buffer.
4
+ *
5
+ * @param documentDefinition - The pdfmake document definition object
6
+ * @returns Promise that resolves to a Buffer containing the PDF data
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const docDef = {
11
+ * content: [
12
+ * { text: 'Hello World', fontSize: 20 },
13
+ * { table: { body: [['Cell 1', 'Cell 2']] } }
14
+ * ]
15
+ * };
16
+ *
17
+ * const pdfBuffer = await renderPdfmakeDocument(docDef);
18
+ * await fs.writeFile('output.pdf', pdfBuffer);
19
+ * ```
20
+ */
21
+ export declare function renderPdfMakeDocument(documentDefinition: TDocumentDefinitions): Promise<Buffer>;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.renderPdfMakeDocument = renderPdfMakeDocument;
40
+ const pdfmake_1 = __importDefault(require("pdfmake/build/pdfmake"));
41
+ const pdfFonts = __importStar(require("pdfmake/build/vfs_fonts"));
42
+ // Set up default fonts for pdfmake
43
+ pdfmake_1.default.vfs = pdfFonts.vfs;
44
+ /**
45
+ * Renders a pdfmake document definition to a PDF Buffer.
46
+ *
47
+ * @param documentDefinition - The pdfmake document definition object
48
+ * @returns Promise that resolves to a Buffer containing the PDF data
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * const docDef = {
53
+ * content: [
54
+ * { text: 'Hello World', fontSize: 20 },
55
+ * { table: { body: [['Cell 1', 'Cell 2']] } }
56
+ * ]
57
+ * };
58
+ *
59
+ * const pdfBuffer = await renderPdfmakeDocument(docDef);
60
+ * await fs.writeFile('output.pdf', pdfBuffer);
61
+ * ```
62
+ */
63
+ async function renderPdfMakeDocument(documentDefinition) {
64
+ return new Promise((resolve, reject) => {
65
+ let isResolved = false;
66
+ const errorHandler = (error) => {
67
+ if (!isResolved) {
68
+ cleanup();
69
+ reject(error);
70
+ }
71
+ };
72
+ const cleanup = () => {
73
+ if (!isResolved) {
74
+ isResolved = true;
75
+ process.off("uncaughtException", errorHandler);
76
+ }
77
+ };
78
+ process.on("uncaughtException", errorHandler);
79
+ const pdfDocGenerator = pdfmake_1.default.createPdf(documentDefinition);
80
+ pdfDocGenerator.getBuffer((buffer) => {
81
+ // Success callback
82
+ cleanup();
83
+ resolve(Buffer.from(buffer));
84
+ });
85
+ });
86
+ }
87
+ //# sourceMappingURL=pdfmake-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfmake-renderer.js","sourceRoot":"","sources":["../../../src/converters/pdf/pdfmake-renderer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,sDA6BC;AAvDD,oEAA4C;AAC5C,kEAAoD;AAGpD,mCAAmC;AACnC,iBAAO,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;AAE3B;;;;;;;;;;;;;;;;;;GAkBG;AACI,KAAK,UAAU,qBAAqB,CACzC,kBAAwC;IAExC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,EAAE;YACpC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,UAAU,GAAG,IAAI,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;QAE9C,MAAM,eAAe,GAAG,iBAAO,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC9D,eAAe,CAAC,SAAS,CAAC,CAAC,MAAc,EAAE,EAAE;YAC3C,mBAAmB;YACnB,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import pdfMake from \"pdfmake/build/pdfmake\";\nimport * as pdfFonts from \"pdfmake/build/vfs_fonts\";\nimport type { TDocumentDefinitions } from \"pdfmake/interfaces\";\n\n// Set up default fonts for pdfmake\npdfMake.vfs = pdfFonts.vfs;\n\n/**\n * Renders a pdfmake document definition to a PDF Buffer.\n *\n * @param documentDefinition - The pdfmake document definition object\n * @returns Promise that resolves to a Buffer containing the PDF data\n *\n * @example\n * ```typescript\n * const docDef = {\n * content: [\n * { text: 'Hello World', fontSize: 20 },\n * { table: { body: [['Cell 1', 'Cell 2']] } }\n * ]\n * };\n *\n * const pdfBuffer = await renderPdfmakeDocument(docDef);\n * await fs.writeFile('output.pdf', pdfBuffer);\n * ```\n */\nexport async function renderPdfMakeDocument(\n documentDefinition: TDocumentDefinitions,\n): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n let isResolved = false;\n\n const errorHandler = (error: Error) => {\n if (!isResolved) {\n cleanup();\n reject(error);\n }\n };\n\n const cleanup = () => {\n if (!isResolved) {\n isResolved = true;\n process.off(\"uncaughtException\", errorHandler);\n }\n };\n\n process.on(\"uncaughtException\", errorHandler);\n\n const pdfDocGenerator = pdfMake.createPdf(documentDefinition);\n pdfDocGenerator.getBuffer((buffer: Buffer) => {\n // Success callback\n cleanup();\n resolve(Buffer.from(buffer));\n });\n });\n}\n"]}
@@ -1,11 +1,13 @@
1
1
  import { SmeupDataTable } from "../types/data-structures/smeupDataTable";
2
2
  import { SmeupSch } from "../types/data-structures/smeupSch";
3
3
  import { WebupManagerData, GenericObject } from "../types/index";
4
+ import type { PdfMakeConverterContext } from "./pdf/pdfmake/pdfmake.types";
4
5
  import { fillPdfForm, FillPdfFormOptions } from "./pdf/form-filler";
5
6
  export declare const schedaToPdfData: (sch: SmeupSch, webupManagerData: WebupManagerData) => Promise<Buffer>;
6
7
  export declare const dataTableToPdfData: (component: {
7
8
  smeupDataTable: SmeupDataTable;
8
9
  props: GenericObject;
9
10
  }, webupManagerData: WebupManagerData) => Promise<Buffer | Uint8Array>;
11
+ export declare const pdfmakeDocumentToPdfData: (documentDefinition: Record<string, unknown>, context?: Partial<PdfMakeConverterContext>) => Promise<Buffer>;
10
12
  export { fillPdfForm };
11
13
  export type { FillPdfFormOptions };
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /* eslint-disable @typescript-eslint/no-unused-vars */
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.fillPdfForm = exports.dataTableToPdfData = exports.schedaToPdfData = void 0;
4
+ exports.fillPdfForm = exports.pdfmakeDocumentToPdfData = exports.dataTableToPdfData = exports.schedaToPdfData = void 0;
5
5
  const index_1 = require("../types/index");
6
6
  const commons_utility_1 = require("../utils/commons-utility");
7
7
  const matrix_converter_1 = require("./excel/matrix-converter");
@@ -10,8 +10,12 @@ const sch_converter_1 = require("./pdf/sch-converter");
10
10
  const pdf_lib_1 = require("pdf-lib");
11
11
  const cover_renderer_1 = require("./pdf/cover-renderer");
12
12
  const gfx_data_1 = require("../assets/gfx-data");
13
+ const pdfmake_renderer_1 = require("./pdf/pdfmake-renderer");
13
14
  const form_filler_1 = require("./pdf/form-filler");
14
15
  Object.defineProperty(exports, "fillPdfForm", { enumerable: true, get: function () { return form_filler_1.fillPdfForm; } });
16
+ const adapter_processor_1 = require("./pdf/pdfmake/adapter-processor");
17
+ const adapter_registry_1 = require("./pdf/pdfmake/adapter-registry");
18
+ const table_adapter_1 = require("./pdf/pdfmake/table-adapter");
15
19
  const schedaToPdfData = async (sch, webupManagerData) => {
16
20
  const doc = await (0, sch_converter_1.schedaToPdfDoc)(sch);
17
21
  return Buffer.from(doc.output("arraybuffer"));
@@ -40,6 +44,17 @@ const dataTableToPdfData = async (component, webupManagerData) => {
40
44
  }
41
45
  };
42
46
  exports.dataTableToPdfData = dataTableToPdfData;
47
+ const pdfmakeDocumentToPdfData = async (documentDefinition, context) => {
48
+ // Register adapters
49
+ const registry = (0, adapter_registry_1.createAdapterRegistry)();
50
+ registry.register("table", (0, table_adapter_1.dataTableAdapter)());
51
+ // Pre-process document with adapters
52
+ let processedDoc = await (0, adapter_processor_1.preProcessPdfMakeDocument)(documentDefinition, registry, context);
53
+ processedDoc = (await registry.process(documentDefinition, context));
54
+ // Render the document using pdfmake
55
+ return (0, pdfmake_renderer_1.renderPdfMakeDocument)(processedDoc);
56
+ };
57
+ exports.pdfmakeDocumentToPdfData = pdfmakeDocumentToPdfData;
43
58
  /**
44
59
  * Unisce più PDF (in formato ArrayBuffer/Uint8Array/Buffer) in un unico PDF.
45
60
  * @param pdfBuffers Array di buffer PDF (es. ottenuti da jsPDF.output("arraybuffer"))
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-converter.js","sourceRoot":"","sources":["../../src/converters/pdf-converter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { create } from \"domain\";\nimport { SmeupDataTable } from \"../types/data-structures/smeupDataTable\";\nimport { SmeupSch } from \"../types/data-structures/smeupSch\";\nimport {\n WebupManagerData,\n GenericObject,\n SupportedExportFormats,\n} from \"../types/index\";\nimport { convertToBuffer } from \"../utils/commons-utility\";\nimport { dataTableToExcelWorkbook } from \"./excel/matrix-converter\";\nimport { dataTableToPdfDoc } from \"./pdf/matrix-converter\";\nimport { schedaToPdfDoc } from \"./pdf/sch-converter\";\nimport { PDFDocument } from \"pdf-lib\";\nimport { createCoverPdf } from \"./pdf/cover-renderer\";\nimport { logoBase64 } from \"../assets/gfx-data\";\nimport { fillPdfForm, FillPdfFormOptions } from \"./pdf/form-filler\";\n\nexport const schedaToPdfData = async (\n sch: SmeupSch,\n webupManagerData: WebupManagerData,\n): Promise<Buffer> => {\n const doc = await schedaToPdfDoc(sch);\n return Buffer.from(doc.output(\"arraybuffer\"));\n};\n\nexport const dataTableToPdfData = async (\n component: {\n smeupDataTable: SmeupDataTable;\n props: GenericObject;\n },\n webupManagerData: WebupManagerData,\n): Promise<Buffer | Uint8Array> => {\n const workbook = dataTableToExcelWorkbook(\n component,\n SupportedExportFormats.XLSX,\n webupManagerData,\n );\n\n const worksheet = workbook.getWorksheet(1);\n if (worksheet) {\n const title = component.smeupDataTable.cover?.titles?.[\"T01\"] ?? \"\";\n const subtitle = component.smeupDataTable.cover?.titles?.[\"T02\"] ?? \"\";\n const subtitle2 = component.smeupDataTable.cover?.titles?.[\"T03\"] ?? \"\";\n const image = component.smeupDataTable.cover?.image ?? \"\";\n const logo = component.smeupDataTable.cover?.logo ?? logoBase64;\n const cover = createCoverPdf(image, logo, title, subtitle, subtitle2);\n const pdfDoc = await dataTableToPdfDoc(worksheet, webupManagerData, {\n logoBase64: logo,\n title: title,\n subtitle: subtitle,\n });\n const pdfBuffer = pdfDoc.output(\"arraybuffer\");\n return convertToBuffer(await appendPdfDocs([cover, pdfBuffer]));\n } else {\n throw new Error(\"Worksheet not found in the workbook\");\n }\n};\n\n/**\n * Unisce più PDF (in formato ArrayBuffer/Uint8Array/Buffer) in un unico PDF.\n * @param pdfBuffers Array di buffer PDF (es. ottenuti da jsPDF.output(\"arraybuffer\"))\n * @returns Buffer del PDF unito\n */\nconst appendPdfDocs = async (\n pdfBuffers: (Uint8Array | ArrayBuffer | Buffer)[],\n): Promise<Uint8Array> => {\n if (!pdfBuffers.length) throw new Error(\"No PDF buffers to append\");\n\n // Crea un nuovo documento PDF vuoto\n const mergedPdf = await PDFDocument.create();\n\n for (const pdfBytes of pdfBuffers) {\n const srcPdf = await PDFDocument.load(pdfBytes);\n const copiedPages = await mergedPdf.copyPages(\n srcPdf,\n srcPdf.getPageIndices(),\n );\n copiedPages.forEach(page => mergedPdf.addPage(page));\n }\n\n const mergedBytes = await mergedPdf.save();\n return mergedBytes;\n};\n\n// Re-export form filler function and types\nexport { fillPdfForm };\nexport type { FillPdfFormOptions };\n\n"]}
1
+ {"version":3,"file":"pdf-converter.js","sourceRoot":"","sources":["../../src/converters/pdf-converter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { SmeupDataTable } from \"../types/data-structures/smeupDataTable\";\nimport { SmeupSch } from \"../types/data-structures/smeupSch\";\nimport {\n WebupManagerData,\n GenericObject,\n SupportedExportFormats,\n} from \"../types/index\";\nimport { convertToBuffer } from \"../utils/commons-utility\";\nimport { dataTableToExcelWorkbook } from \"./excel/matrix-converter\";\nimport { dataTableToPdfDoc } from \"./pdf/matrix-converter\";\nimport { schedaToPdfDoc } from \"./pdf/sch-converter\";\nimport { PDFDocument } from \"pdf-lib\";\nimport { createCoverPdf } from \"./pdf/cover-renderer\";\nimport { logoBase64 } from \"../assets/gfx-data\";\nimport { renderPdfMakeDocument } from \"./pdf/pdfmake-renderer\";\nimport type {\n PdfMakeConverterContext,\n AdapterRegistry,\n} from \"./pdf/pdfmake/pdfmake.types\";\nimport type { TDocumentDefinitions } from \"pdfmake/interfaces\";\nimport { fillPdfForm, FillPdfFormOptions } from \"./pdf/form-filler\";\nimport { preProcessPdfMakeDocument } from \"./pdf/pdfmake/adapter-processor\";\nimport { createAdapterRegistry } from \"./pdf/pdfmake/adapter-registry\";\nimport { dataTableAdapter } from \"./pdf/pdfmake/table-adapter\";\n\nexport const schedaToPdfData = async (\n sch: SmeupSch,\n webupManagerData: WebupManagerData,\n): Promise<Buffer> => {\n const doc = await schedaToPdfDoc(sch);\n return Buffer.from(doc.output(\"arraybuffer\"));\n};\n\nexport const dataTableToPdfData = async (\n component: {\n smeupDataTable: SmeupDataTable;\n props: GenericObject;\n },\n webupManagerData: WebupManagerData,\n): Promise<Buffer | Uint8Array> => {\n const workbook = dataTableToExcelWorkbook(\n component,\n SupportedExportFormats.XLSX,\n webupManagerData,\n );\n\n const worksheet = workbook.getWorksheet(1);\n if (worksheet) {\n const title = component.smeupDataTable.cover?.titles?.[\"T01\"] ?? \"\";\n const subtitle = component.smeupDataTable.cover?.titles?.[\"T02\"] ?? \"\";\n const subtitle2 = component.smeupDataTable.cover?.titles?.[\"T03\"] ?? \"\";\n const image = component.smeupDataTable.cover?.image ?? \"\";\n const logo = component.smeupDataTable.cover?.logo ?? logoBase64;\n const cover = createCoverPdf(image, logo, title, subtitle, subtitle2);\n const pdfDoc = await dataTableToPdfDoc(worksheet, webupManagerData, {\n logoBase64: logo,\n title: title,\n subtitle: subtitle,\n });\n const pdfBuffer = pdfDoc.output(\"arraybuffer\");\n return convertToBuffer(await appendPdfDocs([cover, pdfBuffer]));\n } else {\n throw new Error(\"Worksheet not found in the workbook\");\n }\n};\n\nexport const pdfmakeDocumentToPdfData = async (\n documentDefinition: Record<string, unknown>,\n context?: Partial<PdfMakeConverterContext>,\n): Promise<Buffer> => {\n // Register adapters\n const registry = createAdapterRegistry();\n registry.register(\"table\", dataTableAdapter());\n\n // Pre-process document with adapters\n let processedDoc = await preProcessPdfMakeDocument(\n documentDefinition,\n registry,\n context,\n );\n\n processedDoc = (await registry.process(\n documentDefinition,\n context,\n )) as Record<string, unknown>;\n\n // Render the document using pdfmake\n return renderPdfMakeDocument(processedDoc as unknown as TDocumentDefinitions);\n};\n\n/**\n * Unisce più PDF (in formato ArrayBuffer/Uint8Array/Buffer) in un unico PDF.\n * @param pdfBuffers Array di buffer PDF (es. ottenuti da jsPDF.output(\"arraybuffer\"))\n * @returns Buffer del PDF unito\n */\nconst appendPdfDocs = async (\n pdfBuffers: (Uint8Array | ArrayBuffer | Buffer)[],\n): Promise<Uint8Array> => {\n if (!pdfBuffers.length) throw new Error(\"No PDF buffers to append\");\n\n // Crea un nuovo documento PDF vuoto\n const mergedPdf = await PDFDocument.create();\n\n for (const pdfBytes of pdfBuffers) {\n const srcPdf = await PDFDocument.load(pdfBytes);\n const copiedPages = await mergedPdf.copyPages(\n srcPdf,\n srcPdf.getPageIndices(),\n );\n copiedPages.forEach(page => mergedPdf.addPage(page));\n }\n\n const mergedBytes = await mergedPdf.save();\n return mergedBytes;\n};\n\n// Re-export form filler function and types\nexport { fillPdfForm };\nexport type { FillPdfFormOptions };\n"]}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,12 @@
1
1
  export { dataTableToExcelData, dataTreeToExcelData, } from "./converters/excel-converter";
2
- export { schedaToPdfData, dataTableToPdfData, fillPdfForm, } from "./converters/pdf-converter";
2
+ export { schedaToPdfData, dataTableToPdfData, pdfmakeDocumentToPdfData, fillPdfForm, } from "./converters/pdf-converter";
3
3
  export type { FillPdfFormOptions } from "./converters/pdf-converter";
4
4
  export { dataTableToChart } from "./converters/images/charts-generator";
5
+ export { createAdapterRegistry } from "./converters/pdf/pdfmake/adapter-registry";
6
+ export { funToSmeupTableAdapter } from "./converters/pdf/pdfmake/table-adapter";
7
+ export { smeupTableToPdfMakeTableAdapter } from "./converters/pdf/pdfmake/table-adapter";
8
+ export { preProcessPdfMakeDocument } from "./converters/pdf/pdfmake/adapter-processor";
9
+ export type { PdfmakeAdapter, PdfMakeConverterContext, AdapterRegistry, AdapterError, } from "./converters/pdf/pdfmake/pdfmake.types";
5
10
  export type { WebupManagerData, GenericObject } from "./types/index";
6
11
  export { SupportedExportFormats } from "./types/index";
7
12
  export type { SmeupDataTable } from "./types/data-structures/smeupDataTable";
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SupportedExportFormats = exports.dataTableToChart = exports.fillPdfForm = exports.dataTableToPdfData = exports.schedaToPdfData = exports.dataTreeToExcelData = exports.dataTableToExcelData = void 0;
3
+ exports.SupportedExportFormats = exports.preProcessPdfMakeDocument = exports.smeupTableToPdfMakeTableAdapter = exports.funToSmeupTableAdapter = exports.createAdapterRegistry = exports.dataTableToChart = exports.fillPdfForm = exports.pdfmakeDocumentToPdfData = exports.dataTableToPdfData = exports.schedaToPdfData = exports.dataTreeToExcelData = exports.dataTableToExcelData = void 0;
4
4
  // Public API exports
5
5
  var excel_converter_1 = require("./converters/excel-converter");
6
6
  Object.defineProperty(exports, "dataTableToExcelData", { enumerable: true, get: function () { return excel_converter_1.dataTableToExcelData; } });
@@ -8,9 +8,19 @@ Object.defineProperty(exports, "dataTreeToExcelData", { enumerable: true, get: f
8
8
  var pdf_converter_1 = require("./converters/pdf-converter");
9
9
  Object.defineProperty(exports, "schedaToPdfData", { enumerable: true, get: function () { return pdf_converter_1.schedaToPdfData; } });
10
10
  Object.defineProperty(exports, "dataTableToPdfData", { enumerable: true, get: function () { return pdf_converter_1.dataTableToPdfData; } });
11
+ Object.defineProperty(exports, "pdfmakeDocumentToPdfData", { enumerable: true, get: function () { return pdf_converter_1.pdfmakeDocumentToPdfData; } });
11
12
  Object.defineProperty(exports, "fillPdfForm", { enumerable: true, get: function () { return pdf_converter_1.fillPdfForm; } });
12
13
  var charts_generator_1 = require("./converters/images/charts-generator");
13
14
  Object.defineProperty(exports, "dataTableToChart", { enumerable: true, get: function () { return charts_generator_1.dataTableToChart; } });
15
+ // Pdfmake adapter system
16
+ var adapter_registry_1 = require("./converters/pdf/pdfmake/adapter-registry");
17
+ Object.defineProperty(exports, "createAdapterRegistry", { enumerable: true, get: function () { return adapter_registry_1.createAdapterRegistry; } });
18
+ var table_adapter_1 = require("./converters/pdf/pdfmake/table-adapter");
19
+ Object.defineProperty(exports, "funToSmeupTableAdapter", { enumerable: true, get: function () { return table_adapter_1.funToSmeupTableAdapter; } });
20
+ var table_adapter_2 = require("./converters/pdf/pdfmake/table-adapter");
21
+ Object.defineProperty(exports, "smeupTableToPdfMakeTableAdapter", { enumerable: true, get: function () { return table_adapter_2.smeupTableToPdfMakeTableAdapter; } });
22
+ var adapter_processor_1 = require("./converters/pdf/pdfmake/adapter-processor");
23
+ Object.defineProperty(exports, "preProcessPdfMakeDocument", { enumerable: true, get: function () { return adapter_processor_1.preProcessPdfMakeDocument; } });
14
24
  var index_1 = require("./types/index");
15
25
  Object.defineProperty(exports, "SupportedExportFormats", { enumerable: true, get: function () { return index_1.SupportedExportFormats; } });
16
26
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qBAAqB;AACrB,gEAGsC;AAFpC,uHAAA,oBAAoB,OAAA;AACpB,sHAAA,mBAAmB,OAAA;AAGrB,4DAIoC;AAHlC,gHAAA,eAAe,OAAA;AACf,mHAAA,kBAAkB,OAAA;AAClB,4GAAA,WAAW,OAAA;AAIb,yEAAwE;AAA/D,oHAAA,gBAAgB,OAAA;AAGzB,uCAAuD;AAA9C,+GAAA,sBAAsB,OAAA","sourcesContent":["// Public API exports\nexport {\n dataTableToExcelData,\n dataTreeToExcelData,\n} from \"./converters/excel-converter\";\n\nexport {\n schedaToPdfData,\n dataTableToPdfData,\n fillPdfForm,\n} from \"./converters/pdf-converter\";\nexport type { FillPdfFormOptions } from \"./converters/pdf-converter\";\n\nexport { dataTableToChart } from \"./converters/images/charts-generator\";\n// Export types that users might need\nexport type { WebupManagerData, GenericObject } from \"./types/index\";\nexport { SupportedExportFormats } from \"./types/index\";\nexport type { SmeupDataTable } from \"./types/data-structures/smeupDataTable\";\nexport type { SmeupDataTree } from \"./types/data-structures/smeupDataTree\";\n\nexport type ColumnGroup = {\n column: string;\n visible: boolean;\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qBAAqB;AACrB,gEAGsC;AAFpC,uHAAA,oBAAoB,OAAA;AACpB,sHAAA,mBAAmB,OAAA;AAGrB,4DAKoC;AAJlC,gHAAA,eAAe,OAAA;AACf,mHAAA,kBAAkB,OAAA;AAClB,yHAAA,wBAAwB,OAAA;AACxB,4GAAA,WAAW,OAAA;AAIb,yEAAwE;AAA/D,oHAAA,gBAAgB,OAAA;AAEzB,yBAAyB;AACzB,8EAAkF;AAAzE,yHAAA,qBAAqB,OAAA;AAC9B,wEAAgF;AAAvE,uHAAA,sBAAsB,OAAA;AAC/B,wEAAyF;AAAhF,gIAAA,+BAA+B,OAAA;AACxC,gFAAuF;AAA9E,8HAAA,yBAAyB,OAAA;AAWlC,uCAAuD;AAA9C,+GAAA,sBAAsB,OAAA","sourcesContent":["// Public API exports\nexport {\n dataTableToExcelData,\n dataTreeToExcelData,\n} from \"./converters/excel-converter\";\n\nexport {\n schedaToPdfData,\n dataTableToPdfData,\n pdfmakeDocumentToPdfData,\n fillPdfForm,\n} from \"./converters/pdf-converter\";\nexport type { FillPdfFormOptions } from \"./converters/pdf-converter\";\n\nexport { dataTableToChart } from \"./converters/images/charts-generator\";\n\n// Pdfmake adapter system\nexport { createAdapterRegistry } from \"./converters/pdf/pdfmake/adapter-registry\";\nexport { funToSmeupTableAdapter } from \"./converters/pdf/pdfmake/table-adapter\";\nexport { smeupTableToPdfMakeTableAdapter } from \"./converters/pdf/pdfmake/table-adapter\";\nexport { preProcessPdfMakeDocument } from \"./converters/pdf/pdfmake/adapter-processor\";\n\nexport type {\n PdfmakeAdapter,\n PdfMakeConverterContext,\n AdapterRegistry,\n AdapterError,\n} from \"./converters/pdf/pdfmake/pdfmake.types\";\n\n// Export types that users might need\nexport type { WebupManagerData, GenericObject } from \"./types/index\";\nexport { SupportedExportFormats } from \"./types/index\";\nexport type { SmeupDataTable } from \"./types/data-structures/smeupDataTable\";\nexport type { SmeupDataTree } from \"./types/data-structures/smeupDataTree\";\n\nexport type ColumnGroup = {\n column: string;\n visible: boolean;\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sme.up/doc-alchemist",
3
- "version": "1.5.0-SNAPSHOT-20251118133453",
3
+ "version": "1.5.0-SNAPSHOT-20251121152517",
4
4
  "description": "Library for generating documents in various formats, including Excel and PDF.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Smeup LAB <info@smeup.com> (https://www.smeup.com/)",
@@ -24,6 +24,7 @@
24
24
  "@eslint/js": "^9.28.0",
25
25
  "@types/jest": "^29.5.14",
26
26
  "@types/node": "^22.15.30",
27
+ "@types/pdfmake": "^0.2.12",
27
28
  "csstype": "^3.1.3",
28
29
  "eslint": "^9.28.0",
29
30
  "globals": "^16.2.0",
@@ -44,6 +45,7 @@
44
45
  "jspdf": "^3.0.1",
45
46
  "jspdf-autotable": "^5.0.2",
46
47
  "math-expression-evaluator": "^2.0.7",
47
- "pdf-lib": "^1.17.1"
48
+ "pdf-lib": "^1.17.1",
49
+ "pdfmake": "^0.2.20"
48
50
  }
49
- }
51
+ }