@sme.up/doc-alchemist 1.7.0-SNAPSHOT-20251218155723 → 1.7.0-SNAPSHOT-20251224094418

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 (59) hide show
  1. package/dist/assets/gfx-data.d.ts +1 -0
  2. package/dist/assets/gfx-data.js +2 -1
  3. package/dist/assets/gfx-data.js.map +1 -1
  4. package/dist/converters/images/charts-converter.d.ts +1 -1
  5. package/dist/converters/images/charts-converter.js.map +1 -1
  6. package/dist/converters/images/charts-data-converter.d.ts +1 -1
  7. package/dist/converters/images/charts-data-converter.js +8 -8
  8. package/dist/converters/images/charts-data-converter.js.map +1 -1
  9. package/dist/converters/pdf/pdfmake/adapters/box/box-adapter.d.ts +28 -0
  10. package/dist/converters/pdf/pdfmake/adapters/box/box-adapter.js +164 -0
  11. package/dist/converters/pdf/pdfmake/adapters/box/box-adapter.js.map +1 -0
  12. package/dist/converters/pdf/pdfmake/adapters/box/box-layouts.d.ts +6 -0
  13. package/dist/converters/pdf/pdfmake/adapters/box/box-layouts.js +147 -0
  14. package/dist/converters/pdf/pdfmake/adapters/box/box-layouts.js.map +1 -0
  15. package/dist/converters/pdf/pdfmake/adapters/{chart-adapter.d.ts → chart/chart-adapter.d.ts} +1 -1
  16. package/dist/converters/pdf/pdfmake/adapters/{chart-adapter.js → chart/chart-adapter.js} +2 -2
  17. package/dist/converters/pdf/pdfmake/adapters/chart/chart-adapter.js.map +1 -0
  18. package/dist/converters/pdf/pdfmake/adapters/helpers.d.ts +3 -0
  19. package/dist/converters/pdf/pdfmake/adapters/helpers.js +18 -0
  20. package/dist/converters/pdf/pdfmake/adapters/helpers.js.map +1 -0
  21. package/dist/converters/pdf/pdfmake/adapters/{image-adapter.d.ts → image/image-adapter.d.ts} +1 -1
  22. package/dist/converters/pdf/pdfmake/adapters/{image-adapter.js → image/image-adapter.js} +19 -12
  23. package/dist/converters/pdf/pdfmake/adapters/image/image-adapter.js.map +1 -0
  24. package/dist/converters/pdf/pdfmake/adapters/{layout-adapter.d.ts → layout/layout-adapter.d.ts} +1 -1
  25. package/dist/converters/pdf/pdfmake/adapters/layout/layout-adapter.js.map +1 -0
  26. package/dist/converters/pdf/pdfmake/adapters/{page-element-adapter.d.ts → page-alement/page-element-adapter.d.ts} +1 -1
  27. package/dist/converters/pdf/pdfmake/adapters/{page-element-adapter.js → page-alement/page-element-adapter.js} +1 -1
  28. package/dist/converters/pdf/pdfmake/adapters/page-alement/page-element-adapter.js.map +1 -0
  29. package/dist/converters/pdf/pdfmake/adapters/{table-adapter.d.ts → table/table-adapter.d.ts} +1 -1
  30. package/dist/converters/pdf/pdfmake/adapters/{table-adapter.js → table/table-adapter.js} +16 -8
  31. package/dist/converters/pdf/pdfmake/adapters/table/table-adapter.js.map +1 -0
  32. package/dist/converters/pdf/pdfmake/pdfmake.types.d.ts +2 -3
  33. package/dist/converters/pdf/pdfmake/pdfmake.types.js.map +1 -1
  34. package/dist/converters/pdf-converter.js +7 -5
  35. package/dist/converters/pdf-converter.js.map +1 -1
  36. package/dist/index.d.ts +2 -2
  37. package/dist/index.js +2 -2
  38. package/dist/index.js.map +1 -1
  39. package/dist/types/component.d.ts +34 -0
  40. package/dist/types/component.js +8 -1
  41. package/dist/types/component.js.map +1 -1
  42. package/dist/utils/cells-utility.d.ts +2 -0
  43. package/dist/utils/cells-utility.js +10 -0
  44. package/dist/utils/cells-utility.js.map +1 -0
  45. package/dist/utils/filters-utility.js +0 -1
  46. package/dist/utils/filters-utility.js.map +1 -1
  47. package/dist/utils/objects-utility.d.ts +1 -0
  48. package/dist/utils/objects-utility.js +7 -1
  49. package/dist/utils/objects-utility.js.map +1 -1
  50. package/package.json +1 -1
  51. package/dist/converters/images/charts-converter-types.d.ts +0 -15
  52. package/dist/converters/images/charts-converter-types.js +0 -11
  53. package/dist/converters/images/charts-converter-types.js.map +0 -1
  54. package/dist/converters/pdf/pdfmake/adapters/chart-adapter.js.map +0 -1
  55. package/dist/converters/pdf/pdfmake/adapters/image-adapter.js.map +0 -1
  56. package/dist/converters/pdf/pdfmake/adapters/layout-adapter.js.map +0 -1
  57. package/dist/converters/pdf/pdfmake/adapters/page-element-adapter.js.map +0 -1
  58. package/dist/converters/pdf/pdfmake/adapters/table-adapter.js.map +0 -1
  59. /package/dist/converters/pdf/pdfmake/adapters/{layout-adapter.js → layout/layout-adapter.js} +0 -0
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ // ...
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.boxAdapter = exports.boxDataAdapter = exports.boxFunAdapter = void 0;
5
+ const smeupDataStructure_1 = require("../../../../../types/data-structures/smeupDataStructure");
6
+ const box_layouts_1 = require("./box-layouts");
7
+ const adapter_processor_1 = require("../../adapter-processor");
8
+ const hasSmeupBoxData = (element) => {
9
+ const box = element
10
+ ?.box;
11
+ const data = box?.smeup?.data;
12
+ return (data?.type === smeupDataStructure_1.SmeupDataStructureType.SmeupDataTable &&
13
+ Array.isArray(data?.rows) &&
14
+ Array.isArray(data?.columns));
15
+ };
16
+ const hasSmeupBox = (element) => {
17
+ const box = element
18
+ ?.box;
19
+ const fun = box?.smeup?.fun;
20
+ return typeof fun === "string" && fun.length > 0;
21
+ };
22
+ /**
23
+ * Adapter function for converting a box element with a `fun` property to a Smeup box structure.
24
+ *
25
+ * This function returns an asynchronous converter that checks if the provided element contains
26
+ * a box with a `fun` property. If present, it uses the `getSmeupDataStructure` function from
27
+ * the context to fetch the box data corresponding to the `fun` string, and replaces the original
28
+ * box's `fun` property with the fetched data under the `data` property. All other properties
29
+ * of the box are preserved.
30
+ *
31
+ * @returns An asynchronous function that takes an element and a context, and returns the adapted element.
32
+ *
33
+ * @throws If the context does not provide a `getSmeupDataStructure` function when the `fun` property is used.
34
+ *
35
+ * @param element - The input element to be adapted.
36
+ * @param context - The conversion context, which must provide `getSmeupDataStructure` if the `fun` property is present.
37
+ */
38
+ const boxFunAdapter = () => {
39
+ return async (element, context) => {
40
+ if (!hasSmeupBox(element)) {
41
+ return element;
42
+ }
43
+ else {
44
+ if (!context.getSmeupDataStructure) {
45
+ throw new Error("getSmeupDataStructure function is required in context when the fun property is used");
46
+ }
47
+ else {
48
+ const elementWithBox = element;
49
+ const funStr = elementWithBox.box.smeup.fun;
50
+ const boxData = (await context.getSmeupDataStructure(funStr));
51
+ // Extract all properties except 'fun' from the smeup object
52
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
53
+ const { fun, ...smeupRest } = elementWithBox.box.smeup;
54
+ // Extract all properties except 'smeup' from the box object
55
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
56
+ const { smeup, ...boxRest } = elementWithBox.box;
57
+ return {
58
+ ...elementWithBox,
59
+ box: {
60
+ ...boxRest,
61
+ smeup: {
62
+ ...smeupRest,
63
+ data: boxData,
64
+ },
65
+ },
66
+ };
67
+ }
68
+ }
69
+ };
70
+ };
71
+ exports.boxFunAdapter = boxFunAdapter;
72
+ /**
73
+ * Adapts a Smeup box structure to PDFMake columns with cards.
74
+ *
75
+ * This adapter function checks if the provided element contains a box with data.
76
+ * If so, it generates columns containing cards from the data rows and replaces the box
77
+ * object with column structures. The number of columns and which data columns to display
78
+ * are determined by the options.
79
+ *
80
+ * @returns A function that takes an element and returns the adapted element for PDFMake,
81
+ * or the original element if it does not contain a valid box with data.
82
+ * @throws If options.Columns is missing or empty.
83
+ */
84
+ // Map of available layout builders
85
+ const layoutBuilders = {
86
+ "1": box_layouts_1.buildLayout1,
87
+ "2": box_layouts_1.buildLayout2,
88
+ "5": box_layouts_1.buildLayout5,
89
+ };
90
+ const boxDataAdapter = () => {
91
+ return async (element, context) => {
92
+ if (!hasSmeupBoxData(element)) {
93
+ return element;
94
+ }
95
+ const elementWithBox = element;
96
+ const data = elementWithBox.box.smeup.data;
97
+ const options = elementWithBox.box.smeup.options;
98
+ // Validate that options.Columns exists
99
+ if (!options?.Columns || options.Columns.trim().length === 0) {
100
+ throw new Error("options.Columns is required for box adapter");
101
+ }
102
+ // Parse column names from options.Columns (pipe-separated)
103
+ const columnNames = options.Columns.split("|")
104
+ .map(name => name.trim())
105
+ .filter(name => name.length > 0);
106
+ // Parse number of columns (default to 1)
107
+ const numCols = options.Cols ? parseInt(options.Cols, 10) : 1;
108
+ const cols = isNaN(numCols) || numCols < 1 ? 1 : numCols;
109
+ // Distribute rows horizontally across columns
110
+ const rows = data.rows;
111
+ const columnsArray = [];
112
+ // Select the appropriate layout builder (default: layout 1)
113
+ const buildLayout = layoutBuilders[options.LayoutNbr || "1"] || box_layouts_1.buildLayout1;
114
+ // Calculate how many complete rows of columns we'll have
115
+ let rowIndex = 0;
116
+ while (rowIndex < rows.length) {
117
+ const columnsInThisRow = [];
118
+ // Fill this row with up to 'cols' cards
119
+ for (let colIndex = 0; colIndex < cols && rowIndex < rows.length; colIndex++) {
120
+ const card = buildLayout(rows[rowIndex], data.columns, columnNames, context, options);
121
+ columnsInThisRow.push(card);
122
+ rowIndex++;
123
+ }
124
+ // Fill with empty objects to ensure the number of columns is always a multiple of cols
125
+ while (columnsInThisRow.length < cols) {
126
+ columnsInThisRow.push({});
127
+ }
128
+ // Add this row of columns to the array
129
+ columnsArray.push({
130
+ columns: columnsInThisRow,
131
+ columnGap: 10,
132
+ });
133
+ }
134
+ // Extract all properties except 'box' from the element
135
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
136
+ const { box, ...elementRest } = elementWithBox;
137
+ let processedValue = columnsArray;
138
+ if (context._adapters) {
139
+ processedValue = await (0, adapter_processor_1.processDocument)(columnsArray, context._adapters, context);
140
+ }
141
+ // Return the element with columns array replacing the box
142
+ return {
143
+ ...elementRest,
144
+ stack: processedValue,
145
+ };
146
+ };
147
+ };
148
+ exports.boxDataAdapter = boxDataAdapter;
149
+ /**
150
+ * Main box adapter that chains all box transformation adapters.
151
+ *
152
+ * This adapter first converts a `fun` property to box data using boxFunAdapter,
153
+ * then transforms the box data to columns with cards using boxDataAdapter.
154
+ *
155
+ * @returns An asynchronous function that applies all box adapters in sequence.
156
+ */
157
+ const boxAdapter = () => {
158
+ return async (element, context) => {
159
+ const adaptedElement = await (0, exports.boxFunAdapter)()(element, context);
160
+ return (0, exports.boxDataAdapter)()(adaptedElement, context);
161
+ };
162
+ };
163
+ exports.boxAdapter = boxAdapter;
164
+ //# sourceMappingURL=box-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box-adapter.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/box/box-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["// ...\n\nimport { PdfMakeConverterContext } from \"../../pdfmake.types\";\n\nimport { SmeupDataStructureType } from \"../../../../../types/data-structures/smeupDataStructure\";\nimport { SmeupDataTable } from \"../../../../../types/data-structures/smeupDataTable\";\nimport { BoxOptions } from \"../../../../../types/component\";\nimport { buildLayout1, buildLayout2, buildLayout5 } from \"./box-layouts\";\nimport { processDocument } from \"../../adapter-processor\";\n\ninterface ContentBoxExtension {\n box: {\n smeup?: {\n data?: SmeupDataTable;\n fun?: string;\n options?: BoxOptions;\n };\n };\n}\n\ninterface ElementWithBoxExtension {\n box: ContentBoxExtension[\"box\"];\n [key: string]: unknown;\n}\n\nconst hasSmeupBoxData = (\n element: unknown,\n): element is ElementWithBoxExtension => {\n const box = (element as Record<string, unknown>)\n ?.box as ContentBoxExtension[\"box\"];\n const data = box?.smeup?.data as SmeupDataTable | undefined;\n return (\n data?.type === SmeupDataStructureType.SmeupDataTable &&\n Array.isArray(data?.rows) &&\n Array.isArray(data?.columns)\n );\n};\n\nconst hasSmeupBox = (element: unknown): element is ElementWithBoxExtension => {\n const box = (element as Record<string, unknown>)\n ?.box as ContentBoxExtension[\"box\"];\n const fun = box?.smeup?.fun;\n return typeof fun === \"string\" && fun.length > 0;\n};\n\n/**\n * Adapter function for converting a box element with a `fun` property to a Smeup box structure.\n *\n * This function returns an asynchronous converter that checks if the provided element contains\n * a box with a `fun` property. If present, it uses the `getSmeupDataStructure` function from\n * the context to fetch the box data corresponding to the `fun` string, and replaces the original\n * box's `fun` property with the fetched data under the `data` property. All other properties\n * of the box 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 const boxFunAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n if (!hasSmeupBox(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 elementWithBox = element as ElementWithBoxExtension;\n const funStr = elementWithBox.box.smeup!.fun!;\n const boxData = (await context.getSmeupDataStructure(\n funStr,\n )) as SmeupDataTable;\n\n // Extract all properties except 'fun' from the smeup object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { fun, ...smeupRest } = elementWithBox.box.smeup!;\n // Extract all properties except 'smeup' from the box object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { smeup, ...boxRest } = elementWithBox.box;\n\n return {\n ...elementWithBox,\n box: {\n ...boxRest,\n smeup: {\n ...smeupRest,\n data: boxData,\n },\n },\n };\n }\n }\n };\n};\n\n/**\n * Adapts a Smeup box structure to PDFMake columns with cards.\n *\n * This adapter function checks if the provided element contains a box with data.\n * If so, it generates columns containing cards from the data rows and replaces the box\n * object with column structures. The number of columns and which data columns to display\n * are determined by the options.\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 box with data.\n * @throws If options.Columns is missing or empty.\n */\n// Map of available layout builders\nconst layoutBuilders: Record<string, typeof buildLayout1> = {\n \"1\": buildLayout1,\n \"2\": buildLayout2,\n \"5\": buildLayout5,\n};\n\nexport const boxDataAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n if (!hasSmeupBoxData(element)) {\n return element;\n }\n\n const elementWithBox = element as ElementWithBoxExtension;\n const data = elementWithBox.box.smeup!.data!;\n const options = elementWithBox.box.smeup!.options as BoxOptions | undefined;\n\n // Validate that options.Columns exists\n if (!options?.Columns || options.Columns.trim().length === 0) {\n throw new Error(\"options.Columns is required for box adapter\");\n }\n\n // Parse column names from options.Columns (pipe-separated)\n const columnNames = options.Columns.split(\"|\")\n .map(name => name.trim())\n .filter(name => name.length > 0);\n\n // Parse number of columns (default to 1)\n const numCols = options.Cols ? parseInt(options.Cols, 10) : 1;\n const cols = isNaN(numCols) || numCols < 1 ? 1 : numCols;\n\n // Distribute rows horizontally across columns\n const rows = data.rows;\n const columnsArray: unknown[] = [];\n\n // Select the appropriate layout builder (default: layout 1)\n const buildLayout =\n layoutBuilders[options.LayoutNbr || \"1\"] || buildLayout1;\n\n // Calculate how many complete rows of columns we'll have\n let rowIndex = 0;\n\n while (rowIndex < rows.length) {\n const columnsInThisRow: unknown[] = [];\n\n // Fill this row with up to 'cols' cards\n for (\n let colIndex = 0;\n colIndex < cols && rowIndex < rows.length;\n colIndex++\n ) {\n const card = buildLayout(\n rows[rowIndex],\n data.columns,\n columnNames,\n context,\n options,\n );\n columnsInThisRow.push(card);\n rowIndex++;\n }\n\n // Fill with empty objects to ensure the number of columns is always a multiple of cols\n while (columnsInThisRow.length < cols) {\n columnsInThisRow.push({});\n }\n\n // Add this row of columns to the array\n columnsArray.push({\n columns: columnsInThisRow,\n columnGap: 10,\n });\n }\n\n // Extract all properties except 'box' from the element\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { box, ...elementRest } = elementWithBox;\n\n let processedValue: unknown = columnsArray;\n if (context._adapters) {\n processedValue = await processDocument(\n columnsArray,\n context._adapters,\n context,\n );\n }\n\n // Return the element with columns array replacing the box\n return {\n ...elementRest,\n stack: processedValue,\n };\n };\n};\n\n/**\n * Main box adapter that chains all box transformation adapters.\n *\n * This adapter first converts a `fun` property to box data using boxFunAdapter,\n * then transforms the box data to columns with cards using boxDataAdapter.\n *\n * @returns An asynchronous function that applies all box adapters in sequence.\n */\nexport const boxAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n const adaptedElement = await boxFunAdapter()(element, context);\n return boxDataAdapter()(adaptedElement, context);\n };\n};\n"]}
@@ -0,0 +1,6 @@
1
+ import { SmeupDataRow, SmeupDataColumn } from "../../../../../types/data-structures/smeupDataTable";
2
+ import { PdfMakeConverterContext } from "../../pdfmake.types";
3
+ import { BoxOptions } from "../../../../../types/component";
4
+ export declare const buildLayout1: (row: SmeupDataRow, columns: SmeupDataColumn[], columnNames: string[], context: PdfMakeConverterContext, options: BoxOptions) => unknown;
5
+ export declare const buildLayout2: (row: SmeupDataRow, columns: SmeupDataColumn[], columnNames: string[], context: PdfMakeConverterContext, options: BoxOptions) => unknown;
6
+ export declare const buildLayout5: (row: SmeupDataRow, columns: SmeupDataColumn[], columnNames: string[], context: PdfMakeConverterContext, options: BoxOptions) => unknown;
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildLayout5 = exports.buildLayout2 = exports.buildLayout1 = void 0;
4
+ const types_1 = require("../../../../../types");
5
+ const commons_utility_1 = require("../../../../../utils/commons-utility");
6
+ const cells_utility_1 = require("../../../../../utils/cells-utility");
7
+ const helpers_1 = require("../helpers");
8
+ const buildLayout1 = (row, columns, columnNames, context, options) => {
9
+ return buildTwoColumnLayout(row, columns, columnNames, context, options, {}, { bold: true });
10
+ };
11
+ exports.buildLayout1 = buildLayout1;
12
+ const buildLayout2 = (row, columns, columnNames, context, options) => {
13
+ return buildTwoColumnLayout(row, columns, columnNames, context, options, {}, { bold: true, alignment: "right" });
14
+ };
15
+ exports.buildLayout2 = buildLayout2;
16
+ const buildLayout5 = (row, columns, columnNames, context, options) => {
17
+ const body = [];
18
+ // Check if there's an image cell
19
+ let imageCell = null;
20
+ const dataCells = [];
21
+ for (const columnName of columnNames) {
22
+ // Find the column definition
23
+ const columnDef = columns.find(col => col.name === columnName);
24
+ if (!columnDef) {
25
+ console.warn(`Column "${columnName}" not found in data columns`);
26
+ continue;
27
+ }
28
+ // Get the label (title with fallback to name)
29
+ const label = columnDef.title || columnDef.name;
30
+ // Get the cell
31
+ const cell = row.cells?.[columnName] ?? {
32
+ value: "",
33
+ obj: { t: "", p: "", k: "" },
34
+ };
35
+ // Check if this is an image cell
36
+ if ((0, cells_utility_1.cellIsImage)(cell) && !imageCell) {
37
+ imageCell = cell;
38
+ }
39
+ else {
40
+ const value = (0, commons_utility_1.calculateCellValue)(cell, types_1.SupportedExportFormats.PDF, context.webupManagerData);
41
+ dataCells.push({ label, value });
42
+ }
43
+ }
44
+ // Build the table body
45
+ const hasImage = imageCell !== null;
46
+ for (let i = 0; i < dataCells.length; i++) {
47
+ const { label, value } = dataCells[i];
48
+ const labelCell = {
49
+ text: label,
50
+ style: "box__label",
51
+ alignment: "right",
52
+ bold: false,
53
+ };
54
+ const valueCell = {
55
+ text: value,
56
+ style: "box__value",
57
+ bold: true,
58
+ };
59
+ const row = [];
60
+ // Add image column if present
61
+ if (hasImage) {
62
+ if (i === 0) {
63
+ // First row: include image with rowspan
64
+ row.push((0, helpers_1.buildImageCell)(imageCell, options, dataCells.length));
65
+ }
66
+ else {
67
+ // Subsequent rows: empty cell (handled by rowspan)
68
+ row.push({});
69
+ }
70
+ }
71
+ row.push(labelCell, valueCell);
72
+ body.push(row);
73
+ }
74
+ return buildCard({
75
+ table: {
76
+ widths: hasImage ? ["33%", "*", "*"] : ["*", "*"],
77
+ body: body,
78
+ },
79
+ layout: "noBorders",
80
+ padding: [10, 10, 10, 10],
81
+ });
82
+ };
83
+ exports.buildLayout5 = buildLayout5;
84
+ const buildTwoColumnLayout = (row, columns, columnNames, context, options, labelInnerStyle, valueInnerStyle) => {
85
+ const body = [];
86
+ for (const columnName of columnNames) {
87
+ // Find the column definition
88
+ const columnDef = columns.find(col => col.name === columnName);
89
+ if (!columnDef) {
90
+ console.warn(`Column "${columnName}" not found in data columns`);
91
+ continue;
92
+ }
93
+ // Get the label (title with fallback to name)
94
+ const label = columnDef.title || columnDef.name;
95
+ // Get the cell value (empty string if missing)
96
+ const cell = row.cells?.[columnName] ?? {
97
+ value: "",
98
+ obj: { t: "", p: "", k: "" },
99
+ };
100
+ const value = (0, commons_utility_1.calculateCellValue)(cell, types_1.SupportedExportFormats.PDF, context.webupManagerData);
101
+ body.push([
102
+ {
103
+ text: [{ text: label, ...labelInnerStyle }],
104
+ style: "box__label",
105
+ },
106
+ (0, cells_utility_1.cellIsImage)(cell)
107
+ ? (0, helpers_1.buildImageCell)(cell, options)
108
+ : {
109
+ text: [{ text: value, ...valueInnerStyle }],
110
+ style: "box__value",
111
+ },
112
+ ]);
113
+ }
114
+ return buildCard({
115
+ table: {
116
+ widths: ["*", "*"],
117
+ body: body,
118
+ },
119
+ layout: "noBorders",
120
+ padding: [10, 10, 10, 10],
121
+ });
122
+ };
123
+ const buildCard = (content) => {
124
+ return {
125
+ table: {
126
+ widths: ["*"],
127
+ body: [[content]],
128
+ },
129
+ layout: {
130
+ hLineWidth: function (_i, _node) {
131
+ return 1;
132
+ },
133
+ vLineWidth: function (_i, _node) {
134
+ return 1;
135
+ },
136
+ hLineColor: function (_i, _node) {
137
+ return "#CCCCCC";
138
+ },
139
+ vLineColor: function (_i, _node) {
140
+ return "#CCCCCC";
141
+ },
142
+ },
143
+ margin: [0, 0, 0, 10],
144
+ unbreakable: true,
145
+ };
146
+ };
147
+ //# sourceMappingURL=box-layouts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box-layouts.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/box/box-layouts.ts"],"names":[],"mappings":"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","sourcesContent":["import { Content, Style } from \"pdfmake/interfaces\";\nimport { SupportedExportFormats } from \"../../../../../types\";\nimport {\n SmeupDataRow,\n SmeupDataColumn,\n SmeupDataCell,\n} from \"../../../../../types/data-structures/smeupDataTable\";\nimport { calculateCellValue } from \"../../../../../utils/commons-utility\";\nimport { PdfMakeConverterContext } from \"../../pdfmake.types\";\nimport { BoxOptions } from \"../../../../../types/component\";\nimport { cellIsImage } from \"../../../../../utils/cells-utility\";\nimport { buildImageCell } from \"../helpers\";\n\nexport const buildLayout1 = (\n row: SmeupDataRow,\n columns: SmeupDataColumn[],\n columnNames: string[],\n context: PdfMakeConverterContext,\n options: BoxOptions,\n): unknown => {\n return buildTwoColumnLayout(\n row,\n columns,\n columnNames,\n context,\n options,\n {},\n { bold: true },\n );\n};\n\nexport const buildLayout2 = (\n row: SmeupDataRow,\n columns: SmeupDataColumn[],\n columnNames: string[],\n context: PdfMakeConverterContext,\n options: BoxOptions,\n): unknown => {\n return buildTwoColumnLayout(\n row,\n columns,\n columnNames,\n context,\n options,\n {},\n { bold: true, alignment: \"right\" },\n );\n};\n\nexport const buildLayout5 = (\n row: SmeupDataRow,\n columns: SmeupDataColumn[],\n columnNames: string[],\n context: PdfMakeConverterContext,\n options: BoxOptions,\n): unknown => {\n const body: unknown[][] = [];\n\n // Check if there's an image cell\n let imageCell: SmeupDataCell | null = null;\n const dataCells: Array<{ label: string; value: string }> = [];\n\n for (const columnName of columnNames) {\n // Find the column definition\n const columnDef = columns.find(col => col.name === columnName);\n\n if (!columnDef) {\n console.warn(`Column \"${columnName}\" not found in data columns`);\n continue;\n }\n\n // Get the label (title with fallback to name)\n const label = columnDef.title || columnDef.name;\n\n // Get the cell\n const cell = (row.cells?.[columnName] as SmeupDataCell) ?? {\n value: \"\",\n obj: { t: \"\", p: \"\", k: \"\" },\n };\n\n // Check if this is an image cell\n if (cellIsImage(cell) && !imageCell) {\n imageCell = cell;\n } else {\n const value = calculateCellValue(\n cell,\n SupportedExportFormats.PDF,\n context.webupManagerData,\n ) as string;\n dataCells.push({ label, value });\n }\n }\n\n // Build the table body\n const hasImage = imageCell !== null;\n\n for (let i = 0; i < dataCells.length; i++) {\n const { label, value } = dataCells[i];\n\n const labelCell = {\n text: label,\n style: \"box__label\",\n alignment: \"right\",\n bold: false,\n };\n\n const valueCell = {\n text: value,\n style: \"box__value\",\n bold: true,\n };\n\n const row: unknown[] = [];\n\n // Add image column if present\n if (hasImage) {\n if (i === 0) {\n // First row: include image with rowspan\n row.push(buildImageCell(imageCell!, options, dataCells.length));\n } else {\n // Subsequent rows: empty cell (handled by rowspan)\n row.push({});\n }\n }\n\n row.push(labelCell, valueCell);\n body.push(row);\n }\n\n return buildCard({\n table: {\n widths: hasImage ? [\"33%\", \"*\", \"*\"] : [\"*\", \"*\"],\n body: body,\n },\n layout: \"noBorders\",\n padding: [10, 10, 10, 10],\n } as Content);\n};\n\nconst buildTwoColumnLayout = (\n row: SmeupDataRow,\n columns: SmeupDataColumn[],\n columnNames: string[],\n context: PdfMakeConverterContext,\n options: BoxOptions,\n labelInnerStyle: Style,\n valueInnerStyle: Style,\n): unknown => {\n const body: unknown[] = [];\n\n for (const columnName of columnNames) {\n // Find the column definition\n const columnDef = columns.find(col => col.name === columnName);\n\n if (!columnDef) {\n console.warn(`Column \"${columnName}\" not found in data columns`);\n continue;\n }\n\n // Get the label (title with fallback to name)\n const label = columnDef.title || columnDef.name;\n\n // Get the cell value (empty string if missing)\n const cell = (row.cells?.[columnName] as SmeupDataCell) ?? {\n value: \"\",\n obj: { t: \"\", p: \"\", k: \"\" },\n };\n const value = calculateCellValue(\n cell,\n SupportedExportFormats.PDF,\n context.webupManagerData,\n );\n\n body.push([\n {\n text: [{ text: label, ...labelInnerStyle }],\n style: \"box__label\",\n },\n cellIsImage(cell)\n ? buildImageCell(cell, options)\n : {\n text: [{ text: value, ...valueInnerStyle }],\n style: \"box__value\",\n },\n ]);\n }\n\n return buildCard({\n table: {\n widths: [\"*\", \"*\"],\n body: body,\n },\n layout: \"noBorders\",\n padding: [10, 10, 10, 10],\n } as Content);\n};\n\nconst buildCard = (content: Content): unknown => {\n return {\n table: {\n widths: [\"*\"],\n body: [[content]],\n },\n layout: {\n hLineWidth: function (_i: number, _node: unknown) {\n return 1;\n },\n vLineWidth: function (_i: number, _node: unknown) {\n return 1;\n },\n hLineColor: function (_i: number, _node: unknown) {\n return \"#CCCCCC\";\n },\n vLineColor: function (_i: number, _node: unknown) {\n return \"#CCCCCC\";\n },\n },\n margin: [0, 0, 0, 10],\n unbreakable: true,\n };\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { PdfMakeConverterContext, ElementWithChartExtension } from "../pdfmake.types";
1
+ import { PdfMakeConverterContext, ElementWithChartExtension } from "../../pdfmake.types";
2
2
  /**
3
3
  * Adapts a Smeup chart structure to the PDFMake SVG format.
4
4
  *
@@ -2,8 +2,8 @@
2
2
  // ...
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.chartAdapter = exports.funToSmeupChartAdapter = exports.smeupChartToPdfMakeSvgAdapter = void 0;
5
- const smeupDataStructure_1 = require("../../../../types/data-structures/smeupDataStructure");
6
- const charts_converter_1 = require("../../../images/charts-converter");
5
+ const smeupDataStructure_1 = require("../../../../../types/data-structures/smeupDataStructure");
6
+ const charts_converter_1 = require("../../../../images/charts-converter");
7
7
  const hasChartWithData = (element) => {
8
8
  const chart = element
9
9
  ?.chart;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-adapter.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/chart/chart-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["// ...\n\nimport {\n PdfMakeConverterContext,\n ContentChartExtension,\n ElementWithChartExtension,\n} from \"../../pdfmake.types\";\n\nimport { SmeupDataStructureType } from \"../../../../../types/data-structures/smeupDataStructure\";\nimport { SmeupDataTable } from \"../../../../../types/data-structures/smeupDataTable\";\nimport { dataTableToChart } from \"../../../../images/charts-converter\";\nimport { ChartOptions } from \"../../../../../types/component\";\n\nconst hasChartWithData = (\n element: unknown,\n): element is ElementWithChartExtension => {\n const chart = (element as Record<string, unknown>)\n ?.chart as ContentChartExtension;\n const data = chart?.smeup?.data as SmeupDataTable | undefined;\n return (\n data?.type === SmeupDataStructureType.SmeupDataTable &&\n Array.isArray(data?.rows) &&\n Array.isArray(data?.columns)\n );\n};\n\nconst hasChartWithFun = (\n element: unknown,\n): element is ElementWithChartExtension => {\n const chart = (element as Record<string, unknown>)\n ?.chart as ContentChartExtension;\n const fun = chart?.smeup?.fun;\n return typeof fun === \"string\" && fun.length > 0;\n};\n\n/**\n * Adapts a Smeup chart structure to the PDFMake SVG format.\n *\n * This adapter function checks if the provided element contains a chart with data.\n * If so, it generates an SVG representation from the chart data and replaces the chart\n * object with an svg property. All properties of the original chart 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 chart with data.\n */\nexport const smeupChartToPdfMakeSvgAdapter = () => {\n return async (\n element: unknown,\n _context: PdfMakeConverterContext,\n ): Promise<ElementWithChartExtension> => {\n if (!hasChartWithData(element)) {\n return element as ElementWithChartExtension;\n }\n\n const elementWithChart = element as ElementWithChartExtension;\n const options = elementWithChart.chart.smeup!.options as ChartOptions;\n\n let mergedOptions;\n\n const svg = await dataTableToChart(\n elementWithChart.chart.smeup!.data!,\n options,\n (merged: ChartOptions) => {\n mergedOptions = merged;\n },\n );\n\n const width = mergedOptions!.ForceWidth;\n const height = mergedOptions!.ForceHeight;\n\n return {\n ...elementWithChart,\n svg: svg,\n ...width,\n ...height,\n } as ElementWithChartExtension;\n };\n};\n\n/**\n * Adapter function for converting a chart element with a `fun` property to a Smeup chart structure.\n *\n * This function returns an asynchronous converter that checks if the provided element contains\n * a chart with a `fun` property. If present, it uses the `getSmeupDataStructure` function from\n * the context to fetch the chart data corresponding to the `fun` string, and replaces the original\n * chart's `fun` property with the fetched data under the `data` property. All other properties\n * of the chart 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 const funToSmeupChartAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<ElementWithChartExtension> => {\n if (!hasChartWithFun(element)) {\n return element as ElementWithChartExtension;\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 elementWithChart = element as ElementWithChartExtension;\n const funStr = elementWithChart.chart.smeup!.fun!;\n const chartData = (await context.getSmeupDataStructure(\n funStr,\n )) as SmeupDataTable;\n\n // Extract all properties except 'fun' from the smeup object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { fun, ...smeupRest } = elementWithChart.chart.smeup!;\n // Extract all properties except 'smeup' from the chart object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { smeup, ...chartRest } = elementWithChart.chart;\n\n return {\n ...elementWithChart,\n chart: {\n ...chartRest,\n smeup: {\n ...smeupRest,\n data: chartData,\n },\n },\n };\n }\n }\n };\n};\n\n/**\n * Main chart adapter that chains all chart transformation adapters.\n *\n * This adapter first converts a `fun` property to chart data using funToSmeupChartAdapter,\n * then transforms the chart data to an SVG format using smeupChartToPdfMakeSvgAdapter.\n *\n * @returns An asynchronous function that applies all chart adapters in sequence.\n */\nexport const chartAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<ElementWithChartExtension> => {\n const adaptedElement = await funToSmeupChartAdapter()(element, context);\n return (await smeupChartToPdfMakeSvgAdapter()(\n adaptedElement,\n context,\n )) as ElementWithChartExtension;\n };\n};\n"]}
