@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.
- package/LICENSE +21 -0
- package/README.md +319 -0
- package/THIRD_PARTY_NOTICES.md +56 -0
- package/dist/cell/cell.d.ts +234 -0
- package/dist/cell/index.d.ts +4 -0
- package/dist/cell/rich-text.d.ts +37 -0
- package/dist/cell-D9CaNKnU.mjs +320 -0
- package/dist/cell-D9CaNKnU.mjs.map +1 -0
- package/dist/cell-style-BEDjMX1y.mjs +1579 -0
- package/dist/cell-style-BEDjMX1y.mjs.map +1 -0
- package/dist/cell.mjs +2 -0
- package/dist/chart/chart-xml.d.ts +16 -0
- package/dist/chart/chart.d.ts +735 -0
- package/dist/chart/cx/chartex-xml.d.ts +6 -0
- package/dist/chart/cx/chartex.d.ts +279 -0
- package/dist/chart/index.d.ts +6 -0
- package/dist/chart/user-shapes-xml.d.ts +4 -0
- package/dist/chart/user-shapes.d.ts +61 -0
- package/dist/chart.mjs +232 -0
- package/dist/chart.mjs.map +1 -0
- package/dist/chartsheet/chartsheet-xml.d.ts +17 -0
- package/dist/chartsheet/chartsheet.d.ts +121 -0
- package/dist/chartsheet/index.d.ts +2 -0
- package/dist/chartsheet-C3-tqkPy.mjs +23 -0
- package/dist/chartsheet-C3-tqkPy.mjs.map +1 -0
- package/dist/chartsheet.mjs +2 -0
- package/dist/colors-ovWAwnZI.mjs +67 -0
- package/dist/colors-ovWAwnZI.mjs.map +1 -0
- package/dist/compat/numbers.d.ts +14 -0
- package/dist/coordinate-96Ecci4d.mjs +276 -0
- package/dist/coordinate-96Ecci4d.mjs.map +1 -0
- package/dist/datetime-B2ySVlXt.mjs +71 -0
- package/dist/datetime-B2ySVlXt.mjs.map +1 -0
- package/dist/defined-names-CviWmtQg.mjs +89 -0
- package/dist/defined-names-CviWmtQg.mjs.map +1 -0
- package/dist/differential-D4dg-qtZ.mjs +37 -0
- package/dist/differential-D4dg-qtZ.mjs.map +1 -0
- package/dist/drawing/anchor.d.ts +63 -0
- package/dist/drawing/dml/colors.d.ts +109 -0
- package/dist/drawing/dml/dml-xml.d.ts +35 -0
- package/dist/drawing/dml/effect.d.ts +92 -0
- package/dist/drawing/dml/fill.d.ts +115 -0
- package/dist/drawing/dml/geometry.d.ts +113 -0
- package/dist/drawing/dml/line.d.ts +41 -0
- package/dist/drawing/dml/shape-properties.d.ts +33 -0
- package/dist/drawing/dml/text.d.ts +218 -0
- package/dist/drawing/drawing-xml.d.ts +5 -0
- package/dist/drawing/drawing.d.ts +117 -0
- package/dist/drawing/image.d.ts +40 -0
- package/dist/drawing/index.d.ts +14 -0
- package/dist/drawing-BxzLuryn.mjs +415 -0
- package/dist/drawing-BxzLuryn.mjs.map +1 -0
- package/dist/drawing.mjs +119 -0
- package/dist/drawing.mjs.map +1 -0
- package/dist/escape-DFTE7ZJc.mjs +51 -0
- package/dist/escape-DFTE7ZJc.mjs.map +1 -0
- package/dist/exceptions-D-CFwxgm.mjs +37 -0
- package/dist/exceptions-D-CFwxgm.mjs.map +1 -0
- package/dist/formula/tokenizer.d.ts +61 -0
- package/dist/formula/translate.d.ts +67 -0
- package/dist/inference-B3ES3KEJ.mjs +42 -0
- package/dist/inference-B3ES3KEJ.mjs.map +1 -0
- package/dist/io/browser.d.ts +41 -0
- package/dist/io/index.d.ts +7 -0
- package/dist/io/load.d.ts +46 -0
- package/dist/io/node-fs.d.ts +62 -0
- package/dist/io/node-save.d.ts +3 -0
- package/dist/io/node.d.ts +17 -0
- package/dist/io/save.d.ts +14 -0
- package/dist/io/sink.d.ts +54 -0
- package/dist/io/source.d.ts +14 -0
- package/dist/io.mjs +212 -0
- package/dist/io.mjs.map +1 -0
- package/dist/load-D5cbhoGx.mjs +1069 -0
- package/dist/load-D5cbhoGx.mjs.map +1 -0
- package/dist/manifest-Dps1-OpP.mjs +801 -0
- package/dist/manifest-Dps1-OpP.mjs.map +1 -0
- package/dist/node.d.ts +3 -0
- package/dist/node.mjs +308 -0
- package/dist/node.mjs.map +1 -0
- package/dist/packaging/core.d.ts +45 -0
- package/dist/packaging/custom.d.ts +62 -0
- package/dist/packaging/extended.d.ts +45 -0
- package/dist/packaging/index.d.ts +10 -0
- package/dist/packaging/manifest.d.ts +24 -0
- package/dist/packaging/relationships.d.ts +30 -0
- package/dist/packaging.mjs +2 -0
- package/dist/parser-DuLejQy1.mjs +156 -0
- package/dist/parser-DuLejQy1.mjs.map +1 -0
- package/dist/reader-D1fNW9k1.mjs +534 -0
- package/dist/reader-D1fNW9k1.mjs.map +1 -0
- package/dist/save-RohQtgEZ.mjs +745 -0
- package/dist/save-RohQtgEZ.mjs.map +1 -0
- package/dist/schema/core.d.ts +133 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/serialize.d.ts +6 -0
- package/dist/schema.mjs +2 -0
- package/dist/serialize-55EnT30e.mjs +254 -0
- package/dist/serialize-55EnT30e.mjs.map +1 -0
- package/dist/serializer-BwbgHYJV.mjs +116 -0
- package/dist/serializer-BwbgHYJV.mjs.map +1 -0
- package/dist/streaming/index.d.ts +2 -0
- package/dist/streaming/read-only.d.ts +38 -0
- package/dist/streaming/write-only.d.ts +47 -0
- package/dist/streaming.mjs +612 -0
- package/dist/streaming.mjs.map +1 -0
- package/dist/styles/alignment.d.ts +33 -0
- package/dist/styles/alignment.schema.d.ts +3 -0
- package/dist/styles/borders.d.ts +40 -0
- package/dist/styles/borders.schema.d.ts +4 -0
- package/dist/styles/cell-style.d.ts +270 -0
- package/dist/styles/colors.d.ts +128 -0
- package/dist/styles/colors.schema.d.ts +3 -0
- package/dist/styles/differential.d.ts +41 -0
- package/dist/styles/fills.d.ts +54 -0
- package/dist/styles/fills.schema.d.ts +6 -0
- package/dist/styles/fonts.d.ts +44 -0
- package/dist/styles/fonts.schema.d.ts +3 -0
- package/dist/styles/index.d.ts +21 -0
- package/dist/styles/named-styles.d.ts +52 -0
- package/dist/styles/numbers.d.ts +39 -0
- package/dist/styles/numbers.schema.d.ts +3 -0
- package/dist/styles/protection.d.ts +9 -0
- package/dist/styles/protection.schema.d.ts +3 -0
- package/dist/styles/stylesheet-reader.d.ts +7 -0
- package/dist/styles/stylesheet-writer.d.ts +3 -0
- package/dist/styles/stylesheet.d.ts +95 -0
- package/dist/styles.mjs +4 -0
- package/dist/stylesheet-writer-C2eRmn22.mjs +8624 -0
- package/dist/stylesheet-writer-C2eRmn22.mjs.map +1 -0
- package/dist/table-DkX6UniA.mjs +113 -0
- package/dist/table-DkX6UniA.mjs.map +1 -0
- package/dist/tree-Bbs1C8Rc.mjs +192 -0
- package/dist/tree-Bbs1C8Rc.mjs.map +1 -0
- package/dist/units-rOMQqXh2.mjs +41 -0
- package/dist/units-rOMQqXh2.mjs.map +1 -0
- package/dist/user-shapes-DfmCGKB0.mjs +252 -0
- package/dist/user-shapes-DfmCGKB0.mjs.map +1 -0
- package/dist/utf8-D91g1XTG.mjs +143 -0
- package/dist/utf8-D91g1XTG.mjs.map +1 -0
- package/dist/utils/coordinate.d.ts +103 -0
- package/dist/utils/css.d.ts +18 -0
- package/dist/utils/datetime.d.ts +38 -0
- package/dist/utils/escape.d.ts +34 -0
- package/dist/utils/exceptions.d.ts +34 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/inference.d.ts +24 -0
- package/dist/utils/stable-stringify.d.ts +7 -0
- package/dist/utils/units.d.ts +14 -0
- package/dist/utils/utf8.d.ts +1 -0
- package/dist/utils.mjs +39 -0
- package/dist/utils.mjs.map +1 -0
- package/dist/workbook/calc-properties.d.ts +47 -0
- package/dist/workbook/defined-names.d.ts +121 -0
- package/dist/workbook/file-recovery.d.ts +11 -0
- package/dist/workbook/file-sharing.d.ts +14 -0
- package/dist/workbook/file-version.d.ts +13 -0
- package/dist/workbook/function-groups.d.ts +10 -0
- package/dist/workbook/index.d.ts +24 -0
- package/dist/workbook/protection.d.ts +35 -0
- package/dist/workbook/shared-strings.d.ts +57 -0
- package/dist/workbook/smart-tags.d.ts +13 -0
- package/dist/workbook/views.d.ts +89 -0
- package/dist/workbook/workbook-properties.d.ts +57 -0
- package/dist/workbook/workbook.d.ts +643 -0
- package/dist/workbook-HGYNRBlV.mjs +636 -0
- package/dist/workbook-HGYNRBlV.mjs.map +1 -0
- package/dist/workbook.mjs +58 -0
- package/dist/workbook.mjs.map +1 -0
- package/dist/worksheet/auto-filter.d.ts +34 -0
- package/dist/worksheet/cell-range.d.ts +121 -0
- package/dist/worksheet/comments-xml.d.ts +24 -0
- package/dist/worksheet/comments.d.ts +13 -0
- package/dist/worksheet/conditional-formatting.d.ts +150 -0
- package/dist/worksheet/custom-sheet-views.d.ts +43 -0
- package/dist/worksheet/data-consolidate.d.ts +29 -0
- package/dist/worksheet/data-validations.d.ts +72 -0
- package/dist/worksheet/dimensions.d.ts +40 -0
- package/dist/worksheet/errors.d.ts +40 -0
- package/dist/worksheet/hyperlinks.d.ts +42 -0
- package/dist/worksheet/index.d.ts +46 -0
- package/dist/worksheet/ole-objects.d.ts +37 -0
- package/dist/worksheet/page-setup.d.ts +173 -0
- package/dist/worksheet/phonetic.d.ts +11 -0
- package/dist/worksheet/properties.d.ts +34 -0
- package/dist/worksheet/protected-ranges.d.ts +19 -0
- package/dist/worksheet/protection.d.ts +44 -0
- package/dist/worksheet/reader.d.ts +38 -0
- package/dist/worksheet/scenarios.d.ts +36 -0
- package/dist/worksheet/smart-tags.d.ts +23 -0
- package/dist/worksheet/sort-state.d.ts +28 -0
- package/dist/worksheet/table-xml.d.ts +5 -0
- package/dist/worksheet/table.d.ts +80 -0
- package/dist/worksheet/views.d.ts +47 -0
- package/dist/worksheet/web-publish.d.ts +21 -0
- package/dist/worksheet/worksheet.d.ts +935 -0
- package/dist/worksheet/writer.d.ts +72 -0
- package/dist/worksheet-CmCNoIgD.mjs +1726 -0
- package/dist/worksheet-CmCNoIgD.mjs.map +1 -0
- package/dist/worksheet.mjs +247 -0
- package/dist/worksheet.mjs.map +1 -0
- package/dist/writer-DspzfkNA.mjs +221 -0
- package/dist/writer-DspzfkNA.mjs.map +1 -0
- package/dist/xml/index.d.ts +10 -0
- package/dist/xml/iterparse.d.ts +22 -0
- package/dist/xml/namespaces.d.ts +91 -0
- package/dist/xml/parser.d.ts +7 -0
- package/dist/xml/serializer.d.ts +14 -0
- package/dist/xml/stream-writer.d.ts +39 -0
- package/dist/xml/tree.d.ts +37 -0
- package/dist/xml.mjs +140 -0
- package/dist/xml.mjs.map +1 -0
- package/dist/zip/decompression-guard.d.ts +70 -0
- package/dist/zip/index.d.ts +6 -0
- package/dist/zip/random-access-reader.d.ts +16 -0
- package/dist/zip/reader.d.ts +45 -0
- package/dist/zip/writer.d.ts +65 -0
- package/dist/zip/zip64-patch.d.ts +12 -0
- package/dist/zip.mjs +3 -0
- package/package.json +147 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { n as escapeXmlAttr, r as escapeXmlText } from "./escape-DFTE7ZJc.mjs";
|
|
2
|
+
import { At as parseQName, Dt as XML_NS, V as DEFAULT_PREFIXES } from "./tree-Bbs1C8Rc.mjs";
|
|
3
|
+
//#region src/xml/serializer.ts
|
|
4
|
+
/**
|
|
5
|
+
* Serialize an {@link XmlNode} tree into a UTF-8 byte payload. The
|
|
6
|
+
* inverse of {@link parseXml}: `parseXml(serializeXml(n))` yields a
|
|
7
|
+
* tree structurally equivalent to `n` modulo attribute insertion order
|
|
8
|
+
* (which both directions preserve on Node 18+ / V8).
|
|
9
|
+
*/
|
|
10
|
+
function serializeXml(root, opts = {}) {
|
|
11
|
+
const { xmlDeclaration = true, standalone = "yes" } = opts;
|
|
12
|
+
const allocation = allocatePrefixes(root);
|
|
13
|
+
const out = [];
|
|
14
|
+
if (xmlDeclaration) {
|
|
15
|
+
out.push("<?xml version=\"1.0\" encoding=\"UTF-8\"");
|
|
16
|
+
if (standalone !== "omit") out.push(` standalone="${standalone}"`);
|
|
17
|
+
out.push("?>\n");
|
|
18
|
+
}
|
|
19
|
+
emit(out, root, allocation, true);
|
|
20
|
+
return new TextEncoder().encode(out.join(""));
|
|
21
|
+
}
|
|
22
|
+
const allocatePrefixes = (root) => {
|
|
23
|
+
const used = /* @__PURE__ */ new Set();
|
|
24
|
+
collectNamespaces(root, used, true);
|
|
25
|
+
used.delete("");
|
|
26
|
+
const rootNs = parseQName(root.name).ns;
|
|
27
|
+
let defaultNs = "";
|
|
28
|
+
if (rootNs && DEFAULT_PREFIXES[rootNs] === "") defaultNs = rootNs;
|
|
29
|
+
const prefixOf = /* @__PURE__ */ new Map();
|
|
30
|
+
if (defaultNs !== "") prefixOf.set(defaultNs, "");
|
|
31
|
+
prefixOf.set(XML_NS, "xml");
|
|
32
|
+
let auto = 0;
|
|
33
|
+
const usedPrefixes = new Set([
|
|
34
|
+
"",
|
|
35
|
+
"xml",
|
|
36
|
+
"xmlns"
|
|
37
|
+
]);
|
|
38
|
+
const ordered = Array.from(used).sort();
|
|
39
|
+
for (const ns of ordered) {
|
|
40
|
+
if (prefixOf.has(ns)) continue;
|
|
41
|
+
const preferred = DEFAULT_PREFIXES[ns];
|
|
42
|
+
if (preferred !== void 0 && preferred !== "" && !usedPrefixes.has(preferred)) {
|
|
43
|
+
prefixOf.set(ns, preferred);
|
|
44
|
+
usedPrefixes.add(preferred);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
for (const ns of ordered) {
|
|
48
|
+
if (prefixOf.has(ns)) continue;
|
|
49
|
+
let prefix = `ns${auto++}`;
|
|
50
|
+
while (usedPrefixes.has(prefix)) prefix = `ns${auto++}`;
|
|
51
|
+
prefixOf.set(ns, prefix);
|
|
52
|
+
usedPrefixes.add(prefix);
|
|
53
|
+
}
|
|
54
|
+
const declarations = [];
|
|
55
|
+
if (defaultNs !== "") declarations.push({
|
|
56
|
+
prefix: "",
|
|
57
|
+
ns: defaultNs
|
|
58
|
+
});
|
|
59
|
+
for (const ns of ordered) {
|
|
60
|
+
if (ns === defaultNs) continue;
|
|
61
|
+
if (ns === "http://www.w3.org/XML/1998/namespace") continue;
|
|
62
|
+
const prefix = prefixOf.get(ns);
|
|
63
|
+
if (prefix === void 0) continue;
|
|
64
|
+
declarations.push({
|
|
65
|
+
prefix,
|
|
66
|
+
ns
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
prefixOf,
|
|
71
|
+
declarations
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
const collectNamespaces = (node, into, attrsToo) => {
|
|
75
|
+
into.add(parseQName(node.name).ns);
|
|
76
|
+
if (attrsToo) for (const attrName of Object.keys(node.attrs)) into.add(parseQName(attrName).ns);
|
|
77
|
+
for (const c of node.children) collectNamespaces(c, into, attrsToo);
|
|
78
|
+
};
|
|
79
|
+
const buildElementPrefix = (name, prefixOf) => {
|
|
80
|
+
const { ns, local } = parseQName(name);
|
|
81
|
+
if (ns === "") return local;
|
|
82
|
+
const prefix = prefixOf.get(ns);
|
|
83
|
+
if (prefix === void 0 || prefix === "") return local;
|
|
84
|
+
return `${prefix}:${local}`;
|
|
85
|
+
};
|
|
86
|
+
const buildAttrPrefix = (name, prefixOf) => {
|
|
87
|
+
const { ns, local } = parseQName(name);
|
|
88
|
+
if (ns === "") return local;
|
|
89
|
+
const prefix = prefixOf.get(ns);
|
|
90
|
+
if (prefix === void 0 || prefix === "") return local;
|
|
91
|
+
return `${prefix}:${local}`;
|
|
92
|
+
};
|
|
93
|
+
const emit = (out, node, allocation, isRoot) => {
|
|
94
|
+
const tag = buildElementPrefix(node.name, allocation.prefixOf);
|
|
95
|
+
out.push("<", tag);
|
|
96
|
+
if (isRoot) for (const { prefix, ns } of allocation.declarations) out.push(prefix === "" ? ` xmlns="${escapeXmlAttr(ns)}"` : ` xmlns:${prefix}="${escapeXmlAttr(ns)}"`);
|
|
97
|
+
for (const [name, value] of Object.entries(node.attrs)) {
|
|
98
|
+
const attrName = buildAttrPrefix(name, allocation.prefixOf);
|
|
99
|
+
out.push(" ", attrName, "=\"", escapeXmlAttr(value), "\"");
|
|
100
|
+
}
|
|
101
|
+
const text = node.text;
|
|
102
|
+
const hasText = text !== void 0 && text !== "";
|
|
103
|
+
const hasChildren = node.children.length > 0;
|
|
104
|
+
if (!hasText && !hasChildren) {
|
|
105
|
+
out.push("/>");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
out.push(">");
|
|
109
|
+
if (hasText) out.push(escapeXmlText(text));
|
|
110
|
+
for (const c of node.children) emit(out, c, allocation, false);
|
|
111
|
+
out.push("</", tag, ">");
|
|
112
|
+
};
|
|
113
|
+
//#endregion
|
|
114
|
+
export { serializeXml as t };
|
|
115
|
+
|
|
116
|
+
//# sourceMappingURL=serializer-BwbgHYJV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializer-BwbgHYJV.mjs","names":[],"sources":["../src/xml/serializer.ts"],"sourcesContent":["// DOM-style XML serializer. Inverse of src/xml/parser.ts.\n//\n// XmlNode trees use Clark-notation names (`{ns}local`); the serializer\n// rebuilds prefix mappings and emits a single UTF-8 byte payload.\n//\n// Algorithm:\n// 1. walk the tree once, collecting every namespace URI used by\n// elements or attributes;\n// 2. assign each URI a prefix — DEFAULT_PREFIXES first, then\n// auto-generated `ns{N}` — and decide which (if any) becomes the\n// default (xmlns=\"…\") namespace by reusing the root element's NS;\n// 3. emit the XML declaration, root open tag with all xmlns / xmlns:*\n// declarations, then a recursive children walk that escapes text\n// and attribute values.\n//\n// Output style matches openpyxl/Excel: no whitespace between elements,\n// `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>` on its own\n// line, attribute values quoted with `\"`.\n\nimport { escapeXmlAttr, escapeXmlText } from '../utils/escape';\nimport { DEFAULT_PREFIXES, parseQName, XML_NS } from './namespaces';\nimport type { XmlNode } from './tree';\n\nexport interface SerializeOptions {\n /** Emit `<?xml … ?>` declaration. Defaults to true. */\n xmlDeclaration?: boolean;\n /** `standalone` attribute on the declaration. Defaults to 'yes'. */\n standalone?: 'yes' | 'no' | 'omit';\n}\n\n/**\n * Serialize an {@link XmlNode} tree into a UTF-8 byte payload. The\n * inverse of {@link parseXml}: `parseXml(serializeXml(n))` yields a\n * tree structurally equivalent to `n` modulo attribute insertion order\n * (which both directions preserve on Node 18+ / V8).\n */\nexport function serializeXml(root: XmlNode, opts: SerializeOptions = {}): Uint8Array {\n const { xmlDeclaration = true, standalone = 'yes' } = opts;\n\n const allocation = allocatePrefixes(root);\n const out: string[] = [];\n\n if (xmlDeclaration) {\n out.push('<?xml version=\"1.0\" encoding=\"UTF-8\"');\n if (standalone !== 'omit') out.push(` standalone=\"${standalone}\"`);\n out.push('?>\\n');\n }\n\n emit(out, root, allocation, /* isRoot */ true);\n\n return new TextEncoder().encode(out.join(''));\n}\n\n// ---- prefix allocation ------------------------------------------------------\n\ninterface Allocation {\n /** ns URI → prefix ('' = default namespace) */\n prefixOf: Map<string, string>;\n /** prefix declarations to emit on the root element, in deterministic order */\n declarations: Array<{ prefix: string; ns: string }>;\n}\n\nconst allocatePrefixes = (root: XmlNode): Allocation => {\n const used = new Set<string>();\n collectNamespaces(root, used, /* attrsToo */ true);\n used.delete(''); // empty NS = unprefixed names; not emitted as xmlns\n\n // Decide the default namespace. Prefer the root element's NS if its\n // canonical prefix in DEFAULT_PREFIXES is empty (i.e. designed to live\n // as a default), so the bulk of the root subtree stays unprefixed.\n const rootNs = parseQName(root.name).ns;\n let defaultNs = '';\n if (rootNs && DEFAULT_PREFIXES[rootNs] === '') {\n defaultNs = rootNs;\n }\n\n const prefixOf = new Map<string, string>();\n if (defaultNs !== '') prefixOf.set(defaultNs, '');\n // `xml` and `xmlns` are reserved by the XMLNS spec; xml ↔ XML_NS is\n // predefined and must NOT be redeclared via xmlns:xml=\"…\".\n prefixOf.set(XML_NS, 'xml');\n\n // Pass 1: respect DEFAULT_PREFIXES for namespaces that have a\n // canonical short prefix.\n let auto = 0;\n const usedPrefixes = new Set<string>(['', 'xml', 'xmlns']);\n const ordered = Array.from(used).sort();\n for (const ns of ordered) {\n if (prefixOf.has(ns)) continue;\n const preferred = DEFAULT_PREFIXES[ns];\n if (preferred !== undefined && preferred !== '' && !usedPrefixes.has(preferred)) {\n prefixOf.set(ns, preferred);\n usedPrefixes.add(preferred);\n }\n }\n // Pass 2: auto-allocate for the remainder.\n for (const ns of ordered) {\n if (prefixOf.has(ns)) continue;\n let prefix = `ns${auto++}`;\n while (usedPrefixes.has(prefix)) prefix = `ns${auto++}`;\n prefixOf.set(ns, prefix);\n usedPrefixes.add(prefix);\n }\n\n // Emission order: default first, then other prefixes alphabetically by ns\n // URI for determinism. XML_NS is reserved and never declared.\n const declarations: Array<{ prefix: string; ns: string }> = [];\n if (defaultNs !== '') declarations.push({ prefix: '', ns: defaultNs });\n for (const ns of ordered) {\n if (ns === defaultNs) continue;\n if (ns === XML_NS) continue;\n const prefix = prefixOf.get(ns);\n if (prefix === undefined) continue;\n declarations.push({ prefix, ns });\n }\n\n return { prefixOf, declarations };\n};\n\nconst collectNamespaces = (node: XmlNode, into: Set<string>, attrsToo: boolean): void => {\n into.add(parseQName(node.name).ns);\n if (attrsToo) {\n for (const attrName of Object.keys(node.attrs)) {\n into.add(parseQName(attrName).ns);\n }\n }\n for (const c of node.children) collectNamespaces(c, into, attrsToo);\n};\n\n// ---- emission ---------------------------------------------------------------\n\nconst buildElementPrefix = (name: string, prefixOf: Map<string, string>): string => {\n const { ns, local } = parseQName(name);\n if (ns === '') return local;\n const prefix = prefixOf.get(ns);\n if (prefix === undefined || prefix === '') return local;\n return `${prefix}:${local}`;\n};\n\nconst buildAttrPrefix = (name: string, prefixOf: Map<string, string>): string => {\n const { ns, local } = parseQName(name);\n if (ns === '') return local;\n // Attributes never inherit the default namespace; if the namespace is\n // mapped to the default prefix, they still need an explicit prefix.\n const prefix = prefixOf.get(ns);\n if (prefix === undefined || prefix === '') {\n // Attribute lives in a namespace that we marked as default-only;\n // fall through to no prefix (the namespace must already be declared\n // by ancestor walk, but for default-namespace attrs that's invalid\n // XML — we keep it bare anyway since OOXML never produces this).\n return local;\n }\n return `${prefix}:${local}`;\n};\n\nconst emit = (out: string[], node: XmlNode, allocation: Allocation, isRoot: boolean): void => {\n const tag = buildElementPrefix(node.name, allocation.prefixOf);\n out.push('<', tag);\n\n if (isRoot) {\n for (const { prefix, ns } of allocation.declarations) {\n out.push(prefix === '' ? ` xmlns=\"${escapeXmlAttr(ns)}\"` : ` xmlns:${prefix}=\"${escapeXmlAttr(ns)}\"`);\n }\n }\n\n for (const [name, value] of Object.entries(node.attrs)) {\n const attrName = buildAttrPrefix(name, allocation.prefixOf);\n out.push(' ', attrName, '=\"', escapeXmlAttr(value), '\"');\n }\n\n const text = node.text;\n const hasText = text !== undefined && text !== '';\n const hasChildren = node.children.length > 0;\n if (!hasText && !hasChildren) {\n out.push('/>');\n return;\n }\n\n out.push('>');\n if (hasText) out.push(escapeXmlText(text));\n for (const c of node.children) emit(out, c, allocation, /* isRoot */ false);\n out.push('</', tag, '>');\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { loadWorkbookStream, type IterRowsOptions, type LoadWorkbookStreamOptions, type ReadOnlyCell, type ReadOnlyWorkbook, type ReadOnlyWorksheet, } from './read-only';
|
|
2
|
+
export { createWriteOnlyWorkbook, type WriteOnlyOptions, type WriteOnlyRowItem, type WriteOnlyStyle, type WriteOnlyWorkbook, type WriteOnlyWorksheet, } from './write-only';
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { DecompressionLimits } from '../zip/decompression-guard';
|
|
2
|
+
import type { CellValue } from '../cell/cell';
|
|
3
|
+
import type { XlsxSource } from '../io/source';
|
|
4
|
+
import { type Stylesheet } from '../styles/stylesheet';
|
|
5
|
+
export interface IterRowsOptions {
|
|
6
|
+
minRow?: number;
|
|
7
|
+
maxRow?: number;
|
|
8
|
+
minCol?: number;
|
|
9
|
+
maxCol?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface ReadOnlyCell {
|
|
12
|
+
readonly row: number;
|
|
13
|
+
readonly col: number;
|
|
14
|
+
readonly value: CellValue;
|
|
15
|
+
readonly styleId: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ReadOnlyWorksheet {
|
|
18
|
+
title: string;
|
|
19
|
+
iterRows(opts?: IterRowsOptions): AsyncIterableIterator<ReadOnlyCell[]>;
|
|
20
|
+
iterValues(opts?: IterRowsOptions): AsyncIterableIterator<CellValue[]>;
|
|
21
|
+
}
|
|
22
|
+
export interface ReadOnlyWorkbook {
|
|
23
|
+
sheetNames: string[];
|
|
24
|
+
styles: Stylesheet;
|
|
25
|
+
openWorksheet(name: string): ReadOnlyWorksheet;
|
|
26
|
+
close(): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
/** Options for {@link loadWorkbookStream}. */
|
|
29
|
+
export interface LoadWorkbookStreamOptions {
|
|
30
|
+
/**
|
|
31
|
+
* Decompression-bomb safeguards applied while inflating zip entries.
|
|
32
|
+
* Defaults to limits that fit any legitimate xlsx; pass `false` to disable
|
|
33
|
+
* (only safe for fully trusted sources).
|
|
34
|
+
*/
|
|
35
|
+
decompressionLimits?: DecompressionLimits | false;
|
|
36
|
+
}
|
|
37
|
+
/** Open an xlsx for read-only streaming access. */
|
|
38
|
+
export declare function loadWorkbookStream(source: XlsxSource, opts?: LoadWorkbookStreamOptions): Promise<ReadOnlyWorkbook>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { CellValue } from '../cell/cell';
|
|
2
|
+
import type { XlsxSink } from '../io/sink';
|
|
3
|
+
import type { Alignment } from '../styles/alignment';
|
|
4
|
+
import type { Border } from '../styles/borders';
|
|
5
|
+
import type { Fill } from '../styles/fills';
|
|
6
|
+
import type { Font } from '../styles/fonts';
|
|
7
|
+
import type { Protection } from '../styles/protection';
|
|
8
|
+
export interface WriteOnlyOptions {
|
|
9
|
+
/** Reserved — currently ignored (the buffered backend doesn't honour it). */
|
|
10
|
+
estimatedMaxRow?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface WriteOnlyStyle {
|
|
13
|
+
font?: Font;
|
|
14
|
+
fill?: Fill;
|
|
15
|
+
border?: Border;
|
|
16
|
+
alignment?: Alignment;
|
|
17
|
+
numberFormat?: string;
|
|
18
|
+
protection?: Protection;
|
|
19
|
+
}
|
|
20
|
+
export type WriteOnlyRowItem = CellValue | {
|
|
21
|
+
value: CellValue;
|
|
22
|
+
style?: WriteOnlyStyle;
|
|
23
|
+
};
|
|
24
|
+
export interface WriteOnlyWorksheet {
|
|
25
|
+
readonly title: string;
|
|
26
|
+
appendRow(row: WriteOnlyRowItem[]): Promise<void>;
|
|
27
|
+
setColumnWidth(col: number, width: number): void;
|
|
28
|
+
close(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export interface WriteOnlyWorkbook {
|
|
31
|
+
/** Add a new worksheet. The previous worksheet must be `close()`d first. */
|
|
32
|
+
addWorksheet(title: string): Promise<WriteOnlyWorksheet>;
|
|
33
|
+
/** Finalise the archive: emits styles / sharedStrings / workbook / manifest / rels. */
|
|
34
|
+
finalize(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Release the sink without finalising the archive. Call this from a
|
|
37
|
+
* surrounding catch block when the producer pipeline throws before
|
|
38
|
+
* `finalize()` — without it, streaming destinations (`toFile` /
|
|
39
|
+
* `toWritable`) keep the file descriptor / Writable open and the partial
|
|
40
|
+
* xlsx looks valid on disk.
|
|
41
|
+
*
|
|
42
|
+
* Idempotent. Subsequent `addWorksheet` / `finalize` calls throw.
|
|
43
|
+
*/
|
|
44
|
+
abort(cause?: unknown): void;
|
|
45
|
+
}
|
|
46
|
+
/** Open a workbook for streaming write-only output. */
|
|
47
|
+
export declare function createWriteOnlyWorkbook(sink: XlsxSink, _opts?: WriteOnlyOptions): Promise<WriteOnlyWorkbook>;
|