@office-kit/xlsx 0.8.0

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 (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +319 -0
  3. package/THIRD_PARTY_NOTICES.md +56 -0
  4. package/dist/cell/cell.d.ts +234 -0
  5. package/dist/cell/index.d.ts +4 -0
  6. package/dist/cell/rich-text.d.ts +37 -0
  7. package/dist/cell-D9CaNKnU.mjs +320 -0
  8. package/dist/cell-D9CaNKnU.mjs.map +1 -0
  9. package/dist/cell-style-BEDjMX1y.mjs +1579 -0
  10. package/dist/cell-style-BEDjMX1y.mjs.map +1 -0
  11. package/dist/cell.mjs +2 -0
  12. package/dist/chart/chart-xml.d.ts +16 -0
  13. package/dist/chart/chart.d.ts +735 -0
  14. package/dist/chart/cx/chartex-xml.d.ts +6 -0
  15. package/dist/chart/cx/chartex.d.ts +279 -0
  16. package/dist/chart/index.d.ts +6 -0
  17. package/dist/chart/user-shapes-xml.d.ts +4 -0
  18. package/dist/chart/user-shapes.d.ts +61 -0
  19. package/dist/chart.mjs +232 -0
  20. package/dist/chart.mjs.map +1 -0
  21. package/dist/chartsheet/chartsheet-xml.d.ts +17 -0
  22. package/dist/chartsheet/chartsheet.d.ts +121 -0
  23. package/dist/chartsheet/index.d.ts +2 -0
  24. package/dist/chartsheet-C3-tqkPy.mjs +23 -0
  25. package/dist/chartsheet-C3-tqkPy.mjs.map +1 -0
  26. package/dist/chartsheet.mjs +2 -0
  27. package/dist/colors-ovWAwnZI.mjs +67 -0
  28. package/dist/colors-ovWAwnZI.mjs.map +1 -0
  29. package/dist/compat/numbers.d.ts +14 -0
  30. package/dist/coordinate-96Ecci4d.mjs +276 -0
  31. package/dist/coordinate-96Ecci4d.mjs.map +1 -0
  32. package/dist/datetime-B2ySVlXt.mjs +71 -0
  33. package/dist/datetime-B2ySVlXt.mjs.map +1 -0
  34. package/dist/defined-names-CviWmtQg.mjs +89 -0
  35. package/dist/defined-names-CviWmtQg.mjs.map +1 -0
  36. package/dist/differential-D4dg-qtZ.mjs +37 -0
  37. package/dist/differential-D4dg-qtZ.mjs.map +1 -0
  38. package/dist/drawing/anchor.d.ts +63 -0
  39. package/dist/drawing/dml/colors.d.ts +109 -0
  40. package/dist/drawing/dml/dml-xml.d.ts +35 -0
  41. package/dist/drawing/dml/effect.d.ts +92 -0
  42. package/dist/drawing/dml/fill.d.ts +115 -0
  43. package/dist/drawing/dml/geometry.d.ts +113 -0
  44. package/dist/drawing/dml/line.d.ts +41 -0
  45. package/dist/drawing/dml/shape-properties.d.ts +33 -0
  46. package/dist/drawing/dml/text.d.ts +218 -0
  47. package/dist/drawing/drawing-xml.d.ts +5 -0
  48. package/dist/drawing/drawing.d.ts +117 -0
  49. package/dist/drawing/image.d.ts +40 -0
  50. package/dist/drawing/index.d.ts +14 -0
  51. package/dist/drawing-BxzLuryn.mjs +415 -0
  52. package/dist/drawing-BxzLuryn.mjs.map +1 -0
  53. package/dist/drawing.mjs +119 -0
  54. package/dist/drawing.mjs.map +1 -0
  55. package/dist/escape-DFTE7ZJc.mjs +51 -0
  56. package/dist/escape-DFTE7ZJc.mjs.map +1 -0
  57. package/dist/exceptions-D-CFwxgm.mjs +37 -0
  58. package/dist/exceptions-D-CFwxgm.mjs.map +1 -0
  59. package/dist/formula/tokenizer.d.ts +61 -0
  60. package/dist/formula/translate.d.ts +67 -0
  61. package/dist/inference-B3ES3KEJ.mjs +42 -0
  62. package/dist/inference-B3ES3KEJ.mjs.map +1 -0
  63. package/dist/io/browser.d.ts +41 -0
  64. package/dist/io/index.d.ts +7 -0
  65. package/dist/io/load.d.ts +46 -0
  66. package/dist/io/node-fs.d.ts +62 -0
  67. package/dist/io/node-save.d.ts +3 -0
  68. package/dist/io/node.d.ts +17 -0
  69. package/dist/io/save.d.ts +14 -0
  70. package/dist/io/sink.d.ts +54 -0
  71. package/dist/io/source.d.ts +14 -0
  72. package/dist/io.mjs +212 -0
  73. package/dist/io.mjs.map +1 -0
  74. package/dist/load-D5cbhoGx.mjs +1069 -0
  75. package/dist/load-D5cbhoGx.mjs.map +1 -0
  76. package/dist/manifest-Dps1-OpP.mjs +801 -0
  77. package/dist/manifest-Dps1-OpP.mjs.map +1 -0
  78. package/dist/node.d.ts +3 -0
  79. package/dist/node.mjs +308 -0
  80. package/dist/node.mjs.map +1 -0
  81. package/dist/packaging/core.d.ts +45 -0
  82. package/dist/packaging/custom.d.ts +62 -0
  83. package/dist/packaging/extended.d.ts +45 -0
  84. package/dist/packaging/index.d.ts +10 -0
  85. package/dist/packaging/manifest.d.ts +24 -0
  86. package/dist/packaging/relationships.d.ts +30 -0
  87. package/dist/packaging.mjs +2 -0
  88. package/dist/parser-DuLejQy1.mjs +156 -0
  89. package/dist/parser-DuLejQy1.mjs.map +1 -0
  90. package/dist/reader-D1fNW9k1.mjs +534 -0
  91. package/dist/reader-D1fNW9k1.mjs.map +1 -0
  92. package/dist/save-RohQtgEZ.mjs +745 -0
  93. package/dist/save-RohQtgEZ.mjs.map +1 -0
  94. package/dist/schema/core.d.ts +133 -0
  95. package/dist/schema/index.d.ts +3 -0
  96. package/dist/schema/serialize.d.ts +6 -0
  97. package/dist/schema.mjs +2 -0
  98. package/dist/serialize-55EnT30e.mjs +254 -0
  99. package/dist/serialize-55EnT30e.mjs.map +1 -0
  100. package/dist/serializer-BwbgHYJV.mjs +116 -0
  101. package/dist/serializer-BwbgHYJV.mjs.map +1 -0
  102. package/dist/streaming/index.d.ts +2 -0
  103. package/dist/streaming/read-only.d.ts +38 -0
  104. package/dist/streaming/write-only.d.ts +47 -0
  105. package/dist/streaming.mjs +612 -0
  106. package/dist/streaming.mjs.map +1 -0
  107. package/dist/styles/alignment.d.ts +33 -0
  108. package/dist/styles/alignment.schema.d.ts +3 -0
  109. package/dist/styles/borders.d.ts +40 -0
  110. package/dist/styles/borders.schema.d.ts +4 -0
  111. package/dist/styles/cell-style.d.ts +270 -0
  112. package/dist/styles/colors.d.ts +128 -0
  113. package/dist/styles/colors.schema.d.ts +3 -0
  114. package/dist/styles/differential.d.ts +41 -0
  115. package/dist/styles/fills.d.ts +54 -0
  116. package/dist/styles/fills.schema.d.ts +6 -0
  117. package/dist/styles/fonts.d.ts +44 -0
  118. package/dist/styles/fonts.schema.d.ts +3 -0
  119. package/dist/styles/index.d.ts +21 -0
  120. package/dist/styles/named-styles.d.ts +52 -0
  121. package/dist/styles/numbers.d.ts +39 -0
  122. package/dist/styles/numbers.schema.d.ts +3 -0
  123. package/dist/styles/protection.d.ts +9 -0
  124. package/dist/styles/protection.schema.d.ts +3 -0
  125. package/dist/styles/stylesheet-reader.d.ts +7 -0
  126. package/dist/styles/stylesheet-writer.d.ts +3 -0
  127. package/dist/styles/stylesheet.d.ts +95 -0
  128. package/dist/styles.mjs +4 -0
  129. package/dist/stylesheet-writer-C2eRmn22.mjs +8624 -0
  130. package/dist/stylesheet-writer-C2eRmn22.mjs.map +1 -0
  131. package/dist/table-DkX6UniA.mjs +113 -0
  132. package/dist/table-DkX6UniA.mjs.map +1 -0
  133. package/dist/tree-Bbs1C8Rc.mjs +192 -0
  134. package/dist/tree-Bbs1C8Rc.mjs.map +1 -0
  135. package/dist/units-rOMQqXh2.mjs +41 -0
  136. package/dist/units-rOMQqXh2.mjs.map +1 -0
  137. package/dist/user-shapes-DfmCGKB0.mjs +252 -0
  138. package/dist/user-shapes-DfmCGKB0.mjs.map +1 -0
  139. package/dist/utf8-D91g1XTG.mjs +143 -0
  140. package/dist/utf8-D91g1XTG.mjs.map +1 -0
  141. package/dist/utils/coordinate.d.ts +103 -0
  142. package/dist/utils/css.d.ts +18 -0
  143. package/dist/utils/datetime.d.ts +38 -0
  144. package/dist/utils/escape.d.ts +34 -0
  145. package/dist/utils/exceptions.d.ts +34 -0
  146. package/dist/utils/index.d.ts +11 -0
  147. package/dist/utils/inference.d.ts +24 -0
  148. package/dist/utils/stable-stringify.d.ts +7 -0
  149. package/dist/utils/units.d.ts +14 -0
  150. package/dist/utils/utf8.d.ts +1 -0
  151. package/dist/utils.mjs +39 -0
  152. package/dist/utils.mjs.map +1 -0
  153. package/dist/workbook/calc-properties.d.ts +47 -0
  154. package/dist/workbook/defined-names.d.ts +121 -0
  155. package/dist/workbook/file-recovery.d.ts +11 -0
  156. package/dist/workbook/file-sharing.d.ts +14 -0
  157. package/dist/workbook/file-version.d.ts +13 -0
  158. package/dist/workbook/function-groups.d.ts +10 -0
  159. package/dist/workbook/index.d.ts +24 -0
  160. package/dist/workbook/protection.d.ts +35 -0
  161. package/dist/workbook/shared-strings.d.ts +57 -0
  162. package/dist/workbook/smart-tags.d.ts +13 -0
  163. package/dist/workbook/views.d.ts +89 -0
  164. package/dist/workbook/workbook-properties.d.ts +57 -0
  165. package/dist/workbook/workbook.d.ts +643 -0
  166. package/dist/workbook-HGYNRBlV.mjs +636 -0
  167. package/dist/workbook-HGYNRBlV.mjs.map +1 -0
  168. package/dist/workbook.mjs +58 -0
  169. package/dist/workbook.mjs.map +1 -0
  170. package/dist/worksheet/auto-filter.d.ts +34 -0
  171. package/dist/worksheet/cell-range.d.ts +121 -0
  172. package/dist/worksheet/comments-xml.d.ts +24 -0
  173. package/dist/worksheet/comments.d.ts +13 -0
  174. package/dist/worksheet/conditional-formatting.d.ts +150 -0
  175. package/dist/worksheet/custom-sheet-views.d.ts +43 -0
  176. package/dist/worksheet/data-consolidate.d.ts +29 -0
  177. package/dist/worksheet/data-validations.d.ts +72 -0
  178. package/dist/worksheet/dimensions.d.ts +40 -0
  179. package/dist/worksheet/errors.d.ts +40 -0
  180. package/dist/worksheet/hyperlinks.d.ts +42 -0
  181. package/dist/worksheet/index.d.ts +46 -0
  182. package/dist/worksheet/ole-objects.d.ts +37 -0
  183. package/dist/worksheet/page-setup.d.ts +173 -0
  184. package/dist/worksheet/phonetic.d.ts +11 -0
  185. package/dist/worksheet/properties.d.ts +34 -0
  186. package/dist/worksheet/protected-ranges.d.ts +19 -0
  187. package/dist/worksheet/protection.d.ts +44 -0
  188. package/dist/worksheet/reader.d.ts +38 -0
  189. package/dist/worksheet/scenarios.d.ts +36 -0
  190. package/dist/worksheet/smart-tags.d.ts +23 -0
  191. package/dist/worksheet/sort-state.d.ts +28 -0
  192. package/dist/worksheet/table-xml.d.ts +5 -0
  193. package/dist/worksheet/table.d.ts +80 -0
  194. package/dist/worksheet/views.d.ts +47 -0
  195. package/dist/worksheet/web-publish.d.ts +21 -0
  196. package/dist/worksheet/worksheet.d.ts +935 -0
  197. package/dist/worksheet/writer.d.ts +72 -0
  198. package/dist/worksheet-CmCNoIgD.mjs +1726 -0
  199. package/dist/worksheet-CmCNoIgD.mjs.map +1 -0
  200. package/dist/worksheet.mjs +247 -0
  201. package/dist/worksheet.mjs.map +1 -0
  202. package/dist/writer-DspzfkNA.mjs +221 -0
  203. package/dist/writer-DspzfkNA.mjs.map +1 -0
  204. package/dist/xml/index.d.ts +10 -0
  205. package/dist/xml/iterparse.d.ts +22 -0
  206. package/dist/xml/namespaces.d.ts +91 -0
  207. package/dist/xml/parser.d.ts +7 -0
  208. package/dist/xml/serializer.d.ts +14 -0
  209. package/dist/xml/stream-writer.d.ts +39 -0
  210. package/dist/xml/tree.d.ts +37 -0
  211. package/dist/xml.mjs +140 -0
  212. package/dist/xml.mjs.map +1 -0
  213. package/dist/zip/decompression-guard.d.ts +70 -0
  214. package/dist/zip/index.d.ts +6 -0
  215. package/dist/zip/random-access-reader.d.ts +16 -0
  216. package/dist/zip/reader.d.ts +45 -0
  217. package/dist/zip/writer.d.ts +65 -0
  218. package/dist/zip/zip64-patch.d.ts +12 -0
  219. package/dist/zip.mjs +3 -0
  220. package/package.json +147 -0
@@ -0,0 +1,24 @@
1
+ export interface DefaultEntry {
2
+ /** File extension without leading dot (e.g. "rels", "xml", "png"). */
3
+ ext: string;
4
+ contentType: string;
5
+ }
6
+ export interface OverrideEntry {
7
+ /** Part name path including leading slash (e.g. "/xl/workbook.xml"). */
8
+ partName: string;
9
+ contentType: string;
10
+ }
11
+ export interface Manifest {
12
+ defaults: DefaultEntry[];
13
+ overrides: OverrideEntry[];
14
+ }
15
+ export declare function makeManifest(): Manifest;
16
+ /** Register a default content type for an extension. Idempotent. */
17
+ export declare function addDefault(m: Manifest, ext: string, contentType: string): void;
18
+ /** Register an Override for a specific part. Idempotent. */
19
+ export declare function addOverride(m: Manifest, partName: string, contentType: string): void;
20
+ export declare function findOverride(m: Manifest, partName: string): OverrideEntry | undefined;
21
+ /** Find the first Override matching a content type. */
22
+ export declare function findOverrideByContentType(m: Manifest, contentType: string): OverrideEntry | undefined;
23
+ export declare function manifestToBytes(m: Manifest): Uint8Array;
24
+ export declare function manifestFromBytes(bytes: Uint8Array | string): Manifest;
@@ -0,0 +1,30 @@
1
+ export interface Relationship {
2
+ /** rIdN identifier; unique within the parent .rels file. */
3
+ id: string;
4
+ /** Full relationship type URI. */
5
+ type: string;
6
+ /** Target — relative part path or absolute URL when targetMode === 'External'. */
7
+ target: string;
8
+ /** Defaults to internal. */
9
+ targetMode?: 'External' | 'Internal';
10
+ }
11
+ export interface Relationships {
12
+ rels: Relationship[];
13
+ }
14
+ export declare function makeRelationships(): Relationships;
15
+ /**
16
+ * Append a relationship and return the resulting object. Auto-assigns the next
17
+ * free `rId{N}` Id.
18
+ */
19
+ export declare function appendRel(rels: Relationships, type: string, target: string, targetMode?: 'External'): Relationship;
20
+ export declare function findById(rels: Relationships, id: string): Relationship | undefined;
21
+ /**
22
+ * Build an id → relationship index for callers that look up the same .rels
23
+ * file many times in a hot loop. Cheaper than repeated {@link findById} once
24
+ * the rels count crosses a handful of entries.
25
+ */
26
+ export declare function indexRelsById(rels: Relationships): Map<string, Relationship>;
27
+ export declare function findByType(rels: Relationships, type: string): Relationship | undefined;
28
+ export declare function findAllByType(rels: Relationships, type: string): Relationship[];
29
+ export declare function relsToBytes(rels: Relationships): Uint8Array;
30
+ export declare function relsFromBytes(bytes: Uint8Array | string): Relationships;
@@ -0,0 +1,2 @@
1
+ import { $ as findByType, A as readBoolValue, B as corePropsFromBytes, C as makeBoolValue, D as makeFiletimeValue, E as makeDoubleValue, F as removeCustomProperty, G as setWorkbookDescription, H as makeCoreProperties, I as setCustomBoolProperty, J as setWorkbookSubject, K as setWorkbookKeywords, L as setCustomDateProperty, M as readFiletimeValue, N as readIntValue, O as makeIntValue, P as readStringValue, Q as findById, R as setCustomNumberProperty, S as makeAsciiStringValue, T as makeDateValue, U as setWorkbookCategory, V as corePropsToBytes, W as setWorkbookCreator, X as appendRel, Y as setWorkbookTitle, Z as findAllByType, _ as customPropsFromBytes, a as makeManifest, b as getCustomPropertyValue, c as extendedPropsFromBytes, d as setWorkbookAppVersion, f as setWorkbookApplication, g as appendCustomProperty, h as setWorkbookManager, i as findOverrideByContentType, j as readDoubleValue, k as makeStringValue, l as extendedPropsToBytes, m as setWorkbookHyperlinkBase, n as addOverride, nt as relsFromBytes, o as manifestFromBytes, p as setWorkbookCompany, q as setWorkbookLastModifiedBy, r as findOverride, rt as relsToBytes, s as manifestToBytes, t as addDefault, tt as makeRelationships, u as makeExtendedProperties, v as customPropsToBytes, w as makeCustomProperties, x as listCustomProperties, y as findCustomPropertyByName, z as setCustomStringProperty } from "./manifest-Dps1-OpP.mjs";
2
+ export { addDefault, addOverride, appendCustomProperty, appendRel, corePropsFromBytes, corePropsToBytes, customPropsFromBytes, customPropsToBytes, extendedPropsFromBytes, extendedPropsToBytes, findAllByType, findById, findByType, findCustomPropertyByName, findOverride, findOverrideByContentType, getCustomPropertyValue, listCustomProperties, makeAsciiStringValue, makeBoolValue, makeCoreProperties, makeCustomProperties, makeDateValue, makeDoubleValue, makeExtendedProperties, makeFiletimeValue, makeIntValue, makeManifest, makeRelationships, makeStringValue, manifestFromBytes, manifestToBytes, readBoolValue, readDoubleValue, readFiletimeValue, readIntValue, readStringValue, relsFromBytes, relsToBytes, removeCustomProperty, setCustomBoolProperty, setCustomDateProperty, setCustomNumberProperty, setCustomStringProperty, setWorkbookAppVersion, setWorkbookApplication, setWorkbookCategory, setWorkbookCompany, setWorkbookCreator, setWorkbookDescription, setWorkbookHyperlinkBase, setWorkbookKeywords, setWorkbookLastModifiedBy, setWorkbookManager, setWorkbookSubject, setWorkbookTitle };
@@ -0,0 +1,156 @@
1
+ import { o as OpenXmlSchemaError } from "./exceptions-D-CFwxgm.mjs";
2
+ import { jt as qname, n as el } from "./tree-Bbs1C8Rc.mjs";
3
+ import { XMLParser } from "fast-xml-parser";
4
+ //#region src/xml/parser.ts
5
+ const decoder = new TextDecoder("utf-8", { fatal: false });
6
+ const decodeForPrescan = (input) => {
7
+ if (typeof input === "string") return input;
8
+ return decoder.decode(input);
9
+ };
10
+ const checkForDoctype = (text) => {
11
+ const stripped = text.replace(/^/, "");
12
+ if (/<!DOCTYPE\b/.test(stripped)) throw new OpenXmlSchemaError("DTD declarations are not permitted in OOXML payloads");
13
+ if (/<!ENTITY\b/.test(stripped)) throw new OpenXmlSchemaError("Entity declarations are not permitted in OOXML payloads");
14
+ };
15
+ const parser = new XMLParser({
16
+ preserveOrder: true,
17
+ ignoreAttributes: false,
18
+ attributeNamePrefix: "",
19
+ attributesGroupName: ":@",
20
+ trimValues: false,
21
+ parseTagValue: false,
22
+ parseAttributeValue: false,
23
+ processEntities: true,
24
+ htmlEntities: false
25
+ });
26
+ const ATTR_KEY = ":@";
27
+ const TEXT_KEY = "#text";
28
+ /**
29
+ * Parse a UTF-8 XML payload into an {@link XmlNode} tree. Element and attribute
30
+ * names are returned in Clark notation. Throws {@link OpenXmlSchemaError} on
31
+ * DTD/entity declarations or on multi-root documents.
32
+ */
33
+ function parseXml(input) {
34
+ const text = decodeForPrescan(input);
35
+ checkForDoctype(text);
36
+ let raw;
37
+ try {
38
+ raw = parser.parse(text);
39
+ } catch (cause) {
40
+ throw new OpenXmlSchemaError("parseXml: failed to parse XML payload", { cause });
41
+ }
42
+ const roots = [];
43
+ for (const entry of raw) {
44
+ const tag = elementTag(entry);
45
+ if (tag === void 0) continue;
46
+ if (isProcessingInstruction(tag)) continue;
47
+ roots.push(entry);
48
+ }
49
+ if (roots.length === 0) throw new OpenXmlSchemaError("parseXml: document has no root element");
50
+ if (roots.length > 1) throw new OpenXmlSchemaError(`parseXml: document has ${roots.length} root elements; expected exactly one`);
51
+ const initial = {
52
+ default: "",
53
+ byPrefix: {}
54
+ };
55
+ const [root] = roots;
56
+ if (root === void 0) throw new OpenXmlSchemaError("parseXml: no root element");
57
+ return convertElement(root, initial);
58
+ }
59
+ const elementTag = (entry) => {
60
+ for (const k of Object.keys(entry)) {
61
+ if (k === ATTR_KEY) continue;
62
+ return k;
63
+ }
64
+ };
65
+ const isProcessingInstruction = (tag) => tag.startsWith("?");
66
+ const splitPrefixed = (qname0) => {
67
+ const idx = qname0.indexOf(":");
68
+ if (idx < 0) return {
69
+ prefix: "",
70
+ local: qname0
71
+ };
72
+ return {
73
+ prefix: qname0.slice(0, idx),
74
+ local: qname0.slice(idx + 1)
75
+ };
76
+ };
77
+ const extendStack = (parent, attrs) => {
78
+ if (attrs === void 0) return parent;
79
+ let nextDefault = parent.default;
80
+ let nextByPrefix;
81
+ for (const [k, v] of Object.entries(attrs)) {
82
+ if (k === "xmlns") {
83
+ nextDefault = v;
84
+ continue;
85
+ }
86
+ if (k.startsWith("xmlns:")) {
87
+ const prefix = k.slice(6);
88
+ nextByPrefix ??= { ...parent.byPrefix };
89
+ nextByPrefix[prefix] = v;
90
+ }
91
+ }
92
+ if (nextDefault === parent.default && nextByPrefix === void 0) return parent;
93
+ return {
94
+ default: nextDefault,
95
+ byPrefix: nextByPrefix ?? parent.byPrefix
96
+ };
97
+ };
98
+ const resolveElementName = (raw, stack) => {
99
+ const { prefix, local } = splitPrefixed(raw);
100
+ if (prefix === "") return qname(stack.default, local);
101
+ const ns = stack.byPrefix[prefix];
102
+ if (ns === void 0) throw new OpenXmlSchemaError(`parseXml: undeclared namespace prefix "${prefix}" on element <${raw}>`);
103
+ return qname(ns, local);
104
+ };
105
+ const resolveAttrName = (raw, stack) => {
106
+ const { prefix, local } = splitPrefixed(raw);
107
+ if (prefix === "") return local;
108
+ if (prefix === "xml") return qname("http://www.w3.org/XML/1998/namespace", local);
109
+ const ns = stack.byPrefix[prefix];
110
+ if (ns === void 0) throw new OpenXmlSchemaError(`parseXml: undeclared namespace prefix "${prefix}" on attribute "${raw}"`);
111
+ return qname(ns, local);
112
+ };
113
+ const filterAttrs = (rawAttrs, stack) => {
114
+ const resolved = {};
115
+ if (rawAttrs === void 0) return { resolved };
116
+ for (const [k, v] of Object.entries(rawAttrs)) {
117
+ if (k === "xmlns" || k.startsWith("xmlns:")) continue;
118
+ resolved[resolveAttrName(k, stack)] = v;
119
+ }
120
+ return { resolved };
121
+ };
122
+ const isWhitespaceOnly = (s) => /^\s*$/.test(s);
123
+ const convertElement = (entry, parentStack) => {
124
+ const rawTag = elementTag(entry);
125
+ if (rawTag === void 0) throw new OpenXmlSchemaError("parseXml: encountered an entry with no element tag");
126
+ if (isProcessingInstruction(rawTag)) throw new OpenXmlSchemaError(`parseXml: processing instructions are not supported (saw "<${rawTag}>")`);
127
+ const rawAttrs = entry[ATTR_KEY];
128
+ const stack = extendStack(parentStack, rawAttrs);
129
+ const { resolved } = filterAttrs(rawAttrs, stack);
130
+ const node = el(resolveElementName(rawTag, stack), resolved);
131
+ const childEntries = entry[rawTag];
132
+ if (childEntries === void 0 || childEntries.length === 0) return node;
133
+ const textParts = [];
134
+ for (const child of childEntries) {
135
+ if (Object.hasOwn(child, TEXT_KEY)) {
136
+ const t = child[TEXT_KEY];
137
+ if (typeof t === "string") textParts.push(t);
138
+ continue;
139
+ }
140
+ if (textParts.length > 0 && node.children.length === 0) {} else if (textParts.length > 0 && node.children.length > 0) {
141
+ if (!isWhitespaceOnly(textParts.join(""))) throw new OpenXmlSchemaError(`parseXml: mixed content not supported (text between elements under <${rawTag}>)`);
142
+ textParts.length = 0;
143
+ }
144
+ node.children.push(convertElement(child, stack));
145
+ }
146
+ if (textParts.length > 0) {
147
+ const acc = textParts.join("");
148
+ if (node.children.length === 0) node.text = acc;
149
+ else if (!isWhitespaceOnly(acc)) throw new OpenXmlSchemaError(`parseXml: mixed content not supported (trailing text under <${rawTag}>)`);
150
+ }
151
+ return node;
152
+ };
153
+ //#endregion
154
+ export { parseXml as t };
155
+
156
+ //# sourceMappingURL=parser-DuLejQy1.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-DuLejQy1.mjs","names":[],"sources":["../src/xml/parser.ts"],"sourcesContent":["// DOM-style XML parser. fast-xml-parser does the lexing, then we walk its\n// preserveOrder tree to:\n// 1. resolve `prefix:local` element + attribute names to Clark notation\n// (`{ns}local`) using a namespace-declaration stack;\n// 2. fold text segments into XmlNode.text for text-only elements;\n// 3. drop XML declarations and processing instructions.\n//\n// DOCTYPE / external entity declarations are rejected outright via a byte-level\n// prescan before the parser ever sees the input — fast-xml-parser does not\n// expand external entities, but we still want the offending document to fail\n// loudly.\n\nimport { XMLParser } from 'fast-xml-parser';\nimport { OpenXmlSchemaError } from '../utils/exceptions';\nimport { qname } from './namespaces';\nimport { el, type XmlNode } from './tree';\n\n// ---- DOCTYPE / DTD prescan --------------------------------------------------\n\nconst decoder = new TextDecoder('utf-8', { fatal: false });\n\nconst decodeForPrescan = (input: Uint8Array | string): string => {\n if (typeof input === 'string') return input;\n return decoder.decode(input);\n};\n\nconst checkForDoctype = (text: string): void => {\n // Strip XML declaration so any subsequent `<!DOCTYPE` is the real thing. The\n // declaration is always the first non-BOM token in well-formed XML.\n const stripped = text.replace(/^/, '');\n if (/<!DOCTYPE\\b/.test(stripped)) {\n throw new OpenXmlSchemaError('DTD declarations are not permitted in OOXML payloads');\n }\n if (/<!ENTITY\\b/.test(stripped)) {\n throw new OpenXmlSchemaError('Entity declarations are not permitted in OOXML payloads');\n }\n};\n\n// ---- fast-xml-parser configuration ------------------------------------------\n\nconst parser = new XMLParser({\n preserveOrder: true,\n ignoreAttributes: false,\n attributeNamePrefix: '',\n attributesGroupName: ':@',\n trimValues: false,\n parseTagValue: false,\n parseAttributeValue: false,\n // OOXML needs the standard XML entities (&amp; / &lt; / &gt; / &quot; /\n // &apos;) expanded; HTML / numeric entities outside that set are not used in\n // SpreadsheetML payloads.\n processEntities: true,\n htmlEntities: false,\n});\n\n// ---- preserveOrder shape ----------------------------------------------------\n\ntype FxpAttrs = Record<string, string>;\ntype FxpEntry = { ':@'?: FxpAttrs } & { [tagOrText: string]: FxpEntry[] | string | FxpAttrs | undefined };\ntype FxpTree = FxpEntry[];\n\nconst ATTR_KEY = ':@';\nconst TEXT_KEY = '#text';\n\n// ---- public API -------------------------------------------------------------\n\n/**\n * Parse a UTF-8 XML payload into an {@link XmlNode} tree. Element and attribute\n * names are returned in Clark notation. Throws {@link OpenXmlSchemaError} on\n * DTD/entity declarations or on multi-root documents.\n */\nexport function parseXml(input: Uint8Array | string): XmlNode {\n const text = decodeForPrescan(input);\n checkForDoctype(text);\n\n let raw: FxpTree;\n try {\n raw = parser.parse(text) as FxpTree;\n } catch (cause) {\n throw new OpenXmlSchemaError('parseXml: failed to parse XML payload', { cause });\n }\n\n // Skip XML declaration, processing instructions and any leading whitespace\n // text nodes.\n const roots: FxpEntry[] = [];\n for (const entry of raw) {\n const tag = elementTag(entry);\n if (tag === undefined) continue; // text-only entry\n if (isProcessingInstruction(tag)) continue; // <?xml …?>, other PIs\n roots.push(entry);\n }\n if (roots.length === 0) {\n throw new OpenXmlSchemaError('parseXml: document has no root element');\n }\n if (roots.length > 1) {\n throw new OpenXmlSchemaError(`parseXml: document has ${roots.length} root elements; expected exactly one`);\n }\n\n const initial: NamespaceStack = { default: '', byPrefix: {} };\n const [root] = roots;\n if (root === undefined) {\n throw new OpenXmlSchemaError('parseXml: no root element');\n }\n return convertElement(root, initial);\n}\n\n// ---- conversion -------------------------------------------------------------\n\ninterface NamespaceStack {\n /** Default namespace URI (xmlns=\"…\"); empty string means no default. */\n readonly default: string;\n /** Map of prefix → namespace URI declared in this scope or any ancestor. */\n readonly byPrefix: Readonly<Record<string, string>>;\n}\n\nconst elementTag = (entry: FxpEntry): string | undefined => {\n for (const k of Object.keys(entry)) {\n if (k === ATTR_KEY) continue;\n return k;\n }\n return undefined;\n};\n\nconst isProcessingInstruction = (tag: string): boolean => tag.startsWith('?');\n\nconst splitPrefixed = (qname0: string): { prefix: string; local: string } => {\n const idx = qname0.indexOf(':');\n if (idx < 0) return { prefix: '', local: qname0 };\n return { prefix: qname0.slice(0, idx), local: qname0.slice(idx + 1) };\n};\n\nconst extendStack = (parent: NamespaceStack, attrs: FxpAttrs | undefined): NamespaceStack => {\n if (attrs === undefined) return parent;\n let nextDefault = parent.default;\n let nextByPrefix: Record<string, string> | undefined;\n for (const [k, v] of Object.entries(attrs)) {\n if (k === 'xmlns') {\n nextDefault = v;\n continue;\n }\n if (k.startsWith('xmlns:')) {\n const prefix = k.slice('xmlns:'.length);\n nextByPrefix ??= { ...parent.byPrefix };\n nextByPrefix[prefix] = v;\n }\n }\n if (nextDefault === parent.default && nextByPrefix === undefined) return parent;\n return {\n default: nextDefault,\n byPrefix: nextByPrefix ?? parent.byPrefix,\n };\n};\n\nconst resolveElementName = (raw: string, stack: NamespaceStack): string => {\n const { prefix, local } = splitPrefixed(raw);\n if (prefix === '') return qname(stack.default, local);\n const ns = stack.byPrefix[prefix];\n if (ns === undefined) {\n throw new OpenXmlSchemaError(`parseXml: undeclared namespace prefix \"${prefix}\" on element <${raw}>`);\n }\n return qname(ns, local);\n};\n\nconst resolveAttrName = (raw: string, stack: NamespaceStack): string => {\n const { prefix, local } = splitPrefixed(raw);\n // Unprefixed attributes do NOT inherit the default namespace (XMLNS spec).\n if (prefix === '') return local;\n if (prefix === 'xml') return qname('http://www.w3.org/XML/1998/namespace', local);\n const ns = stack.byPrefix[prefix];\n if (ns === undefined) {\n throw new OpenXmlSchemaError(`parseXml: undeclared namespace prefix \"${prefix}\" on attribute \"${raw}\"`);\n }\n return qname(ns, local);\n};\n\nconst filterAttrs = (rawAttrs: FxpAttrs | undefined, stack: NamespaceStack): { resolved: Record<string, string> } => {\n const resolved: Record<string, string> = {};\n if (rawAttrs === undefined) return { resolved };\n for (const [k, v] of Object.entries(rawAttrs)) {\n // xmlns / xmlns:* declarations: dropped from the XmlNode attribute table.\n // The serializer rebuilds them from the Clark-notation namespaces it walks,\n // so round-tripping does not require preserving the declarations.\n if (k === 'xmlns' || k.startsWith('xmlns:')) continue;\n resolved[resolveAttrName(k, stack)] = v;\n }\n return { resolved };\n};\n\nconst isWhitespaceOnly = (s: string): boolean => /^\\s*$/.test(s);\n\nconst convertElement = (entry: FxpEntry, parentStack: NamespaceStack): XmlNode => {\n const rawTag = elementTag(entry);\n if (rawTag === undefined) {\n throw new OpenXmlSchemaError('parseXml: encountered an entry with no element tag');\n }\n if (isProcessingInstruction(rawTag)) {\n throw new OpenXmlSchemaError(`parseXml: processing instructions are not supported (saw \"<${rawTag}>\")`);\n }\n\n const rawAttrs = entry[ATTR_KEY] as FxpAttrs | undefined;\n const stack = extendStack(parentStack, rawAttrs);\n\n const { resolved } = filterAttrs(rawAttrs, stack);\n const node = el(resolveElementName(rawTag, stack), resolved);\n\n const childEntries = entry[rawTag] as FxpEntry[] | undefined;\n if (childEntries === undefined || childEntries.length === 0) return node;\n\n const textParts: string[] = [];\n for (const child of childEntries) {\n if (Object.hasOwn(child, TEXT_KEY)) {\n const t = child[TEXT_KEY];\n if (typeof t === 'string') textParts.push(t);\n continue;\n }\n if (textParts.length > 0 && node.children.length === 0) {\n // text accumulated *before* any child element — keep collecting.\n } else if (textParts.length > 0 && node.children.length > 0) {\n const acc = textParts.join('');\n if (!isWhitespaceOnly(acc)) {\n throw new OpenXmlSchemaError(`parseXml: mixed content not supported (text between elements under <${rawTag}>)`);\n }\n // whitespace-only inter-element text: drop.\n textParts.length = 0;\n }\n node.children.push(convertElement(child, stack));\n }\n // Trailing text after the last child element.\n if (textParts.length > 0) {\n const acc = textParts.join('');\n if (node.children.length === 0) {\n // text-only element (the common case): keep as the element's text.\n node.text = acc;\n } else if (!isWhitespaceOnly(acc)) {\n throw new OpenXmlSchemaError(`parseXml: mixed content not supported (trailing text under <${rawTag}>)`);\n }\n }\n return node;\n};\n"],"mappings":";;;;AAmBA,MAAM,UAAU,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC;AAEzD,MAAM,oBAAoB,UAAuC;CAC/D,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,OAAO,QAAQ,OAAO,KAAK;AAC7B;AAEA,MAAM,mBAAmB,SAAuB;CAG9C,MAAM,WAAW,KAAK,QAAQ,MAAM,EAAE;CACtC,IAAI,cAAc,KAAK,QAAQ,GAC7B,MAAM,IAAI,mBAAmB,sDAAsD;CAErF,IAAI,aAAa,KAAK,QAAQ,GAC5B,MAAM,IAAI,mBAAmB,yDAAyD;AAE1F;AAIA,MAAM,SAAS,IAAI,UAAU;CAC3B,eAAe;CACf,kBAAkB;CAClB,qBAAqB;CACrB,qBAAqB;CACrB,YAAY;CACZ,eAAe;CACf,qBAAqB;CAIrB,iBAAiB;CACjB,cAAc;AAChB,CAAC;AAQD,MAAM,WAAW;AACjB,MAAM,WAAW;;;;;;AASjB,SAAgB,SAAS,OAAqC;CAC5D,MAAM,OAAO,iBAAiB,KAAK;CACnC,gBAAgB,IAAI;CAEpB,IAAI;CACJ,IAAI;EACF,MAAM,OAAO,MAAM,IAAI;CACzB,SAAS,OAAO;EACd,MAAM,IAAI,mBAAmB,yCAAyC,EAAE,MAAM,CAAC;CACjF;CAIA,MAAM,QAAoB,CAAC;CAC3B,KAAK,MAAM,SAAS,KAAK;EACvB,MAAM,MAAM,WAAW,KAAK;EAC5B,IAAI,QAAQ,KAAA,GAAW;EACvB,IAAI,wBAAwB,GAAG,GAAG;EAClC,MAAM,KAAK,KAAK;CAClB;CACA,IAAI,MAAM,WAAW,GACnB,MAAM,IAAI,mBAAmB,wCAAwC;CAEvE,IAAI,MAAM,SAAS,GACjB,MAAM,IAAI,mBAAmB,0BAA0B,MAAM,OAAO,qCAAqC;CAG3G,MAAM,UAA0B;EAAE,SAAS;EAAI,UAAU,CAAC;CAAE;CAC5D,MAAM,CAAC,QAAQ;CACf,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,mBAAmB,2BAA2B;CAE1D,OAAO,eAAe,MAAM,OAAO;AACrC;AAWA,MAAM,cAAc,UAAwC;CAC1D,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK,GAAG;EAClC,IAAI,MAAM,UAAU;EACpB,OAAO;CACT;AAEF;AAEA,MAAM,2BAA2B,QAAyB,IAAI,WAAW,GAAG;AAE5E,MAAM,iBAAiB,WAAsD;CAC3E,MAAM,MAAM,OAAO,QAAQ,GAAG;CAC9B,IAAI,MAAM,GAAG,OAAO;EAAE,QAAQ;EAAI,OAAO;CAAO;CAChD,OAAO;EAAE,QAAQ,OAAO,MAAM,GAAG,GAAG;EAAG,OAAO,OAAO,MAAM,MAAM,CAAC;CAAE;AACtE;AAEA,MAAM,eAAe,QAAwB,UAAgD;CAC3F,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,IAAI,cAAc,OAAO;CACzB,IAAI;CACJ,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,GAAG;EAC1C,IAAI,MAAM,SAAS;GACjB,cAAc;GACd;EACF;EACA,IAAI,EAAE,WAAW,QAAQ,GAAG;GAC1B,MAAM,SAAS,EAAE,MAAM,CAAe;GACtC,iBAAiB,EAAE,GAAG,OAAO,SAAS;GACtC,aAAa,UAAU;EACzB;CACF;CACA,IAAI,gBAAgB,OAAO,WAAW,iBAAiB,KAAA,GAAW,OAAO;CACzE,OAAO;EACL,SAAS;EACT,UAAU,gBAAgB,OAAO;CACnC;AACF;AAEA,MAAM,sBAAsB,KAAa,UAAkC;CACzE,MAAM,EAAE,QAAQ,UAAU,cAAc,GAAG;CAC3C,IAAI,WAAW,IAAI,OAAO,MAAM,MAAM,SAAS,KAAK;CACpD,MAAM,KAAK,MAAM,SAAS;CAC1B,IAAI,OAAO,KAAA,GACT,MAAM,IAAI,mBAAmB,0CAA0C,OAAO,gBAAgB,IAAI,EAAE;CAEtG,OAAO,MAAM,IAAI,KAAK;AACxB;AAEA,MAAM,mBAAmB,KAAa,UAAkC;CACtE,MAAM,EAAE,QAAQ,UAAU,cAAc,GAAG;CAE3C,IAAI,WAAW,IAAI,OAAO;CAC1B,IAAI,WAAW,OAAO,OAAO,MAAM,wCAAwC,KAAK;CAChF,MAAM,KAAK,MAAM,SAAS;CAC1B,IAAI,OAAO,KAAA,GACT,MAAM,IAAI,mBAAmB,0CAA0C,OAAO,kBAAkB,IAAI,EAAE;CAExG,OAAO,MAAM,IAAI,KAAK;AACxB;AAEA,MAAM,eAAe,UAAgC,UAAgE;CACnH,MAAM,WAAmC,CAAC;CAC1C,IAAI,aAAa,KAAA,GAAW,OAAO,EAAE,SAAS;CAC9C,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,QAAQ,GAAG;EAI7C,IAAI,MAAM,WAAW,EAAE,WAAW,QAAQ,GAAG;EAC7C,SAAS,gBAAgB,GAAG,KAAK,KAAK;CACxC;CACA,OAAO,EAAE,SAAS;AACpB;AAEA,MAAM,oBAAoB,MAAuB,QAAQ,KAAK,CAAC;AAE/D,MAAM,kBAAkB,OAAiB,gBAAyC;CAChF,MAAM,SAAS,WAAW,KAAK;CAC/B,IAAI,WAAW,KAAA,GACb,MAAM,IAAI,mBAAmB,oDAAoD;CAEnF,IAAI,wBAAwB,MAAM,GAChC,MAAM,IAAI,mBAAmB,8DAA8D,OAAO,IAAI;CAGxG,MAAM,WAAW,MAAM;CACvB,MAAM,QAAQ,YAAY,aAAa,QAAQ;CAE/C,MAAM,EAAE,aAAa,YAAY,UAAU,KAAK;CAChD,MAAM,OAAO,GAAG,mBAAmB,QAAQ,KAAK,GAAG,QAAQ;CAE3D,MAAM,eAAe,MAAM;CAC3B,IAAI,iBAAiB,KAAA,KAAa,aAAa,WAAW,GAAG,OAAO;CAEpE,MAAM,YAAsB,CAAC;CAC7B,KAAK,MAAM,SAAS,cAAc;EAChC,IAAI,OAAO,OAAO,OAAO,QAAQ,GAAG;GAClC,MAAM,IAAI,MAAM;GAChB,IAAI,OAAO,MAAM,UAAU,UAAU,KAAK,CAAC;GAC3C;EACF;EACA,IAAI,UAAU,SAAS,KAAK,KAAK,SAAS,WAAW,GAAG,CAExD,OAAO,IAAI,UAAU,SAAS,KAAK,KAAK,SAAS,SAAS,GAAG;GAE3D,IAAI,CAAC,iBADO,UAAU,KAAK,EACH,CAAC,GACvB,MAAM,IAAI,mBAAmB,uEAAuE,OAAO,GAAG;GAGhH,UAAU,SAAS;EACrB;EACA,KAAK,SAAS,KAAK,eAAe,OAAO,KAAK,CAAC;CACjD;CAEA,IAAI,UAAU,SAAS,GAAG;EACxB,MAAM,MAAM,UAAU,KAAK,EAAE;EAC7B,IAAI,KAAK,SAAS,WAAW,GAE3B,KAAK,OAAO;OACP,IAAI,CAAC,iBAAiB,GAAG,GAC9B,MAAM,IAAI,mBAAmB,+DAA+D,OAAO,GAAG;CAE1G;CACA,OAAO;AACT"}