@@ -0,0 +1,3 @@
1
+ import { BoxOptions } from "../../../../types/component";
2
+ import { SmeupDataCell } from "../../../../types/data-structures/smeupDataTable";
3
+ export declare const buildImageCell: (imageCell: SmeupDataCell, options: BoxOptions, rowSpan?: number, alignment?: "center" | "left" | "right") => unknown;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildImageCell = void 0;
4
+ const objects_utility_1 = require("../../../../utils/objects-utility");
5
+ const buildImageCell = (imageCell, options, rowSpan = 1, alignment = "left") => {
6
+ const fit = options.ImageFit ? parseInt(options.ImageFit) : 60;
7
+ const imageProvider = (0, objects_utility_1.objectsIsURL)(imageCell.obj)
8
+ ? { url: imageCell.obj.k }
9
+ : { obj: { ...imageCell.obj } };
10
+ return {
11
+ image: { smeup: imageProvider },
12
+ fit: [fit, fit],
13
+ alignment: alignment,
14
+ rowSpan: rowSpan,
15
+ };
16
+ };
17
+ exports.buildImageCell = buildImageCell;
18
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../../src/converters/pdf/pdfmake/adapters/helpers.ts"],"names":[],"mappings":";;;AAEA,uEAAiE;AAE1D,MAAM,cAAc,GAAG,CAC5B,SAAwB,EACxB,OAAmB,EACnB,UAAkB,CAAC,EACnB,YAAyC,MAAM,EACtC,EAAE;IACX,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,aAAa,GAAG,IAAA,8BAAY,EAAC,SAAS,CAAC,GAAG,CAAC;QAC/C,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,GAAI,CAAC,CAAC,EAAE;QAC3B,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC;IAClC,OAAO;QACL,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;QAC/B,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;QACf,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,OAAO;KACjB,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,cAAc,kBAgBzB","sourcesContent":["import { BoxOptions } from \"../../../../types/component\";\nimport { SmeupDataCell } from \"../../../../types/data-structures/smeupDataTable\";\nimport { objectsIsURL } from \"../../../../utils/objects-utility\";\n\nexport const buildImageCell = (\n imageCell: SmeupDataCell,\n options: BoxOptions,\n rowSpan: number = 1,\n alignment: \"center\" | \"left\" | \"right\" = \"left\",\n): unknown => {\n const fit = options.ImageFit ? parseInt(options.ImageFit) : 60;\n const imageProvider = objectsIsURL(imageCell.obj)\n ? { url: imageCell.obj!.k }\n : { obj: { ...imageCell.obj } };\n return {\n image: { smeup: imageProvider },\n fit: [fit, fit],\n alignment: alignment,\n rowSpan: rowSpan,\n };\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { ContentImageExtension, ElementWithImageExtension, PdfMakeConverterContext } from "../pdfmake.types";
1
+ import { ContentImageExtension, ElementWithImageExtension, PdfMakeConverterContext } from "../../pdfmake.types";
2
2
  /**
3
3
  * Adapts a Smeup image structure to the PDFMake image format.
4
4
  *
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.imageAdapter = exports.objectToUrlAdapter = exports.urlToImageAdapter = void 0;
4
+ const gfx_data_1 = require("../../../../../assets/gfx-data");
4
5
  const hasSmeupUrl = (element) => {
5
6
  const image = element
6
7
  .image;
@@ -23,20 +24,26 @@ function hasSmeupObject(element) {
23
24
  * @throws If the download fails, content-type is not an image, or network error occurs
24
25
  */
