@sme.up/doc-alchemist 1.4.1 → 1.5.0-20251209090900

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 (56) hide show
  1. package/README.md +39 -48
  2. package/dist/converters/excel/commons.d.ts +2 -2
  3. package/dist/converters/excel/commons.js +19 -13
  4. package/dist/converters/excel/commons.js.map +1 -1
  5. package/dist/converters/excel/excel-converter.types.d.ts +2 -0
  6. package/dist/converters/excel/excel-converter.types.js +3 -1
  7. package/dist/converters/excel/excel-converter.types.js.map +1 -1
  8. package/dist/converters/excel/matrix-converter.d.ts +1 -1
  9. package/dist/converters/excel/matrix-converter.js +33 -11
  10. package/dist/converters/excel/matrix-converter.js.map +1 -1
  11. package/dist/converters/excel/tree-converter.d.ts +1 -1
  12. package/dist/converters/excel/tree-converter.js +3 -3
  13. package/dist/converters/excel/tree-converter.js.map +1 -1
  14. package/dist/converters/excel-converter.d.ts +1 -1
  15. package/dist/converters/excel-converter.js +2 -2
  16. package/dist/converters/excel-converter.js.map +1 -1
  17. package/dist/converters/pdf/form-filler.d.ts +24 -0
  18. package/dist/converters/pdf/form-filler.js +187 -0
  19. package/dist/converters/pdf/form-filler.js.map +1 -0
  20. package/dist/converters/pdf/pdfmake/adapter-processor.d.ts +12 -0
  21. package/dist/converters/pdf/pdfmake/adapter-processor.js +113 -0
  22. package/dist/converters/pdf/pdfmake/adapter-processor.js.map +1 -0
  23. package/dist/converters/pdf/pdfmake/adapter-registry.d.ts +22 -0
  24. package/dist/converters/pdf/pdfmake/adapter-registry.js +48 -0
  25. package/dist/converters/pdf/pdfmake/adapter-registry.js.map +1 -0
  26. package/dist/converters/pdf/pdfmake/image-adapter.d.ts +19 -0
  27. package/dist/converters/pdf/pdfmake/image-adapter.js +150 -0
  28. package/dist/converters/pdf/pdfmake/image-adapter.js.map +1 -0
  29. package/dist/converters/pdf/pdfmake/page-element-adapter.d.ts +8 -0
  30. package/dist/converters/pdf/pdfmake/page-element-adapter.js +83 -0
  31. package/dist/converters/pdf/pdfmake/page-element-adapter.js.map +1 -0
  32. package/dist/converters/pdf/pdfmake/pdfmake.types.d.ts +60 -0
  33. package/dist/converters/pdf/pdfmake/pdfmake.types.js +13 -0
  34. package/dist/converters/pdf/pdfmake/pdfmake.types.js.map +1 -0
  35. package/dist/converters/pdf/pdfmake/table-adapter.d.ts +31 -0
  36. package/dist/converters/pdf/pdfmake/table-adapter.js +126 -0
  37. package/dist/converters/pdf/pdfmake/table-adapter.js.map +1 -0
  38. package/dist/converters/pdf/pdfmake-renderer.d.ts +21 -0
  39. package/dist/converters/pdf/pdfmake-renderer.js +87 -0
  40. package/dist/converters/pdf/pdfmake-renderer.js.map +1 -0
  41. package/dist/converters/pdf-converter.d.ts +6 -0
  42. package/dist/converters/pdf-converter.js +24 -1
  43. package/dist/converters/pdf-converter.js.map +1 -1
  44. package/dist/index.d.ts +7 -1
  45. package/dist/index.js +12 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/utils/commons-utility.d.ts +3 -2
  48. package/dist/utils/commons-utility.js +23 -79
  49. package/dist/utils/commons-utility.js.map +1 -1
  50. package/dist/utils/dates-utility.d.ts +7 -0
  51. package/dist/utils/dates-utility.js +25 -0
  52. package/dist/utils/dates-utility.js.map +1 -1
  53. package/dist/utils/filters-utility.d.ts +6 -0
  54. package/dist/utils/filters-utility.js +189 -0
  55. package/dist/utils/filters-utility.js.map +1 -0
  56. package/package.json +5 -3
