@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,172 @@
1
+ // src/spreadsheet-xlsx-api.ts
2
+ var XLSX_MEDIA_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
3
+ var SpreadsheetFidelityError = class extends Error {
4
+ issues;
5
+ constructor(message, issues) {
6
+ super(message);
7
+ this.name = "SpreadsheetFidelityError";
8
+ this.issues = issues;
9
+ }
10
+ };
11
+ var SpreadsheetSecurityError = class extends Error {
12
+ constructor(message, code, entryName) {
13
+ super(message);
14
+ this.code = code;
15
+ this.entryName = entryName;
16
+ this.name = "SpreadsheetSecurityError";
17
+ }
18
+ };
19
+
20
+ // src/spreadsheet-xlsx-state.ts
21
+ var LOSS_PRESERVATION = /* @__PURE__ */ new WeakMap();
22
+ function spreadsheetFidelityReport(workbook) {
23
+ const issues = [];
24
+ const envelope = LOSS_PRESERVATION.get(workbook);
25
+ if (envelope && hasOpaqueContent(envelope.opaqueContent)) {
26
+ const severity = workbook.revision === envelope.importedRevision ? "warning" : "error";
27
+ const categorized = opaqueContentIssues(envelope.opaqueContent, severity);
28
+ issues.push(...categorized);
29
+ }
30
+ for (const worksheet of workbook.worksheets.items) {
31
+ const charts = worksheet.charts.items.length;
32
+ if (charts > 0) {
33
+ issues.push({
34
+ code: "editable-chart-not-exportable",
35
+ severity: "error",
36
+ feature: "chart",
37
+ message: `Worksheet ${JSON.stringify(worksheet.name)} has ${charts} editable chart(s); XLSX chart authoring is not implemented`
38
+ });
39
+ }
40
+ const sparklines = worksheet.sparklineGroups.items.length;
41
+ if (sparklines > 0) {
42
+ issues.push({
43
+ code: "sparkline-not-exportable",
44
+ severity: "error",
45
+ feature: "sparkline",
46
+ message: `Worksheet ${JSON.stringify(worksheet.name)} has ${sparklines} editable sparkline group(s); XLSX sparkline authoring is not implemented`
47
+ });
48
+ }
49
+ const imageMetadata = worksheet.images.items.filter((image) => Boolean(image.config.alt));
50
+ if (imageMetadata.length > 0) {
51
+ issues.push({
52
+ code: "image-metadata-not-exportable",
53
+ severity: "error",
54
+ feature: "image",
55
+ message: `Worksheet ${JSON.stringify(worksheet.name)} has ${imageMetadata.length} image(s) with accessibility text that ExcelJS cannot author`
56
+ });
57
+ }
58
+ }
59
+ if (workbook.comments.items.length > 0) {
60
+ issues.push({
61
+ code: "comment-thread-not-exportable",
62
+ severity: "error",
63
+ feature: "comment",
64
+ message: `The workbook has ${workbook.comments.items.length} threaded comment(s); XLSX legacy notes cannot preserve authorship, replies, resolution, and timestamps`
65
+ });
66
+ }
67
+ return issues;
68
+ }
69
+ function opaqueContentIssues(content, severity) {
70
+ const features = new Set(content.features);
71
+ const issues = [];
72
+ if (features.has("editable-charts")) {
73
+ issues.push({
74
+ code: severity === "warning" ? "editable-chart-preserved" : "editable-chart-not-exportable",
75
+ severity,
76
+ feature: "chart",
77
+ message: severity === "warning" ? "Imported editable chart OOXML is retained in the original XLSX package" : "The workbook changed, so retained editable chart OOXML would be discarded",
78
+ ...opaqueMetadataFor(content, (part) => /^xl\/charts\//i.test(part))
79
+ });
80
+ features.delete("editable-charts");
81
+ }
82
+ if (features.has("sparklines")) {
83
+ issues.push({
84
+ code: severity === "warning" ? "sparkline-preserved" : "sparkline-not-exportable",
85
+ severity,
86
+ feature: "sparkline",
87
+ message: severity === "warning" ? "Imported sparkline OOXML is retained in the original XLSX package" : "The workbook changed, so retained sparkline OOXML would be discarded",
88
+ ...opaqueMetadataFor(
89
+ content,
90
+ (part) => content.features.includes("sparklines") && /^xl\/worksheets\//i.test(part)
91
+ )
92
+ });
93
+ features.delete("sparklines");
94
+ features.delete("worksheet-extensions");
95
+ }
96
+ if (features.size > 0 || issues.length === 0) {
97
+ const remaining = {
98
+ ...cloneOpaqueContent(content),
99
+ features: [...features].sort()
100
+ };
101
+ issues.push(opaqueContentIssue(remaining, severity));
102
+ }
103
+ return issues;
104
+ }
105
+ function opaqueMetadataFor(content, matchesPart) {
106
+ const parts = content.parts.filter(matchesPart);
107
+ const selected = new Set(parts);
108
+ return {
109
+ parts,
110
+ relationships: content.relationships.filter(
111
+ (relationship) => selected.has(relationship.sourcePart) || selected.has(relationship.targetPart)
112
+ ).map((relationship) => ({ ...relationship })),
113
+ contentTypes: content.contentTypes.filter((contentType) => selected.has(contentType.partName)).map((contentType) => ({ ...contentType }))
114
+ };
115
+ }
116
+ function spreadsheetLossPreservationEnvelope(workbook) {
117
+ const envelope = LOSS_PRESERVATION.get(workbook);
118
+ if (!envelope) return null;
119
+ return {
120
+ version: 1,
121
+ mediaType: XLSX_MEDIA_TYPE,
122
+ sourceBytes: envelope.sourceBytes.slice(),
123
+ sourceDigest: envelope.sourceDigest,
124
+ opaqueContent: cloneOpaqueContent(envelope.opaqueContent),
125
+ modelDigest: envelope.modelDigest
126
+ };
127
+ }
128
+ function opaqueContentIssue(content, severity) {
129
+ const changed = severity === "error";
130
+ return {
131
+ code: changed ? "content-will-be-discarded" : "content-preserved-in-source",
132
+ severity,
133
+ feature: "opaque-ooxml",
134
+ message: changed ? "The imported XLSX contains bounded inert OOXML outside the editable model; the workbook changed, so regeneration would discard it" : "The imported XLSX contains bounded inert OOXML outside the editable model; unchanged export returns the original package byte-for-byte",
135
+ parts: [...content.parts],
136
+ relationships: content.relationships.map((relationship) => ({
137
+ ...relationship
138
+ })),
139
+ contentTypes: content.contentTypes.map((contentType) => ({
140
+ ...contentType
141
+ })),
142
+ features: [...content.features]
143
+ };
144
+ }
145
+ function hasOpaqueContent(content) {
146
+ return content.parts.length > 0 || content.relationships.length > 0 || content.contentTypes.length > 0 || content.features.length > 0;
147
+ }
148
+ function cloneOpaqueContent(content) {
149
+ return {
150
+ parts: [...content.parts],
151
+ relationships: content.relationships.map((relationship) => ({
152
+ ...relationship
153
+ })),
154
+ contentTypes: content.contentTypes.map((contentType) => ({
155
+ ...contentType
156
+ })),
157
+ features: [...content.features]
158
+ };
159
+ }
160
+
161
+ export {
162
+ XLSX_MEDIA_TYPE,
163
+ SpreadsheetFidelityError,
164
+ SpreadsheetSecurityError,
165
+ LOSS_PRESERVATION,
166
+ spreadsheetFidelityReport,
167
+ opaqueContentIssues,
168
+ spreadsheetLossPreservationEnvelope,
169
+ hasOpaqueContent,
170
+ cloneOpaqueContent
171
+ };
172
+ //# sourceMappingURL=chunk-J6N7IR44.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/spreadsheet-xlsx-api.ts","../src/spreadsheet-xlsx-state.ts"],"sourcesContent":["export const XLSX_MEDIA_TYPE =\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\" as const;\n\nexport type SpreadsheetOpaqueRelationship = {\n sourcePart: string;\n type: string;\n targetPart: string;\n};\n\nexport type SpreadsheetOpaqueContentType = {\n partName: string;\n contentType: string;\n};\n\n/** Bounded, inert OOXML which is retained only in the original source package. */\nexport type SpreadsheetOpaqueContent = {\n parts: readonly string[];\n relationships: readonly SpreadsheetOpaqueRelationship[];\n contentTypes: readonly SpreadsheetOpaqueContentType[];\n features: readonly string[];\n};\n\nexport type SpreadsheetFidelityIssue = {\n code:\n | \"content-preserved-in-source\"\n | \"content-will-be-discarded\"\n | \"editable-chart-preserved\"\n | \"editable-chart-not-exportable\"\n | \"sparkline-preserved\"\n | \"sparkline-not-exportable\"\n | \"image-metadata-not-exportable\"\n | \"comment-thread-not-exportable\";\n severity: \"warning\" | \"error\";\n feature: \"opaque-ooxml\" | \"chart\" | \"sparkline\" | \"image\" | \"comment\";\n message: string;\n parts?: readonly string[];\n relationships?: readonly SpreadsheetOpaqueRelationship[];\n contentTypes?: readonly SpreadsheetOpaqueContentType[];\n features?: readonly string[];\n};\n\nexport type SpreadsheetXlsxImportOptions = {\n /** Reject unsupported editable OOXML instead of retaining its original package. */\n unsupportedContent?: \"preserve\" | \"error\";\n /** Bounded before ExcelJS allocates or parses any OOXML. */\n limits?: Partial<SpreadsheetXlsxImportLimits>;\n};\n\nexport type SpreadsheetXlsxImportLimits = {\n compressedBytes: number;\n expandedBytes: number;\n entryBytes: number;\n entries: number;\n compressionRatio: number;\n inspectedXmlBytes: number;\n xmlDepth: number;\n xmlAttributesPerElement: number;\n xmlAttributesPerPart: number;\n xmlAttributes: number;\n xmlElementsPerPart: number;\n xmlElements: number;\n xmlTextCharactersPerPart: number;\n xmlTextCharacters: number;\n worksheetCellsPerPart: number;\n worksheetCells: number;\n formulasPerPart: number;\n formulas: number;\n formulaBytesPerPart: number;\n formulaBytes: number;\n sharedStrings: number;\n cellStyles: number;\n styleRecords: number;\n commentsPerPart: number;\n comments: number;\n relationshipsPerPart: number;\n relationships: number;\n mediaEntries: number;\n mediaEntryBytes: number;\n mediaBytes: number;\n imagePixels: number;\n};\n\nexport type SpreadsheetLossPreservationEnvelope = {\n version: 1;\n mediaType: typeof XLSX_MEDIA_TYPE;\n sourceBytes: Uint8Array;\n sourceDigest: string;\n opaqueContent: SpreadsheetOpaqueContent;\n modelDigest: string;\n};\n\nexport type SpreadsheetXlsxExportOptions = {\n fileName?: string;\n /** Must be explicit because ExcelJS cannot author every retained editable OOXML feature. */\n unsupportedContent?: \"error\" | \"discard\";\n};\n\nexport class SpreadsheetFidelityError extends Error {\n readonly issues: readonly SpreadsheetFidelityIssue[];\n\n constructor(message: string, issues: readonly SpreadsheetFidelityIssue[]) {\n super(message);\n this.name = \"SpreadsheetFidelityError\";\n this.issues = issues;\n }\n}\n\nexport class SpreadsheetSecurityError extends Error {\n constructor(\n message: string,\n readonly code:\n | \"invalid-package\"\n | \"limit-exceeded\"\n | \"encrypted-content\"\n | \"active-content\"\n | \"unsafe-xml\"\n | \"external-relationship\",\n readonly entryName?: string,\n ) {\n super(message);\n this.name = \"SpreadsheetSecurityError\";\n }\n}\n","import type { Workbook } from \"./spreadsheet\";\nimport {\n XLSX_MEDIA_TYPE,\n type SpreadsheetFidelityIssue,\n type SpreadsheetLossPreservationEnvelope,\n type SpreadsheetOpaqueContent,\n} from \"./spreadsheet-xlsx-api\";\n\nexport type SpreadsheetLossPreservationState = {\n sourceBytes: Uint8Array;\n sourceDigest: string;\n importedRevision: number;\n opaqueContent: SpreadsheetOpaqueContent;\n modelDigest: string;\n};\n\nexport const LOSS_PRESERVATION = new WeakMap<Workbook, SpreadsheetLossPreservationState>();\n\nexport function spreadsheetFidelityReport(workbook: Workbook): readonly SpreadsheetFidelityIssue[] {\n const issues: SpreadsheetFidelityIssue[] = [];\n const envelope = LOSS_PRESERVATION.get(workbook);\n if (envelope && hasOpaqueContent(envelope.opaqueContent)) {\n const severity = workbook.revision === envelope.importedRevision ? \"warning\" : \"error\";\n const categorized = opaqueContentIssues(envelope.opaqueContent, severity);\n issues.push(...categorized);\n }\n for (const worksheet of workbook.worksheets.items) {\n const charts = worksheet.charts.items.length;\n if (charts > 0) {\n issues.push({\n code: \"editable-chart-not-exportable\",\n severity: \"error\",\n feature: \"chart\",\n message: `Worksheet ${JSON.stringify(worksheet.name)} has ${charts} editable chart(s); XLSX chart authoring is not implemented`,\n });\n }\n const sparklines = worksheet.sparklineGroups.items.length;\n if (sparklines > 0) {\n issues.push({\n code: \"sparkline-not-exportable\",\n severity: \"error\",\n feature: \"sparkline\",\n message: `Worksheet ${JSON.stringify(worksheet.name)} has ${sparklines} editable sparkline group(s); XLSX sparkline authoring is not implemented`,\n });\n }\n const imageMetadata = worksheet.images.items.filter((image) => Boolean(image.config.alt));\n if (imageMetadata.length > 0) {\n issues.push({\n code: \"image-metadata-not-exportable\",\n severity: \"error\",\n feature: \"image\",\n message: `Worksheet ${JSON.stringify(worksheet.name)} has ${imageMetadata.length} image(s) with accessibility text that ExcelJS cannot author`,\n });\n }\n }\n if (workbook.comments.items.length > 0) {\n issues.push({\n code: \"comment-thread-not-exportable\",\n severity: \"error\",\n feature: \"comment\",\n message: `The workbook has ${workbook.comments.items.length} threaded comment(s); XLSX legacy notes cannot preserve authorship, replies, resolution, and timestamps`,\n });\n }\n return issues;\n}\n\nexport function opaqueContentIssues(\n content: SpreadsheetOpaqueContent,\n severity: SpreadsheetFidelityIssue[\"severity\"],\n): SpreadsheetFidelityIssue[] {\n const features = new Set(content.features);\n const issues: SpreadsheetFidelityIssue[] = [];\n if (features.has(\"editable-charts\")) {\n issues.push({\n code: severity === \"warning\" ? \"editable-chart-preserved\" : \"editable-chart-not-exportable\",\n severity,\n feature: \"chart\",\n message:\n severity === \"warning\"\n ? \"Imported editable chart OOXML is retained in the original XLSX package\"\n : \"The workbook changed, so retained editable chart OOXML would be discarded\",\n ...opaqueMetadataFor(content, (part) => /^xl\\/charts\\//i.test(part)),\n });\n features.delete(\"editable-charts\");\n }\n if (features.has(\"sparklines\")) {\n issues.push({\n code: severity === \"warning\" ? \"sparkline-preserved\" : \"sparkline-not-exportable\",\n severity,\n feature: \"sparkline\",\n message:\n severity === \"warning\"\n ? \"Imported sparkline OOXML is retained in the original XLSX package\"\n : \"The workbook changed, so retained sparkline OOXML would be discarded\",\n ...opaqueMetadataFor(\n content,\n (part) => content.features.includes(\"sparklines\") && /^xl\\/worksheets\\//i.test(part),\n ),\n });\n features.delete(\"sparklines\");\n features.delete(\"worksheet-extensions\");\n }\n if (features.size > 0 || issues.length === 0) {\n const remaining = {\n ...cloneOpaqueContent(content),\n features: [...features].sort(),\n };\n issues.push(opaqueContentIssue(remaining, severity));\n }\n return issues;\n}\n\nfunction opaqueMetadataFor(\n content: SpreadsheetOpaqueContent,\n matchesPart: (part: string) => boolean,\n): Pick<SpreadsheetFidelityIssue, \"parts\" | \"relationships\" | \"contentTypes\"> {\n const parts = content.parts.filter(matchesPart);\n const selected = new Set(parts);\n return {\n parts,\n relationships: content.relationships\n .filter(\n (relationship) =>\n selected.has(relationship.sourcePart) || selected.has(relationship.targetPart),\n )\n .map((relationship) => ({ ...relationship })),\n contentTypes: content.contentTypes\n .filter((contentType) => selected.has(contentType.partName))\n .map((contentType) => ({ ...contentType })),\n };\n}\n\nexport function spreadsheetLossPreservationEnvelope(\n workbook: Workbook,\n): SpreadsheetLossPreservationEnvelope | null {\n const envelope = LOSS_PRESERVATION.get(workbook);\n if (!envelope) return null;\n return {\n version: 1,\n mediaType: XLSX_MEDIA_TYPE,\n sourceBytes: envelope.sourceBytes.slice(),\n sourceDigest: envelope.sourceDigest,\n opaqueContent: cloneOpaqueContent(envelope.opaqueContent),\n modelDigest: envelope.modelDigest,\n };\n}\n\nexport function opaqueContentIssue(\n content: SpreadsheetOpaqueContent,\n severity: SpreadsheetFidelityIssue[\"severity\"],\n): SpreadsheetFidelityIssue {\n const changed = severity === \"error\";\n return {\n code: changed ? \"content-will-be-discarded\" : \"content-preserved-in-source\",\n severity,\n feature: \"opaque-ooxml\",\n message: changed\n ? \"The imported XLSX contains bounded inert OOXML outside the editable model; the workbook changed, so regeneration would discard it\"\n : \"The imported XLSX contains bounded inert OOXML outside the editable model; unchanged export returns the original package byte-for-byte\",\n parts: [...content.parts],\n relationships: content.relationships.map((relationship) => ({\n ...relationship,\n })),\n contentTypes: content.contentTypes.map((contentType) => ({\n ...contentType,\n })),\n features: [...content.features],\n };\n}\n\nexport function hasOpaqueContent(content: SpreadsheetOpaqueContent): boolean {\n return (\n content.parts.length > 0 ||\n content.relationships.length > 0 ||\n content.contentTypes.length > 0 ||\n content.features.length > 0\n );\n}\n\nexport function cloneOpaqueContent(content: SpreadsheetOpaqueContent): SpreadsheetOpaqueContent {\n return {\n parts: [...content.parts],\n relationships: content.relationships.map((relationship) => ({\n ...relationship,\n })),\n contentTypes: content.contentTypes.map((contentType) => ({\n ...contentType,\n })),\n features: [...content.features],\n };\n}\n"],"mappings":";AAAO,IAAM,kBACX;AAgGK,IAAM,2BAAN,cAAuC,MAAM;AAAA,EACzC;AAAA,EAET,YAAY,SAAiB,QAA6C;AACxE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAClD,YACE,SACS,MAOA,WACT;AACA,UAAM,OAAO;AATJ;AAOA;AAGT,SAAK,OAAO;AAAA,EACd;AACF;;;AC1GO,IAAM,oBAAoB,oBAAI,QAAoD;AAElF,SAAS,0BAA0B,UAAyD;AACjG,QAAM,SAAqC,CAAC;AAC5C,QAAM,WAAW,kBAAkB,IAAI,QAAQ;AAC/C,MAAI,YAAY,iBAAiB,SAAS,aAAa,GAAG;AACxD,UAAM,WAAW,SAAS,aAAa,SAAS,mBAAmB,YAAY;AAC/E,UAAM,cAAc,oBAAoB,SAAS,eAAe,QAAQ;AACxE,WAAO,KAAK,GAAG,WAAW;AAAA,EAC5B;AACA,aAAW,aAAa,SAAS,WAAW,OAAO;AACjD,UAAM,SAAS,UAAU,OAAO,MAAM;AACtC,QAAI,SAAS,GAAG;AACd,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,QACT,SAAS,aAAa,KAAK,UAAU,UAAU,IAAI,CAAC,QAAQ,MAAM;AAAA,MACpE,CAAC;AAAA,IACH;AACA,UAAM,aAAa,UAAU,gBAAgB,MAAM;AACnD,QAAI,aAAa,GAAG;AAClB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,QACT,SAAS,aAAa,KAAK,UAAU,UAAU,IAAI,CAAC,QAAQ,UAAU;AAAA,MACxE,CAAC;AAAA,IACH;AACA,UAAM,gBAAgB,UAAU,OAAO,MAAM,OAAO,CAAC,UAAU,QAAQ,MAAM,OAAO,GAAG,CAAC;AACxF,QAAI,cAAc,SAAS,GAAG;AAC5B,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,QACT,SAAS,aAAa,KAAK,UAAU,UAAU,IAAI,CAAC,QAAQ,cAAc,MAAM;AAAA,MAClF,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,SAAS,SAAS,MAAM,SAAS,GAAG;AACtC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,SAAS,oBAAoB,SAAS,SAAS,MAAM,MAAM;AAAA,IAC7D,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,oBACd,SACA,UAC4B;AAC5B,QAAM,WAAW,IAAI,IAAI,QAAQ,QAAQ;AACzC,QAAM,SAAqC,CAAC;AAC5C,MAAI,SAAS,IAAI,iBAAiB,GAAG;AACnC,WAAO,KAAK;AAAA,MACV,MAAM,aAAa,YAAY,6BAA6B;AAAA,MAC5D;AAAA,MACA,SAAS;AAAA,MACT,SACE,aAAa,YACT,2EACA;AAAA,MACN,GAAG,kBAAkB,SAAS,CAAC,SAAS,iBAAiB,KAAK,IAAI,CAAC;AAAA,IACrE,CAAC;AACD,aAAS,OAAO,iBAAiB;AAAA,EACnC;AACA,MAAI,SAAS,IAAI,YAAY,GAAG;AAC9B,WAAO,KAAK;AAAA,MACV,MAAM,aAAa,YAAY,wBAAwB;AAAA,MACvD;AAAA,MACA,SAAS;AAAA,MACT,SACE,aAAa,YACT,sEACA;AAAA,MACN,GAAG;AAAA,QACD;AAAA,QACA,CAAC,SAAS,QAAQ,SAAS,SAAS,YAAY,KAAK,qBAAqB,KAAK,IAAI;AAAA,MACrF;AAAA,IACF,CAAC;AACD,aAAS,OAAO,YAAY;AAC5B,aAAS,OAAO,sBAAsB;AAAA,EACxC;AACA,MAAI,SAAS,OAAO,KAAK,OAAO,WAAW,GAAG;AAC5C,UAAM,YAAY;AAAA,MAChB,GAAG,mBAAmB,OAAO;AAAA,MAC7B,UAAU,CAAC,GAAG,QAAQ,EAAE,KAAK;AAAA,IAC/B;AACA,WAAO,KAAK,mBAAmB,WAAW,QAAQ,CAAC;AAAA,EACrD;AACA,SAAO;AACT;AAEA,SAAS,kBACP,SACA,aAC4E;AAC5E,QAAM,QAAQ,QAAQ,MAAM,OAAO,WAAW;AAC9C,QAAM,WAAW,IAAI,IAAI,KAAK;AAC9B,SAAO;AAAA,IACL;AAAA,IACA,eAAe,QAAQ,cACpB;AAAA,MACC,CAAC,iBACC,SAAS,IAAI,aAAa,UAAU,KAAK,SAAS,IAAI,aAAa,UAAU;AAAA,IACjF,EACC,IAAI,CAAC,kBAAkB,EAAE,GAAG,aAAa,EAAE;AAAA,IAC9C,cAAc,QAAQ,aACnB,OAAO,CAAC,gBAAgB,SAAS,IAAI,YAAY,QAAQ,CAAC,EAC1D,IAAI,CAAC,iBAAiB,EAAE,GAAG,YAAY,EAAE;AAAA,EAC9C;AACF;AAEO,SAAS,oCACd,UAC4C;AAC5C,QAAM,WAAW,kBAAkB,IAAI,QAAQ;AAC/C,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,aAAa,SAAS,YAAY,MAAM;AAAA,IACxC,cAAc,SAAS;AAAA,IACvB,eAAe,mBAAmB,SAAS,aAAa;AAAA,IACxD,aAAa,SAAS;AAAA,EACxB;AACF;AAEO,SAAS,mBACd,SACA,UAC0B;AAC1B,QAAM,UAAU,aAAa;AAC7B,SAAO;AAAA,IACL,MAAM,UAAU,8BAA8B;AAAA,IAC9C;AAAA,IACA,SAAS;AAAA,IACT,SAAS,UACL,sIACA;AAAA,IACJ,OAAO,CAAC,GAAG,QAAQ,KAAK;AAAA,IACxB,eAAe,QAAQ,cAAc,IAAI,CAAC,kBAAkB;AAAA,MAC1D,GAAG;AAAA,IACL,EAAE;AAAA,IACF,cAAc,QAAQ,aAAa,IAAI,CAAC,iBAAiB;AAAA,MACvD,GAAG;AAAA,IACL,EAAE;AAAA,IACF,UAAU,CAAC,GAAG,QAAQ,QAAQ;AAAA,EAChC;AACF;AAEO,SAAS,iBAAiB,SAA4C;AAC3E,SACE,QAAQ,MAAM,SAAS,KACvB,QAAQ,cAAc,SAAS,KAC/B,QAAQ,aAAa,SAAS,KAC9B,QAAQ,SAAS,SAAS;AAE9B;AAEO,SAAS,mBAAmB,SAA6D;AAC9F,SAAO;AAAA,IACL,OAAO,CAAC,GAAG,QAAQ,KAAK;AAAA,IACxB,eAAe,QAAQ,cAAc,IAAI,CAAC,kBAAkB;AAAA,MAC1D,GAAG;AAAA,IACL,EAAE;AAAA,IACF,cAAc,QAAQ,aAAa,IAAI,CAAC,iBAAiB;AAAA,MACvD,GAAG;AAAA,IACL,EAAE;AAAA,IACF,UAAU,CAAC,GAAG,QAAQ,QAAQ;AAAA,EAChC;AACF;","names":[]}