@opengeni/artifact-tool 0.2.2

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 (203) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +104 -0
  3. package/dist/bounded-zip.d.ts +28 -0
  4. package/dist/chunk-4BSENMAE.js +39 -0
  5. package/dist/chunk-4BSENMAE.js.map +1 -0
  6. package/dist/chunk-4FRFNNBM.js +276 -0
  7. package/dist/chunk-4FRFNNBM.js.map +1 -0
  8. package/dist/chunk-5XIA6KHZ.js +49 -0
  9. package/dist/chunk-5XIA6KHZ.js.map +1 -0
  10. package/dist/chunk-66CT2ZRP.js +2229 -0
  11. package/dist/chunk-66CT2ZRP.js.map +1 -0
  12. package/dist/chunk-72SYDU4O.js +319 -0
  13. package/dist/chunk-72SYDU4O.js.map +1 -0
  14. package/dist/chunk-B2ZJRZDA.js +279 -0
  15. package/dist/chunk-B2ZJRZDA.js.map +1 -0
  16. package/dist/chunk-DCTLTNPW.js +2458 -0
  17. package/dist/chunk-DCTLTNPW.js.map +1 -0
  18. package/dist/chunk-FGZM4FQ6.js +473 -0
  19. package/dist/chunk-FGZM4FQ6.js.map +1 -0
  20. package/dist/chunk-HTJBLBDE.js +591 -0
  21. package/dist/chunk-HTJBLBDE.js.map +1 -0
  22. package/dist/chunk-IYFXZQ34.js +5306 -0
  23. package/dist/chunk-IYFXZQ34.js.map +1 -0
  24. package/dist/chunk-J6N7IR44.js +172 -0
  25. package/dist/chunk-J6N7IR44.js.map +1 -0
  26. package/dist/chunk-N2IHNWBS.js +1002 -0
  27. package/dist/chunk-N2IHNWBS.js.map +1 -0
  28. package/dist/chunk-NAG44K67.js +549 -0
  29. package/dist/chunk-NAG44K67.js.map +1 -0
  30. package/dist/chunk-O24KTEGP.js +33 -0
  31. package/dist/chunk-O24KTEGP.js.map +1 -0
  32. package/dist/chunk-PI2AZVGK.js +2074 -0
  33. package/dist/chunk-PI2AZVGK.js.map +1 -0
  34. package/dist/chunk-Q2FFHEY7.js +40 -0
  35. package/dist/chunk-Q2FFHEY7.js.map +1 -0
  36. package/dist/chunk-RBGQADXA.js +57 -0
  37. package/dist/chunk-RBGQADXA.js.map +1 -0
  38. package/dist/chunk-U5G2BKM2.js +613 -0
  39. package/dist/chunk-U5G2BKM2.js.map +1 -0
  40. package/dist/chunk-VOJHMSM3.js +39 -0
  41. package/dist/chunk-VOJHMSM3.js.map +1 -0
  42. package/dist/chunk-VUNV25KB.js +16 -0
  43. package/dist/chunk-VUNV25KB.js.map +1 -0
  44. package/dist/chunk-XIFUNVBO.js +101 -0
  45. package/dist/chunk-XIFUNVBO.js.map +1 -0
  46. package/dist/chunk-ZCJYRJGB.js +489 -0
  47. package/dist/chunk-ZCJYRJGB.js.map +1 -0
  48. package/dist/chunk-ZZXPEE4S.js +2260 -0
  49. package/dist/chunk-ZZXPEE4S.js.map +1 -0
  50. package/dist/document-docx-api.d.ts +49 -0
  51. package/dist/document-docx-codec.d.ts +9 -0
  52. package/dist/document-docx-codec.js +4765 -0
  53. package/dist/document-docx-codec.js.map +1 -0
  54. package/dist/document-docx-import.d.ts +261 -0
  55. package/dist/document-docx-packer.d.ts +18 -0
  56. package/dist/document-docx-state.d.ts +12 -0
  57. package/dist/document-render.d.ts +3 -0
  58. package/dist/document-render.js +492 -0
  59. package/dist/document-render.js.map +1 -0
  60. package/dist/document.d.ts +432 -0
  61. package/dist/document.js +37 -0
  62. package/dist/document.js.map +1 -0
  63. package/dist/errors.d.ts +23 -0
  64. package/dist/file-blob.d.ts +11 -0
  65. package/dist/index.d.ts +4 -0
  66. package/dist/index.js +186 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/inspection.d.ts +12 -0
  69. package/dist/kernel.d.ts +101 -0
  70. package/dist/lib-GQLPACFK.js +9746 -0
  71. package/dist/lib-GQLPACFK.js.map +1 -0
  72. package/dist/materializer-cli-entry.d.ts +2 -0
  73. package/dist/materializer-cli-entry.js +29 -0
  74. package/dist/materializer-cli-entry.js.map +1 -0
  75. package/dist/materializer-cli.d.ts +24 -0
  76. package/dist/materializer-cli.js +24 -0
  77. package/dist/materializer-cli.js.map +1 -0
  78. package/dist/native-raster.d.ts +10 -0
  79. package/dist/native.d.ts +129 -0
  80. package/dist/native.js +31 -0
  81. package/dist/native.js.map +1 -0
  82. package/dist/office-import.d.ts +48 -0
  83. package/dist/office-import.js +154 -0
  84. package/dist/office-import.js.map +1 -0
  85. package/dist/presentation-pptx-api.d.ts +60 -0
  86. package/dist/presentation-pptx-import.d.ts +5 -0
  87. package/dist/presentation-pptx-state-digest-765CZZED.js +10 -0
  88. package/dist/presentation-pptx-state-digest-765CZZED.js.map +1 -0
  89. package/dist/presentation-pptx-state-digest.d.ts +3 -0
  90. package/dist/presentation-pptx-state.d.ts +4 -0
  91. package/dist/presentation-pptx-xml.d.ts +29 -0
  92. package/dist/presentation-pptx.d.ts +5 -0
  93. package/dist/presentation-pptx.js +2365 -0
  94. package/dist/presentation-pptx.js.map +1 -0
  95. package/dist/presentation-render.d.ts +29 -0
  96. package/dist/presentation-render.js +375 -0
  97. package/dist/presentation-render.js.map +1 -0
  98. package/dist/presentation.d.ts +565 -0
  99. package/dist/presentation.js +71 -0
  100. package/dist/presentation.js.map +1 -0
  101. package/dist/production-composite.d.ts +68 -0
  102. package/dist/production-document.d.ts +2 -0
  103. package/dist/production-document.js +176 -0
  104. package/dist/production-document.js.map +1 -0
  105. package/dist/production-native-codecs.d.ts +94 -0
  106. package/dist/production-presentation.d.ts +2 -0
  107. package/dist/production-presentation.js +176 -0
  108. package/dist/production-presentation.js.map +1 -0
  109. package/dist/production-sha256.d.ts +2 -0
  110. package/dist/production-spreadsheet-native.d.ts +12 -0
  111. package/dist/production-spreadsheet.d.ts +2 -0
  112. package/dist/production-spreadsheet.js +176 -0
  113. package/dist/production-spreadsheet.js.map +1 -0
  114. package/dist/production.d.ts +96 -0
  115. package/dist/raster-image.d.ts +34 -0
  116. package/dist/reference.d.ts +17 -0
  117. package/dist/reference.js +574 -0
  118. package/dist/reference.js.map +1 -0
  119. package/dist/runtime-cli-entry.d.ts +2 -0
  120. package/dist/runtime-cli-entry.js +21 -0
  121. package/dist/runtime-cli-entry.js.map +1 -0
  122. package/dist/runtime-cli.d.ts +76 -0
  123. package/dist/runtime-cli.js +26 -0
  124. package/dist/runtime-cli.js.map +1 -0
  125. package/dist/runtime-development.d.ts +73 -0
  126. package/dist/runtime-development.js +30 -0
  127. package/dist/runtime-development.js.map +1 -0
  128. package/dist/runtime-receipt.d.ts +19 -0
  129. package/dist/runtime.d.ts +355 -0
  130. package/dist/runtime.js +42 -0
  131. package/dist/runtime.js.map +1 -0
  132. package/dist/snapshot.d.ts +26 -0
  133. package/dist/snapshot.js +61 -0
  134. package/dist/snapshot.js.map +1 -0
  135. package/dist/spreadsheet-address.d.ts +18 -0
  136. package/dist/spreadsheet-file.d.ts +17 -0
  137. package/dist/spreadsheet-formula.d.ts +67 -0
  138. package/dist/spreadsheet-image.d.ts +17 -0
  139. package/dist/spreadsheet-render.d.ts +5 -0
  140. package/dist/spreadsheet-render.js +752 -0
  141. package/dist/spreadsheet-render.js.map +1 -0
  142. package/dist/spreadsheet-types.d.ts +155 -0
  143. package/dist/spreadsheet-xlsx-api.d.ts +88 -0
  144. package/dist/spreadsheet-xlsx-codec.d.ts +16 -0
  145. package/dist/spreadsheet-xlsx-codec.js +16 -0
  146. package/dist/spreadsheet-xlsx-codec.js.map +1 -0
  147. package/dist/spreadsheet-xlsx-state.d.ts +16 -0
  148. package/dist/spreadsheet.d.ts +724 -0
  149. package/dist/spreadsheet.js +67 -0
  150. package/dist/spreadsheet.js.map +1 -0
  151. package/package.json +129 -0
  152. package/src/bounded-zip.ts +450 -0
  153. package/src/document-docx-api.ts +64 -0
  154. package/src/document-docx-codec.ts +2253 -0
  155. package/src/document-docx-import.ts +3814 -0
  156. package/src/document-docx-packer.ts +72 -0
  157. package/src/document-docx-state.ts +59 -0
  158. package/src/document-render.ts +615 -0
  159. package/src/document.ts +2800 -0
  160. package/src/errors.ts +45 -0
  161. package/src/file-blob.ts +43 -0
  162. package/src/index.ts +4 -0
  163. package/src/inspection.ts +50 -0
  164. package/src/kernel.ts +525 -0
  165. package/src/materializer-cli-entry.ts +11 -0
  166. package/src/materializer-cli.ts +743 -0
  167. package/src/native-raster.ts +141 -0
  168. package/src/native.ts +390 -0
  169. package/src/office-import.ts +243 -0
  170. package/src/presentation-pptx-api.ts +107 -0
  171. package/src/presentation-pptx-import.ts +2065 -0
  172. package/src/presentation-pptx-state-digest.ts +46 -0
  173. package/src/presentation-pptx-state.ts +18 -0
  174. package/src/presentation-pptx-xml.ts +473 -0
  175. package/src/presentation-pptx.ts +447 -0
  176. package/src/presentation-render.ts +532 -0
  177. package/src/presentation.ts +2599 -0
  178. package/src/production-composite.ts +805 -0
  179. package/src/production-document.ts +2 -0
  180. package/src/production-native-codecs.ts +1141 -0
  181. package/src/production-presentation.ts +2 -0
  182. package/src/production-sha256.ts +150 -0
  183. package/src/production-spreadsheet-native.ts +686 -0
  184. package/src/production-spreadsheet.ts +2 -0
  185. package/src/production.ts +1022 -0
  186. package/src/raster-image.ts +586 -0
  187. package/src/reference.ts +17 -0
  188. package/src/runtime-cli-entry.ts +13 -0
  189. package/src/runtime-cli.ts +670 -0
  190. package/src/runtime-development.ts +689 -0
  191. package/src/runtime-receipt.ts +169 -0
  192. package/src/runtime.ts +1463 -0
  193. package/src/snapshot.ts +88 -0
  194. package/src/spreadsheet-address.ts +90 -0
  195. package/src/spreadsheet-file.ts +71 -0
  196. package/src/spreadsheet-formula.ts +1212 -0
  197. package/src/spreadsheet-image.ts +242 -0
  198. package/src/spreadsheet-render.ts +985 -0
  199. package/src/spreadsheet-types.ts +171 -0
  200. package/src/spreadsheet-xlsx-api.ts +123 -0
  201. package/src/spreadsheet-xlsx-codec.ts +3063 -0
  202. package/src/spreadsheet-xlsx-state.ts +191 -0
  203. package/src/spreadsheet.ts +5195 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/spreadsheet-xlsx-codec.ts"],"sourcesContent":["import type ExcelJS from \"exceljs\";\nimport { SaxesParser, type SaxesTagNS } from \"saxes\";\n\nimport {\n inflateBoundedZipEntry,\n parseBoundedZip,\n verifyBoundedZipEntry,\n type BoundedZipEntry,\n type BoundedZipFailure,\n} from \"./bounded-zip\";\nimport { FileBlob } from \"./file-blob\";\nimport {\n formatCellAddress,\n formatRangeAddress,\n parseRangeAddress,\n type RangeAddress,\n} from \"./spreadsheet-address\";\nimport { normalizeSpreadsheetImageConfig } from \"./spreadsheet-image\";\nimport { validateSupportedFormula } from \"./spreadsheet-formula\";\nimport { boundedUtf8ByteLength, inspectRasterImage } from \"./raster-image\";\nimport { Workbook, type Worksheet } from \"./spreadsheet\";\nimport {\n XLSX_MEDIA_TYPE,\n SpreadsheetFidelityError,\n SpreadsheetSecurityError,\n type SpreadsheetFidelityIssue,\n type SpreadsheetLossPreservationEnvelope,\n type SpreadsheetOpaqueContent,\n type SpreadsheetOpaqueContentType,\n type SpreadsheetOpaqueRelationship,\n type SpreadsheetXlsxExportOptions,\n type SpreadsheetXlsxImportLimits,\n type SpreadsheetXlsxImportOptions,\n} from \"./spreadsheet-xlsx-api\";\nimport {\n LOSS_PRESERVATION,\n cloneOpaqueContent,\n hasOpaqueContent,\n opaqueContentIssues,\n spreadsheetFidelityReport,\n spreadsheetLossPreservationEnvelope,\n} from \"./spreadsheet-xlsx-state\";\nimport type {\n BorderConfig,\n CellFormat,\n CellValue,\n FormulaErrorValue,\n FormulaResult,\n SpreadsheetImageConfig,\n} from \"./spreadsheet-types\";\n\nconst DEFAULT_XLSX_IMPORT_LIMITS: SpreadsheetXlsxImportLimits = Object.freeze({\n compressedBytes: 64 * 1024 * 1024,\n expandedBytes: 512 * 1024 * 1024,\n entryBytes: 128 * 1024 * 1024,\n entries: 20_000,\n compressionRatio: 100,\n inspectedXmlBytes: 64 * 1024 * 1024,\n xmlDepth: 128,\n xmlAttributesPerElement: 256,\n xmlAttributesPerPart: 100_000,\n xmlAttributes: 500_000,\n xmlElementsPerPart: 1_000_000,\n xmlElements: 2_000_000,\n xmlTextCharactersPerPart: 16 * 1024 * 1024,\n xmlTextCharacters: 64 * 1024 * 1024,\n worksheetCellsPerPart: 1_000_000,\n worksheetCells: 1_000_000,\n formulasPerPart: 250_000,\n formulas: 1_000_000,\n formulaBytesPerPart: 16 * 1024 * 1024,\n formulaBytes: 64 * 1024 * 1024,\n sharedStrings: 1_000_000,\n cellStyles: 100_000,\n styleRecords: 250_000,\n commentsPerPart: 100_000,\n comments: 100_000,\n relationshipsPerPart: 4_096,\n relationships: 20_000,\n mediaEntries: 1_024,\n mediaEntryBytes: 32 * 1024 * 1024,\n mediaBytes: 128 * 1024 * 1024,\n imagePixels: 67_108_864,\n});\n\n/** XLSX codec around the canonical Workbook model. */\n// eslint-disable-next-line typescript/no-extraneous-class -- Skill-compatible static facade.\nexport class SpreadsheetXlsxCodec {\n static async importXlsx(\n input: FileBlob | Blob | ArrayBuffer | Uint8Array,\n options: SpreadsheetXlsxImportOptions = {},\n ): Promise<Workbook> {\n validateImportOptions(options);\n const limits = resolveImportLimits(options.limits);\n const sourceBytes = await toBytes(input, limits.compressedBytes);\n const preflight = await preflightXlsx(sourceBytes, limits);\n if (hasOpaqueContent(preflight.opaqueContent) && options.unsupportedContent === \"error\") {\n throw new SpreadsheetFidelityError(\n \"The XLSX contains bounded inert OOXML outside the editable spreadsheet model\",\n opaqueContentIssues(preflight.opaqueContent, \"error\"),\n );\n }\n\n const excelWorkbook = await createExcelWorkbook();\n // toBytes always returns an owned, full-span Uint8Array. Hand that buffer to ExcelJS directly;\n // retaining unsupported OOXML then needs only this one canonical package copy.\n await excelWorkbook.xlsx.load(\n sourceBytes.buffer as Parameters<typeof excelWorkbook.xlsx.load>[0],\n );\n const workbook = importWorkbook(excelWorkbook, preflight.comments);\n LOSS_PRESERVATION.set(workbook, {\n sourceBytes,\n sourceDigest: await sha256Hex(sourceBytes),\n importedRevision: workbook.revision,\n opaqueContent: cloneOpaqueContent(preflight.opaqueContent),\n modelDigest: await workbookModelDigest(workbook),\n });\n return workbook;\n }\n\n static async exportXlsx(\n workbook: Workbook,\n options: SpreadsheetXlsxExportOptions = {},\n ): Promise<FileBlob> {\n validateExportOptions(options);\n // Validation also catches hostile state injected through reflection before any source bytes\n // are returned or ExcelJS is allocated.\n workbook.toJSON();\n const envelope = LOSS_PRESERVATION.get(workbook);\n if (envelope && (await workbookModelDigest(workbook)) === envelope.modelDigest) {\n return FileBlob.fromBytes(envelope.sourceBytes.slice(), {\n type: XLSX_MEDIA_TYPE,\n name: options.fileName ?? \"workbook.xlsx\",\n });\n }\n\n const issues = this.fidelityReport(workbook).filter((issue) => issue.severity === \"error\");\n if (issues.length > 0 && options.unsupportedContent !== \"discard\") {\n throw new SpreadsheetFidelityError(\n 'XLSX export would discard unsupported editable content; remove it or explicitly export with unsupportedContent: \"discard\"',\n issues,\n );\n }\n\n const excelWorkbook = await exportWorkbook(workbook);\n const output = await excelWorkbook.xlsx.writeBuffer({\n zip: { compression: \"DEFLATE\", compressionOptions: { level: 6 } },\n });\n return FileBlob.fromBytes(normalizeGeneratedZip(new Uint8Array(output)), {\n type: XLSX_MEDIA_TYPE,\n name: options.fileName ?? \"workbook.xlsx\",\n });\n }\n\n static fidelityReport(workbook: Workbook): readonly SpreadsheetFidelityIssue[] {\n workbook.toJSON();\n return spreadsheetFidelityReport(workbook);\n }\n\n /**\n * Returns a portable copy of the opaque original-package envelope.\n * Persist it beside Workbook.toJSON(); the Workbook JSON intentionally does not contain Office bytes.\n */\n static lossPreservationEnvelope(workbook: Workbook): SpreadsheetLossPreservationEnvelope | null {\n workbook.toJSON();\n return spreadsheetLossPreservationEnvelope(workbook);\n }\n\n /** Reattaches a separately persisted envelope to a restored canonical workbook snapshot. */\n static async attachLossPreservationEnvelope(\n workbook: Workbook,\n envelope: SpreadsheetLossPreservationEnvelope,\n options: Pick<SpreadsheetXlsxImportOptions, \"limits\"> = {},\n ): Promise<void> {\n workbook.toJSON();\n validateAttachOptions(options);\n const normalizedEnvelope = normalizeLossPreservationEnvelope(envelope);\n const sourceBytes = normalizedEnvelope.sourceBytes;\n if (normalizedEnvelope.sourceDigest !== (await sha256Hex(sourceBytes))) {\n throw new SpreadsheetSecurityError(\n \"Spreadsheet loss-preservation source digest does not match its bytes\",\n \"invalid-package\",\n );\n }\n const preflight = await preflightXlsx(sourceBytes, resolveImportLimits(options.limits));\n if (!sameOpaqueContent(preflight.opaqueContent, normalizedEnvelope.opaqueContent)) {\n throw new SpreadsheetSecurityError(\n \"Spreadsheet loss-preservation envelope metadata does not match its XLSX bytes\",\n \"invalid-package\",\n );\n }\n const projectedSource = await createExcelWorkbook();\n await projectedSource.xlsx.load(\n sourceBytes.buffer as Parameters<typeof projectedSource.xlsx.load>[0],\n );\n const projectedDigest = await workbookModelDigest(\n importWorkbook(projectedSource, preflight.comments),\n );\n const targetDigest = await workbookModelDigest(workbook);\n if (\n projectedDigest !== normalizedEnvelope.modelDigest ||\n targetDigest !== normalizedEnvelope.modelDigest\n ) {\n throw new SpreadsheetSecurityError(\n \"Spreadsheet loss-preservation envelope belongs to a different workbook snapshot\",\n \"invalid-package\",\n );\n }\n LOSS_PRESERVATION.set(workbook, {\n sourceBytes,\n sourceDigest: normalizedEnvelope.sourceDigest,\n importedRevision: workbook.revision,\n opaqueContent: cloneOpaqueContent(preflight.opaqueContent),\n modelDigest: normalizedEnvelope.modelDigest,\n });\n }\n}\n\nfunction normalizeLossPreservationEnvelope(input: unknown): {\n sourceBytes: Uint8Array;\n sourceDigest: string;\n opaqueContent: SpreadsheetOpaqueContent;\n modelDigest: string;\n} {\n if (\n input === null ||\n typeof input !== \"object\" ||\n Array.isArray(input) ||\n Object.getPrototypeOf(input) !== Object.prototype\n ) {\n throw new TypeError(\"Spreadsheet loss-preservation envelope must be a plain object\");\n }\n const record = input as Record<string, unknown>;\n const required = new Set([\n \"version\",\n \"mediaType\",\n \"sourceBytes\",\n \"sourceDigest\",\n \"opaqueContent\",\n \"modelDigest\",\n ]);\n const allowed = required;\n for (const key of Reflect.ownKeys(record)) {\n if (typeof key !== \"string\" || !allowed.has(key)) {\n throw new TypeError(\"Spreadsheet loss-preservation envelope contains an unknown property\");\n }\n const descriptor = Object.getOwnPropertyDescriptor(record, key);\n if (!descriptor || !(\"value\" in descriptor)) {\n throw new TypeError(`Spreadsheet loss-preservation envelope ${key} must be plain data`);\n }\n }\n for (const key of required) {\n if (!Object.hasOwn(record, key)) {\n throw new TypeError(`Spreadsheet loss-preservation envelope ${key} is required`);\n }\n }\n if (record.version !== 1 || record.mediaType !== XLSX_MEDIA_TYPE) {\n throw new TypeError(\"Unsupported spreadsheet loss-preservation envelope\");\n }\n const source = record.sourceBytes;\n if (\n !(source instanceof Uint8Array) ||\n Object.getPrototypeOf(source) !== Uint8Array.prototype ||\n source.byteLength > DEFAULT_XLSX_IMPORT_LIMITS.compressedBytes\n ) {\n throw new TypeError(\"Spreadsheet loss-preservation sourceBytes must be a bounded Uint8Array\");\n }\n if (typeof record.sourceDigest !== \"string\" || !/^[0-9a-f]{64}$/.test(record.sourceDigest)) {\n throw new TypeError(\"Spreadsheet loss-preservation sourceDigest must be canonical SHA-256\");\n }\n const opaqueContent = normalizeOpaqueContent(record.opaqueContent);\n if (typeof record.modelDigest !== \"string\" || !/^[0-9a-f]{64}$/.test(record.modelDigest)) {\n throw new TypeError(\"Spreadsheet loss-preservation modelDigest must be canonical SHA-256\");\n }\n return {\n sourceBytes: Uint8Array.prototype.slice.call(source) as Uint8Array,\n sourceDigest: record.sourceDigest,\n opaqueContent,\n modelDigest: record.modelDigest,\n };\n}\n\nfunction normalizeOpaqueContent(input: unknown): SpreadsheetOpaqueContent {\n assertPlainDataRecord(\n input,\n new Set([\"parts\", \"relationships\", \"contentTypes\", \"features\"]),\n \"Spreadsheet opaque-content metadata\",\n );\n const parts = denseDataArray(\n input.parts,\n DEFAULT_XLSX_IMPORT_LIMITS.entries,\n \"Spreadsheet opaque part list\",\n ).map((part) => {\n if (typeof part !== \"string\" || !isCanonicalPartName(part)) {\n throw new TypeError(\"Spreadsheet opaque part name is invalid\");\n }\n return part;\n });\n const relationships = denseDataArray(\n input.relationships,\n DEFAULT_XLSX_IMPORT_LIMITS.relationships,\n \"Spreadsheet opaque relationship list\",\n ).map((relationship) => {\n assertPlainDataRecord(\n relationship,\n new Set([\"sourcePart\", \"type\", \"targetPart\"]),\n \"Spreadsheet opaque relationship\",\n );\n const { sourcePart, type, targetPart } = relationship;\n if (\n typeof sourcePart !== \"string\" ||\n (sourcePart !== \"\" && !isCanonicalPartName(sourcePart)) ||\n typeof type !== \"string\" ||\n type.length === 0 ||\n type.length > 2_048 ||\n !/^[\\x21-\\x7e]+$/.test(type) ||\n typeof targetPart !== \"string\" ||\n !isCanonicalPartName(targetPart)\n ) {\n throw new TypeError(\"Spreadsheet opaque relationship metadata is invalid\");\n }\n return { sourcePart, type, targetPart };\n });\n const contentTypes = denseDataArray(\n input.contentTypes,\n DEFAULT_XLSX_IMPORT_LIMITS.entries,\n \"Spreadsheet opaque content-type list\",\n ).map((contentType) => {\n assertPlainDataRecord(\n contentType,\n new Set([\"partName\", \"contentType\"]),\n \"Spreadsheet opaque content type\",\n );\n if (\n typeof contentType.partName !== \"string\" ||\n !isCanonicalPartName(contentType.partName) ||\n typeof contentType.contentType !== \"string\" ||\n contentType.contentType.length === 0 ||\n contentType.contentType.length > 2_048 ||\n !/^[\\x21-\\x7e]+$/.test(contentType.contentType)\n ) {\n throw new TypeError(\"Spreadsheet opaque content-type metadata is invalid\");\n }\n return {\n partName: contentType.partName,\n contentType: contentType.contentType,\n };\n });\n const features = denseDataArray(input.features, 4_096, \"Spreadsheet opaque feature list\").map(\n (feature) => {\n if (typeof feature !== \"string\" || !/^[a-z0-9][a-z0-9._-]{0,127}$/.test(feature)) {\n throw new TypeError(\"Spreadsheet opaque feature name is invalid\");\n }\n return feature;\n },\n );\n return {\n parts: canonicalUnique(parts, compareStrings, \"Spreadsheet opaque part list\"),\n relationships: canonicalUnique(\n relationships,\n compareOpaqueRelationships,\n \"Spreadsheet opaque relationship list\",\n ),\n contentTypes: canonicalUnique(\n contentTypes,\n compareOpaqueContentTypes,\n \"Spreadsheet opaque content-type list\",\n ),\n features: canonicalUnique(features, compareStrings, \"Spreadsheet opaque feature list\"),\n };\n}\n\nfunction canonicalUnique<T>(\n values: readonly T[],\n compare: (left: T, right: T) => number,\n label: string,\n): T[] {\n const sorted = [...values].sort(compare);\n for (let index = 1; index < sorted.length; index += 1) {\n if (compare(sorted[index - 1]!, sorted[index]!) === 0) {\n throw new TypeError(`${label} contains duplicate metadata`);\n }\n }\n return sorted;\n}\n\nfunction denseDataArray(value: unknown, maximum: number, label: string): unknown[] {\n if (\n !Array.isArray(value) ||\n Object.getPrototypeOf(value) !== Array.prototype ||\n value.length > maximum\n ) {\n throw new TypeError(`${label} must be a bounded ordinary array`);\n }\n const descriptors = Object.getOwnPropertyDescriptors(value);\n for (let index = 0; index < value.length; index += 1) {\n const descriptor = descriptors[String(index)];\n if (!descriptor || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw new TypeError(`${label} must contain only dense data elements`);\n }\n }\n for (const key of Object.keys(descriptors)) {\n if (key !== \"length\" && !/^(?:0|[1-9][0-9]*)$/.test(key)) {\n throw new TypeError(`${label} contains an unknown property`);\n }\n }\n return Array.prototype.slice.call(value) as unknown[];\n}\n\nfunction assertPlainDataRecord(\n value: unknown,\n allowedKeys: ReadonlySet<string>,\n label: string,\n): asserts value is Record<string, unknown> {\n if (\n value === null ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n Object.getPrototypeOf(value) !== Object.prototype\n ) {\n throw new TypeError(`${label} must be a plain data object`);\n }\n if (Object.getOwnPropertySymbols(value).length > 0) {\n throw new TypeError(`${label} must not contain symbol properties`);\n }\n for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {\n if (!(\"value\" in descriptor) || !descriptor.enumerable) {\n throw new TypeError(`${label} must contain only enumerable data properties`);\n }\n if (!allowedKeys.has(key)) throw new TypeError(`${label} contains unknown property ${key}`);\n }\n}\n\nfunction sameOpaqueContent(\n left: SpreadsheetOpaqueContent,\n right: SpreadsheetOpaqueContent,\n): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction validateImportOptions(options: SpreadsheetXlsxImportOptions): void {\n assertPlainDataRecord(options, new Set([\"unsupportedContent\", \"limits\"]), \"XLSX import options\");\n if (\n options.unsupportedContent !== undefined &&\n options.unsupportedContent !== \"preserve\" &&\n options.unsupportedContent !== \"error\"\n ) {\n throw new TypeError(\"XLSX unsupportedContent import policy is invalid\");\n }\n if (options.limits !== undefined) {\n assertPlainDataRecord(\n options.limits,\n new Set(Object.keys(DEFAULT_XLSX_IMPORT_LIMITS)),\n \"XLSX import limits\",\n );\n }\n}\n\nfunction validateExportOptions(options: SpreadsheetXlsxExportOptions): void {\n assertPlainDataRecord(\n options,\n new Set([\"fileName\", \"unsupportedContent\"]),\n \"XLSX export options\",\n );\n if (\n options.unsupportedContent !== undefined &&\n options.unsupportedContent !== \"error\" &&\n options.unsupportedContent !== \"discard\"\n ) {\n throw new TypeError(\"XLSX unsupportedContent export policy is invalid\");\n }\n if (\n options.fileName !== undefined &&\n (typeof options.fileName !== \"string\" ||\n options.fileName.length === 0 ||\n options.fileName.length > 255 ||\n /[\\u0000-\\u001f\\u007f]/.test(options.fileName))\n ) {\n throw new TypeError(\"XLSX export fileName must contain 1 through 255 safe characters\");\n }\n}\n\nfunction validateAttachOptions(options: Pick<SpreadsheetXlsxImportOptions, \"limits\">): void {\n assertPlainDataRecord(options, new Set([\"limits\"]), \"XLSX envelope attach options\");\n if (options.limits !== undefined) {\n assertPlainDataRecord(\n options.limits,\n new Set(Object.keys(DEFAULT_XLSX_IMPORT_LIMITS)),\n \"XLSX import limits\",\n );\n }\n}\n\nasync function createExcelWorkbook(): Promise<ExcelJS.Workbook> {\n const module = await import(\"exceljs\");\n const runtime = (module.default ?? module) as unknown as {\n Workbook: new () => ExcelJS.Workbook;\n };\n return new runtime.Workbook();\n}\n\ntype ImportedLegacyComment = {\n sheetName: string;\n cell: string;\n text: string;\n};\n\nfunction importWorkbook(\n source: ExcelJS.Workbook,\n legacyComments: readonly ImportedLegacyComment[] = [],\n): Workbook {\n const workbook = Workbook.create();\n workbook.transact(() => {\n for (const sourceSheet of source.worksheets) {\n const worksheet = workbook.worksheets.add(sourceSheet.name);\n const view = sourceSheet.views[0];\n worksheet.showGridLines = view?.showGridLines ?? true;\n if (view?.state === \"frozen\") {\n if (view.ySplit) worksheet.freezePanes.freezeRows(view.ySplit);\n if (view.xSplit) worksheet.freezePanes.freezeColumns(view.xSplit);\n }\n\n sourceSheet.eachRow({ includeEmpty: false }, (row, rowNumber) => {\n if (row.height && row.height > 0)\n worksheet.setRowHeight(rowNumber - 1, pointsToPixels(row.height));\n row.eachCell({ includeEmpty: false }, (cell, columnNumber) => {\n const value = importCellValue(cell.value);\n const formula = formulaOf(cell.value);\n worksheet.setCell(\n rowNumber - 1,\n columnNumber - 1,\n {\n value: formula ? null : value,\n formula,\n format: importCellFormat(cell),\n },\n \"content\",\n );\n importDataValidation(worksheet, rowNumber - 1, columnNumber - 1, cell.dataValidation);\n });\n });\n\n for (let columnNumber = 1; columnNumber <= sourceSheet.columnCount; columnNumber += 1) {\n const width = sourceSheet.getColumn(columnNumber).width;\n if (width && width > 0)\n worksheet.setColumnWidth(columnNumber - 1, excelWidthToPixels(width));\n }\n for (const merge of sourceSheet.model.merges ?? []) worksheet.mergeCells(merge);\n importTables(worksheet, sourceSheet);\n importImages(source, worksheet, sourceSheet);\n importConditionalFormattings(worksheet, sourceSheet);\n }\n for (const comment of legacyComments) {\n const worksheet = workbook.worksheets.getItem(comment.sheetName);\n workbook.comments.addThread({ cell: worksheet.getRange(comment.cell) }, comment.text);\n }\n });\n return workbook;\n}\n\nasync function exportWorkbook(workbook: Workbook): Promise<ExcelJS.Workbook> {\n const output = await createExcelWorkbook();\n output.creator = \"OpenGeni\";\n output.lastModifiedBy = \"OpenGeni\";\n output.created = new Date(0);\n output.modified = new Date(0);\n output.calcProperties.fullCalcOnLoad = true;\n\n for (const worksheet of workbook.worksheets.items) {\n const sourceFreeze = worksheet.freezePanes.snapshot();\n const views: Array<Partial<ExcelJS.WorksheetView>> =\n sourceFreeze.rows || sourceFreeze.columns\n ? [\n {\n state: \"frozen\",\n xSplit: sourceFreeze.columns,\n ySplit: sourceFreeze.rows,\n showGridLines: worksheet.showGridLines,\n },\n ]\n : [{ state: \"normal\", showGridLines: worksheet.showGridLines }];\n const sheet = output.addWorksheet(worksheet.name, { views });\n\n for (const { row, col, data } of worksheet.cellEntries()) {\n const cell = sheet.getCell(row + 1, col + 1);\n if (data.formula) {\n assertSafeFormula(data.formula, `${worksheet.name}!${formatCellAddress({ row, col })}`);\n const result = workbook.valueAt(worksheet, { row, col });\n cell.value = {\n formula: data.formula.startsWith(\"=\") ? data.formula.slice(1) : data.formula,\n ...(formulaResultForExcel(result) === undefined\n ? {}\n : { result: formulaResultForExcel(result) }),\n } as ExcelJS.CellFormulaValue;\n } else {\n cell.value = exportCellValue(data.value);\n }\n applyCellFormat(cell, data.format);\n }\n\n const used = worksheet.usedRangeAddress();\n if (used) {\n for (let col = used.col; col < used.col + used.colCount; col += 1) {\n sheet.getColumn(col + 1).width = pixelsToExcelWidth(worksheet.columnWidth(col));\n }\n for (let row = used.row; row < used.row + used.rowCount; row += 1) {\n sheet.getRow(row + 1).height = pixelsToPoints(worksheet.rowHeight(row));\n }\n }\n for (const merge of worksheet.mergeRegions()) sheet.mergeCells(formatRangeAddress(merge));\n exportDataValidations(worksheet, sheet);\n exportConditionalFormattings(worksheet, sheet);\n exportTables(worksheet, sheet);\n exportImages(output, worksheet, sheet);\n exportComments(workbook, worksheet, sheet);\n }\n return output;\n}\n\nfunction importCellValue(value: ExcelJS.CellValue): CellValue {\n if (value === undefined || value === null) return null;\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value instanceof Date\n )\n return value;\n if (\"formula\" in value || \"sharedFormula\" in value) {\n const result = value.result;\n if (result === undefined) return null;\n if (\n typeof result === \"string\" ||\n typeof result === \"number\" ||\n typeof result === \"boolean\" ||\n result instanceof Date\n )\n return result;\n if (\"error\" in result) return result.error;\n return null;\n }\n if (\"error\" in value) return value.error;\n if (\"richText\" in value) return value.richText.map((part) => part.text).join(\"\");\n if (\"text\" in value) return value.text;\n return null;\n}\n\nfunction formulaOf(value: ExcelJS.CellValue): string | null {\n if (!value || typeof value !== \"object\") return null;\n if (\"formula\" in value && value.formula) return normalizeFormula(value.formula);\n if (\"sharedFormula\" in value && value.formula) return normalizeFormula(value.formula);\n return null;\n}\n\nfunction importCellFormat(cell: ExcelJS.Cell): CellFormat {\n const fill = cell.fill?.type === \"pattern\" ? colorFromExcel(cell.fill.fgColor) : undefined;\n const fontColor = colorFromExcel(cell.font?.color);\n const border = importBorders(cell.border);\n const format: CellFormat = {};\n if (fill) format.fill = fill;\n const font: NonNullable<CellFormat[\"font\"]> = {};\n if (cell.font?.name) font.name = cell.font.name;\n if (cell.font?.size !== undefined) font.size = cell.font.size;\n if (cell.font?.bold !== undefined) font.bold = cell.font.bold;\n if (cell.font?.italic !== undefined) font.italic = cell.font.italic;\n if (cell.font?.underline !== undefined)\n font.underline = Boolean(cell.font.underline && cell.font.underline !== \"none\");\n if (fontColor) font.color = fontColor;\n if (Object.keys(font).length > 0) format.font = font;\n if (cell.numFmt) format.numberFormat = cell.numFmt;\n if (border) format.borders = border;\n const horizontal = importHorizontalAlignment(cell.alignment?.horizontal);\n if (horizontal) format.horizontalAlignment = horizontal;\n const vertical = importVerticalAlignment(cell.alignment?.vertical);\n if (vertical) format.verticalAlignment = vertical;\n if (cell.alignment?.wrapText !== undefined) format.wrapText = cell.alignment.wrapText;\n return format;\n}\n\nfunction applyCellFormat(cell: ExcelJS.Cell, format: CellFormat): void {\n if (format.fill) {\n cell.fill = {\n type: \"pattern\",\n pattern: \"solid\",\n fgColor: { argb: colorToArgb(format.fill) },\n };\n }\n if (format.font) {\n const font: Partial<ExcelJS.Font> = {};\n if (format.font.name !== undefined) font.name = format.font.name;\n if (format.font.size !== undefined) font.size = format.font.size;\n if (format.font.bold !== undefined) font.bold = format.font.bold;\n if (format.font.italic !== undefined) font.italic = format.font.italic;\n if (format.font.underline !== undefined) font.underline = format.font.underline;\n if (format.font.color) font.color = { argb: colorToArgb(format.font.color) };\n cell.font = font;\n }\n if (format.numberFormat) cell.numFmt = format.numberFormat;\n if (format.borders) cell.border = exportBorders(format.borders);\n const alignment: Partial<ExcelJS.Alignment> = {};\n if (format.horizontalAlignment) alignment.horizontal = format.horizontalAlignment;\n if (format.verticalAlignment)\n alignment.vertical =\n format.verticalAlignment === \"center\" ? \"middle\" : format.verticalAlignment;\n if (format.wrapText !== undefined) alignment.wrapText = format.wrapText;\n if (Object.keys(alignment).length > 0) cell.alignment = alignment;\n}\n\nfunction importBorders(borders: Partial<ExcelJS.Borders> | undefined): CellFormat[\"borders\"] {\n if (!borders) return undefined;\n const imported: NonNullable<CellFormat[\"borders\"]> = {};\n const top = importBorder(borders.top);\n const right = importBorder(borders.right);\n const bottom = importBorder(borders.bottom);\n const left = importBorder(borders.left);\n if (top) imported.top = top;\n if (right) imported.right = right;\n if (bottom) imported.bottom = bottom;\n if (left) imported.left = left;\n return Object.keys(imported).length > 0 ? imported : undefined;\n}\n\nfunction importBorder(border: Partial<ExcelJS.Border> | undefined): BorderConfig | undefined {\n if (!border?.style) return undefined;\n const imported: BorderConfig = { style: border.style };\n const color = colorFromExcel(border.color);\n if (color) imported.color = color;\n return imported;\n}\n\nfunction exportBorders(borders: NonNullable<CellFormat[\"borders\"]>): Partial<ExcelJS.Borders> {\n const fallback: BorderConfig | undefined =\n borders.style || borders.color\n ? {\n style: borders.style ?? \"thin\",\n ...(borders.color ? { color: borders.color } : {}),\n }\n : undefined;\n const useFallback = borders.preset === \"all\" || borders.preset === \"outside\";\n const exported: Partial<ExcelJS.Borders> = {};\n const top = exportBorder(borders.top ?? (useFallback ? fallback : undefined));\n const right = exportBorder(borders.right ?? (useFallback ? fallback : undefined));\n const doubleBottom: BorderConfig = {\n style: \"double\",\n ...(borders.color ? { color: borders.color } : {}),\n };\n const bottom = exportBorder(\n borders.bottom ??\n (borders.preset === \"doubleBottom\" ? doubleBottom : useFallback ? fallback : undefined),\n );\n const left = exportBorder(borders.left ?? (useFallback ? fallback : undefined));\n if (top) exported.top = top;\n if (right) exported.right = right;\n if (bottom) exported.bottom = bottom;\n if (left) exported.left = left;\n return exported;\n}\n\nfunction exportBorder(border: BorderConfig | undefined): Partial<ExcelJS.Border> | undefined {\n if (!border) return undefined;\n const exported: Partial<ExcelJS.Border> = {\n style: excelBorderStyle(border.style),\n };\n if (border.color) exported.color = { argb: colorToArgb(border.color) };\n return exported;\n}\n\nfunction importDataValidation(\n worksheet: Worksheet,\n row: number,\n col: number,\n validation: ExcelJS.DataValidation,\n): void {\n if (!validation?.type) return;\n worksheet.dataValidations.add({\n range: formatCellAddress({ row, col }),\n rule: importDataValidationRule(validation),\n });\n}\n\nfunction exportDataValidations(worksheet: Worksheet, target: ExcelJS.Worksheet): void {\n for (const entry of worksheet.dataValidations.all()) {\n const validation = exportDataValidationRule(entry.config.rule);\n forEachCell(entry.range, (row, col) => {\n target.getCell(row + 1, col + 1).dataValidation = structuredClone(validation);\n });\n }\n}\n\nfunction importDataValidationRule(validation: ExcelJS.DataValidation): Record<string, unknown> {\n const source = structuredClone(validation as unknown as Record<string, unknown>);\n const formulae = source.formulae;\n if (source.type === \"list\" && Array.isArray(formulae) && formulae.length === 1) {\n const values = inlineValidationValues(formulae[0]);\n if (values) {\n delete source.formulae;\n source.values = values;\n }\n }\n return source;\n}\n\nfunction exportDataValidationRule(rule: Record<string, unknown>): ExcelJS.DataValidation {\n const output = structuredClone(rule);\n if (Array.isArray(output.values)) {\n if (output.type !== \"list\" || output.values.some((value) => typeof value !== \"string\")) {\n throw new TypeError(\"Data validation values require a list of strings\");\n }\n const literal = `\"${output.values\n .map((value) => (value as string).replaceAll('\"', '\"\"'))\n .join(\",\")}\"`;\n if (literal.length > 255) {\n throw new TypeError(\"Inline data validation values exceed Excel's 255-character limit\");\n }\n output.formulae = [literal];\n delete output.values;\n } else if (!Array.isArray(output.formulae)) {\n const formulae = [];\n if (output.formula1 !== undefined) formulae.push(output.formula1);\n if (output.formula2 !== undefined) formulae.push(output.formula2);\n if (formulae.length > 0) output.formulae = formulae;\n delete output.formula1;\n delete output.formula2;\n }\n return output as unknown as ExcelJS.DataValidation;\n}\n\nfunction inlineValidationValues(value: unknown): string[] | null {\n if (\n typeof value !== \"string\" ||\n value.length < 2 ||\n !value.startsWith('\"') ||\n !value.endsWith('\"')\n ) {\n return null;\n }\n const input = value.slice(1, -1);\n const values: string[] = [];\n let current = \"\";\n for (let index = 0; index < input.length; index += 1) {\n const character = input[index]!;\n if (character === '\"' && input[index + 1] === '\"') {\n current += '\"';\n index += 1;\n } else if (character === \",\") {\n values.push(current);\n current = \"\";\n } else current += character;\n }\n values.push(current);\n return values;\n}\n\ntype ExcelConditionalFormatting = {\n ref: string;\n rules: Array<Record<string, unknown>>;\n};\n\nfunction importConditionalFormattings(worksheet: Worksheet, source: ExcelJS.Worksheet): void {\n const entries =\n (\n source as unknown as {\n conditionalFormattings?: ExcelConditionalFormatting[];\n }\n ).conditionalFormattings ?? [];\n for (const entry of entries) {\n const range = parseRangeAddress(entry.ref);\n for (const sourceRule of entry.rules ?? []) {\n const rule = stripUndefinedProperties(structuredClone(sourceRule));\n const type = rule.type;\n if (typeof type !== \"string\") throw new TypeError(\"XLSX conditional format type is missing\");\n // Strict preflight records safe, unsupported rule kinds as source-only fidelity. Do not\n // coerce them into a different editable rule.\n if (!SUPPORTED_CONDITIONAL_FORMAT_RULE_TYPES.has(type.toLowerCase())) continue;\n delete rule.type;\n delete rule.priority;\n const formulae = rule.formulae;\n if (Array.isArray(formulae)) {\n const normalizedFormulae = formulae.map(importConditionalFormula);\n rule.formula = normalizedFormulae.length === 1 ? normalizedFormulae[0] : normalizedFormulae;\n delete rule.formulae;\n }\n if (rule.style && typeof rule.style === \"object\") {\n rule.format = importConditionalStyle(rule.style as Record<string, unknown>);\n delete rule.style;\n }\n worksheet.conditionalFormattings.add(range, type, rule);\n }\n }\n}\n\nfunction stripUndefinedProperties<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((item) => stripUndefinedProperties(item)) as T;\n }\n if (value && typeof value === \"object\" && Object.getPrototypeOf(value) === Object.prototype) {\n const output: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n if (item !== undefined) output[key] = stripUndefinedProperties(item);\n }\n return output as T;\n }\n return value;\n}\n\nfunction exportConditionalFormattings(worksheet: Worksheet, target: ExcelJS.Worksheet): void {\n const add = (\n target as unknown as {\n addConditionalFormatting: (input: ExcelConditionalFormatting) => void;\n }\n ).addConditionalFormatting.bind(target);\n for (const entry of worksheet.conditionalFormattings.all()) {\n const config = structuredClone(entry.config);\n const formula = config.formula;\n if (formula !== undefined) {\n config.formulae = Array.isArray(formula) ? formula : [formula];\n delete config.formula;\n }\n if (config.format && typeof config.format === \"object\") {\n config.style = exportConditionalStyle(config.format as Record<string, unknown>);\n delete config.format;\n }\n add({\n ref: formatRangeAddress(entry.range),\n rules: [{ type: entry.ruleType, ...config }],\n });\n }\n}\n\nfunction importConditionalStyle(style: Record<string, unknown>): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n const fill = style.fill as\n | { fgColor?: Partial<ExcelJS.Color>; bgColor?: Partial<ExcelJS.Color> }\n | undefined;\n const fillColor = colorFromExcel(fill?.fgColor ?? fill?.bgColor);\n if (fillColor) output.fill = fillColor;\n const font = style.font as\n | (Partial<ExcelJS.Font> & { color?: Partial<ExcelJS.Color> })\n | undefined;\n const fontColor = colorFromExcel(font?.color);\n if (font) {\n const normalizedFont: Record<string, unknown> = {};\n for (const key of [\"name\", \"size\", \"bold\", \"italic\", \"underline\"] as const) {\n if (font[key] !== null && font[key] !== undefined) normalizedFont[key] = font[key];\n }\n if (fontColor) normalizedFont.color = fontColor;\n if (Object.keys(normalizedFont).length > 0) output.font = normalizedFont;\n }\n if (style.border && typeof style.border === \"object\") output.border = style.border;\n if (typeof style.numFmt === \"string\") output.numberFormat = style.numFmt;\n return output;\n}\n\nfunction importConditionalFormula(value: unknown): unknown {\n if (typeof value === \"string\" && /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[Ee][+-]?\\d+)?$/.test(value)) {\n const number = Number(value);\n if (Number.isFinite(number)) return number;\n }\n return value;\n}\n\nfunction exportConditionalStyle(format: Record<string, unknown>): Record<string, unknown> {\n const output = structuredClone(format);\n if (typeof output.fill === \"string\") {\n output.fill = {\n type: \"pattern\",\n pattern: \"solid\",\n fgColor: { argb: colorToArgb(output.fill) },\n };\n }\n const font = output.font as { color?: unknown } | undefined;\n if (font && typeof font.color === \"string\") {\n output.font = { ...font, color: { argb: colorToArgb(font.color) } };\n }\n if (output.numberFormat !== undefined && output.numFmt === undefined) {\n output.numFmt = output.numberFormat;\n delete output.numberFormat;\n }\n return output;\n}\n\nfunction exportComments(workbook: Workbook, worksheet: Worksheet, target: ExcelJS.Worksheet): void {\n for (const comment of workbook.toJSON().comments) {\n if (comment.sheetId !== worksheet.id || comment.comments.length === 0) continue;\n target.getCell(comment.cell.row + 1, comment.cell.col + 1).note = comment.comments\n .map((item) => item.text)\n .join(\"\\n\\n\");\n }\n}\n\ntype ExcelTableModel = {\n table: {\n name: string;\n tableRef: string;\n headerRow: boolean;\n totalsRow: boolean;\n style?: {\n theme?: string;\n showColumnStripes?: boolean;\n };\n };\n};\n\nfunction importTables(worksheet: Worksheet, source: ExcelJS.Worksheet): void {\n const tables = source.getTables() as unknown as ExcelTableModel[];\n for (const sourceTable of tables) {\n const model = sourceTable.table;\n if (!model?.name || !model.tableRef) continue;\n const table = worksheet.tables.add(model.tableRef, model.headerRow !== false, model.name);\n table.showTotals = model.totalsRow === true;\n table.style = model.style?.theme ?? \"TableStyleMedium2\";\n table.showBandedColumns = model.style?.showColumnStripes ?? false;\n }\n}\n\nfunction exportTables(worksheet: Worksheet, target: ExcelJS.Worksheet): void {\n for (const table of worksheet.tables.items) {\n const values = table.range.values;\n const firstRow = values[0] ?? [];\n const columns = firstRow.map((value, index) => ({\n name: String(value ?? `Column${index + 1}`),\n filterButton: table.showFilterButton,\n }));\n if (columns.length === 0) continue;\n target.addTable({\n name: table.name,\n ref: formatCellAddress(table.range.address),\n headerRow: table.hasHeaders && table.showHeaders,\n totalsRow: table.showTotals,\n style: {\n theme: excelTableTheme(table.style),\n showColumnStripes: table.showBandedColumns,\n showRowStripes: !table.showBandedColumns,\n },\n columns,\n rows: exportTableRows(\n worksheet,\n table.range.address,\n table.hasHeaders ? 1 : 0,\n table.showTotals ? 1 : 0,\n ),\n });\n }\n}\n\nfunction exportTableRows(\n worksheet: Worksheet,\n address: RangeAddress,\n headerRows: number,\n totalRows: number,\n): ExcelJS.CellValue[][] {\n const rows: ExcelJS.CellValue[][] = [];\n const end = address.row + address.rowCount - totalRows;\n for (let row = address.row + headerRows; row < end; row += 1) {\n const values: ExcelJS.CellValue[] = [];\n for (let col = address.col; col < address.col + address.colCount; col += 1) {\n const data = worksheet.cellData(row, col);\n if (data.formula) {\n assertSafeFormula(data.formula, `${worksheet.name}!${formatCellAddress({ row, col })}`);\n const result = formulaResultForExcel(worksheet.workbook.valueAt(worksheet, { row, col }));\n values.push({\n formula: data.formula.startsWith(\"=\") ? data.formula.slice(1) : data.formula,\n ...(result === undefined ? {} : { result }),\n });\n } else {\n values.push(exportCellValue(data.value));\n }\n }\n rows.push(values);\n }\n return rows;\n}\n\nfunction importImages(\n source: ExcelJS.Workbook,\n worksheet: Worksheet,\n sourceSheet: ExcelJS.Worksheet,\n): void {\n for (const image of sourceSheet.getImages()) {\n const media = source.getImage(Number(image.imageId));\n if (!media?.buffer || ![\"png\", \"jpeg\", \"gif\"].includes(media.extension)) continue;\n const range = image.range as unknown as {\n tl: { row: number; col: number };\n br?: { row: number; col: number };\n ext?: { width: number; height: number };\n };\n const fromRow = Math.max(0, Math.floor(range.tl.row));\n const fromCol = Math.max(0, Math.floor(range.tl.col));\n const rowOffsetPx = Math.max(0, (range.tl.row - fromRow) * worksheet.rowHeight(fromRow));\n const colOffsetPx = Math.max(0, (range.tl.col - fromCol) * worksheet.columnWidth(fromCol));\n const width = Math.max(\n 1,\n range.ext?.width ??\n ((range.br?.col ?? range.tl.col + 1) - range.tl.col) * worksheet.columnWidth(fromCol),\n );\n const height = Math.max(\n 1,\n range.ext?.height ??\n ((range.br?.row ?? range.tl.row + 1) - range.tl.row) * worksheet.rowHeight(fromRow),\n );\n worksheet.images.add({\n blob: copyArrayBuffer(media.buffer),\n contentType: media.extension === \"jpeg\" ? \"image/jpeg\" : `image/${media.extension}`,\n anchor: {\n from: {\n row: fromRow,\n col: fromCol,\n ...(rowOffsetPx > 0 ? { rowOffsetPx } : {}),\n ...(colOffsetPx > 0 ? { colOffsetPx } : {}),\n },\n extent: { widthPx: width, heightPx: height },\n },\n });\n }\n}\n\nfunction exportImages(\n source: ExcelJS.Workbook,\n worksheet: Worksheet,\n target: ExcelJS.Worksheet,\n): void {\n for (const image of worksheet.images.items) {\n const data = safeExportImage(image.config);\n const extension = imageExtension(data);\n const imageId = data.dataUrl\n ? source.addImage({ base64: data.dataUrl, extension })\n : data.blob\n ? source.addImage({\n buffer: data.blob as NonNullable<ExcelJS.Image[\"buffer\"]>,\n extension,\n })\n : null;\n if (imageId === null) continue;\n const rowOffset =\n (data.anchor.from.rowOffsetPx ?? 0) / worksheet.rowHeight(data.anchor.from.row);\n const colOffset =\n (data.anchor.from.colOffsetPx ?? 0) / worksheet.columnWidth(data.anchor.from.col);\n target.addImage(imageId, {\n tl: {\n col: data.anchor.from.col + colOffset,\n row: data.anchor.from.row + rowOffset,\n },\n ext: {\n width: data.anchor.extent.widthPx,\n height: data.anchor.extent.heightPx,\n },\n editAs: \"oneCell\",\n });\n }\n}\n\nfunction imageExtension(image: SpreadsheetImageConfig): \"png\" | \"jpeg\" | \"gif\" {\n const contentType = image.contentType ?? image.dataUrl?.slice(5, image.dataUrl.indexOf(\";\"));\n if (contentType === \"image/jpeg\" || contentType === \"image/jpg\") return \"jpeg\";\n if (contentType === \"image/gif\") return \"gif\";\n return \"png\";\n}\n\nfunction formulaResultForExcel(\n value: FormulaResult,\n): number | string | boolean | Date | ExcelJS.CellErrorValue | undefined {\n if (value === null) return undefined;\n if (typeof value === \"string\" && isFormulaError(value)) {\n if (value === \"#CYCLE!\") return { error: \"#VALUE!\" };\n return { error: value };\n }\n return value;\n}\n\nfunction exportCellValue(value: CellValue): ExcelJS.CellValue {\n return value;\n}\n\nfunction normalizeFormula(formula: string): string {\n return formula.startsWith(\"=\") ? formula : `=${formula}`;\n}\n\nfunction importHorizontalAlignment(\n value: ExcelJS.Alignment[\"horizontal\"] | undefined,\n): CellFormat[\"horizontalAlignment\"] {\n if (value === \"left\" || value === \"center\" || value === \"right\" || value === \"justify\")\n return value;\n return undefined;\n}\n\nfunction importVerticalAlignment(\n value: ExcelJS.Alignment[\"vertical\"] | undefined,\n): CellFormat[\"verticalAlignment\"] {\n if (value === \"middle\") return \"center\";\n if (value === \"top\" || value === \"bottom\") return value;\n return undefined;\n}\n\nfunction colorFromExcel(color: Partial<ExcelJS.Color> | undefined): string | undefined {\n const argb = color?.argb;\n if (!argb) return undefined;\n const normalized = argb.replace(/^#/, \"\");\n if (/^[0-9a-f]{8}$/i.test(normalized)) return `#${normalized.slice(2)}`;\n if (/^[0-9a-f]{6}$/i.test(normalized)) return `#${normalized}`;\n return undefined;\n}\n\nfunction colorToArgb(color: string): string {\n const normalized = color.trim().replace(/^#/, \"\");\n if (/^[0-9a-f]{8}$/i.test(normalized)) return normalized.toUpperCase();\n if (/^[0-9a-f]{6}$/i.test(normalized)) return `FF${normalized.toUpperCase()}`;\n if (/^[0-9a-f]{3}$/i.test(normalized)) {\n return `FF${normalized\n .split(\"\")\n .map((character) => character.repeat(2))\n .join(\"\")}`.toUpperCase();\n }\n return \"FF000000\";\n}\n\nfunction excelBorderStyle(value: string | undefined): ExcelJS.BorderStyle {\n const supported: readonly ExcelJS.BorderStyle[] = [\n \"thin\",\n \"dotted\",\n \"hair\",\n \"medium\",\n \"double\",\n \"thick\",\n \"dashed\",\n \"dashDot\",\n \"dashDotDot\",\n \"slantDashDot\",\n \"mediumDashed\",\n \"mediumDashDotDot\",\n \"mediumDashDot\",\n ];\n return supported.includes(value as ExcelJS.BorderStyle) ? (value as ExcelJS.BorderStyle) : \"thin\";\n}\n\nfunction excelTableTheme(value: string): NonNullable<ExcelJS.TableStyleProperties[\"theme\"]> {\n return /^TableStyle(?:Dark|Light|Medium)\\d+$/.test(value)\n ? (value as NonNullable<ExcelJS.TableStyleProperties[\"theme\"]>)\n : \"TableStyleMedium2\";\n}\n\nfunction excelWidthToPixels(width: number): number {\n return Math.max(1, Math.round(width * 7 + 5));\n}\n\nfunction pixelsToExcelWidth(pixels: number): number {\n return Math.max(0.1, Number(((pixels - 5) / 7).toFixed(2)));\n}\n\nfunction pointsToPixels(points: number): number {\n return points * (96 / 72);\n}\n\nfunction pixelsToPoints(pixels: number): number {\n return Number((pixels * (72 / 96)).toFixed(2));\n}\n\nfunction copyArrayBuffer(value: ArrayBuffer): ArrayBuffer {\n return new Uint8Array(value).slice().buffer;\n}\n\nfunction isFormulaError(value: string): value is FormulaErrorValue {\n return [\"#DIV/0!\", \"#N/A\", \"#NAME?\", \"#NUM!\", \"#REF!\", \"#VALUE!\", \"#CYCLE!\"].includes(value);\n}\n\nfunction forEachCell(address: RangeAddress, callback: (row: number, col: number) => void): void {\n for (let row = address.row; row < address.row + address.rowCount; row += 1) {\n for (let col = address.col; col < address.col + address.colCount; col += 1) callback(row, col);\n }\n}\n\nasync function toBytes(\n input: FileBlob | Blob | ArrayBuffer | Uint8Array,\n maxBytes: number,\n): Promise<Uint8Array> {\n if (input instanceof Uint8Array) {\n if (input.byteLength > maxBytes) {\n throw securityError(\"XLSX exceeds the compressed-size limit\", \"limit-exceeded\");\n }\n return Uint8Array.prototype.slice.call(input) as Uint8Array;\n }\n if (input instanceof ArrayBuffer) {\n if (input.byteLength > maxBytes) {\n throw securityError(\"XLSX exceeds the compressed-size limit\", \"limit-exceeded\");\n }\n return new Uint8Array(input.slice(0));\n }\n if (typeof Blob !== \"undefined\" && input instanceof Blob) {\n const size = Object.getOwnPropertyDescriptor(Blob.prototype, \"size\")?.get?.call(input);\n if (typeof size !== \"number\" || size > maxBytes) {\n throw securityError(\"XLSX exceeds the compressed-size limit\", \"limit-exceeded\");\n }\n return new Uint8Array(await Blob.prototype.arrayBuffer.call(input));\n }\n throw new TypeError(\"XLSX input must be a Blob, ArrayBuffer, or Uint8Array\");\n}\n\nasync function workbookModelDigest(workbook: Workbook): Promise<string> {\n return sha256Hex(new TextEncoder().encode(JSON.stringify(workbook.toJSON())));\n}\n\nasync function sha256Hex(bytes: Uint8Array): Promise<string> {\n const owned = new Uint8Array(bytes.byteLength);\n owned.set(bytes);\n const digest = new Uint8Array(await globalThis.crypto.subtle.digest(\"SHA-256\", owned));\n return [...digest].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/** ExcelJS stamps ZIP headers with wall-clock time; normalize package metadata only. */\nfunction normalizeGeneratedZip(input: Uint8Array): Uint8Array {\n const bytes = Uint8Array.from(input);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const minimumEocdBytes = 22;\n if (bytes.byteLength < minimumEocdBytes) {\n throw new Error(\"Generated XLSX ZIP has no end-of-central-directory record\");\n }\n const firstCandidate = Math.max(0, bytes.byteLength - 65_557);\n let eocdOffset = -1;\n for (let offset = bytes.byteLength - minimumEocdBytes; offset >= firstCandidate; offset -= 1) {\n if (\n view.getUint32(offset, true) === 0x06054b50 &&\n offset + minimumEocdBytes + view.getUint16(offset + 20, true) === bytes.byteLength\n ) {\n eocdOffset = offset;\n break;\n }\n }\n if (eocdOffset < 0) {\n throw new Error(\"Generated XLSX ZIP has an invalid end-of-central-directory record\");\n }\n const disk = view.getUint16(eocdOffset + 4, true);\n const centralDisk = view.getUint16(eocdOffset + 6, true);\n const diskEntries = view.getUint16(eocdOffset + 8, true);\n const entries = view.getUint16(eocdOffset + 10, true);\n const centralBytes = view.getUint32(eocdOffset + 12, true);\n const centralOffset = view.getUint32(eocdOffset + 16, true);\n if (\n disk !== 0 ||\n centralDisk !== 0 ||\n diskEntries !== entries ||\n entries === 0xffff ||\n centralBytes === 0xffff_ffff ||\n centralOffset === 0xffff_ffff ||\n centralOffset + centralBytes !== eocdOffset\n ) {\n throw new Error(\"Generated XLSX ZIP uses an unsupported central-directory layout\");\n }\n let offset = centralOffset;\n for (let index = 0; index < entries; index += 1) {\n if (offset + 46 > eocdOffset || view.getUint32(offset, true) !== 0x02014b50) {\n throw new Error(\"Generated XLSX ZIP central directory is malformed\");\n }\n const nameBytes = view.getUint16(offset + 28, true);\n const extraBytes = view.getUint16(offset + 30, true);\n const commentBytes = view.getUint16(offset + 32, true);\n const localOffset = view.getUint32(offset + 42, true);\n const nextOffset = offset + 46 + nameBytes + extraBytes + commentBytes;\n if (\n nextOffset > eocdOffset ||\n localOffset + 30 > centralOffset ||\n view.getUint32(localOffset, true) !== 0x04034b50\n ) {\n throw new Error(\"Generated XLSX ZIP entry offsets are malformed\");\n }\n const localNameBytes = view.getUint16(localOffset + 26, true);\n const localExtraBytes = view.getUint16(localOffset + 28, true);\n const localExtraOffset = localOffset + 30 + localNameBytes;\n if (localExtraOffset + localExtraBytes > centralOffset) {\n throw new Error(\"Generated XLSX ZIP local metadata is malformed\");\n }\n // Portable DOS 1980-01-01 00:00. File bytes and CRCs are untouched.\n view.setUint16(offset + 12, 0, true);\n view.setUint16(offset + 14, 0x21, true);\n view.setUint16(localOffset + 10, 0, true);\n view.setUint16(localOffset + 12, 0x21, true);\n normalizeZipTimestampExtras(view, offset + 46 + nameBytes, extraBytes);\n normalizeZipTimestampExtras(view, localExtraOffset, localExtraBytes);\n offset = nextOffset;\n }\n if (offset !== eocdOffset) {\n throw new Error(\"Generated XLSX ZIP central-directory size is inconsistent\");\n }\n return bytes;\n}\n\nfunction normalizeZipTimestampExtras(view: DataView, start: number, length: number): void {\n const end = start + length;\n let offset = start;\n while (offset < end) {\n if (offset + 4 > end) throw new Error(\"Generated XLSX ZIP extra field is malformed\");\n const kind = view.getUint16(offset, true);\n const fieldBytes = view.getUint16(offset + 2, true);\n const dataStart = offset + 4;\n const dataEnd = dataStart + fieldBytes;\n if (dataEnd > end) throw new Error(\"Generated XLSX ZIP extra field is malformed\");\n if (kind === 0x5455 && fieldBytes > 0) {\n const flags = view.getUint8(dataStart);\n let timestampOffset = dataStart + 1;\n for (const flag of [1, 2, 4]) {\n if ((flags & flag) === 0) continue;\n if (timestampOffset + 4 > dataEnd) {\n throw new Error(\"Generated XLSX ZIP timestamp field is malformed\");\n }\n view.setUint32(timestampOffset, 315_532_800, true);\n timestampOffset += 4;\n }\n }\n offset = dataEnd;\n }\n}\n\ntype ZipEntry = BoundedZipEntry;\n\nasync function preflightXlsx(\n bytes: Uint8Array,\n limits: SpreadsheetXlsxImportLimits,\n): Promise<{\n opaqueContent: SpreadsheetOpaqueContent;\n comments: readonly ImportedLegacyComment[];\n}> {\n if (bytes.byteLength > limits.compressedBytes) {\n throw securityError(\n `XLSX exceeds the ${limits.compressedBytes} byte compressed-size limit`,\n \"limit-exceeded\",\n );\n }\n const entries = zipEntries(bytes, limits);\n const entryNames = new Map(entries.map((entry) => [entry.name.toLowerCase(), entry.name]));\n for (const required of [\n \"[content_types].xml\",\n \"_rels/.rels\",\n \"xl/workbook.xml\",\n \"xl/_rels/workbook.xml.rels\",\n ]) {\n if (!entryNames.has(required)) {\n throw securityError(\"Required XLSX package part is missing\", \"invalid-package\", required);\n }\n }\n let expandedBytes = 0;\n let inspectedXmlBytes = 0;\n let xmlAttributes = 0;\n let xmlElements = 0;\n let xmlTextCharacters = 0;\n let worksheetCells = 0;\n let formulas = 0;\n let formulaBytes = 0;\n let sharedStrings = 0;\n let cellStyles = 0;\n let styleRecords = 0;\n let comments = 0;\n let relationships = 0;\n let mediaEntries = 0;\n let mediaBytes = 0;\n let imagePixels = 0;\n const allRelationships: InspectedRelationship[] = [];\n const contentTypeDeclarations: ContentTypeDeclaration[] = [];\n const workbookSheets: WorkbookSheetBinding[] = [];\n const legacyCommentParts: Array<{\n partName: string;\n comments: LegacyCommentRecord[];\n }> = [];\n const opaqueParts = new Set<string>();\n const opaqueFeatures = new Set<string>();\n const mediaTypes = new Map<string, string>();\n for (const entry of entries) {\n if (entry.directory) {\n await verifyBoundedZipEntry(bytes, entry, 0, xlsxZipFailure);\n continue;\n }\n expandedBytes += entry.expandedSize;\n if (expandedBytes > limits.expandedBytes) {\n throw securityError(\n `XLSX expands beyond the ${limits.expandedBytes} byte package limit`,\n \"limit-exceeded\",\n entry.name,\n );\n }\n if (entry.expandedSize > limits.entryBytes) {\n throw securityError(\n `XLSX entry exceeds the ${limits.entryBytes} byte entry limit`,\n \"limit-exceeded\",\n entry.name,\n );\n }\n if (\n entry.expandedSize > 1_048_576 &&\n entry.expandedSize / Math.max(1, entry.compressedSize) > limits.compressionRatio\n ) {\n throw securityError(\n `XLSX entry exceeds the ${limits.compressionRatio}:1 compression-ratio limit`,\n \"limit-exceeded\",\n entry.name,\n );\n }\n rejectActiveEntry(entry.name);\n if (isMediaPart(entry.name)) {\n mediaEntries += 1;\n mediaBytes += entry.expandedSize;\n if (\n mediaEntries > limits.mediaEntries ||\n entry.expandedSize > limits.mediaEntryBytes ||\n mediaBytes > limits.mediaBytes\n ) {\n throw securityError(\n \"Spreadsheet media exceeds its bounded import limits\",\n \"limit-exceeded\",\n entry.name,\n );\n }\n const media = await inflateBoundedZipEntry(\n bytes,\n entry,\n limits.mediaEntryBytes,\n xlsxZipFailure,\n );\n let metadata: ReturnType<typeof inspectRasterImage>;\n try {\n metadata = inspectRasterImage(media);\n } catch (error) {\n const failure = securityError(\n `Spreadsheet media is not a structurally valid bounded raster image (${error instanceof Error ? error.message : \"invalid image\"})`,\n \"active-content\",\n entry.name,\n );\n Object.defineProperty(failure, \"cause\", {\n value: error,\n enumerable: false,\n });\n throw failure;\n }\n const expectedType = mediaTypeForExtension(entry.name);\n if (metadata.contentType !== expectedType) {\n throw securityError(\n \"Spreadsheet media MIME does not match its file signature\",\n \"active-content\",\n entry.name,\n );\n }\n imagePixels += metadata.width * metadata.height;\n if (imagePixels > limits.imagePixels) {\n throw securityError(\n \"Spreadsheet images exceed their decoded-pixel limit\",\n \"limit-exceeded\",\n entry.name,\n );\n }\n mediaTypes.set(entry.name.toLowerCase(), metadata.contentType);\n continue;\n }\n if (!isInspectableXml(entry.name)) {\n await verifyBoundedZipEntry(bytes, entry, limits.entryBytes, xlsxZipFailure);\n throw securityError(\n \"XLSX part is neither modeled nor in the bounded inert OOXML allowlist\",\n \"active-content\",\n entry.name,\n );\n }\n const disposition = partDisposition(entry.name);\n inspectedXmlBytes += entry.expandedSize;\n if (inspectedXmlBytes > limits.inspectedXmlBytes) {\n throw securityError(\n `Inspectable OOXML exceeds the ${limits.inspectedXmlBytes} byte inspection limit`,\n \"limit-exceeded\",\n entry.name,\n );\n }\n const xmlBytes = await inflateBoundedZipEntry(bytes, entry, limits.entryBytes, xlsxZipFailure);\n const xml = decodeXml(xmlBytes, entry.name);\n const counts = inspectXml(xml, entry.name, limits, entryNames);\n xmlAttributes += counts.attributes;\n xmlElements += counts.elements;\n xmlTextCharacters += counts.textCharacters;\n worksheetCells += counts.worksheetCells;\n formulas += counts.formulas;\n formulaBytes += counts.formulaBytes;\n sharedStrings += counts.sharedStrings;\n cellStyles += counts.cellStyles;\n styleRecords += counts.styleRecords;\n comments += counts.comments.length;\n relationships += counts.relationships.length;\n allRelationships.push(...counts.relationships);\n contentTypeDeclarations.push(...counts.contentTypes);\n workbookSheets.push(...counts.workbookSheets);\n if (counts.comments.length > 0) {\n legacyCommentParts.push({\n partName: entry.name,\n comments: counts.comments,\n });\n }\n for (const feature of counts.opaqueFeatures) {\n opaqueFeatures.add(feature);\n opaqueParts.add(entry.name);\n }\n if (xmlAttributes > limits.xmlAttributes) {\n throw securityError(\n `OOXML package exceeds the ${limits.xmlAttributes} attribute limit`,\n \"limit-exceeded\",\n entry.name,\n );\n }\n if (relationships > limits.relationships) {\n throw securityError(\n `OOXML package exceeds the ${limits.relationships} relationship limit`,\n \"limit-exceeded\",\n entry.name,\n );\n }\n if (xmlElements > limits.xmlElements) {\n throw securityError(\n `OOXML package exceeds the ${limits.xmlElements} element limit`,\n \"limit-exceeded\",\n entry.name,\n );\n }\n if (xmlTextCharacters > limits.xmlTextCharacters) {\n throw securityError(\n `OOXML package exceeds the ${limits.xmlTextCharacters} text-character limit`,\n \"limit-exceeded\",\n entry.name,\n );\n }\n if (worksheetCells > limits.worksheetCells) {\n throw securityError(\n `OOXML package exceeds the ${limits.worksheetCells} worksheet-cell limit`,\n \"limit-exceeded\",\n entry.name,\n );\n }\n if (sharedStrings > limits.sharedStrings) {\n throw securityError(\n `OOXML package exceeds the ${limits.sharedStrings} shared-string limit`,\n \"limit-exceeded\",\n entry.name,\n );\n }\n if (cellStyles > limits.cellStyles) {\n throw securityError(\n `OOXML package exceeds the ${limits.cellStyles} cell-style limit`,\n \"limit-exceeded\",\n entry.name,\n );\n }\n if (\n formulas > limits.formulas ||\n formulaBytes > limits.formulaBytes ||\n styleRecords > limits.styleRecords\n ) {\n throw securityError(\n \"OOXML package exceeds formula or style aggregate limits\",\n \"limit-exceeded\",\n entry.name,\n );\n }\n if (comments > limits.comments) {\n throw securityError(\n `OOXML package exceeds the ${limits.comments} comment limit`,\n \"limit-exceeded\",\n entry.name,\n );\n }\n if (disposition === \"reject\") {\n throw securityError(\n \"XLSX XML part is neither modeled nor in the bounded inert allowlist\",\n \"active-content\",\n entry.name,\n );\n }\n if (disposition === \"opaque\") {\n opaqueParts.add(entry.name);\n opaqueFeatures.add(opaqueFeatureForPart(entry.name));\n }\n }\n const opaqueRelationships: SpreadsheetOpaqueRelationship[] = [];\n for (const relationship of allRelationships) {\n if (\n relationship.opaque ||\n opaqueParts.has(relationship.sourcePart) ||\n opaqueParts.has(relationship.targetPart)\n ) {\n const { opaque: _opaque, id: _id, kind: _kind, ...metadata } = relationship;\n opaqueRelationships.push(metadata);\n opaqueParts.add(relationshipPartForSource(relationship.sourcePart));\n }\n }\n const contentTypes = resolveContentTypes(\n entries,\n contentTypeDeclarations,\n mediaTypes,\n opaqueParts,\n );\n const importedComments = resolveLegacyComments(\n workbookSheets,\n allRelationships,\n legacyCommentParts,\n );\n return {\n opaqueContent: {\n parts: [...opaqueParts].sort(compareStrings),\n relationships: opaqueRelationships.sort(compareOpaqueRelationships),\n contentTypes: contentTypes\n .filter((contentType) => opaqueParts.has(contentType.partName))\n .sort(compareOpaqueContentTypes),\n features: [...opaqueFeatures].sort(compareStrings),\n },\n comments: importedComments,\n };\n}\n\nfunction resolveLegacyComments(\n workbookSheets: readonly WorkbookSheetBinding[],\n relationships: readonly InspectedRelationship[],\n parts: readonly {\n partName: string;\n comments: readonly LegacyCommentRecord[];\n }[],\n): ImportedLegacyComment[] {\n const worksheetPartsByRelationship = new Map(\n relationships\n .filter(\n (relationship) =>\n relationship.sourcePart.toLowerCase() === \"xl/workbook.xml\" &&\n relationship.kind === \"worksheet\",\n )\n .map((relationship) => [relationship.id, relationship.targetPart]),\n );\n const sheetNamesByPart = new Map<string, string>();\n for (const sheet of workbookSheets) {\n const partName = worksheetPartsByRelationship.get(sheet.relationshipId);\n if (!partName || sheetNamesByPart.has(partName.toLowerCase())) {\n throw securityError(\n \"Workbook sheet relationship is missing or duplicated\",\n \"invalid-package\",\n \"xl/workbook.xml\",\n );\n }\n sheetNamesByPart.set(partName.toLowerCase(), sheet.name);\n }\n\n const sheetPartsByCommentPart = new Map<string, string>();\n for (const relationship of relationships) {\n if (relationship.kind !== \"comments\") continue;\n const target = relationship.targetPart.toLowerCase();\n if (sheetPartsByCommentPart.has(target)) {\n throw securityError(\n \"Spreadsheet comment part is linked from multiple worksheets\",\n \"invalid-package\",\n relationship.targetPart,\n );\n }\n sheetPartsByCommentPart.set(target, relationship.sourcePart);\n }\n\n const result: ImportedLegacyComment[] = [];\n const cells = new Set<string>();\n for (const part of parts) {\n const sheetPart = sheetPartsByCommentPart.get(part.partName.toLowerCase());\n if (!sheetPart) continue;\n const sheetName = sheetNamesByPart.get(sheetPart.toLowerCase());\n if (!sheetName) {\n throw securityError(\n \"Spreadsheet comment relationship does not target a workbook sheet\",\n \"invalid-package\",\n part.partName,\n );\n }\n for (const comment of part.comments) {\n const key = `${sheetName}\\u0000${comment.cell}`;\n if (cells.has(key)) {\n throw securityError(\n \"Spreadsheet has duplicate comments for one cell\",\n \"invalid-package\",\n part.partName,\n );\n }\n cells.add(key);\n result.push({ sheetName, cell: comment.cell, text: comment.text });\n }\n }\n return result;\n}\n\nfunction isMediaPart(name: string): boolean {\n return /^xl\\/media\\/[^/]+\\.(?:png|jpe?g|gif)$/i.test(name);\n}\n\nfunction mediaTypeForExtension(name: string): \"image/png\" | \"image/jpeg\" | \"image/gif\" {\n if (/\\.png$/i.test(name)) return \"image/png\";\n if (/\\.jpe?g$/i.test(name)) return \"image/jpeg\";\n if (/\\.gif$/i.test(name)) return \"image/gif\";\n throw securityError(\"Spreadsheet media extension is unsupported\", \"active-content\", name);\n}\n\nfunction partDisposition(name: string): \"modeled\" | \"opaque\" | \"reject\" {\n if (\n name === \"[Content_Types].xml\" ||\n name === \"_rels/.rels\" ||\n name === \"xl/workbook.xml\" ||\n name === \"xl/_rels/workbook.xml.rels\" ||\n /^xl\\/worksheets\\/[^/]+\\.xml$/i.test(name) ||\n /^xl\\/worksheets\\/_rels\\/[^/]+\\.xml\\.rels$/i.test(name) ||\n /^xl\\/(?:styles|sharedStrings|calcChain)\\.xml$/i.test(name) ||\n /^xl\\/tables\\/[^/]+\\.xml$/i.test(name) ||\n /^xl\\/drawings\\/[^/]+\\.xml$/i.test(name) ||\n /^xl\\/drawings\\/_rels\\/[^/]+\\.xml\\.rels$/i.test(name) ||\n /^xl\\/comments[^/]*\\.xml$/i.test(name) ||\n /^xl\\/drawings\\/[^/]+\\.vml$/i.test(name)\n ) {\n return \"modeled\";\n }\n if (\n /^docProps\\/custom\\.xml$/i.test(name) ||\n /^xl\\/charts\\/[^/]+\\.xml$/i.test(name) ||\n /^xl\\/charts\\/_rels\\/[^/]+\\.xml\\.rels$/i.test(name) ||\n /^customXml\\/item(?:Props)?\\d+\\.xml$/i.test(name) ||\n /^customXml\\/_rels\\/item\\d+\\.xml\\.rels$/i.test(name)\n ) {\n return \"opaque\";\n }\n if (/^docProps\\/(?:core|app)\\.xml$/i.test(name) || /^xl\\/theme\\/[^/]+\\.xml$/i.test(name)) {\n return \"modeled\";\n }\n return \"reject\";\n}\n\nfunction opaqueFeatureForPart(name: string): string {\n if (/^docProps\\//i.test(name)) return \"workbook-properties\";\n if (/^xl\\/theme\\//i.test(name)) return \"workbook-theme\";\n if (/^xl\\/charts\\//i.test(name)) return \"editable-charts\";\n if (/^customXml\\//i.test(name)) return \"custom-xml\";\n return \"opaque-ooxml\";\n}\n\nfunction resolveContentTypes(\n entries: readonly ZipEntry[],\n declarations: readonly ContentTypeDeclaration[],\n mediaTypes: ReadonlyMap<string, string>,\n opaqueParts: Set<string>,\n): SpreadsheetOpaqueContentType[] {\n const defaults = new Map<string, string>();\n const overrides = new Map<string, string>();\n const existing = new Set(\n entries.filter((entry) => !entry.directory).map((entry) => entry.name.toLowerCase()),\n );\n for (const declaration of declarations) {\n if (declaration.kind === \"default\") {\n if (defaults.has(declaration.extension)) {\n throw securityError(\n \"XLSX has duplicate default content types\",\n \"invalid-package\",\n \"[Content_Types].xml\",\n );\n }\n defaults.set(declaration.extension, declaration.contentType);\n } else {\n const key = declaration.partName.toLowerCase();\n if (overrides.has(key) || !existing.has(key)) {\n throw securityError(\n \"XLSX has duplicate or dangling content type overrides\",\n \"invalid-package\",\n declaration.partName,\n );\n }\n overrides.set(key, declaration.contentType);\n }\n }\n const output: SpreadsheetOpaqueContentType[] = [];\n for (const entry of entries) {\n if (entry.directory || entry.name === \"[Content_Types].xml\") continue;\n const extension = entry.name.includes(\".\")\n ? entry.name.slice(entry.name.lastIndexOf(\".\") + 1).toLowerCase()\n : \"\";\n const contentType = overrides.get(entry.name.toLowerCase()) ?? defaults.get(extension);\n if (!contentType) {\n throw securityError(\"XLSX part has no declared content type\", \"invalid-package\", entry.name);\n }\n rejectActiveContentType(contentType, entry.name);\n if (/\\.rels$/i.test(entry.name)) {\n if (contentType !== \"application/vnd.openxmlformats-package.relationships+xml\") {\n throw securityError(\"Relationship part MIME is inconsistent\", \"active-content\", entry.name);\n }\n } else if (isMediaPart(entry.name)) {\n if (contentType !== mediaTypes.get(entry.name.toLowerCase())) {\n throw securityError(\n \"Spreadsheet media content type is MIME-confused\",\n \"active-content\",\n entry.name,\n );\n }\n } else if (/\\.vml$/i.test(entry.name)) {\n if (contentType !== \"application/vnd.openxmlformats-officedocument.vmlDrawing\") {\n throw securityError(\"VML content type is inconsistent\", \"active-content\", entry.name);\n }\n } else if (isInspectableXml(entry.name) && !isXmlContentType(contentType)) {\n throw securityError(\"XML part has a non-XML content type\", \"active-content\", entry.name);\n }\n if (opaqueParts.has(entry.name)) output.push({ partName: entry.name, contentType });\n }\n return output;\n}\n\nfunction isXmlContentType(contentType: string): boolean {\n return (\n contentType === \"application/xml\" ||\n contentType === \"text/xml\" ||\n /\\+xml(?:;|$)/i.test(contentType)\n );\n}\n\nfunction isCanonicalPartName(name: string): boolean {\n return (\n name.length > 0 &&\n name.length <= 2_048 &&\n !name.startsWith(\"/\") &&\n !name.endsWith(\"/\") &&\n !name.includes(\"\\\\\") &&\n !name.includes(\"%\") &&\n !/[\\u0000-\\u001f\\u007f]/.test(name) &&\n name.normalize(\"NFC\") === name &&\n name.split(\"/\").every((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\")\n );\n}\n\nfunction relationshipPartForSource(sourcePart: string): string {\n if (sourcePart === \"\") return \"_rels/.rels\";\n const slash = sourcePart.lastIndexOf(\"/\");\n const directory = slash < 0 ? \"\" : sourcePart.slice(0, slash + 1);\n const file = sourcePart.slice(slash + 1);\n return `${directory}_rels/${file}.rels`;\n}\n\nfunction compareStrings(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction compareOpaqueRelationships(\n left: SpreadsheetOpaqueRelationship,\n right: SpreadsheetOpaqueRelationship,\n): number {\n return (\n compareStrings(left.sourcePart, right.sourcePart) ||\n compareStrings(left.type, right.type) ||\n compareStrings(left.targetPart, right.targetPart)\n );\n}\n\nfunction compareOpaqueContentTypes(\n left: SpreadsheetOpaqueContentType,\n right: SpreadsheetOpaqueContentType,\n): number {\n return (\n compareStrings(left.partName, right.partName) ||\n compareStrings(left.contentType, right.contentType)\n );\n}\n\nfunction resolveImportLimits(\n options: Partial<SpreadsheetXlsxImportLimits> | undefined,\n): SpreadsheetXlsxImportLimits {\n const resolved = { ...DEFAULT_XLSX_IMPORT_LIMITS, ...options };\n for (const [name, value] of Object.entries(resolved)) {\n if (!Number.isFinite(value) || value <= 0 || !Number.isInteger(value)) {\n throw new TypeError(`XLSX import limit ${name} must be a positive integer`);\n }\n }\n // Public callers may reduce work budgets for their deployment, but must not\n // expand the audited hard envelope before ZIP/XML preflight.\n for (const [name, maximum] of Object.entries(DEFAULT_XLSX_IMPORT_LIMITS) as Array<\n [keyof SpreadsheetXlsxImportLimits, number]\n >) {\n if (resolved[name] > maximum) {\n throw new TypeError(\n `XLSX import limit ${name} cannot exceed its hard safety cap of ${maximum}`,\n );\n }\n }\n return resolved;\n}\n\nfunction zipEntries(bytes: Uint8Array, limits: SpreadsheetXlsxImportLimits): ZipEntry[] {\n return parseBoundedZip(\n bytes,\n {\n entries: limits.entries,\n compressedEntryBytes: limits.compressedBytes,\n expandedEntryBytes: limits.entryBytes,\n expandedBytes: limits.expandedBytes,\n compressionRatio: limits.compressionRatio,\n compressionRatioThreshold: 1_048_576,\n },\n xlsxZipFailure,\n );\n}\n\nfunction rejectActiveEntry(name: string): void {\n if (\n /(?:^|\\/)(?:vbaProject|vbaData)\\.bin$/i.test(name) ||\n /(?:^|\\/)(?:activeX|embeddings|externalLinks|queryTables|ctrlProps|webextensions)(?:\\/|$)/i.test(\n name,\n ) ||\n /^xl\\/connections\\.xml$/i.test(name) ||\n /\\.(?:exe|dll|com|msi|js|vbs|vbe|bat|cmd|ps1|sh|scr|jar)$/i.test(name)\n ) {\n throw securityError(\n \"Active or externally connected OOXML content is unsupported\",\n \"active-content\",\n name,\n );\n }\n}\n\nfunction isInspectableXml(name: string): boolean {\n return /(?:\\.xml|\\.rels|\\.vml)$/i.test(name) || /^\\[Content_Types\\]\\.xml$/i.test(name);\n}\n\nfunction decodeXml(bytes: Uint8Array, entryName: string): string {\n try {\n if (bytes[0] === 0xff && bytes[1] === 0xfe)\n return new TextDecoder(\"utf-16le\", { fatal: true }).decode(bytes);\n if (bytes[0] === 0xfe && bytes[1] === 0xff)\n return new TextDecoder(\"utf-16be\", { fatal: true }).decode(bytes);\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n } catch {\n throw securityError(\"OOXML text is not valid UTF-8/UTF-16\", \"unsafe-xml\", entryName);\n }\n}\n\ntype ContentTypeDeclaration =\n | { kind: \"default\"; extension: string; contentType: string }\n | { kind: \"override\"; partName: string; contentType: string };\n\ntype InspectedRelationship = SpreadsheetOpaqueRelationship & {\n id: string;\n kind: string;\n opaque: boolean;\n};\n\ntype WorkbookSheetBinding = { name: string; relationshipId: string };\ntype LegacyCommentRecord = { cell: string; text: string };\n\ntype XmlInspection = {\n attributes: number;\n elements: number;\n textCharacters: number;\n worksheetCells: number;\n formulas: number;\n formulaBytes: number;\n sharedStrings: number;\n cellStyles: number;\n styleRecords: number;\n workbookSheets: WorkbookSheetBinding[];\n comments: LegacyCommentRecord[];\n relationships: InspectedRelationship[];\n contentTypes: ContentTypeDeclaration[];\n opaqueFeatures: string[];\n};\n\nconst FORMULA_ELEMENTS = new Set([\n \"f\",\n \"formula\",\n \"formula1\",\n \"formula2\",\n \"definedName\",\n \"calculatedColumnFormula\",\n \"totalsRowFormula\",\n]);\nconst STYLE_RECORD_ELEMENTS = new Set([\n \"numFmt\",\n \"font\",\n \"fill\",\n \"border\",\n \"xf\",\n \"cellStyle\",\n \"dxf\",\n]);\nconst SUPPORTED_CONDITIONAL_FORMAT_RULE_TYPES = new Set([\n \"cellis\",\n \"expression\",\n \"colorscale\",\n \"databar\",\n \"iconset\",\n \"containstext\",\n \"notcontainstext\",\n \"beginswith\",\n \"endswith\",\n \"containsblanks\",\n \"notcontainsblanks\",\n \"containserrors\",\n \"notcontainserrors\",\n \"duplicatevalues\",\n \"uniquevalues\",\n \"timeperiod\",\n \"top10\",\n \"aboveaverage\",\n]);\n\nfunction inspectXml(\n xml: string,\n entryName: string,\n limits: SpreadsheetXlsxImportLimits,\n entryNames: ReadonlyMap<string, string>,\n): XmlInspection {\n const result: XmlInspection = {\n attributes: 0,\n elements: 0,\n textCharacters: 0,\n worksheetCells: 0,\n formulas: 0,\n formulaBytes: 0,\n sharedStrings: 0,\n cellStyles: 0,\n styleRecords: 0,\n workbookSheets: [],\n comments: [],\n relationships: [],\n contentTypes: [],\n opaqueFeatures: [],\n };\n const features = new Set<string>();\n const relationshipIds = new Set<string>();\n const relationshipTags: Array<ReadonlyMap<string, string>> = [];\n const stack: string[] = [];\n let activeFormula: { name: string; text: string } | null = null;\n let activeMetadata: { name: string; text: string } | null = null;\n let activeComment: LegacyCommentRecord | null = null;\n let failed: unknown;\n const parser = new SaxesParser<{ xmlns: true }>({ xmlns: true });\n\n const chargeText = (text: string): void => {\n result.textCharacters += text.length;\n if (result.textCharacters > limits.xmlTextCharactersPerPart) {\n throw securityError(\n `OOXML part exceeds the ${limits.xmlTextCharactersPerPart} text-character limit`,\n \"limit-exceeded\",\n entryName,\n );\n }\n if (activeFormula) {\n activeFormula.text += text;\n if (boundedUtf8ByteLength(activeFormula.text, 8_192) > 8_192) {\n throw securityError(\n \"Spreadsheet formula exceeds its byte limit\",\n \"limit-exceeded\",\n entryName,\n );\n }\n }\n if (activeMetadata) activeMetadata.text += text;\n if (activeComment && stack.at(-1) === \"t\") activeComment.text += text;\n };\n\n parser.on(\"doctype\", () => {\n throw securityError(\n \"DTD and entity declarations are forbidden in OOXML\",\n \"unsafe-xml\",\n entryName,\n );\n });\n parser.on(\"processinginstruction\", () => {\n throw securityError(\"OOXML processing instructions are unsupported\", \"unsafe-xml\", entryName);\n });\n parser.on(\"comment\", chargeText);\n parser.on(\"text\", chargeText);\n parser.on(\"cdata\", chargeText);\n parser.on(\"opentag\", (tag: SaxesTagNS) => {\n const localName = tag.local;\n if (activeFormula) {\n throw securityError(\n \"Spreadsheet formula elements cannot contain child markup\",\n \"unsafe-xml\",\n entryName,\n );\n }\n result.elements += 1;\n if (result.elements > limits.xmlElementsPerPart) {\n throw securityError(\n `OOXML part exceeds the ${limits.xmlElementsPerPart} element limit`,\n \"limit-exceeded\",\n entryName,\n );\n }\n const elementAttributes = Object.keys(tag.attributes).length;\n if (elementAttributes > limits.xmlAttributesPerElement) {\n throw securityError(\n `OOXML element exceeds the ${limits.xmlAttributesPerElement} attribute limit`,\n \"limit-exceeded\",\n entryName,\n );\n }\n result.attributes += elementAttributes;\n if (result.attributes > limits.xmlAttributesPerPart) {\n throw securityError(\n `OOXML part exceeds the ${limits.xmlAttributesPerPart} attribute limit`,\n \"limit-exceeded\",\n entryName,\n );\n }\n stack.push(localName);\n if (stack.length > limits.xmlDepth) {\n throw securityError(\n `OOXML nesting exceeds the ${limits.xmlDepth} level limit`,\n \"limit-exceeded\",\n entryName,\n );\n }\n const attributes = localAttributes(tag, entryName);\n rejectActiveXmlElement(entryName, localName, attributes);\n detectOpaqueXmlFeature(entryName, localName, attributes, stack, features);\n\n if (/^xl\\/workbook\\.xml$/i.test(entryName) && localName === \"sheet\") {\n const name = attributes.get(\"name\");\n const relationshipId = attributes.get(\"id\");\n if (!name || name.length > 31 || !relationshipId || relationshipId.length > 512) {\n throw securityError(\n \"Workbook sheet binding is missing or invalid\",\n \"invalid-package\",\n entryName,\n );\n }\n result.workbookSheets.push({ name, relationshipId });\n }\n if (/^xl\\/comments[^/]*\\.xml$/i.test(entryName) && localName === \"comment\") {\n if (activeComment) {\n throw securityError(\"Spreadsheet comments cannot be nested\", \"unsafe-xml\", entryName);\n }\n if (result.comments.length >= limits.commentsPerPart) {\n throw securityError(\n `OOXML part exceeds the ${limits.commentsPerPart} comment limit`,\n \"limit-exceeded\",\n entryName,\n );\n }\n const ref = attributes.get(\"ref\");\n let range: RangeAddress;\n try {\n if (!ref) throw new Error(\"missing comment reference\");\n range = parseRangeAddress(ref);\n } catch (error) {\n const failure = securityError(\n \"Spreadsheet comment reference is invalid\",\n \"invalid-package\",\n entryName,\n );\n Object.defineProperty(failure, \"cause\", {\n value: error,\n enumerable: false,\n });\n throw failure;\n }\n if (range.rowCount !== 1 || range.colCount !== 1) {\n throw securityError(\n \"Spreadsheet comment must reference one cell\",\n \"invalid-package\",\n entryName,\n );\n }\n activeComment = { cell: formatCellAddress(range), text: \"\" };\n }\n\n if (/^xl\\/worksheets\\/[^/]+\\.xml$/i.test(entryName) && localName === \"c\") {\n result.worksheetCells += 1;\n if (result.worksheetCells > limits.worksheetCellsPerPart) {\n throw securityError(\n `Worksheet exceeds the ${limits.worksheetCellsPerPart} cell limit`,\n \"limit-exceeded\",\n entryName,\n );\n }\n }\n if (/^xl\\/sharedStrings\\.xml$/i.test(entryName) && localName === \"si\") {\n result.sharedStrings += 1;\n if (result.sharedStrings > limits.sharedStrings) {\n throw securityError(\n `Shared strings exceed the ${limits.sharedStrings} item limit`,\n \"limit-exceeded\",\n entryName,\n );\n }\n }\n if (/^xl\\/styles\\.xml$/i.test(entryName) && STYLE_RECORD_ELEMENTS.has(localName)) {\n result.styleRecords += 1;\n if (localName === \"xf\") result.cellStyles += 1;\n if (result.cellStyles > limits.cellStyles || result.styleRecords > limits.styleRecords) {\n throw securityError(\n \"Spreadsheet styles exceed their record limit\",\n \"limit-exceeded\",\n entryName,\n );\n }\n }\n if (FORMULA_ELEMENTS.has(localName)) {\n result.formulas += 1;\n if (result.formulas > limits.formulasPerPart) {\n throw securityError(\n `OOXML part exceeds the ${limits.formulasPerPart} formula limit`,\n \"limit-exceeded\",\n entryName,\n );\n }\n activeFormula = { name: localName, text: \"\" };\n }\n if (\n /^docProps\\/(?:core|app)\\.xml$/i.test(entryName) &&\n new Set([\n \"creator\",\n \"title\",\n \"subject\",\n \"description\",\n \"keywords\",\n \"category\",\n \"lastModifiedBy\",\n \"Company\",\n \"Manager\",\n ]).has(localName)\n ) {\n activeMetadata = { name: localName, text: \"\" };\n }\n if (/\\.rels$/i.test(entryName) && localName === \"Relationship\") {\n if (relationshipTags.length >= limits.relationshipsPerPart) {\n throw securityError(\n `OOXML part exceeds the ${limits.relationshipsPerPart} relationship limit`,\n \"limit-exceeded\",\n entryName,\n );\n }\n const id = attributes.get(\"Id\");\n if (!id || relationshipIds.has(id)) {\n throw securityError(\n \"OOXML relationship id is missing or duplicated\",\n \"invalid-package\",\n entryName,\n );\n }\n relationshipIds.add(id);\n relationshipTags.push(attributes);\n }\n if (\n entryName === \"[Content_Types].xml\" &&\n (localName === \"Default\" || localName === \"Override\")\n ) {\n result.contentTypes.push(inspectContentTypeTag(localName, attributes, entryName));\n }\n });\n parser.on(\"closetag\", (tag: SaxesTagNS) => {\n if (activeFormula && activeFormula.name === tag.local) {\n const formula = activeFormula.text.trim();\n if (formula.length > 0) {\n const formulaBytes = boundedUtf8ByteLength(formula, 8_192);\n result.formulaBytes += formulaBytes;\n if (result.formulaBytes > limits.formulaBytesPerPart) {\n throw securityError(\n `OOXML part exceeds the ${limits.formulaBytesPerPart} formula-byte limit`,\n \"limit-exceeded\",\n entryName,\n );\n }\n assertSafeFormula(formula, entryName);\n }\n activeFormula = null;\n }\n if (activeMetadata && activeMetadata.name === tag.local) {\n const value = activeMetadata.text.trim();\n if (\n value.length > 0 &&\n !([\"creator\", \"lastModifiedBy\"].includes(activeMetadata.name) && value === \"OpenGeni\")\n ) {\n features.add(\"workbook-properties\");\n }\n activeMetadata = null;\n }\n if (activeComment && tag.local === \"comment\") {\n result.comments.push(activeComment);\n activeComment = null;\n }\n stack.pop();\n });\n parser.on(\"error\", (error: Error) => {\n failed = securityError(`OOXML is malformed (${error.message})`, \"unsafe-xml\", entryName);\n throw failed;\n });\n try {\n parser.write(xml).close();\n } catch (error) {\n if (error instanceof SpreadsheetSecurityError) throw error;\n throw securityError(\n `OOXML is malformed (${error instanceof Error ? error.message : \"parse failure\"})`,\n \"unsafe-xml\",\n entryName,\n );\n }\n if (failed) throw failed;\n if (stack.length !== 0 || activeFormula || activeComment) {\n throw securityError(\"OOXML tags are structurally unbalanced\", \"unsafe-xml\", entryName);\n }\n result.relationships = relationshipTags.map((attributes) =>\n inspectRelationshipTag(attributes, entryName, entryNames),\n );\n result.opaqueFeatures = [...features].sort();\n return result;\n}\n\nfunction localAttributes(tag: SaxesTagNS, entryName: string): Map<string, string> {\n const attributes = new Map<string, string>();\n for (const attribute of Object.values(tag.attributes)) {\n const name = attribute.local;\n if (attributes.has(name)) {\n throw securityError(\"OOXML element has duplicate local attributes\", \"unsafe-xml\", entryName);\n }\n attributes.set(name, attribute.value);\n }\n return attributes;\n}\n\nfunction inspectContentTypeTag(\n localName: \"Default\" | \"Override\",\n attributes: ReadonlyMap<string, string>,\n entryName: string,\n): ContentTypeDeclaration {\n const expected =\n localName === \"Default\"\n ? new Set([\"Extension\", \"ContentType\"])\n : new Set([\"PartName\", \"ContentType\"]);\n if ([...attributes.keys()].some((name) => !expected.has(name))) {\n throw securityError(\"OOXML content type has unsupported attributes\", \"unsafe-xml\", entryName);\n }\n const contentType = attributes.get(\"ContentType\");\n if (!contentType || contentType.length > 2_048 || !/^[\\x21-\\x7e]+$/.test(contentType)) {\n throw securityError(\"OOXML content type is missing or invalid\", \"unsafe-xml\", entryName);\n }\n rejectActiveContentType(contentType, entryName);\n if (localName === \"Default\") {\n const extension = attributes.get(\"Extension\");\n if (!extension || extension.length > 32 || !/^[A-Za-z0-9]+$/.test(extension)) {\n throw securityError(\"OOXML default extension is invalid\", \"unsafe-xml\", entryName);\n }\n return { kind: \"default\", extension: extension.toLowerCase(), contentType };\n }\n const rawPartName = attributes.get(\"PartName\");\n if (!rawPartName || !rawPartName.startsWith(\"/\") || rawPartName.length > 2_049) {\n throw securityError(\"OOXML override part name is invalid\", \"unsafe-xml\", entryName);\n }\n const partName = rawPartName.slice(1);\n if (!isCanonicalPartName(partName)) {\n throw securityError(\"OOXML override part name is non-canonical\", \"invalid-package\", entryName);\n }\n return { kind: \"override\", partName, contentType };\n}\n\nfunction rejectActiveContentType(contentType: string, entryName: string): void {\n if (\n /(?:macroenabled|vba|ole|activex|external(?:link|data)|connections?|querytable|webextension|html|javascript|svg|executable|encrypted|signature)/i.test(\n contentType,\n )\n ) {\n throw securityError(\"Active OOXML content types are unsupported\", \"active-content\", entryName);\n }\n}\n\nfunction rejectActiveXmlElement(\n entryName: string,\n localName: string,\n attributes: ReadonlyMap<string, string>,\n): void {\n if (\n new Set([\n \"oleObject\",\n \"oleObjects\",\n \"controls\",\n \"control\",\n \"activeX\",\n \"externalLink\",\n \"externalData\",\n \"connection\",\n \"connections\",\n \"queryTable\",\n \"webExtension\",\n ]).has(localName)\n ) {\n throw securityError(\n \"Active or externally connected OOXML is unsupported\",\n \"active-content\",\n entryName,\n );\n }\n if (/\\.vml$/i.test(entryName)) {\n if ([\"imagedata\", \"OLEObject\"].includes(localName)) {\n throw securityError(\n \"Active or linked VML content is unsupported\",\n \"active-content\",\n entryName,\n );\n }\n for (const name of [\"href\", \"src\"]) {\n if (attributes.has(name)) {\n throw securityError(\n \"Active or linked VML content is unsupported\",\n \"active-content\",\n entryName,\n );\n }\n }\n }\n}\n\nfunction detectOpaqueXmlFeature(\n entryName: string,\n localName: string,\n attributes: ReadonlyMap<string, string>,\n stack: readonly string[],\n features: Set<string>,\n): void {\n if (/^xl\\/charts\\//i.test(entryName)) features.add(\"editable-charts\");\n if (/^customXml\\//i.test(entryName)) features.add(\"custom-xml\");\n if (/^xl\\/comments[^/]*\\.xml$/i.test(entryName)) features.add(\"comment-metadata\");\n if (/\\.vml$/i.test(entryName)) features.add(\"comment-layout\");\n\n if (/^xl\\/workbook\\.xml$/i.test(entryName)) {\n if (localName === \"sheet\" && (attributes.get(\"state\") ?? \"visible\") !== \"visible\") {\n features.add(\"sheet-visibility\");\n }\n if (localName === \"definedName\" || localName === \"definedNames\") {\n features.add(\"defined-names\");\n }\n if (localName === \"workbookPr\" && isTruthyXml(attributes.get(\"date1904\"))) {\n features.add(\"1904-date-system\");\n }\n if (\n localName === \"workbookView\" &&\n (positiveXmlNumber(attributes.get(\"activeTab\")) ||\n positiveXmlNumber(attributes.get(\"firstSheet\")))\n ) {\n features.add(\"workbook-view-state\");\n }\n }\n\n if (/^xl\\/theme\\/[^/]+\\.xml$/i.test(entryName)) {\n if (\n (localName === \"theme\" && attributes.get(\"name\") !== \"Office Theme\") ||\n (localName === \"clrScheme\" && attributes.get(\"name\") !== \"Office\")\n ) {\n features.add(\"workbook-theme\");\n }\n const colorRole = stack.at(-2);\n const expectedThemeColors: Readonly<Record<string, string>> = {\n dk1: \"000000\",\n lt1: \"FFFFFF\",\n dk2: \"1F497D\",\n lt2: \"EEECE1\",\n accent1: \"4F81BD\",\n accent2: \"C0504D\",\n accent3: \"9BBB59\",\n accent4: \"8064A2\",\n accent5: \"4BACC6\",\n accent6: \"F79646\",\n hlink: \"0000FF\",\n folHlink: \"800080\",\n };\n if ((localName === \"sysClr\" || localName === \"srgbClr\") && colorRole) {\n const expected = expectedThemeColors[colorRole];\n const actual = (attributes.get(\"lastClr\") ?? attributes.get(\"val\"))?.toUpperCase();\n if (expected !== undefined && actual !== expected) features.add(\"workbook-theme\");\n }\n if (localName === \"latin\") {\n const fontRole = stack.at(-2);\n const expected =\n fontRole === \"majorFont\" ? \"Cambria\" : fontRole === \"minorFont\" ? \"Calibri\" : undefined;\n if (expected !== undefined && attributes.get(\"typeface\") !== expected) {\n features.add(\"workbook-theme\");\n }\n }\n }\n\n if (/^xl\\/worksheets\\/[^/]+\\.xml$/i.test(entryName)) {\n if (\n new Set([\n \"hyperlinks\",\n \"hyperlink\",\n \"sheetProtection\",\n \"protectedRanges\",\n \"autoFilter\",\n \"sortState\",\n \"printOptions\",\n \"headerFooter\",\n \"rowBreaks\",\n \"colBreaks\",\n \"selection\",\n ]).has(localName)\n ) {\n features.add(`worksheet-${localName}`);\n }\n if (\n localName === \"pageMargins\" &&\n !xmlAttributesEqual(attributes, {\n left: \"0.7\",\n right: \"0.7\",\n top: \"0.75\",\n bottom: \"0.75\",\n header: \"0.3\",\n footer: \"0.3\",\n })\n ) {\n features.add(\"worksheet-pageMargins\");\n }\n if (\n localName === \"pageSetup\" &&\n !xmlAttributesEqual(attributes, {\n orientation: \"portrait\",\n horizontalDpi: \"4294967295\",\n verticalDpi: \"4294967295\",\n scale: \"100\",\n fitToWidth: \"1\",\n fitToHeight: \"1\",\n })\n ) {\n features.add(\"worksheet-pageSetup\");\n }\n if (\n localName === \"row\" &&\n [\"hidden\", \"outlineLevel\", \"collapsed\", \"s\", \"customFormat\"].some((name) =>\n attributes.has(name),\n )\n ) {\n features.add(\"row-metadata\");\n }\n if (\n localName === \"col\" &&\n [\"hidden\", \"outlineLevel\", \"collapsed\", \"style\", \"bestFit\"].some((name) =>\n attributes.has(name),\n )\n ) {\n features.add(\"column-metadata\");\n }\n if (localName === \"sheetView\") {\n const supported = new Set([\"workbookViewId\", \"showGridLines\"]);\n if ([...attributes.keys()].some((name) => !supported.has(name))) {\n features.add(\"worksheet-view-state\");\n }\n }\n if (localName === \"pane\") {\n const supported = new Set([\"xSplit\", \"ySplit\", \"state\"]);\n if (\n (attributes.get(\"state\") ?? \"frozen\") !== \"frozen\" ||\n [...attributes.keys()].some((name) => !supported.has(name))\n ) {\n features.add(\"worksheet-pane-state\");\n }\n }\n if (localName === \"f\" && attributes.size > 0) features.add(\"special-formulas\");\n if (localName === \"extLst\") features.add(\"worksheet-extensions\");\n if (localName === \"sparklineGroups\" || localName === \"sparklineGroup\") {\n features.add(\"sparklines\");\n }\n if (localName === \"r\" && stack.includes(\"is\")) features.add(\"rich-text\");\n if (localName === \"cfRule\") {\n const type = attributes.get(\"type\");\n if (type && !SUPPORTED_CONDITIONAL_FORMAT_RULE_TYPES.has(type.toLowerCase())) {\n features.add(\"conditional-format-rules\");\n }\n }\n }\n if (/^xl\\/sharedStrings\\.xml$/i.test(entryName) && localName === \"r\") {\n features.add(\"rich-text\");\n }\n if (/^xl\\/styles\\.xml$/i.test(entryName)) {\n if (\n [\n \"gradientFill\",\n \"protection\",\n \"vertical\",\n \"horizontal\",\n \"strike\",\n \"outline\",\n \"shadow\",\n \"condense\",\n \"extend\",\n \"vertAlign\",\n ].includes(localName)\n ) {\n features.add(\"advanced-cell-styles\");\n }\n if (\n [...attributes].some(\n ([name, value]) =>\n [\n \"indexed\",\n \"auto\",\n \"textRotation\",\n \"indent\",\n \"shrinkToFit\",\n \"readingOrder\",\n \"justifyLastLine\",\n \"relativeIndent\",\n \"diagonalUp\",\n \"diagonalDown\",\n ].includes(name) ||\n (name === \"theme\" && value !== \"1\"),\n )\n ) {\n features.add(\"advanced-cell-styles\");\n }\n if (\n localName === \"patternFill\" &&\n ![undefined, \"none\", \"gray125\", \"solid\"].includes(attributes.get(\"patternType\"))\n ) {\n features.add(\"advanced-cell-styles\");\n }\n }\n if (/^xl\\/tables\\/[^/]+\\.xml$/i.test(entryName)) {\n if (\n [\"calculatedColumnFormula\", \"totalsRowFormula\", \"sortState\", \"filterColumn\"].includes(\n localName,\n )\n ) {\n features.add(\"advanced-table-semantics\");\n }\n if (\n localName === \"tableStyleInfo\" &&\n (isTruthyXml(attributes.get(\"showFirstColumn\")) ||\n isTruthyXml(attributes.get(\"showLastColumn\")) ||\n isTruthyXml(attributes.get(\"showRowStripes\")) ===\n isTruthyXml(attributes.get(\"showColumnStripes\")))\n ) {\n features.add(\"advanced-table-style\");\n }\n }\n if (/^xl\\/drawings\\/[^/]+\\.xml$/i.test(entryName)) {\n if (\n [\"sp\", \"grpSp\", \"cxnSp\", \"graphicFrame\", \"absoluteAnchor\", \"twoCellAnchor\"].includes(\n localName,\n )\n ) {\n features.add(\"drawing-objects\");\n }\n if (localName === \"cNvPr\" && (attributes.has(\"descr\") || attributes.has(\"title\"))) {\n features.add(\"image-metadata\");\n }\n }\n}\n\nfunction isTruthyXml(value: string | undefined): boolean {\n return value === \"1\" || value?.toLowerCase() === \"true\";\n}\n\nfunction positiveXmlNumber(value: string | undefined): boolean {\n if (value === undefined) return false;\n const number = Number(value);\n return Number.isFinite(number) && number > 0;\n}\n\nfunction xmlAttributesEqual(\n actual: ReadonlyMap<string, string>,\n expected: Readonly<Record<string, string>>,\n): boolean {\n const entries = Object.entries(expected);\n return (\n actual.size === entries.length && entries.every(([name, value]) => actual.get(name) === value)\n );\n}\n\ntype RelationshipPolicy = {\n source: RegExp;\n kind: string;\n target: RegExp;\n opaque?: boolean;\n};\n\nconst RELATIONSHIP_POLICIES: readonly RelationshipPolicy[] = [\n { source: /^$/, kind: \"officeDocument\", target: /^xl\\/workbook\\.xml$/i },\n { source: /^$/, kind: \"core-properties\", target: /^docProps\\/core\\.xml$/i },\n {\n source: /^$/,\n kind: \"extended-properties\",\n target: /^docProps\\/app\\.xml$/i,\n },\n {\n source: /^$/,\n kind: \"custom-properties\",\n target: /^docProps\\/custom\\.xml$/i,\n opaque: true,\n },\n {\n source: /^xl\\/workbook\\.xml$/i,\n kind: \"styles\",\n target: /^xl\\/styles\\.xml$/i,\n },\n {\n source: /^xl\\/workbook\\.xml$/i,\n kind: \"theme\",\n target: /^xl\\/theme\\/[^/]+\\.xml$/i,\n },\n {\n source: /^xl\\/workbook\\.xml$/i,\n kind: \"sharedStrings\",\n target: /^xl\\/sharedStrings\\.xml$/i,\n },\n {\n source: /^xl\\/workbook\\.xml$/i,\n kind: \"worksheet\",\n target: /^xl\\/worksheets\\/[^/]+\\.xml$/i,\n },\n {\n source: /^xl\\/workbook\\.xml$/i,\n kind: \"calcChain\",\n target: /^xl\\/calcChain\\.xml$/i,\n },\n {\n source: /^xl\\/worksheets\\/[^/]+\\.xml$/i,\n kind: \"comments\",\n target: /^xl\\/comments[^/]*\\.xml$/i,\n opaque: true,\n },\n {\n source: /^xl\\/worksheets\\/[^/]+\\.xml$/i,\n kind: \"vmlDrawing\",\n target: /^xl\\/drawings\\/[^/]+\\.vml$/i,\n opaque: true,\n },\n {\n source: /^xl\\/worksheets\\/[^/]+\\.xml$/i,\n kind: \"table\",\n target: /^xl\\/tables\\/[^/]+\\.xml$/i,\n },\n {\n source: /^xl\\/worksheets\\/[^/]+\\.xml$/i,\n kind: \"drawing\",\n target: /^xl\\/drawings\\/[^/]+\\.xml$/i,\n },\n {\n source: /^xl\\/drawings\\/[^/]+\\.xml$/i,\n kind: \"image\",\n target: /^xl\\/media\\/[^/]+\\.(?:png|jpe?g|gif)$/i,\n },\n {\n source: /^xl\\/drawings\\/[^/]+\\.xml$/i,\n kind: \"chart\",\n target: /^xl\\/charts\\/[^/]+\\.xml$/i,\n opaque: true,\n },\n {\n source: /^xl\\/charts\\/[^/]+\\.xml$/i,\n kind: \"image\",\n target: /^xl\\/media\\/[^/]+\\.(?:png|jpe?g|gif)$/i,\n opaque: true,\n },\n {\n source: /^xl\\/charts\\/[^/]+\\.xml$/i,\n kind: \"themeOverride\",\n target: /^xl\\/theme\\/[^/]+\\.xml$/i,\n opaque: true,\n },\n {\n source: /^xl\\/workbook\\.xml$/i,\n kind: \"customXml\",\n target: /^customXml\\/item\\d+\\.xml$/i,\n opaque: true,\n },\n {\n source: /^customXml\\/item\\d+\\.xml$/i,\n kind: \"customXmlProps\",\n target: /^customXml\\/itemProps\\d+\\.xml$/i,\n opaque: true,\n },\n];\n\nconst OFFICE_RELATIONSHIP_PREFIXES = [\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/\",\n \"http://purl.oclc.org/ooxml/officeDocument/relationships/\",\n \"http://schemas.microsoft.com/office/2006/relationships/\",\n] as const;\n\nfunction inspectRelationshipTag(\n attributes: ReadonlyMap<string, string>,\n entryName: string,\n entryNames: ReadonlyMap<string, string>,\n): InspectedRelationship {\n const source = relationshipSource(entryName);\n for (const name of attributes.keys()) {\n if (![\"Id\", \"Type\", \"Target\", \"TargetMode\"].includes(name)) {\n throw securityError(\"OOXML relationship attributes are unsupported\", \"unsafe-xml\", entryName);\n }\n }\n const type = attributes.get(\"Type\");\n const target = attributes.get(\"Target\");\n const id = attributes.get(\"Id\");\n if (!id || id.length > 512 || !type || type.length > 2_048 || !target || target.length > 4_096) {\n throw securityError(\n \"OOXML relationship is missing or exceeds required attributes\",\n \"unsafe-xml\",\n entryName,\n );\n }\n if ((attributes.get(\"TargetMode\") ?? \"Internal\") !== \"Internal\") {\n throw securityError(\n \"External OOXML relationships are forbidden\",\n \"external-relationship\",\n entryName,\n );\n }\n const kind = relationshipKind(type);\n const resolvedTarget = resolveRelationshipTarget(source, target, entryName);\n if (source !== \"\" && !entryNames.has(source.toLowerCase())) {\n throw securityError(\"OOXML relationship source part is missing\", \"invalid-package\", entryName);\n }\n const policy = RELATIONSHIP_POLICIES.find(\n (candidate) =>\n candidate.kind === kind &&\n candidate.source.test(source) &&\n candidate.target.test(resolvedTarget),\n );\n if (!policy) {\n throw securityError(\n \"Unsupported OOXML relationship type or target\",\n \"active-content\",\n entryName,\n );\n }\n if (!entryNames.has(resolvedTarget.toLowerCase())) {\n throw securityError(\n \"OOXML relationship target is missing from the package\",\n \"invalid-package\",\n entryName,\n );\n }\n return {\n id,\n kind: kind!,\n sourcePart: source,\n type,\n targetPart: entryNames.get(resolvedTarget.toLowerCase())!,\n opaque: policy.opaque === true,\n };\n}\n\nfunction relationshipKind(type: string): string | null {\n if (\n type === \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\"\n ) {\n return \"core-properties\";\n }\n for (const prefix of OFFICE_RELATIONSHIP_PREFIXES) {\n if (type.startsWith(prefix)) {\n const kind = type.slice(prefix.length);\n return /^[A-Za-z][A-Za-z0-9.-]*$/.test(kind) ? kind : null;\n }\n }\n return null;\n}\n\nfunction relationshipSource(entryName: string): string {\n if (entryName.toLowerCase() === \"_rels/.rels\") return \"\";\n const match = /^(.*\\/)_rels\\/([^/]+)\\.rels$/i.exec(entryName);\n if (!match) {\n throw securityError(\n \"OOXML relationship part has an invalid location\",\n \"invalid-package\",\n entryName,\n );\n }\n return `${match[1]}${match[2]}`;\n}\n\nfunction resolveRelationshipTarget(source: string, target: string, entryName: string): string {\n if (\n target.length === 0 ||\n target.includes(\"\\\\\") ||\n target.includes(\"%\") ||\n target.includes(\"?\") ||\n target.includes(\"#\") ||\n target.startsWith(\"/\") ||\n /^[A-Za-z][A-Za-z0-9+.-]*:/.test(target) ||\n /[\\u0000-\\u001f\\u007f]/.test(target)\n ) {\n throw securityError(\n \"External or ambiguous OOXML relationship target\",\n \"external-relationship\",\n entryName,\n );\n }\n const segments = source.includes(\"/\") ? source.split(\"/\").slice(0, -1) : [];\n for (const segment of target.split(\"/\")) {\n if (segment === \"\" || segment === \".\") continue;\n if (segment === \"..\") {\n if (segments.length === 0) {\n throw securityError(\n \"OOXML relationship escapes the package root\",\n \"external-relationship\",\n entryName,\n );\n }\n segments.pop();\n } else {\n segments.push(segment);\n }\n }\n if (segments.length === 0) {\n throw securityError(\"OOXML relationship target is empty\", \"invalid-package\", entryName);\n }\n return segments.join(\"/\");\n}\n\nfunction securityError(\n message: string,\n code: SpreadsheetSecurityError[\"code\"],\n entryName?: string,\n): SpreadsheetSecurityError {\n return entryName\n ? new SpreadsheetSecurityError(`${message}: ${entryName}`, code, entryName)\n : new SpreadsheetSecurityError(message, code);\n}\n\nfunction xlsxZipFailure(\n kind: Parameters<BoundedZipFailure>[0],\n message: string,\n entryName?: string,\n): never {\n throw securityError(\n message,\n kind === \"limit\"\n ? \"limit-exceeded\"\n : kind === \"encrypted\"\n ? \"encrypted-content\"\n : \"invalid-package\",\n entryName,\n );\n}\n\nfunction assertSafeFormula(formula: string, location: string): void {\n try {\n validateSupportedFormula(formula);\n } catch (error) {\n const failure = securityError(\n `Unsupported or potentially active spreadsheet formula at ${location}`,\n \"active-content\",\n );\n Object.defineProperty(failure, \"cause\", {\n value: error,\n enumerable: false,\n });\n throw failure;\n }\n}\n\nfunction safeExportImage(image: SpreadsheetImageConfig): SpreadsheetImageConfig {\n let normalized: SpreadsheetImageConfig;\n try {\n normalized = normalizeSpreadsheetImageConfig(image);\n } catch (error) {\n const failure = securityError(\"Spreadsheet image data is invalid\", \"active-content\");\n Object.defineProperty(failure, \"cause\", {\n value: error,\n enumerable: false,\n });\n throw failure;\n }\n if (\n !normalized.dataUrl ||\n ![\"image/png\", \"image/jpeg\", \"image/gif\"].includes(normalized.contentType ?? \"\")\n ) {\n throw securityError(\n \"Spreadsheet images must be inline PNG, JPEG, or GIF data\",\n \"active-content\",\n );\n }\n return normalized;\n}\n"],"mappings":"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","names":["offset"]}