@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-address.ts","../src/spreadsheet-image.ts"],"sourcesContent":["export const EXCEL_MAX_ROWS = 1_048_576;\nexport const EXCEL_MAX_COLUMNS = 16_384;\n\nexport type CellAddress = { row: number; col: number };\nexport type RangeAddress = CellAddress & { rowCount: number; colCount: number };\n\nexport function columnNameToIndex(name: string): number {\n if (!/^[A-Za-z]+$/.test(name)) throw new Error(`Invalid column name: ${name}`);\n let value = 0;\n for (const character of name.toUpperCase()) {\n value = value * 26 + character.charCodeAt(0) - 64;\n }\n const index = value - 1;\n if (index < 0 || index >= EXCEL_MAX_COLUMNS) {\n throw new Error(`Column is outside the XLSX range: ${name}`);\n }\n return index;\n}\n\nexport function columnIndexToName(index: number): string {\n assertIntegerInRange(index, 0, EXCEL_MAX_COLUMNS - 1, \"column index\");\n let value = index + 1;\n let result = \"\";\n while (value > 0) {\n const remainder = (value - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n value = Math.floor((value - 1) / 26);\n }\n return result;\n}\n\nexport function parseCellAddress(input: string): CellAddress {\n const match = /^\\$?([A-Za-z]+)\\$?([1-9]\\d*)$/.exec(input.trim());\n if (!match) throw new Error(`Invalid A1 cell address: ${input}`);\n const row = Number(match[2]) - 1;\n if (row < 0 || row >= EXCEL_MAX_ROWS) {\n throw new Error(`Row is outside the XLSX range: ${input}`);\n }\n return { row, col: columnNameToIndex(match[1]!) };\n}\n\nexport function parseRangeAddress(input: string): RangeAddress {\n const parts = input.trim().split(\":\");\n if (parts.length > 2 || !parts[0]) throw new Error(`Invalid A1 range: ${input}`);\n const start = parseCellAddress(parts[0]);\n const end = parseCellAddress(parts[1] ?? parts[0]);\n if (end.row < start.row || end.col < start.col) {\n throw new Error(`Range must run top-left to bottom-right: ${input}`);\n }\n return {\n row: start.row,\n col: start.col,\n rowCount: end.row - start.row + 1,\n colCount: end.col - start.col + 1,\n };\n}\n\nexport function formatCellAddress(address: CellAddress): string {\n return `${columnIndexToName(address.col)}${address.row + 1}`;\n}\n\nexport function formatRangeAddress(address: RangeAddress): string {\n const start = formatCellAddress(address);\n if (address.rowCount === 1 && address.colCount === 1) return start;\n return `${start}:${formatCellAddress({\n row: address.row + address.rowCount - 1,\n col: address.col + address.colCount - 1,\n })}`;\n}\n\nexport function cellKey(row: number, col: number): number {\n return row * EXCEL_MAX_COLUMNS + col;\n}\n\nexport function assertRange(address: RangeAddress): void {\n assertIntegerInRange(address.row, 0, EXCEL_MAX_ROWS - 1, \"start row\");\n assertIntegerInRange(address.col, 0, EXCEL_MAX_COLUMNS - 1, \"start column\");\n assertIntegerInRange(address.rowCount, 1, EXCEL_MAX_ROWS, \"row count\");\n assertIntegerInRange(address.colCount, 1, EXCEL_MAX_COLUMNS, \"column count\");\n if (address.row + address.rowCount > EXCEL_MAX_ROWS) throw new Error(\"Range exceeds XLSX rows\");\n if (address.col + address.colCount > EXCEL_MAX_COLUMNS) {\n throw new Error(\"Range exceeds XLSX columns\");\n }\n}\n\nfunction assertIntegerInRange(value: number, min: number, max: number, label: string): void {\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`${label} must be an integer between ${min} and ${max}`);\n }\n}\n","import {\n boundedUtf8ByteLength,\n canonicalizeRasterDataUrl,\n encodeRasterBase64,\n normalizeRasterContentType,\n RasterImageValidationError,\n validateRasterImageBytes,\n} from \"./raster-image\";\nimport type { SpreadsheetImageConfig } from \"./spreadsheet-types\";\n\nexport type SpreadsheetRasterImageContentType =\n | \"image/png\"\n | \"image/jpeg\"\n | \"image/gif\"\n | \"image/webp\";\n\n/** Untrusted spreadsheet image input was rejected before render or file export. */\nexport class InvalidSpreadsheetImageError extends Error {\n readonly code = \"INVALID_SPREADSHEET_IMAGE\";\n\n constructor(\n readonly field: string,\n detail: string,\n ) {\n super(`Invalid spreadsheet ${field}: ${detail}`);\n this.name = \"InvalidSpreadsheetImageError\";\n }\n}\n\n// Keep these model-boundary caps aligned with SPREADSHEET_SNAPSHOT_LIMITS.\nconst MAX_IMAGE_BYTES = 32 * 1024 * 1024;\nconst MAX_ALT_LENGTH = 1024 * 1024;\nconst MAX_PIXEL_VALUE = 1_000_000;\nconst normalizedImages = new WeakSet<object>();\n\n/**\n * Copies, validates, and freezes a spreadsheet image at the model boundary.\n *\n * Both byte and data-URL inputs become a canonical immutable data URL. This\n * prevents later caller mutation and lets render/export reuse validation in O(1).\n */\nexport function normalizeSpreadsheetImageConfig(\n input: SpreadsheetImageConfig,\n): SpreadsheetImageConfig {\n if (typeof input !== \"object\" || input === null) {\n throw new InvalidSpreadsheetImageError(\"image\", \"must be an object\");\n }\n if (normalizedImages.has(input)) return input;\n\n const hasDataUrl = input.dataUrl !== undefined;\n const hasBlob = input.blob !== undefined;\n if (Number(hasDataUrl) + Number(hasBlob) !== 1) {\n throw new InvalidSpreadsheetImageError(\n \"image source\",\n \"requires exactly one source: dataUrl or blob\",\n );\n }\n\n let canonical: string;\n let contentType: SpreadsheetRasterImageContentType;\n if (hasDataUrl) {\n const parsed = parseRasterDataUrl(input.dataUrl);\n contentType = parsed.contentType;\n canonical = parsed.canonical;\n } else {\n const bytes = copyImageBytes(input.blob);\n contentType = validateRasterBytes(bytes, input.contentType, \"image blob\");\n canonical = `data:${contentType};base64,${encodeRasterBase64(bytes)}`;\n }\n\n if (input.contentType !== undefined && normalizeRasterMime(input.contentType) !== contentType) {\n throw new InvalidSpreadsheetImageError(\"image contentType\", \"does not match the image bytes\");\n }\n\n const anchor = normalizeAnchor(input.anchor);\n const alt = normalizeAlt(input.alt);\n const normalized = Object.freeze({\n dataUrl: canonical,\n contentType,\n ...(alt === undefined ? {} : { alt }),\n anchor,\n }) satisfies SpreadsheetImageConfig;\n normalizedImages.add(normalized);\n return normalized;\n}\n\n/** Returns a validated inline source and never fetches or reads external data. */\nexport function spreadsheetImageSource(input: SpreadsheetImageConfig): string {\n const normalized = normalizeSpreadsheetImageConfig(input);\n return normalized.dataUrl!;\n}\n\nfunction normalizeAnchor(\n anchor: SpreadsheetImageConfig[\"anchor\"],\n): SpreadsheetImageConfig[\"anchor\"] {\n if (typeof anchor !== \"object\" || anchor === null) {\n throw new InvalidSpreadsheetImageError(\"image anchor\", \"must be an object\");\n }\n const from = anchor.from;\n const extent = anchor.extent;\n if (typeof from !== \"object\" || from === null) {\n throw new InvalidSpreadsheetImageError(\"image anchor.from\", \"must be an object\");\n }\n if (typeof extent !== \"object\" || extent === null) {\n throw new InvalidSpreadsheetImageError(\"image anchor.extent\", \"must be an object\");\n }\n assertInteger(from.row, \"image anchor.from.row\", 0, 1_048_575);\n assertInteger(from.col, \"image anchor.from.col\", 0, 16_383);\n if (from.rowOffsetPx !== undefined) {\n assertFiniteInRange(from.rowOffsetPx, \"image anchor.from.rowOffsetPx\", 0, MAX_PIXEL_VALUE);\n }\n if (from.colOffsetPx !== undefined) {\n assertFiniteInRange(from.colOffsetPx, \"image anchor.from.colOffsetPx\", 0, MAX_PIXEL_VALUE);\n }\n assertFiniteInRange(\n extent.widthPx,\n \"image anchor.extent.widthPx\",\n Number.MIN_VALUE,\n MAX_PIXEL_VALUE,\n );\n assertFiniteInRange(\n extent.heightPx,\n \"image anchor.extent.heightPx\",\n Number.MIN_VALUE,\n MAX_PIXEL_VALUE,\n );\n return Object.freeze({\n from: Object.freeze({\n row: from.row,\n col: from.col,\n ...(from.rowOffsetPx === undefined ? {} : { rowOffsetPx: from.rowOffsetPx }),\n ...(from.colOffsetPx === undefined ? {} : { colOffsetPx: from.colOffsetPx }),\n }),\n extent: Object.freeze({ widthPx: extent.widthPx, heightPx: extent.heightPx }),\n });\n}\n\nfunction normalizeAlt(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n if (\n typeof value !== \"string\" ||\n value.length > MAX_ALT_LENGTH ||\n boundedUtf8ByteLength(value, MAX_ALT_LENGTH) > MAX_ALT_LENGTH\n ) {\n throw new InvalidSpreadsheetImageError(\"image alt\", \"must be a bounded string\");\n }\n for (const character of value) {\n const codePoint = character.codePointAt(0)!;\n if (\n (codePoint < 0x20 && codePoint !== 0x09 && codePoint !== 0x0a && codePoint !== 0x0d) ||\n (codePoint >= 0xd800 && codePoint <= 0xdfff) ||\n codePoint === 0xfffe ||\n codePoint === 0xffff\n ) {\n throw new InvalidSpreadsheetImageError(\n \"image alt\",\n \"contains characters forbidden by XML 1.0\",\n );\n }\n }\n return value;\n}\n\nfunction parseRasterDataUrl(value: unknown): {\n contentType: SpreadsheetRasterImageContentType;\n canonical: string;\n} {\n try {\n const result = canonicalizeRasterDataUrl(value, MAX_IMAGE_BYTES);\n return {\n contentType: result.contentType,\n canonical: result.canonical,\n };\n } catch (error) {\n if (error instanceof RasterImageValidationError) {\n throw new InvalidSpreadsheetImageError(\"image dataUrl\", error.detail);\n }\n throw error;\n }\n}\n\nfunction copyImageBytes(value: unknown): Uint8Array {\n if (!(value instanceof ArrayBuffer)) {\n throw new InvalidSpreadsheetImageError(\"image blob\", \"must be an ArrayBuffer\");\n }\n const bytes = new Uint8Array(value.slice(0));\n if (bytes.byteLength === 0 || bytes.byteLength > MAX_IMAGE_BYTES) {\n throw new InvalidSpreadsheetImageError(\n \"image blob\",\n `must contain between 1 and ${MAX_IMAGE_BYTES} bytes`,\n );\n }\n return bytes;\n}\n\nfunction normalizeRasterMime(value: unknown): SpreadsheetRasterImageContentType {\n try {\n return normalizeRasterContentType(value);\n } catch (error) {\n if (error instanceof RasterImageValidationError) {\n throw new InvalidSpreadsheetImageError(\"image contentType\", error.detail);\n }\n throw error;\n }\n}\n\nfunction validateRasterBytes(\n bytes: Uint8Array,\n declaredType: unknown,\n field: string,\n): SpreadsheetRasterImageContentType {\n try {\n return validateRasterImageBytes(bytes, declaredType);\n } catch (error) {\n if (error instanceof RasterImageValidationError) {\n throw new InvalidSpreadsheetImageError(field, error.detail);\n }\n throw error;\n }\n}\n\nfunction assertInteger(\n value: unknown,\n field: string,\n min: number,\n max: number,\n): asserts value is number {\n if (!Number.isInteger(value) || (value as number) < min || (value as number) > max) {\n throw new InvalidSpreadsheetImageError(field, `must be an integer from ${min} through ${max}`);\n }\n}\n\nfunction assertFiniteInRange(\n value: unknown,\n field: string,\n min: number,\n max: number,\n): asserts value is number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < min || value > max) {\n throw new InvalidSpreadsheetImageError(field, `must be a finite number from ${min} to ${max}`);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,49 @@
1
+ // src/presentation-pptx-state-digest.ts
2
+ async function presentationModelDigest(presentation) {
3
+ const imageDigests = [];
4
+ const visit = async (element) => {
5
+ if ("sourceForSvg" in element) {
6
+ imageDigests.push({
7
+ id: element.id,
8
+ digest: await sha256Hex(new TextEncoder().encode(element.sourceForSvg() ?? ""))
9
+ });
10
+ } else if ("children" in element) {
11
+ for (const child of element.children) await visit(child);
12
+ }
13
+ };
14
+ for (const slide of presentation.slides.items) {
15
+ for (const element of slide.elements) await visit(element);
16
+ }
17
+ const normalized = await normalizeDigestValue({
18
+ layout: presentation.layoutSnapshot(),
19
+ imageDigests
20
+ });
21
+ return await sha256Hex(new TextEncoder().encode(JSON.stringify(normalized)));
22
+ }
23
+ async function sha256Hex(bytes) {
24
+ const digest = new Uint8Array(
25
+ await crypto.subtle.digest("SHA-256", Uint8Array.from(bytes).buffer)
26
+ );
27
+ return [...digest].map((byte) => byte.toString(16).padStart(2, "0")).join("");
28
+ }
29
+ async function normalizeDigestValue(value) {
30
+ if (value instanceof Uint8Array) return { $bytes: await sha256Hex(value) };
31
+ if (value instanceof ArrayBuffer) return { $bytes: await sha256Hex(new Uint8Array(value)) };
32
+ if (Array.isArray(value)) return await Promise.all(value.map(normalizeDigestValue));
33
+ if (value && typeof value === "object") {
34
+ const output = {};
35
+ for (const key of Object.keys(value).sort()) {
36
+ const child = value[key];
37
+ if (child !== void 0) output[key] = await normalizeDigestValue(child);
38
+ }
39
+ return output;
40
+ }
41
+ if (typeof value === "number" && Object.is(value, -0)) return 0;
42
+ return value;
43
+ }
44
+
45
+ export {
46
+ presentationModelDigest,
47
+ sha256Hex
48
+ };
49
+ //# sourceMappingURL=chunk-5XIA6KHZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/presentation-pptx-state-digest.ts"],"sourcesContent":["import type { Presentation, PresentationElement } from \"./presentation\";\n\nexport async function presentationModelDigest(presentation: Presentation): Promise<string> {\n const imageDigests: Array<{ id: string; digest: string }> = [];\n const visit = async (element: PresentationElement): Promise<void> => {\n if (\"sourceForSvg\" in element) {\n imageDigests.push({\n id: element.id,\n digest: await sha256Hex(new TextEncoder().encode(element.sourceForSvg() ?? \"\")),\n });\n } else if (\"children\" in element) {\n for (const child of element.children) await visit(child);\n }\n };\n for (const slide of presentation.slides.items) {\n for (const element of slide.elements) await visit(element);\n }\n const normalized = await normalizeDigestValue({\n layout: presentation.layoutSnapshot(),\n imageDigests,\n });\n return await sha256Hex(new TextEncoder().encode(JSON.stringify(normalized)));\n}\n\nexport async function sha256Hex(bytes: Uint8Array): Promise<string> {\n const digest = new Uint8Array(\n await crypto.subtle.digest(\"SHA-256\", Uint8Array.from(bytes).buffer),\n );\n return [...digest].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nasync function normalizeDigestValue(value: unknown): Promise<unknown> {\n if (value instanceof Uint8Array) return { $bytes: await sha256Hex(value) };\n if (value instanceof ArrayBuffer) return { $bytes: await sha256Hex(new Uint8Array(value)) };\n if (Array.isArray(value)) return await Promise.all(value.map(normalizeDigestValue));\n if (value && typeof value === \"object\") {\n const output: Record<string, unknown> = {};\n for (const key of Object.keys(value).sort()) {\n const child = (value as Record<string, unknown>)[key];\n if (child !== undefined) output[key] = await normalizeDigestValue(child);\n }\n return output;\n }\n if (typeof value === \"number\" && Object.is(value, -0)) return 0;\n return value;\n}\n"],"mappings":";AAEA,eAAsB,wBAAwB,cAA6C;AACzF,QAAM,eAAsD,CAAC;AAC7D,QAAM,QAAQ,OAAO,YAAgD;AACnE,QAAI,kBAAkB,SAAS;AAC7B,mBAAa,KAAK;AAAA,QAChB,IAAI,QAAQ;AAAA,QACZ,QAAQ,MAAM,UAAU,IAAI,YAAY,EAAE,OAAO,QAAQ,aAAa,KAAK,EAAE,CAAC;AAAA,MAChF,CAAC;AAAA,IACH,WAAW,cAAc,SAAS;AAChC,iBAAW,SAAS,QAAQ,SAAU,OAAM,MAAM,KAAK;AAAA,IACzD;AAAA,EACF;AACA,aAAW,SAAS,aAAa,OAAO,OAAO;AAC7C,eAAW,WAAW,MAAM,SAAU,OAAM,MAAM,OAAO;AAAA,EAC3D;AACA,QAAM,aAAa,MAAM,qBAAqB;AAAA,IAC5C,QAAQ,aAAa,eAAe;AAAA,IACpC;AAAA,EACF,CAAC;AACD,SAAO,MAAM,UAAU,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,UAAU,CAAC,CAAC;AAC7E;AAEA,eAAsB,UAAU,OAAoC;AAClE,QAAM,SAAS,IAAI;AAAA,IACjB,MAAM,OAAO,OAAO,OAAO,WAAW,WAAW,KAAK,KAAK,EAAE,MAAM;AAAA,EACrE;AACA,SAAO,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAC9E;AAEA,eAAe,qBAAqB,OAAkC;AACpE,MAAI,iBAAiB,WAAY,QAAO,EAAE,QAAQ,MAAM,UAAU,KAAK,EAAE;AACzE,MAAI,iBAAiB,YAAa,QAAO,EAAE,QAAQ,MAAM,UAAU,IAAI,WAAW,KAAK,CAAC,EAAE;AAC1F,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,QAAQ,IAAI,MAAM,IAAI,oBAAoB,CAAC;AAClF,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,SAAkC,CAAC;AACzC,eAAW,OAAO,OAAO,KAAK,KAAK,EAAE,KAAK,GAAG;AAC3C,YAAM,QAAS,MAAkC,GAAG;AACpD,UAAI,UAAU,OAAW,QAAO,GAAG,IAAI,MAAM,qBAAqB,KAAK;AAAA,IACzE;AACA,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,GAAG,OAAO,EAAE,EAAG,QAAO;AAC9D,SAAO;AACT;","names":[]}