25
26
  const downloadImageAsDataUrl = async (url, fetchData) => {
26
- const response = await fetchData(url);
27
- if (!response.ok) {
28
- throw new Error(`Failed to download image from ${url}: ${response.status} ${response.statusText}`);
27
+ try {
28
+ const response = await fetchData(url);
29
+ if (!response.ok) {
30
+ throw new Error(`Failed to download image from ${url}: ${response.status} ${response.statusText}`);
31
+ }
32
+ // Extract content-type from headers
33
+ const contentType = response.headers.get("content-type") || "image/jpeg";
34
+ // Validate that content-type is an image
35
+ if (!contentType.startsWith("image/")) {
36
+ throw new Error(`Invalid content-type for image: expected image/*, got ${contentType}`);
37
+ }
38
+ // Get image data and convert to base64
39
+ const arrayBuffer = await response.arrayBuffer();
40
+ const base64 = Buffer.from(arrayBuffer).toString("base64");
41
+ return `data:${contentType};base64,${base64}`;
29
42
  }
30
- // Extract content-type from headers
31
- const contentType = response.headers.get("content-type") || "image/jpeg";
32
- // Validate that content-type is an image
33
- if (!contentType.startsWith("image/")) {
34
- throw new Error(`Invalid content-type for image: expected image/*, got ${contentType}`);
43
+ catch (error) {
44
+ console.error(error);
45
+ return gfx_data_1.brokenImage;
35
46
  }
36
- // Get image data and convert to base64
37
- const arrayBuffer = await response.arrayBuffer();
38
- const base64 = Buffer.from(arrayBuffer).toString("base64");
39
- return `data:${contentType};base64,${base64}`;
40
47
  };
41
48
  /**
42
49
  * Adapts a Smeup image structure to the PDFMake image format.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-adapter.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/image/image-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { SmeupDataTree } from \"../../../../../types/data-structures/smeupDataTree\";\nimport {\n ContentImageExtension,\n ElementWithImageExtension,\n PdfMakeConverterContext,\n} from \"../../pdfmake.types\";\nimport { brokenImage } from \"../../../../../assets/gfx-data\";\n\nconst hasSmeupUrl = (element: unknown): boolean => {\n const image = (element as Record<string, unknown>)\n .image as ContentImageExtension;\n const url = image?.smeup?.url;\n return typeof url === \"string\" && url.length > 0;\n};\n\nfunction hasSmeupObject(element: unknown): boolean {\n const image = (element as Record<string, unknown>)\n .image as ContentImageExtension;\n const obj = image?.smeup?.obj;\n return typeof obj === \"object\" && obj !== null;\n}\n\n/**\n * Downloads an image from a URL and converts it to a data URL format.\n * Validates that the content-type is an image MIME type.\n *\n * @param url - The URL of the image to download\n * @param fetchData - Callback function to fetch the image data\n * @returns A data URL string in the format: data:image/jpeg;base64,<base64>\n * @throws If the download fails, content-type is not an image, or network error occurs\n */\nconst downloadImageAsDataUrl = async (\n url: string,\n fetchData: (url: string) => Promise<Response>,\n): Promise<string> => {\n try {\n const response = await fetchData(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to download image from ${url}: ${response.status} ${response.statusText}`,\n );\n }\n\n // Extract content-type from headers\n const contentType = response.headers.get(\"content-type\") || \"image/jpeg\";\n\n // Validate that content-type is an image\n if (!contentType.startsWith(\"image/\")) {\n throw new Error(\n `Invalid content-type for image: expected image/*, got ${contentType}`,\n );\n }\n\n // Get image data and convert to base64\n const arrayBuffer = await response.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n\n return `data:${contentType};base64,${base64}`;\n } catch (error) {\n console.error(error);\n return brokenImage;\n }\n};\n\n/**\n * Adapts a Smeup image structure to the PDFMake image format.\n *\n * This adapter function checks if the provided element contains an image with a smeup URL.\n * If so, it downloads the image using the fetchData callback from context, validates the\n * content-type, and transforms it into a data URL format that PDFMake can use.\n * The data URL is stored in context.pdfDocument.images to avoid redundancy when the same\n * image is referenced multiple times.\n * All properties of the original image except `smeup` are preserved.\n *\n * @returns An async function that takes an element and returns the adapted element for PDFMake,\n * or the original element if it does not contain a valid smeup image.\n * @throws If the context does not provide a fetchData function when the smeup image is used.\n * @throws If the image download fails or the content-type is not a valid image MIME type.\n */\nexport const urlToImageAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<ContentImageExtension> => {\n if (!hasSmeupUrl(element)) {\n return element as ContentImageExtension;\n }\n\n if (!context.fetchData) {\n throw new Error(\n \"fetchData function is required in context when the smeup image property is used\",\n );\n }\n\n const elementImage = element as { image: { smeup: { url: string } } };\n const url = elementImage.image.smeup.url;\n\n // Ensure pdfDocument exists in context\n if (!context.pdfDocument) {\n throw new Error(\n \"pdfDocument is required in context when the smeup image property is used\",\n );\n }\n\n // Initialize images dictionary if not present\n if (!context.pdfDocument.images) {\n context.pdfDocument.images = {};\n }\n\n // Download and cache the image only if not already present\n if (!context.pdfDocument.images[url]) {\n const dataUrl = await downloadImageAsDataUrl(url, context.fetchData);\n context.pdfDocument.images[url] = dataUrl;\n }\n\n // Extract all properties except 'smeup' from the image object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { smeup, ...imageRest } = elementImage.image;\n\n return {\n ...elementImage,\n image: url,\n ...imageRest,\n };\n };\n};\n\nexport const objectToUrlAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<ElementWithImageExtension> => {\n if (!hasSmeupObject(element)) {\n return element as ElementWithImageExtension;\n }\n if (!context.getSmeupDataStructure || !context.damSvcEndpoint) {\n throw new Error(\n \"getSmeupDataStructure function and damSvcEndpoint prop are required in context when the smeup image obj property is used\",\n );\n } else {\n const elementImage = element as ElementWithImageExtension;\n const obj = elementImage.image.smeup?.obj;\n if (!obj || !obj.t || !obj.p || !obj.k) {\n throw new Error(\n \"Smeup object must have t, p, and k properties to build GET.PATH function\",\n );\n }\n const funToGetPATH = `F(TRE;JASER_12W;GET.PATH) 1(${obj.t};${obj.p};${obj.k})`;\n const dataTree = (await context.getSmeupDataStructure(\n funToGetPATH,\n )) as SmeupDataTree;\n if (dataTree.children?.length === 0) {\n throw new Error(`No data found for function ${funToGetPATH}`);\n } else {\n const pathNode = dataTree.children[0].value.replace(/\\\\/g, \"/\");\n const pathEncoded = encodeURIComponent(pathNode);\n const url = context.damSvcEndpoint + \"/\" + pathEncoded;\n\n // Extract all properties except 'smeup' from the image object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { smeup, ...imageRest } = elementImage.image;\n\n return {\n ...elementImage,\n image: {\n smeup: {\n url,\n },\n ...imageRest,\n },\n };\n }\n }\n };\n};\n\nexport const imageAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<ContentImageExtension> => {\n try {\n const adaptedElement = await objectToUrlAdapter()(element, context);\n return await urlToImageAdapter()(adaptedElement, context);\n } catch (error) {\n console.error(error);\n const errorMessage = (error as Error).message;\n const cause = (error as Error & { cause?: Error }).cause;\n const causeMessage = cause ? `\\nCause: ${cause.message || cause}` : \"\";\n return {\n text: `Error loading image: ${errorMessage}${causeMessage}`,\n fontSize: 10,\n color: \"#8B0000\",\n } as unknown as ContentImageExtension;\n }\n };\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { ElementWithLayout, PdfMakeConverterContext } from "../pdfmake.types";
1
+ import { ElementWithLayout, PdfMakeConverterContext } from "../../pdfmake.types";
2
2
  /**
3
3
  * Adapts a layout object by converting static values to functions.
4
4
  *
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-adapter.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/layout/layout-adapter.ts"],"names":[],"mappings":";;;AAQA,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAW,EAAE;IAC9C,MAAM,MAAM,GAAI,OAAmC,CAAC,MAAM,CAAC;IAC3D,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,OAAgB,EAAW,EAAE;IAC1D,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAI,OAA6B,CAAC,MAAO,CAAC;IAEtD,kDAAkD;IAClD,MAAM,yBAAyB,GAC7B,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,CAAC;IAC7E,MAAM,yBAAyB,GAC7B,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,CAAC;IAC7E,MAAM,yBAAyB,GAC7B,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,CAAC;IAC7E,MAAM,yBAAyB,GAC7B,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,CAAC;IAE7E,OAAO,CACL,yBAAyB;QACzB,yBAAyB;QACzB,yBAAyB;QACzB,yBAAyB,CAC1B,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACI,MAAM,aAAa,GAAG,GAAG,EAAE;IAChC,OAAO,KAAK,EACV,OAAgB,EAChB,QAAiC,EACL,EAAE;QAC9B,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,OAAO,OAA4B,CAAC;QACtC,CAAC;QAED,MAAM,iBAAiB,GAAG,OAA4B,CAAC;QACvD,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAO,CAAC;QACjD,MAAM,aAAa,GAAW,EAAE,GAAG,cAAc,EAAE,CAAC;QAEpD,sCAAsC;QACtC,IACE,cAAc,CAAC,UAAU,KAAK,SAAS;YACvC,OAAO,cAAc,CAAC,UAAU,KAAK,QAAQ,EAC7C,CAAC;YACD,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC;YACxC,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAuB,CAAC;QAC3E,CAAC;QAED,sCAAsC;QACtC,IACE,cAAc,CAAC,UAAU,KAAK,SAAS;YACvC,OAAO,cAAc,CAAC,UAAU,KAAK,QAAQ,EAC7C,CAAC;YACD,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC;YACxC,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAuB,CAAC;QAC3E,CAAC;QAED,sCAAsC;QACtC,IACE,cAAc,CAAC,UAAU,KAAK,SAAS;YACvC,OAAO,cAAc,CAAC,UAAU,KAAK,QAAQ,EAC7C,CAAC;YACD,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC;YACxC,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAwB,CAAC;QAC5E,CAAC;QAED,sCAAsC;QACtC,IACE,cAAc,CAAC,UAAU,KAAK,SAAS;YACvC,OAAO,cAAc,CAAC,UAAU,KAAK,QAAQ,EAC7C,CAAC;YACD,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC;YACxC,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAwB,CAAC;QAC5E,CAAC;QAED,OAAO;YACL,GAAG,iBAAiB;YACpB,MAAM,EAAE,aAAa;SACtB,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAtDW,QAAA,aAAa,iBAsDxB","sourcesContent":["import {\n ElementWithLayout,\n Layout,\n LayoutColorFunction,\n LayoutLineFunction,\n PdfMakeConverterContext,\n} from \"../../pdfmake.types\";\n\nconst hasLayout = (element: unknown): boolean => {\n const layout = (element as Record<string, unknown>).layout;\n return typeof layout === \"object\" && layout !== null;\n};\n\nconst needsLayoutAdaptation = (element: unknown): boolean => {\n if (!hasLayout(element)) {\n return false;\n }\n\n const layout = (element as ElementWithLayout).layout!;\n\n // Check if any of the properties needs conversion\n const needsHLineWidthConversion =\n layout.hLineWidth !== undefined && typeof layout.hLineWidth !== \"function\";\n const needsVLineWidthConversion =\n layout.vLineWidth !== undefined && typeof layout.vLineWidth !== \"function\";\n const needsHLineColorConversion =\n layout.hLineColor !== undefined && typeof layout.hLineColor !== \"function\";\n const needsVLineColorConversion =\n layout.vLineColor !== undefined && typeof layout.vLineColor !== \"function\";\n\n return (\n needsHLineWidthConversion ||\n needsVLineWidthConversion ||\n needsHLineColorConversion ||\n needsVLineColorConversion\n );\n};\n\n/**\n * Adapts a layout object by converting static values to functions.\n *\n * This adapter function checks if the provided element contains a layout with static values\n * for hLineWidth, vLineWidth, hLineColor, and vLineColor properties.\n * If so, it converts them to functions as required by PDFMake:\n * - hLineWidth and vLineWidth (numbers) are converted to: function(i) { return value; }\n * - hLineColor and vLineColor (strings) are converted to: function(i) { return value; }\n *\n * All other properties of the layout 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 layout that needs adaptation.\n */\nexport const layoutAdapter = () => {\n return async (\n element: unknown,\n _context: PdfMakeConverterContext,\n ): Promise<ElementWithLayout> => {\n if (!needsLayoutAdaptation(element)) {\n return element as ElementWithLayout;\n }\n\n const elementWithLayout = element as ElementWithLayout;\n const originalLayout = elementWithLayout.layout!;\n const adaptedLayout: Layout = { ...originalLayout };\n\n // Convert hLineWidth if it's a number\n if (\n originalLayout.hLineWidth !== undefined &&\n typeof originalLayout.hLineWidth === \"number\"\n ) {\n const value = originalLayout.hLineWidth;\n adaptedLayout.hLineWidth = ((_i: number) => value) as LayoutLineFunction;\n }\n\n // Convert vLineWidth if it's a number\n if (\n originalLayout.vLineWidth !== undefined &&\n typeof originalLayout.vLineWidth === \"number\"\n ) {\n const value = originalLayout.vLineWidth;\n adaptedLayout.vLineWidth = ((_i: number) => value) as LayoutLineFunction;\n }\n\n // Convert hLineColor if it's a string\n if (\n originalLayout.hLineColor !== undefined &&\n typeof originalLayout.hLineColor === \"string\"\n ) {\n const value = originalLayout.hLineColor;\n adaptedLayout.hLineColor = ((_i: number) => value) as LayoutColorFunction;\n }\n\n // Convert vLineColor if it's a string\n if (\n originalLayout.vLineColor !== undefined &&\n typeof originalLayout.vLineColor === \"string\"\n ) {\n const value = originalLayout.vLineColor;\n adaptedLayout.vLineColor = ((_i: number) => value) as LayoutColorFunction;\n }\n\n return {\n ...elementWithLayout,\n layout: adaptedLayout,\n };\n };\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { PdfMakeConverterContext } from "../pdfmake.types";
1
+ import { PdfMakeConverterContext } from "../../pdfmake.types";
2
2
  /**
3
3
  * Adapter for header elements with page number placeholder support.
4
4
  */
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.footerAdapter = exports.headerAdapter = void 0;
4
- const adapter_processor_1 = require("../adapter-processor");
4
+ const adapter_processor_1 = require("../../adapter-processor");
5
5
  /**
6
6
  * Type guard to check if an element has a specific property
7
7
  */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-element-adapter.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/page-alement/page-element-adapter.ts"],"names":[],"mappings":";;;AACA,+DAA0D;AAG1D;;GAEG;AACH,MAAM,WAAW,GAAG,CAClB,OAAgB,EAChB,YAAe,EACiC,EAAE;IAClD,OAAO,CACL,OAAO,KAAK,IAAI;QAChB,OAAO,OAAO,KAAK,QAAQ;QAC3B,YAAY,IAAI,OAAO;QACtB,OAAmC,CAAC,YAAY,CAAC,KAAK,SAAS,CACjE,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,mBAAmB,GAAG,CAC1B,GAAY,EACZ,WAAmB,EACnB,SAAiB,EACR,EAAE;IACX,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG;aACP,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;aAChD,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,wBAAwB,GAAG,CAAC,YAAiC,EAAE,EAAE;IACrE,OAAO,KAAK,EACV,OAAgB,EAChB,OAAgC,EACd,EAAE;QACpB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC;YACxC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QAE5C,oDAAoD;QACpD,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;YACxC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,yEAAyE;QACzE,mFAAmF;QACnF,IAAI,cAAc,GAAY,aAAa,CAAC;QAC5C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,cAAc,GAAG,MAAM,IAAA,mCAAe,EACpC,aAAa,EACb,OAAO,CAAC,SAAS,EACjB,OAAO,CACR,CAAC;QACJ,CAAC;QAED,0FAA0F;QAC1F,MAAM,cAAc,GAAmB,CACrC,WAAW,EACX,SAAS,EACT,SAAS,EACT,EAAE;YACF,OAAO,mBAAmB,CACxB,cAAc,EACd,WAAW,EACX,SAAS,CACC,CAAC;QACf,CAAC,CAAC;QAEF,OAAO;YACL,GAAG,OAAO;YACV,CAAC,YAAY,CAAC,EAAE,cAAc;SAC/B,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACI,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;AAAzD,QAAA,aAAa,iBAA4C;AAEtE;;GAEG;AACI,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;AAAzD,QAAA,aAAa,iBAA4C","sourcesContent":["import { Content, DynamicContent } from \"pdfmake/interfaces\";\nimport { processDocument } from \"../../adapter-processor\";\nimport { PdfMakeConverterContext } from \"../../pdfmake.types\";\n\n/**\n * Type guard to check if an element has a specific property\n */\nconst hasProperty = <T extends string>(\n element: unknown,\n propertyName: T,\n): element is Record<T, Content | DynamicContent> => {\n return (\n element !== null &&\n typeof element === \"object\" &&\n propertyName in element &&\n (element as Record<string, unknown>)[propertyName] !== undefined\n );\n};\n\n/**\n * Recursively searches for [CurrentPage] and [PageCount] placeholders in an object\n * and replaces them with the actual values.\n *\n * @param obj - The object to process\n * @param currentPage - The current page number\n * @param pageCount - The total page count\n * @returns The processed object with replaced placeholders\n */\nconst replacePlaceholders = (\n obj: unknown,\n currentPage: number,\n pageCount: number,\n): unknown => {\n if (typeof obj === \"string\") {\n return obj\n .replace(/\\[CurrentPage\\]/g, String(currentPage))\n .replace(/\\[PageCount\\]/g, String(pageCount));\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => replacePlaceholders(item, currentPage, pageCount));\n }\n\n if (obj !== null && typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = replacePlaceholders(value, currentPage, pageCount);\n }\n return result;\n }\n\n return obj;\n};\n\n/**\n * Adapts a header or footer to support dynamic page number placeholders.\n *\n * This adapter function checks if the provided element contains the specified property (header or footer).\n * - If the property is already a function, it leaves it unchanged.\n * - If the property is an object, it first recursively processes it with all registered adapters,\n * then wraps it in a function that replaces [CurrentPage] with the current page number and\n * [PageCount] with the total page count at rendering time.\n *\n * @param propertyName - The name of the property to adapt ('header' or 'footer')\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 the specified property.\n */\nconst createPageElementAdapter = (propertyName: \"header\" | \"footer\") => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n if (!hasProperty(element, propertyName)) {\n return element;\n }\n\n const propertyValue = element[propertyName];\n\n // If property is already a function, leave it as is\n if (typeof propertyValue === \"function\") {\n return element;\n }\n\n // First, recursively process the header/footer content with all adapters\n // This ensures nested elements (like tables with layouts) are properly transformed\n let processedValue: unknown = propertyValue;\n if (context._adapters) {\n processedValue = await processDocument(\n propertyValue,\n context._adapters,\n context,\n );\n }\n\n // Then wrap the processed content in a function that replaces placeholders at render time\n const dynamicContent: DynamicContent = (\n currentPage,\n pageCount,\n _pageSize,\n ) => {\n return replacePlaceholders(\n processedValue,\n currentPage,\n pageCount,\n ) as Content;\n };\n\n return {\n ...element,\n [propertyName]: dynamicContent,\n };\n };\n};\n\n/**\n * Adapter for header elements with page number placeholder support.\n */\nexport const headerAdapter = () => createPageElementAdapter(\"header\");\n\n/**\n * Adapter for footer elements with page number placeholder support.\n */\nexport const footerAdapter = () => createPageElementAdapter(\"footer\");\n"]}
@@ -1,4 +1,4 @@
1
- import { ElementWithTableExtension, PdfMakeConverterContext } from "../pdfmake.types";
1
+ import { ElementWithTableExtension, PdfMakeConverterContext } from "../../pdfmake.types";
2
2
  /**
3
3
  * Adapts a Smeup table structure to the PDFMake table format.
4
4
  *