@@ -1 +1 @@
1
- {"version":3,"file":"tree-converter.js","sourceRoot":"","sources":["../../../src/converters/excel/tree-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n GenericObject,\n SupportedExportFormats,\n WebupManagerData,\n} from \"../../types/index\";\nimport { exportTypeSupportsFormatting } from \"./excel-converter.types\";\nimport ExcelJS from \"exceljs\";\nimport {\n addFooterTotalsRow,\n initializeWorksheet,\n setHeaderStyling,\n} from \"./commons\";\nimport { isColumnHidden } from \"../../utils/datastructure-utility\";\nimport {\n getFilteredColumns,\n calculateCellValue,\n} from \"../../utils/commons-utility\";\nimport { addStyleToExceljsRow } from \"./matrix-converter\";\nimport { SmeupDataColumn } from \"../../types/data-structures/smeupDataTable\";\nimport {\n SmeupDataTree,\n SmeupDataNode,\n} from \"../../types/data-structures/smeupDataTree\";\n\nexport async function dataTreeToExcelWorkbook(\n component: {\n smeupDataTree: SmeupDataTree;\n props: GenericObject;\n },\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n splitNodesToColumns = true,\n): Promise<ExcelJS.Workbook> {\n const { smeupDataTree, props } = component;\n const workbook = new ExcelJS.Workbook();\n const worksheet = initializeWorksheet(workbook);\n const columnsMaxWidth: { [columnName: string]: number } = {};\n\n // Add ExcelJS columns\n const headerColumns = addTreeColumns(\n worksheet,\n smeupDataTree.columns ?? [],\n smeupDataTree.children,\n splitNodesToColumns,\n props,\n );\n\n // Add ExcelJS rows\n addTreeNodeRows(\n worksheet,\n fileFormat,\n webupManagerData,\n columnsMaxWidth,\n headerColumns,\n smeupDataTree.children,\n splitNodesToColumns,\n );\n\n // Totals\n if (exportTypeSupportsFormatting[fileFormat] && props?.totals) {\n addFooterTotalsRow(worksheet, headerColumns, props, webupManagerData);\n }\n\n // Set ExcelJS columns width\n worksheet.columns.forEach(col => {\n if (col.key) {\n col.width = columnsMaxWidth[col.key] ?? 10;\n } else {\n col.width = 10;\n }\n });\n\n // Forces full calculation when the workbook is opened\n workbook.calcProperties = {\n fullCalcOnLoad: true,\n };\n return workbook;\n}\n\nconst addTreeColumns = (\n worksheet: ExcelJS.Worksheet,\n columns: SmeupDataColumn[],\n nodeRows: SmeupDataNode[],\n splitNodesToColumns: boolean,\n props: GenericObject,\n): SmeupDataColumn[] => {\n const addTreeNodeColumns = (\n nodeRows: SmeupDataNode[],\n nodeColumns: SmeupDataColumn[],\n level = 0,\n ) => {\n if (\n !nodeColumns.some(\n nodeColumn => nodeColumn.name === getTreeNodeColumnName(level),\n )\n ) {\n nodeColumns.push({\n name: getTreeNodeColumnName(level),\n title: `.${level + 1}`,\n });\n }\n\n nodeRows.forEach(row => {\n if (row.children?.length ?? 0 > 0) {\n addTreeNodeColumns(row.children ?? [], nodeColumns, level + 1);\n }\n });\n };\n\n const nodeColumns: SmeupDataColumn[] = [];\n if (splitNodesToColumns) {\n // New column for each tree node\n addTreeNodeColumns(nodeRows, nodeColumns);\n } else {\n // All tree nodes are under the same column\n nodeColumns.push({\n name: getTreeNodeColumnName(0),\n title: \"\",\n });\n }\n\n const filteredColumns: SmeupDataColumn[] = getFilteredColumns(columns, props);\n const headerColumns: SmeupDataColumn[] = [...nodeColumns, ...filteredColumns];\n\n /* Add ExcelJS columns*/\n worksheet.columns = headerColumns.map<Partial<ExcelJS.Column>>(column => ({\n header: column.title ?? \"\",\n key: column.name,\n hidden: isColumnHidden(column),\n }));\n // Add style to ExcelJS columns\n setHeaderStyling(worksheet, true);\n return headerColumns;\n};\n\nconst addTreeNodeRows = (\n worksheet: ExcelJS.Worksheet,\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n columnsMaxWidth: { [columnName: string]: number },\n columns: SmeupDataColumn[],\n nodeRows: SmeupDataNode[],\n splitNodesToColumns: boolean,\n level = 0,\n): void => {\n const getParsedRowData = (row: SmeupDataNode): (string | number | Date)[] => {\n return columns.map<string | number | Date>(column => {\n /* Set cell value */\n let cellValue: string | number | Date = \"\";\n\n if (column.name.includes(TREE_HEADER_COLUMN_NAME)) {\n /* Node column */\n if (!splitNodesToColumns) {\n // Level-based indentation\n const indent = ` `.repeat(level);\n cellValue = `${indent}${row.obj?.k}: ${row.value}`;\n } else if (column.name === getTreeNodeColumnName(level)) {\n // No indentation\n cellValue = `${row.obj?.k}: ${row.value}`;\n }\n } else {\n /* Standard column */\n cellValue = calculateCellValue(\n row.cells?.[column.name] ?? { value: \"\" },\n fileFormat,\n webupManagerData,\n );\n }\n\n /* Update column max width */\n const currentMaxWidth = columnsMaxWidth[column.name] ?? 10;\n const cellLength =\n cellValue instanceof Date ? 10 : cellValue.toString().length;\n columnsMaxWidth[column.name] = Math.max(currentMaxWidth, cellLength);\n\n return cellValue;\n });\n };\n\n nodeRows.forEach(row => {\n /* Add ExcelJS row */\n const parsedRowData = getParsedRowData(row);\n const exceljsRow = worksheet.addRow(parsedRowData);\n\n if (exportTypeSupportsFormatting[fileFormat]) {\n addStyleToExceljsRow(exceljsRow, columns, row);\n }\n\n if (row.children?.length ?? 0 > 0) {\n addTreeNodeRows(\n worksheet,\n fileFormat,\n webupManagerData,\n columnsMaxWidth,\n columns,\n row.children ?? [],\n splitNodesToColumns,\n level + 1,\n );\n }\n });\n};\n\nexport const TREE_HEADER_COLUMN_NAME = \"TREE_NODE_LVL_\";\n\nexport const getTreeNodeColumnName = (level: number) => {\n return `${TREE_HEADER_COLUMN_NAME}${level}`;\n};\n\n"]}
1
+ {"version":3,"file":"tree-converter.js","sourceRoot":"","sources":["../../../src/converters/excel/tree-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n GenericObject,\n SupportedExportFormats,\n WebupManagerData,\n} from \"../../types/index\";\nimport {\n exportTypeSupportsFormatting,\n STARTING_ROW_WITHOUT_TITLE,\n} from \"./excel-converter.types\";\nimport ExcelJS from \"exceljs\";\nimport {\n addFooterTotalsRow,\n initializeWorksheet,\n setHeaderStyling,\n} from \"./commons\";\nimport { isColumnHidden } from \"../../utils/datastructure-utility\";\nimport {\n getFilteredColumns,\n calculateCellValue,\n} from \"../../utils/commons-utility\";\nimport { addStyleToExceljsRow } from \"./matrix-converter\";\nimport { SmeupDataColumn } from \"../../types/data-structures/smeupDataTable\";\nimport {\n SmeupDataTree,\n SmeupDataNode,\n} from \"../../types/data-structures/smeupDataTree\";\n\nexport async function dataTreeToExcelWorkbook(\n component: {\n smeupDataTree: SmeupDataTree;\n props: GenericObject;\n },\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n splitNodesToColumns = true,\n title: string = \"\",\n): Promise<ExcelJS.Workbook> {\n const { smeupDataTree, props } = component;\n const workbook = new ExcelJS.Workbook();\n const worksheet = initializeWorksheet(workbook, title);\n const columnsMaxWidth: { [columnName: string]: number } = {};\n\n // Add ExcelJS columns\n const headerColumns = addTreeColumns(\n worksheet,\n smeupDataTree.columns ?? [],\n smeupDataTree.children,\n splitNodesToColumns,\n props,\n );\n\n // Add ExcelJS rows\n addTreeNodeRows(\n worksheet,\n fileFormat,\n webupManagerData,\n columnsMaxWidth,\n headerColumns,\n smeupDataTree.children,\n splitNodesToColumns,\n );\n\n // Totals\n if (exportTypeSupportsFormatting[fileFormat] && props?.totals) {\n addFooterTotalsRow(worksheet, headerColumns, props, webupManagerData);\n }\n\n // Set ExcelJS columns width\n worksheet.columns.forEach(col => {\n if (col.key) {\n col.width = columnsMaxWidth[col.key] ?? 10;\n } else {\n col.width = 10;\n }\n });\n\n // Forces full calculation when the workbook is opened\n workbook.calcProperties = {\n fullCalcOnLoad: true,\n };\n return workbook;\n}\n\nconst addTreeColumns = (\n worksheet: ExcelJS.Worksheet,\n columns: SmeupDataColumn[],\n nodeRows: SmeupDataNode[],\n splitNodesToColumns: boolean,\n props: GenericObject,\n): SmeupDataColumn[] => {\n const addTreeNodeColumns = (\n nodeRows: SmeupDataNode[],\n nodeColumns: SmeupDataColumn[],\n level = 0,\n ) => {\n if (\n !nodeColumns.some(\n nodeColumn => nodeColumn.name === getTreeNodeColumnName(level),\n )\n ) {\n nodeColumns.push({\n name: getTreeNodeColumnName(level),\n title: `.${level + 1}`,\n });\n }\n\n nodeRows.forEach(row => {\n if (row.children?.length ?? 0 > 0) {\n addTreeNodeColumns(row.children ?? [], nodeColumns, level + 1);\n }\n });\n };\n\n const nodeColumns: SmeupDataColumn[] = [];\n if (splitNodesToColumns) {\n // New column for each tree node\n addTreeNodeColumns(nodeRows, nodeColumns);\n } else {\n // All tree nodes are under the same column\n nodeColumns.push({\n name: getTreeNodeColumnName(0),\n title: \"\",\n });\n }\n\n const filteredColumns: SmeupDataColumn[] = getFilteredColumns(columns, props);\n const headerColumns: SmeupDataColumn[] = [...nodeColumns, ...filteredColumns];\n\n /* Add ExcelJS columns*/\n worksheet.columns = headerColumns.map<Partial<ExcelJS.Column>>(column => ({\n header: column.title ?? \"\",\n key: column.name,\n hidden: isColumnHidden(column),\n }));\n // Add style to ExcelJS columns\n setHeaderStyling(worksheet, STARTING_ROW_WITHOUT_TITLE, true);\n return headerColumns;\n};\n\nconst addTreeNodeRows = (\n worksheet: ExcelJS.Worksheet,\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n columnsMaxWidth: { [columnName: string]: number },\n columns: SmeupDataColumn[],\n nodeRows: SmeupDataNode[],\n splitNodesToColumns: boolean,\n level = 0,\n): void => {\n const getParsedRowData = (row: SmeupDataNode): (string | number | Date)[] => {\n return columns.map<string | number | Date>(column => {\n /* Set cell value */\n let cellValue: string | number | Date = \"\";\n\n if (column.name.includes(TREE_HEADER_COLUMN_NAME)) {\n /* Node column */\n if (!splitNodesToColumns) {\n // Level-based indentation\n const indent = ` `.repeat(level);\n cellValue = `${indent}${row.obj?.k}: ${row.value}`;\n } else if (column.name === getTreeNodeColumnName(level)) {\n // No indentation\n cellValue = `${row.obj?.k}: ${row.value}`;\n }\n } else {\n /* Standard column */\n cellValue = calculateCellValue(\n row.cells?.[column.name] ?? { value: \"\" },\n fileFormat,\n webupManagerData,\n );\n }\n\n /* Update column max width */\n const currentMaxWidth = columnsMaxWidth[column.name] ?? 10;\n const cellLength =\n cellValue instanceof Date ? 10 : cellValue.toString().length;\n columnsMaxWidth[column.name] = Math.max(currentMaxWidth, cellLength);\n\n return cellValue;\n });\n };\n\n nodeRows.forEach(row => {\n /* Add ExcelJS row */\n const parsedRowData = getParsedRowData(row);\n const exceljsRow = worksheet.addRow(parsedRowData);\n\n if (exportTypeSupportsFormatting[fileFormat]) {\n addStyleToExceljsRow(exceljsRow, columns, row);\n }\n\n if (row.children?.length ?? 0 > 0) {\n addTreeNodeRows(\n worksheet,\n fileFormat,\n webupManagerData,\n columnsMaxWidth,\n columns,\n row.children ?? [],\n splitNodesToColumns,\n level + 1,\n );\n }\n });\n};\n\nexport const TREE_HEADER_COLUMN_NAME = \"TREE_NODE_LVL_\";\n\nexport const getTreeNodeColumnName = (level: number) => {\n return `${TREE_HEADER_COLUMN_NAME}${level}`;\n};\n"]}
@@ -4,7 +4,7 @@ import { SmeupDataTree } from "../types/data-structures/smeupDataTree";
4
4
  export declare const dataTableToExcelData: (component: {
5
5
  smeupDataTable: SmeupDataTable;
6
6
  props: GenericObject;
7
- }, fileFormat: SupportedExportFormats, webupManagerData: WebupManagerData) => Promise<Buffer | Uint8Array>;
7
+ }, fileFormat: SupportedExportFormats, webupManagerData: WebupManagerData, title?: string) => Promise<Buffer | Uint8Array>;
8
8
  export declare const dataTreeToExcelData: (component: {
9
9
  smeupDataTree: SmeupDataTree;
10
10
  props: GenericObject;
@@ -5,8 +5,8 @@ const index_1 = require("../types/index");
5
5
  const commons_utility_1 = require("../utils/commons-utility");
6
6
  const matrix_converter_1 = require("./excel/matrix-converter");
7
7
  const tree_converter_1 = require("./excel/tree-converter");
8
- const dataTableToExcelData = async (component, fileFormat, webupManagerData) => {
9
- const workbook = (0, matrix_converter_1.dataTableToExcelWorkbook)(component, fileFormat, webupManagerData);
8
+ const dataTableToExcelData = async (component, fileFormat, webupManagerData, title = "") => {
9
+ const workbook = (0, matrix_converter_1.dataTableToExcelWorkbook)(component, fileFormat, webupManagerData, title);
10
10
  return convertToStreamData(workbook, fileFormat);
11
11
  };
12
12
  exports.dataTableToExcelData = dataTableToExcelData;
@@ -1 +1 @@
1
- {"version":3,"file":"excel-converter.js","sourceRoot":"","sources":["../../src/converters/excel-converter.ts"],"names":[],"mappings":";;;AAAA,0CAIwB;AACxB,8DAA2D;AAC3D,+DAAoE;AAEpE,2DAAiE;AAI1D,MAAM,oBAAoB,GAAG,KAAK,EACvC,SAGC,EACD,UAAkC,EAClC,gBAAkC,EACJ,EAAE;IAChC,MAAM,QAAQ,GAAG,IAAA,2CAAwB,EACvC,SAAS,EACT,UAAU,EACV,gBAAgB,CACjB,CAAC;IAEF,OAAO,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC,CAAC;AAfW,QAAA,oBAAoB,wBAe/B;AAEK,MAAM,mBAAmB,GAAG,KAAK,EACtC,SAGC,EACD,UAAkC,EAClC,gBAAkC,EACJ,EAAE;IAChC,MAAM,QAAQ,GAAG,MAAM,IAAA,wCAAuB,EAC5C,SAAS,EACT,UAAU,EACV,gBAAgB,CACjB,CAAC;IAEF,OAAO,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC,CAAC;AAfW,QAAA,mBAAmB,uBAe9B;AAEF,MAAM,mBAAmB,GAAG,KAAK,EAC/B,QAAkB,EAClB,UAAkC,EACJ,EAAE;IAChC,kDAAkD;IAClD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,8BAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACrD,OAAO,IAAA,iCAAe,EAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QACD,KAAK,8BAAsB,CAAC,GAAG,CAAC;QAChC,KAAK,8BAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC/C,gBAAgB,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;aACrC,CAAC,CAAC;YACH,OAAO,IAAA,iCAAe,EAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC,CAAC","sourcesContent":["import {\n GenericObject,\n SupportedExportFormats,\n WebupManagerData,\n} from \"../types/index\";\nimport { convertToBuffer } from \"../utils/commons-utility\";\nimport { dataTableToExcelWorkbook } from \"./excel/matrix-converter\";\nimport { Workbook } from \"exceljs\";\nimport { dataTreeToExcelWorkbook } from \"./excel/tree-converter\";\nimport { SmeupDataTable } from \"../types/data-structures/smeupDataTable\";\nimport { SmeupDataTree } from \"../types/data-structures/smeupDataTree\";\n\nexport const dataTableToExcelData = async (\n component: {\n smeupDataTable: SmeupDataTable;\n props: GenericObject;\n },\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n): Promise<Buffer | Uint8Array> => {\n const workbook = dataTableToExcelWorkbook(\n component,\n fileFormat,\n webupManagerData,\n );\n\n return convertToStreamData(workbook, fileFormat);\n};\n\nexport const dataTreeToExcelData = async (\n component: {\n smeupDataTree: SmeupDataTree;\n props: GenericObject;\n },\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n): Promise<Buffer | Uint8Array> => {\n const workbook = await dataTreeToExcelWorkbook(\n component,\n fileFormat,\n webupManagerData,\n );\n\n return convertToStreamData(workbook, fileFormat);\n};\n\nconst convertToStreamData = async (\n workbook: Workbook,\n fileFormat: SupportedExportFormats,\n): Promise<Buffer | Uint8Array> => {\n // Convert workbook to buffer based on file format\n switch (fileFormat) {\n case SupportedExportFormats.XLSX: {\n const xlsxBuffer = await workbook.xlsx.writeBuffer();\n return convertToBuffer(xlsxBuffer);\n }\n case SupportedExportFormats.TXT:\n case SupportedExportFormats.CSV: {\n const csvBuffer = await workbook.csv.writeBuffer({\n formatterOptions: { delimiter: \";\" },\n });\n return convertToBuffer(csvBuffer);\n }\n default:\n throw new Error(`Unsupported export format: ${fileFormat}`);\n }\n};\n\n"]}
1
+ {"version":3,"file":"excel-converter.js","sourceRoot":"","sources":["../../src/converters/excel-converter.ts"],"names":[],"mappings":";;;AAAA,0CAIwB;AACxB,8DAA2D;AAC3D,+DAAoE;AAEpE,2DAAiE;AAI1D,MAAM,oBAAoB,GAAG,KAAK,EACvC,SAGC,EACD,UAAkC,EAClC,gBAAkC,EAClC,QAAgB,EAAE,EACY,EAAE;IAChC,MAAM,QAAQ,GAAG,IAAA,2CAAwB,EACvC,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,KAAK,CACN,CAAC;IAEF,OAAO,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC,CAAC;AAjBW,QAAA,oBAAoB,wBAiB/B;AAEK,MAAM,mBAAmB,GAAG,KAAK,EACtC,SAGC,EACD,UAAkC,EAClC,gBAAkC,EACJ,EAAE;IAChC,MAAM,QAAQ,GAAG,MAAM,IAAA,wCAAuB,EAC5C,SAAS,EACT,UAAU,EACV,gBAAgB,CACjB,CAAC;IAEF,OAAO,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC,CAAC;AAfW,QAAA,mBAAmB,uBAe9B;AAEF,MAAM,mBAAmB,GAAG,KAAK,EAC/B,QAAkB,EAClB,UAAkC,EACJ,EAAE;IAChC,kDAAkD;IAClD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,8BAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACrD,OAAO,IAAA,iCAAe,EAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QACD,KAAK,8BAAsB,CAAC,GAAG,CAAC;QAChC,KAAK,8BAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC/C,gBAAgB,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;aACrC,CAAC,CAAC;YACH,OAAO,IAAA,iCAAe,EAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC,CAAC","sourcesContent":["import {\n GenericObject,\n SupportedExportFormats,\n WebupManagerData,\n} from \"../types/index\";\nimport { convertToBuffer } from \"../utils/commons-utility\";\nimport { dataTableToExcelWorkbook } from \"./excel/matrix-converter\";\nimport { Workbook } from \"exceljs\";\nimport { dataTreeToExcelWorkbook } from \"./excel/tree-converter\";\nimport { SmeupDataTable } from \"../types/data-structures/smeupDataTable\";\nimport { SmeupDataTree } from \"../types/data-structures/smeupDataTree\";\n\nexport const dataTableToExcelData = async (\n component: {\n smeupDataTable: SmeupDataTable;\n props: GenericObject;\n },\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n title: string = \"\",\n): Promise<Buffer | Uint8Array> => {\n const workbook = dataTableToExcelWorkbook(\n component,\n fileFormat,\n webupManagerData,\n title,\n );\n\n return convertToStreamData(workbook, fileFormat);\n};\n\nexport const dataTreeToExcelData = async (\n component: {\n smeupDataTree: SmeupDataTree;\n props: GenericObject;\n },\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n): Promise<Buffer | Uint8Array> => {\n const workbook = await dataTreeToExcelWorkbook(\n component,\n fileFormat,\n webupManagerData,\n );\n\n return convertToStreamData(workbook, fileFormat);\n};\n\nconst convertToStreamData = async (\n workbook: Workbook,\n fileFormat: SupportedExportFormats,\n): Promise<Buffer | Uint8Array> => {\n // Convert workbook to buffer based on file format\n switch (fileFormat) {\n case SupportedExportFormats.XLSX: {\n const xlsxBuffer = await workbook.xlsx.writeBuffer();\n return convertToBuffer(xlsxBuffer);\n }\n case SupportedExportFormats.TXT:\n case SupportedExportFormats.CSV: {\n const csvBuffer = await workbook.csv.writeBuffer({\n formatterOptions: { delimiter: \";\" },\n });\n return convertToBuffer(csvBuffer);\n }\n default:\n throw new Error(`Unsupported export format: ${fileFormat}`);\n }\n};\n"]}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Configuration options for PDF form filling
3
+ */
4
+ export interface FillPdfFormOptions {
5
+ /**
6
+ * Font size to use for text fields (default: 10)
7
+ * Smaller values help prevent text truncation
8
+ */
9
+ fontSize?: number;
10
+ /**
11
+ * Whether to flatten the form after filling (default: true)
12
+ * When true, form fields become non-editable
13
+ */
14
+ flatten?: boolean;
15
+ }
16
+ /**
17
+ * Fills PDF form fields with provided data and flattens the form
18
+ * @param pdfBuffer - PDF file buffer containing form fields
19
+ * @param formData - Key-value pairs where keys match PDF field names
20
+ * @param options - Optional configuration for form filling
21
+ * @returns Modified PDF buffer with filled and flattened form fields
22
+ * @throws Error if PDF buffer is invalid or cannot be processed
23
+ */
24
+ export declare function fillPdfForm(pdfBuffer: Buffer, formData: Record<string, string | number | boolean>, options?: FillPdfFormOptions): Promise<Buffer>;
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fillPdfForm = fillPdfForm;
4
+ const pdf_lib_1 = require("pdf-lib");
5
+ /**
6
+ * Fills PDF form fields with provided data and flattens the form
7
+ * @param pdfBuffer - PDF file buffer containing form fields
8
+ * @param formData - Key-value pairs where keys match PDF field names
9
+ * @param options - Optional configuration for form filling
10
+ * @returns Modified PDF buffer with filled and flattened form fields
11
+ * @throws Error if PDF buffer is invalid or cannot be processed
12
+ */
13
+ async function fillPdfForm(pdfBuffer, formData, options) {
14
+ // Set default options
15
+ const fontSize = options?.fontSize ?? 10;
16
+ const flatten = options?.flatten ?? true;
17
+ // Validate input
18
+ if (!pdfBuffer || pdfBuffer.length === 0) {
19
+ throw new Error("Invalid PDF buffer: buffer is empty or undefined");
20
+ }
21
+ if (!formData || typeof formData !== "object") {
22
+ throw new Error("Invalid form data: must be a non-null object");
23
+ }
24
+ try {
25
+ // Load the PDF document
26
+ const pdfDoc = await pdf_lib_1.PDFDocument.load(pdfBuffer);
27
+ // Get the form from the PDF
28
+ const form = pdfDoc.getForm();
29
+ // Get all fields in the form
30
+ const fields = form.getFields();
31
+ // Create a map of field names to fields for quick lookup
32
+ const fieldMap = new Map();
33
+ fields.forEach(field => {
34
+ const fieldName = field.getName();
35
+ fieldMap.set(fieldName, field);
36
+ });
37
+ // Process each entry in the form data
38
+ for (const [fieldName, fieldValue] of Object.entries(formData)) {
39
+ const field = fieldMap.get(fieldName);
40
+ // If field doesn't exist, log warning and continue
41
+ if (!field) {
42
+ console.warn(`Field "${fieldName}" not found in PDF form. Skipping.`);
43
+ continue;
44
+ }
45
+ // Handle null or undefined values
46
+ if (fieldValue === null || fieldValue === undefined) {
47
+ console.warn(`Skipping field "${fieldName}" with null or undefined value.`);
48
+ continue;
49
+ }
50
+ try {
51
+ // Fill the field based on its type
52
+ if (field instanceof pdf_lib_1.PDFTextField) {
53
+ fillTextField(field, fieldValue, fontSize);
54
+ }
55
+ else if (field instanceof pdf_lib_1.PDFCheckBox) {
56
+ fillCheckBox(field, fieldValue);
57
+ }
58
+ else if (field instanceof pdf_lib_1.PDFRadioGroup) {
59
+ fillRadioGroup(field, fieldValue);
60
+ }
61
+ else if (field instanceof pdf_lib_1.PDFDropdown) {
62
+ fillDropdown(field, fieldValue);
63
+ }
64
+ else {
65
+ console.warn(`Unsupported field type for "${fieldName}". Skipping.`);
66
+ }
67
+ }
68
+ catch (error) {
69
+ console.warn(`Error filling field "${fieldName}": ${error instanceof Error ? error.message : String(error)}`);
70
+ }
71
+ }
72
+ // Flatten the form to make fields non-editable (if requested)
73
+ if (flatten) {
74
+ form.flatten();
75
+ }
76
+ // Save and return the modified PDF
77
+ const pdfBytes = await pdfDoc.save();
78
+ return Buffer.from(pdfBytes);
79
+ }
80
+ catch (error) {
81
+ if (error instanceof Error) {
82
+ throw new Error(`Failed to process PDF form: ${error.message}`);
83
+ }
84
+ throw new Error("Failed to process PDF form: Unknown error");
85
+ }
86
+ }
87
+ /**
88
+ * Fills a text field with the provided value
89
+ * @param field - PDF text field to fill
90
+ * @param value - Value to set (converted to string)
91
+ * @param fontSize - Font size to use for the text field
92
+ */
93
+ function fillTextField(field, value, fontSize) {
94
+ const stringValue = String(value);
95
+ // Set text content
96
+ field.setText(stringValue);
97
+ // Set font size to ensure text fits and is readable
98
+ // Using a smaller font size helps prevent text truncation
99
+ try {
100
+ field.setFontSize(fontSize);
101
+ }
102
+ catch {
103
+ // If setting font size fails, continue without it
104
+ // This can happen if the field has specific formatting restrictions
105
+ }
106
+ // Enable multiline if the field supports it and text is long
107
+ try {
108
+ if (stringValue.length > 50 || stringValue.includes('\n')) {
109
+ field.enableMultiline();
110
+ }
111
+ }
112
+ catch {
113
+ // If enabling multiline fails, continue without it
114
+ }
115
+ }
116
+ /**
117
+ * Fills a checkbox field with the provided boolean value
118
+ * @param field - PDF checkbox field to fill
119
+ * @param value - Boolean value or string representation
120
+ */
121
+ function fillCheckBox(field, value) {
122
+ // Handle boolean values
123
+ if (typeof value === "boolean") {
124
+ if (value) {
125
+ field.check();
126
+ }
127
+ else {
128
+ field.uncheck();
129
+ }
130
+ return;
131
+ }
132
+ // Handle string representations of booleans
133
+ if (typeof value === "string") {
134
+ const lowerValue = value.toLowerCase();
135
+ if (lowerValue === "true" || lowerValue === "yes" || lowerValue === "1") {
136
+ field.check();
137
+ }
138
+ else if (lowerValue === "false" || lowerValue === "no" || lowerValue === "0") {
139
+ field.uncheck();
140
+ }
141
+ else {
142
+ throw new Error(`Invalid checkbox value: "${value}". Expected boolean or "true"/"false".`);
143
+ }
144
+ return;
145
+ }
146
+ // Handle numeric values (0 = unchecked, non-zero = checked)
147
+ if (typeof value === "number") {
148
+ if (value !== 0) {
149
+ field.check();
150
+ }
151
+ else {
152
+ field.uncheck();
153
+ }
154
+ return;
155
+ }
156
+ }
157
+ /**
158
+ * Fills a radio button group with the provided option value
159
+ * @param field - PDF radio group field to fill
160
+ * @param value - Option value to select
161
+ */
162
+ function fillRadioGroup(field, value) {
163
+ const stringValue = String(value);
164
+ // Get available options
165
+ const options = field.getOptions();
166
+ // Check if the value matches any available option
167
+ if (!options.includes(stringValue)) {
168
+ throw new Error(`Invalid radio group value: "${stringValue}". Available options: ${options.join(", ")}`);
169
+ }
170
+ field.select(stringValue);
171
+ }
172
+ /**
173
+ * Fills a dropdown field with the provided option value
174
+ * @param field - PDF dropdown field to fill
175
+ * @param value - Option value to select
176
+ */
177
+ function fillDropdown(field, value) {
178
+ const stringValue = String(value);
179
+ // Get available options
180
+ const options = field.getOptions();
181
+ // Check if the value matches any available option
182
+ if (!options.includes(stringValue)) {
183
+ throw new Error(`Invalid dropdown value: "${stringValue}". Available options: ${options.join(", ")}`);
184
+ }
185
+ field.select(stringValue);
186
+ }
187
+ //# sourceMappingURL=form-filler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-filler.js","sourceRoot":"","sources":["../../../src/converters/pdf/form-filler.ts"],"names":[],"mappings":"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","sourcesContent":["import { PDFDocument, PDFTextField, PDFCheckBox, PDFRadioGroup, PDFDropdown } from \"pdf-lib\";\n\n/**\n * Configuration options for PDF form filling\n */\nexport interface FillPdfFormOptions {\n /**\n * Font size to use for text fields (default: 10)\n * Smaller values help prevent text truncation\n */\n fontSize?: number;\n\n /**\n * Whether to flatten the form after filling (default: true)\n * When true, form fields become non-editable\n */\n flatten?: boolean;\n}\n\n/**\n * Fills PDF form fields with provided data and flattens the form\n * @param pdfBuffer - PDF file buffer containing form fields\n * @param formData - Key-value pairs where keys match PDF field names\n * @param options - Optional configuration for form filling\n * @returns Modified PDF buffer with filled and flattened form fields\n * @throws Error if PDF buffer is invalid or cannot be processed\n */\nexport async function fillPdfForm(\n pdfBuffer: Buffer,\n formData: Record<string, string | number | boolean>,\n options?: FillPdfFormOptions,\n): Promise<Buffer> {\n // Set default options\n const fontSize = options?.fontSize ?? 10;\n const flatten = options?.flatten ?? true;\n // Validate input\n if (!pdfBuffer || pdfBuffer.length === 0) {\n throw new Error(\"Invalid PDF buffer: buffer is empty or undefined\");\n }\n\n if (!formData || typeof formData !== \"object\") {\n throw new Error(\"Invalid form data: must be a non-null object\");\n }\n\n try {\n // Load the PDF document\n const pdfDoc = await PDFDocument.load(pdfBuffer);\n\n // Get the form from the PDF\n const form = pdfDoc.getForm();\n\n // Get all fields in the form\n const fields = form.getFields();\n\n // Create a map of field names to fields for quick lookup\n const fieldMap = new Map<string, ReturnType<typeof form.getFields>[number]>();\n fields.forEach(field => {\n const fieldName = field.getName();\n fieldMap.set(fieldName, field);\n });\n\n // Process each entry in the form data\n for (const [fieldName, fieldValue] of Object.entries(formData)) {\n const field = fieldMap.get(fieldName);\n\n // If field doesn't exist, log warning and continue\n if (!field) {\n console.warn(`Field \"${fieldName}\" not found in PDF form. Skipping.`);\n continue;\n }\n\n // Handle null or undefined values\n if (fieldValue === null || fieldValue === undefined) {\n console.warn(`Skipping field \"${fieldName}\" with null or undefined value.`);\n continue;\n }\n\n try {\n // Fill the field based on its type\n if (field instanceof PDFTextField) {\n fillTextField(field, fieldValue, fontSize);\n } else if (field instanceof PDFCheckBox) {\n fillCheckBox(field, fieldValue);\n } else if (field instanceof PDFRadioGroup) {\n fillRadioGroup(field, fieldValue);\n } else if (field instanceof PDFDropdown) {\n fillDropdown(field, fieldValue);\n } else {\n console.warn(`Unsupported field type for \"${fieldName}\". Skipping.`);\n }\n } catch (error) {\n console.warn(`Error filling field \"${fieldName}\": ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // Flatten the form to make fields non-editable (if requested)\n if (flatten) {\n form.flatten();\n }\n\n // Save and return the modified PDF\n const pdfBytes = await pdfDoc.save();\n return Buffer.from(pdfBytes);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to process PDF form: ${error.message}`);\n }\n throw new Error(\"Failed to process PDF form: Unknown error\");\n }\n}\n\n/**\n * Fills a text field with the provided value\n * @param field - PDF text field to fill\n * @param value - Value to set (converted to string)\n * @param fontSize - Font size to use for the text field\n */\nfunction fillTextField(\n field: PDFTextField,\n value: string | number | boolean,\n fontSize: number,\n): void {\n const stringValue = String(value);\n\n // Set text content\n field.setText(stringValue);\n\n // Set font size to ensure text fits and is readable\n // Using a smaller font size helps prevent text truncation\n try {\n field.setFontSize(fontSize);\n } catch {\n // If setting font size fails, continue without it\n // This can happen if the field has specific formatting restrictions\n }\n\n // Enable multiline if the field supports it and text is long\n try {\n if (stringValue.length > 50 || stringValue.includes('\\n')) {\n field.enableMultiline();\n }\n } catch {\n // If enabling multiline fails, continue without it\n }\n}\n\n/**\n * Fills a checkbox field with the provided boolean value\n * @param field - PDF checkbox field to fill\n * @param value - Boolean value or string representation\n */\nfunction fillCheckBox(\n field: PDFCheckBox,\n value: string | number | boolean,\n): void {\n // Handle boolean values\n if (typeof value === \"boolean\") {\n if (value) {\n field.check();\n } else {\n field.uncheck();\n }\n return;\n }\n\n // Handle string representations of booleans\n if (typeof value === \"string\") {\n const lowerValue = value.toLowerCase();\n if (lowerValue === \"true\" || lowerValue === \"yes\" || lowerValue === \"1\") {\n field.check();\n } else if (lowerValue === \"false\" || lowerValue === \"no\" || lowerValue === \"0\") {\n field.uncheck();\n } else {\n throw new Error(`Invalid checkbox value: \"${value}\". Expected boolean or \"true\"/\"false\".`);\n }\n return;\n }\n\n // Handle numeric values (0 = unchecked, non-zero = checked)\n if (typeof value === \"number\") {\n if (value !== 0) {\n field.check();\n } else {\n field.uncheck();\n }\n return;\n }\n}\n\n/**\n * Fills a radio button group with the provided option value\n * @param field - PDF radio group field to fill\n * @param value - Option value to select\n */\nfunction fillRadioGroup(\n field: PDFRadioGroup,\n value: string | number | boolean,\n): void {\n const stringValue = String(value);\n\n // Get available options\n const options = field.getOptions();\n\n // Check if the value matches any available option\n if (!options.includes(stringValue)) {\n throw new Error(\n `Invalid radio group value: \"${stringValue}\". Available options: ${options.join(\", \")}`,\n );\n }\n\n field.select(stringValue);\n}\n\n/**\n * Fills a dropdown field with the provided option value\n * @param field - PDF dropdown field to fill\n * @param value - Option value to select\n */\nfunction fillDropdown(\n field: PDFDropdown,\n value: string | number | boolean,\n): void {\n const stringValue = String(value);\n\n // Get available options\n const options = field.getOptions();\n\n // Check if the value matches any available option\n if (!options.includes(stringValue)) {\n throw new Error(\n `Invalid dropdown value: \"${stringValue}\". Available options: ${options.join(\", \")}`,\n );\n }\n\n field.select(stringValue);\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { PdfMakeConverterContext, PdfmakeAdapter, AdapterRegistry } from "./pdfmake.types";
2
+ import type { TDocumentDefinitions } from "pdfmake/interfaces";
3
+ /**
4
+ * Processes a document recursively, applying adapters to matching elements.
5
+ *
6
+ * @param element - The current element to process
7
+ * @param adapters - Map of element types to their adapter functions
8
+ * @param context - Current processing context
9
+ * @returns The transformed element
10
+ */
11
+ export declare const processDocument: (element: unknown, adapters: Map<string, PdfmakeAdapter>, context: PdfMakeConverterContext) => Promise<unknown>;
12
+ export declare const preProcessPdfMakeDocument: (documentDefinition: TDocumentDefinitions, context: Partial<PdfMakeConverterContext>, registry?: AdapterRegistry) => Promise<TDocumentDefinitions>;
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.preProcessPdfMakeDocument = exports.processDocument = void 0;
4
+ const pdfmake_types_1 = require("./pdfmake.types");
5
+ /**
6
+ * Helper to check if a value is a plain object
7
+ */
8
+ const isPlainObject = (value) => {
9
+ return (typeof value === "object" &&
10
+ value !== null &&
11
+ !Array.isArray(value) &&
12
+ Object.prototype.toString.call(value) === "[object Object]");
13
+ };
14
+ /**
15
+ * Properties of pdfmake document that should not be processed by adapters.
16
+ * These are configuration properties, not content.
17
+ */
18
+ const EXCLUDED_PROPERTIES = new Set([
19
+ "styles",
20
+ "defaultStyle",
21
+ "pageSize",
22
+ "pageMargins",
23
+ "pageOrientation",
24
+ "pageBreakBefore",
25
+ "info",
26
+ "permissions",
27
+ "compress",
28
+ "userPassword",
29
+ "ownerPassword",
30
+ "version",
31
+ ]);
32
+ /**
33
+ * Processes a document recursively, applying adapters to matching elements.
34
+ *
35
+ * @param element - The current element to process
36
+ * @param adapters - Map of element types to their adapter functions
37
+ * @param context - Current processing context
38
+ * @returns The transformed element
39
+ */
40
+ const processDocument = async (element, adapters, context) => {
41
+ // Handle null/undefined
42
+ if (element == null) {
43
+ return element;
44
+ }
45
+ try {
46
+ // Handle arrays - process each item
47
+ if (Array.isArray(element)) {
48
+ return await Promise.all(element.map(item => (0, exports.processDocument)(item, adapters, context)));
49
+ }
50
+ // Handle plain objects
51
+ if (isPlainObject(element)) {
52
+ // Try to apply adapters based on element type
53
+ const elementType = element.type;
54
+ if (elementType && adapters.has(elementType)) {
55
+ const adapter = adapters.get(elementType);
56
+ element = await adapter(element, context);
57
+ // After transformation, element might not be a plain object anymore
58
+ if (!isPlainObject(element)) {
59
+ return element;
60
+ }
61
+ }
62
+ // Also try adapters based on properties (e.g., "table" property)
63
+ for (const [key, adapter] of adapters.entries()) {
64
+ // Skip type-based adapters already processed
65
+ if (key === elementType)
66
+ continue;
67
+ // Apply adapter if it matches a property name
68
+ if (key in element) {
69
+ const transformed = await adapter(element, context);
70
+ // Only accept transformation if adapter actually changed something
71
+ if (transformed !== element) {
72
+ element = transformed;
73
+ // After transformation, element might not be a plain object anymore
74
+ if (!isPlainObject(element)) {
75
+ return element;
76
+ }
77
+ // Continue to apply other adapters (e.g., both header and footer)
78
+ }
79
+ }
80
+ }
81
+ // Recursively process all properties
82
+ const processed = {};
83
+ for (const [key, value] of Object.entries(element)) {
84
+ // Skip excluded properties (don't process them recursively)
85
+ if (EXCLUDED_PROPERTIES.has(key)) {
86
+ processed[key] = value;
87
+ }
88
+ else {
89
+ processed[key] = await (0, exports.processDocument)(value, adapters, context);
90
+ }
91
+ }
92
+ return processed;
93
+ }
94
+ // Primitive values - return as-is
95
+ return element;
96
+ }
97
+ catch (err) {
98
+ throw new pdfmake_types_1.AdapterError(err, element);
99
+ }
100
+ };
101
+ exports.processDocument = processDocument;
102
+ const preProcessPdfMakeDocument = async (documentDefinition, context, registry) => {
103
+ if (!registry) {
104
+ return Promise.resolve(documentDefinition);
105
+ }
106
+ else {
107
+ documentDefinition.images = documentDefinition.images || {};
108
+ const processedDoc = (await registry?.process(documentDefinition, context));
109
+ return processedDoc;
110
+ }
111
+ };
112
+ exports.preProcessPdfMakeDocument = preProcessPdfMakeDocument;
113
+ //# 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\";\nimport type { TDocumentDefinitions } from \"pdfmake/interfaces\";\n\n/**\n * Helper to check if a value is a plain object\n */\nconst 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 * Properties of pdfmake document that should not be processed by adapters.\n * These are configuration properties, not content.\n */\nconst EXCLUDED_PROPERTIES = new Set([\n \"styles\",\n \"defaultStyle\",\n \"pageSize\",\n \"pageMargins\",\n \"pageOrientation\",\n \"pageBreakBefore\",\n \"info\",\n \"permissions\",\n \"compress\",\n \"userPassword\",\n \"ownerPassword\",\n \"version\",\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 const processDocument = async (\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 => processDocument(item, adapters, context)),\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 // Continue to apply other adapters (e.g., both header and footer)\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 // Skip excluded properties (don't process them recursively)\n if (EXCLUDED_PROPERTIES.has(key)) {\n processed[key] = value;\n } else {\n processed[key] = await processDocument(value, adapters, context);\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: TDocumentDefinitions,\n context: Partial<PdfMakeConverterContext>,\n registry?: AdapterRegistry,\n): Promise<TDocumentDefinitions> => {\n if (!registry) {\n return Promise.resolve(documentDefinition);\n } else {\n documentDefinition.images = documentDefinition.images || {};\n\n const processedDoc = (await registry?.process(\n documentDefinition,\n context,\n )) as TDocumentDefinitions;\n\n return processedDoc;\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 const createAdapterRegistry: () => AdapterRegistry;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAdapterRegistry = void 0;
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
+ const 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
+ fetchData: context?.fetchData,
39
+ pdfDocument: context?.pdfDocument,
40
+ damSvcEndpoint: context?.damSvcEndpoint,
41
+ };
42
+ const processed = await (0, adapter_processor_1.processDocument)(document, adapters, fullContext);
43
+ return processed;
44
+ },
45
+ };
46
+ };
47
+ exports.createAdapterRegistry = createAdapterRegistry;
48
+ //# 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":";;;AAKA,2DAAsD;AAEtD;;;;;;;;;;;;;;;;;;;GAmBG;AACI,MAAM,qBAAqB,GAAG,GAAoB,EAAE;IACzD,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,OAAyC;YAEzC,MAAM,WAAW,GAA4B;gBAC3C,gBAAgB,EAAE,OAAO,CAAC,gBAAiB;gBAC3C,qBAAqB,EAAE,OAAO,EAAE,qBAAqB;gBACrD,SAAS,EAAE,OAAO,EAAE,SAAS;gBAC7B,WAAW,EAAE,OAAO,EAAE,WAAW;gBACjC,cAAc,EAAE,OAAO,EAAE,cAAc;aACxC,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,CAAC;AA3BW,QAAA,qBAAqB,yBA2BhC","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 const 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 fetchData: context?.fetchData,\n pdfDocument: context?.pdfDocument,\n damSvcEndpoint: context?.damSvcEndpoint,\n };\n const processed = await processDocument(document, adapters, fullContext);\n return processed;\n },\n };\n};\n"]}
@@ -0,0 +1,19 @@
1
+ import { ContentImageExtension, ElementWithImageExtension, PdfMakeConverterContext } from "./pdfmake.types";
2
+ /**
3
+ * Adapts a Smeup image structure to the PDFMake image format.
4
+ *
5
+ * This adapter function checks if the provided element contains an image with a smeup URL.
6
+ * If so, it downloads the image using the fetchData callback from context, validates the
7
+ * content-type, and transforms it into a data URL format that PDFMake can use.
8
+ * The data URL is stored in context.pdfDocument.images to avoid redundancy when the same
9
+ * image is referenced multiple times.
10
+ * All properties of the original image except `smeup` are preserved.
11
+ *
12
+ * @returns An async function that takes an element and returns the adapted element for PDFMake,
13
+ * or the original element if it does not contain a valid smeup image.
14
+ * @throws If the context does not provide a fetchData function when the smeup image is used.
15
+ * @throws If the image download fails or the content-type is not a valid image MIME type.
16
+ */
17
+ export declare const urlToImageAdapter: () => (element: unknown, context: PdfMakeConverterContext) => Promise<ContentImageExtension>;
18
+ export declare const objectToUrlAdapter: () => (element: unknown, context: PdfMakeConverterContext) => Promise<ElementWithImageExtension>;
19
+ export declare const imageAdapter: () => (element: unknown, context: PdfMakeConverterContext) => Promise<ContentImageExtension>;