@office-kit/xlsx 0.17.0 → 0.18.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/README.md +78 -4
- package/dist/{cell-style-DjKKPWDL.mjs → cell-style-CbB4nXTY.mjs} +11 -4
- package/dist/cell-style-CbB4nXTY.mjs.map +1 -0
- package/dist/{differential-7KGzbliB.mjs → differential-QLaKEiBk.mjs} +2 -2
- package/dist/{differential-7KGzbliB.mjs.map → differential-QLaKEiBk.mjs.map} +1 -1
- package/dist/io/load.d.ts +2 -0
- package/dist/io.mjs +2 -2
- package/dist/{iterparse-DZE0zy2M.mjs → iterparse-CZoRXvZW.mjs} +2 -2
- package/dist/{iterparse-DZE0zy2M.mjs.map → iterparse-CZoRXvZW.mjs.map} +1 -1
- package/dist/{load-DIdQ_zum.mjs → load-BpnCPv1S.mjs} +25 -13
- package/dist/load-BpnCPv1S.mjs.map +1 -0
- package/dist/{manifest-BHUYpjUG.mjs → manifest-9p0ccqmR.mjs} +10 -11
- package/dist/manifest-9p0ccqmR.mjs.map +1 -0
- package/dist/node.mjs +1 -1
- package/dist/packaging.mjs +1 -1
- package/dist/{parser-By6RWZVW.mjs → parser-B1tB9YaE.mjs} +15 -5
- package/dist/parser-B1tB9YaE.mjs.map +1 -0
- package/dist/{save-ax11Gsw0.mjs → save-1Z3344nz.mjs} +6 -6
- package/dist/{save-ax11Gsw0.mjs.map → save-1Z3344nz.mjs.map} +1 -1
- package/dist/schema.mjs +1 -1
- package/dist/{serialize-Dmb6Vtt9.mjs → serialize-BtxgssFK.mjs} +2 -2
- package/dist/{serialize-Dmb6Vtt9.mjs.map → serialize-BtxgssFK.mjs.map} +1 -1
- package/dist/{serializer-dhv07Z6F.mjs → serializer-N6XIwsgp.mjs} +2 -2
- package/dist/{serializer-dhv07Z6F.mjs.map → serializer-N6XIwsgp.mjs.map} +1 -1
- package/dist/streaming.mjs +34 -17
- package/dist/streaming.mjs.map +1 -1
- package/dist/styles/display-text.d.ts +95 -0
- package/dist/styles/format-code.d.ts +125 -0
- package/dist/styles/index.d.ts +1 -0
- package/dist/styles/numbers.d.ts +7 -0
- package/dist/styles.mjs +1161 -4
- package/dist/styles.mjs.map +1 -0
- package/dist/{stylesheet-writer-BBYjNSMA.mjs → stylesheet-writer-BEn-0P0x.mjs} +341 -105
- package/dist/stylesheet-writer-BEn-0P0x.mjs.map +1 -0
- package/dist/{table-BFi2WmgG.mjs → table-BxOLUZs3.mjs} +2 -2
- package/dist/{table-BFi2WmgG.mjs.map → table-BxOLUZs3.mjs.map} +1 -1
- package/dist/{tree-BX-sRRVp.mjs → tree-CspNjuYl.mjs} +12 -2
- package/dist/tree-CspNjuYl.mjs.map +1 -0
- package/dist/workbook/index.d.ts +1 -1
- package/dist/workbook/workbook.d.ts +9 -46
- package/dist/{workbook-CMel6UcI.mjs → workbook-tG9oYtzU.mjs} +46 -9
- package/dist/workbook-tG9oYtzU.mjs.map +1 -0
- package/dist/workbook.mjs +2 -2
- package/dist/worksheet/index.d.ts +1 -1
- package/dist/worksheet/worksheet.d.ts +55 -14
- package/dist/{worksheet-Cxn2c-jz.mjs → worksheet-DLMyDD7W.mjs} +85 -20
- package/dist/worksheet-DLMyDD7W.mjs.map +1 -0
- package/dist/worksheet.mjs +3 -3
- package/dist/xml/namespaces.d.ts +7 -0
- package/dist/xml/parser.d.ts +12 -0
- package/dist/xml/strict-package.d.ts +14 -0
- package/dist/xml.mjs +4 -4
- package/package.json +1 -1
- package/dist/cell-style-DjKKPWDL.mjs.map +0 -1
- package/dist/load-DIdQ_zum.mjs.map +0 -1
- package/dist/manifest-BHUYpjUG.mjs.map +0 -1
- package/dist/parser-By6RWZVW.mjs.map +0 -1
- package/dist/stylesheet-writer-BBYjNSMA.mjs.map +0 -1
- package/dist/tree-BX-sRRVp.mjs.map +0 -1
- package/dist/workbook-CMel6UcI.mjs.map +0 -1
- package/dist/worksheet-Cxn2c-jz.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-BHUYpjUG.mjs","names":[],"sources":["../src/packaging/relationships.ts","../src/packaging/core.ts","../src/packaging/custom.ts","../src/packaging/extended.ts","../src/packaging/manifest.ts"],"sourcesContent":["// `*.rels` files — Open Packaging Conventions relationship lists.\n//\n// Mirrors openpyxl/openpyxl/packaging/relationship.py. Relationship Ids\n// (`rId{N}`) auto-increment using the smallest unused integer so the list stays\n// deterministic even when callers mix in pre-assigned ids.\n\nimport { defineSchema, type Schema } from '../schema/core.js';\nimport { fromTree, toTree } from '../schema/serialize.js';\nimport { PKG_REL_NS } from '../xml/namespaces.js';\nimport { parseXml } from '../xml/parser.js';\nimport { serializeXml } from '../xml/serializer.js';\n\nexport interface Relationship {\n /** rIdN identifier; unique within the parent .rels file. */\n id: string;\n /** Full relationship type URI. */\n type: string;\n /** Target — relative part path or absolute URL when targetMode === 'External'. */\n target: string;\n /** Defaults to internal. */\n targetMode?: 'External' | 'Internal';\n}\n\nexport interface Relationships {\n rels: Relationship[];\n}\n\nconst RelationshipSchema = defineSchema<Relationship>({\n tagname: 'Relationship',\n xmlNs: PKG_REL_NS,\n attrs: {\n id: { kind: 'string', xmlName: 'Id' },\n type: { kind: 'string', xmlName: 'Type' },\n target: { kind: 'string', xmlName: 'Target' },\n targetMode: {\n kind: 'enum',\n values: ['External', 'Internal'],\n xmlName: 'TargetMode',\n optional: true,\n },\n },\n elements: [],\n});\n\nconst RelationshipsSchema: Schema<Relationships> = defineSchema<Relationships>({\n tagname: 'Relationships',\n xmlNs: PKG_REL_NS,\n attrs: {},\n elements: [\n {\n kind: 'sequence',\n key: 'rels',\n itemName: 'Relationship',\n itemNs: PKG_REL_NS,\n itemSchema: () => RelationshipSchema,\n },\n ],\n});\n\nexport function makeRelationships(): Relationships {\n return { rels: [] };\n}\n\nconst RID_RE = /^rId(\\d+)$/;\n\nconst allocateNextId = (rels: Relationships): string => {\n // Smallest positive integer not yet used as `rId{N}`. Linear scan is fine\n // because rels lists are small (tens of entries in real workbooks).\n const used = new Set<number>();\n for (const r of rels.rels) {\n const m = RID_RE.exec(r.id);\n if (m !== null) {\n const n = Number.parseInt(m[1] ?? '0', 10);\n if (Number.isFinite(n) && n > 0) used.add(n);\n }\n }\n let n = 1;\n while (used.has(n)) n++;\n return `rId${n}`;\n};\n\n/**\n * Append a relationship and return the resulting object. Auto-assigns the next\n * free `rId{N}` Id.\n */\nexport function appendRel(rels: Relationships, type: string, target: string, targetMode?: 'External'): Relationship {\n const next: Relationship = { id: allocateNextId(rels), type, target };\n if (targetMode !== undefined) next.targetMode = targetMode;\n rels.rels.push(next);\n return next;\n}\n\nexport function findById(rels: Relationships, id: string): Relationship | undefined {\n for (const r of rels.rels) if (r.id === id) return r;\n return undefined;\n}\n\n/**\n * Build an id → relationship index for callers that look up the same .rels\n * file many times in a hot loop. Cheaper than repeated {@link findById} once\n * the rels count crosses a handful of entries.\n */\nexport function indexRelsById(rels: Relationships): Map<string, Relationship> {\n const out = new Map<string, Relationship>();\n for (const r of rels.rels) out.set(r.id, r);\n return out;\n}\n\nexport function findByType(rels: Relationships, type: string): Relationship | undefined {\n for (const r of rels.rels) if (r.type === type) return r;\n return undefined;\n}\n\nexport function findAllByType(rels: Relationships, type: string): Relationship[] {\n const out: Relationship[] = [];\n for (const r of rels.rels) if (r.type === type) out.push(r);\n return out;\n}\n\nexport function relsToBytes(rels: Relationships): Uint8Array {\n return serializeXml(toTree(rels, RelationshipsSchema));\n}\n\nexport function relsFromBytes(bytes: Uint8Array | string): Relationships {\n return fromTree(parseXml(bytes), RelationshipsSchema);\n}\n","// `docProps/core.xml` — Dublin Core / Office core document properties.\n//\n// Each property lives in its own namespace (cp / dc / dcterms). The dcterms\n// timestamps carry an `xsi:type=\"dcterms:W3CDTF\"` marker which we reproduce as\n// a fixed attr on those text elements via the schema layer's `text` element\n// kind.\n\nimport { defineSchema, type Schema } from '../schema/core.js';\nimport { fromTree, toTree } from '../schema/serialize.js';\nimport { COREPROPS_NS, DCORE_NS, DCTERMS_NS, XSI_NS } from '../xml/namespaces.js';\nimport { parseXml } from '../xml/parser.js';\nimport { serializeXml } from '../xml/serializer.js';\n\n/**\n * Set of properties exposed under `docProps/core.xml`. All fields are optional;\n * the workbook only emits those that are set. Timestamps are stored as ISO-8601\n * strings (the W3CDTF subset) — no Date conversion happens at this layer;\n * phase-3 saveWorkbook is responsible for stamping `modified` to `now()` on\n * each save.\n */\nexport interface CoreProperties {\n category?: string;\n contentStatus?: string;\n /** ISO-8601 W3CDTF; auto-stamped on save in phase 3. */\n created?: string;\n creator?: string;\n description?: string;\n identifier?: string;\n keywords?: string;\n language?: string;\n lastModifiedBy?: string;\n /** ISO-8601 W3CDTF. */\n lastPrinted?: string;\n /** ISO-8601 W3CDTF; auto-stamped on save in phase 3. */\n modified?: string;\n revision?: string;\n subject?: string;\n title?: string;\n version?: string;\n}\n\nconst W3CDTF_ATTRS: Record<string, string> = {\n [`{${XSI_NS}}type`]: 'dcterms:W3CDTF',\n};\n\nconst CorePropertiesSchema: Schema<CoreProperties> = defineSchema<CoreProperties>({\n tagname: 'coreProperties',\n xmlNs: COREPROPS_NS,\n attrs: {},\n elements: [\n // openpyxl's child-namespace assignment, mirrored exactly:\n { kind: 'text', key: 'category', xmlNs: COREPROPS_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'contentStatus', xmlNs: COREPROPS_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'keywords', xmlNs: COREPROPS_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'lastModifiedBy', xmlNs: COREPROPS_NS, primitive: 'string', optional: true },\n {\n kind: 'text',\n key: 'lastPrinted',\n xmlNs: DCTERMS_NS,\n primitive: 'string',\n optional: true,\n attrs: W3CDTF_ATTRS,\n },\n { kind: 'text', key: 'revision', xmlNs: COREPROPS_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'version', xmlNs: COREPROPS_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'description', xmlNs: DCORE_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'identifier', xmlNs: DCORE_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'language', xmlNs: DCORE_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'subject', xmlNs: DCORE_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'title', xmlNs: DCORE_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'creator', xmlNs: DCORE_NS, primitive: 'string', optional: true },\n {\n kind: 'text',\n key: 'created',\n xmlNs: DCTERMS_NS,\n primitive: 'string',\n optional: true,\n attrs: W3CDTF_ATTRS,\n },\n {\n kind: 'text',\n key: 'modified',\n xmlNs: DCTERMS_NS,\n primitive: 'string',\n optional: true,\n attrs: W3CDTF_ATTRS,\n },\n ],\n});\n\nexport function makeCoreProperties(): CoreProperties {\n return {};\n}\n\nexport function corePropsToBytes(p: CoreProperties): Uint8Array {\n return serializeXml(toTree(p, CorePropertiesSchema));\n}\n\nexport function corePropsFromBytes(bytes: Uint8Array | string): CoreProperties {\n return fromTree(parseXml(bytes), CorePropertiesSchema);\n}\n\n// ---- Workbook ergonomic helpers ----------------------------------------\n\nimport type { Workbook } from '../workbook/workbook.js';\n\nconst ensureCoreProperties = (wb: Workbook): CoreProperties => {\n if (!wb.properties) wb.properties = {};\n return wb.properties;\n};\n\n/** Set the document author (Excel \"File → Properties → Author\"). */\nexport const setWorkbookCreator = (wb: Workbook, creator: string): void => {\n ensureCoreProperties(wb).creator = creator;\n};\n\n/** Set the document title. */\nexport const setWorkbookTitle = (wb: Workbook, title: string): void => {\n ensureCoreProperties(wb).title = title;\n};\n\n/** Set the document subject. */\nexport const setWorkbookSubject = (wb: Workbook, subject: string): void => {\n ensureCoreProperties(wb).subject = subject;\n};\n\n/** Set the document description / abstract. */\nexport const setWorkbookDescription = (wb: Workbook, description: string): void => {\n ensureCoreProperties(wb).description = description;\n};\n\n/** Set comma- or semicolon-separated keywords. */\nexport const setWorkbookKeywords = (wb: Workbook, keywords: string): void => {\n ensureCoreProperties(wb).keywords = keywords;\n};\n\n/** Set the \"last modified by\" name (defaults to creator if absent). */\nexport const setWorkbookLastModifiedBy = (wb: Workbook, name: string): void => {\n ensureCoreProperties(wb).lastModifiedBy = name;\n};\n\n/** Set the document category (e.g. \"Reports\", \"Drafts\"). */\nexport const setWorkbookCategory = (wb: Workbook, category: string): void => {\n ensureCoreProperties(wb).category = category;\n};\n","// `docProps/custom.xml` — user-defined document properties. Each <property>\n// carries fmtid/pid/name attributes plus a single typed value child from the\n// vt: namespace (vt:lpwstr, vt:i4, vt:bool, …).\n//\n// The Schema layer drives the <property> element attribute set; the typed-value\n// child is stored as a raw XmlNode and the `make*Value` / `read*Value` helpers\n// below cover the most common conversions.\n\nimport { OpenXmlSchemaError } from '../utils/exceptions.js';\nimport { CPROPS_FMTID, CUSTPROPS_NS, parseQName, VTYPES_NS } from '../xml/namespaces.js';\nimport { parseXml } from '../xml/parser.js';\nimport { serializeXml } from '../xml/serializer.js';\nimport { el, type XmlNode } from '../xml/tree.js';\n\nexport interface CustomProperty {\n /** User-visible property name (must be unique within the workbook). */\n name: string;\n /** OOXML \"Property Identifier\"; ≥ 2. Auto-allocated if absent on append. */\n pid: number;\n /** Format ID GUID. Defaults to the well-known {D5CDD505-…} on append. */\n fmtid?: string;\n /** Typed value as a raw vt: element. Use the `make*Value` helpers. */\n value: XmlNode;\n}\n\nexport interface CustomProperties {\n properties: CustomProperty[];\n}\n\nexport function makeCustomProperties(): CustomProperties {\n return { properties: [] };\n}\n\nconst PROPERTY_NAME = `{${CUSTPROPS_NS}}property`;\nconst PROPERTIES_NAME = `{${CUSTPROPS_NS}}Properties`;\n\n// ---- typed-value constructors ----------------------------------------------\n\nconst vt = (local: string, text: string): XmlNode => el(`{${VTYPES_NS}}${local}`, {}, [], text);\n\nexport function makeStringValue(s: string): XmlNode {\n return vt('lpwstr', s);\n}\nexport function makeAsciiStringValue(s: string): XmlNode {\n return vt('lpstr', s);\n}\nexport function makeIntValue(n: number): XmlNode {\n if (!Number.isInteger(n)) throw new OpenXmlSchemaError(`makeIntValue: ${n} is not an integer`);\n return vt('i4', String(n));\n}\nexport function makeDoubleValue(n: number): XmlNode {\n if (!Number.isFinite(n)) throw new OpenXmlSchemaError(`makeDoubleValue: ${n} is not finite`);\n return vt('r8', String(n));\n}\nexport function makeBoolValue(b: boolean): XmlNode {\n return vt('bool', b ? '1' : '0');\n}\nexport function makeFiletimeValue(iso: string): XmlNode {\n return vt('filetime', iso);\n}\nexport function makeDateValue(iso: string): XmlNode {\n return vt('date', iso);\n}\n\n// ---- typed-value readers ---------------------------------------------------\n\nconst localNameOf = (n: XmlNode): string => parseQName(n.name).local;\n\nexport function readStringValue(v: XmlNode): string | undefined {\n const ln = localNameOf(v);\n if (ln === 'lpwstr' || ln === 'lpstr' || ln === 'bstr') return v.text ?? '';\n return undefined;\n}\nexport function readIntValue(v: XmlNode): number | undefined {\n const ln = localNameOf(v);\n if (\n ln === 'i4' ||\n ln === 'i2' ||\n ln === 'i1' ||\n ln === 'int' ||\n ln === 'uint' ||\n ln === 'ui4' ||\n ln === 'ui2' ||\n ln === 'ui1'\n ) {\n const n = Number.parseInt(v.text ?? '', 10);\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\nexport function readDoubleValue(v: XmlNode): number | undefined {\n const ln = localNameOf(v);\n if (ln === 'r4' || ln === 'r8' || ln === 'decimal' || ln === 'cy') {\n const n = Number.parseFloat(v.text ?? '');\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\nexport function readBoolValue(v: XmlNode): boolean | undefined {\n if (localNameOf(v) !== 'bool') return undefined;\n const t = (v.text ?? '').toLowerCase();\n if (t === '1' || t === 'true' || t === 't') return true;\n if (t === '0' || t === 'false' || t === 'f') return false;\n return undefined;\n}\nexport function readFiletimeValue(v: XmlNode): string | undefined {\n if (localNameOf(v) === 'filetime') return v.text ?? '';\n return undefined;\n}\n\n// ---- collection ops --------------------------------------------------------\n\nconst allocatePid = (props: CustomProperties): number => {\n // pid 0 / 1 are reserved by the OPC spec; user pids start at 2.\n const used = new Set<number>();\n for (const p of props.properties) used.add(p.pid);\n let n = 2;\n while (used.has(n)) n++;\n return n;\n};\n\nexport function appendCustomProperty(\n props: CustomProperties,\n name: string,\n value: XmlNode,\n opts?: { pid?: number; fmtid?: string },\n): CustomProperty {\n const pid = opts?.pid ?? allocatePid(props);\n const out: CustomProperty = { name, pid, value };\n if (opts?.fmtid !== undefined) out.fmtid = opts.fmtid;\n props.properties.push(out);\n return out;\n}\n\nexport function findCustomPropertyByName(props: CustomProperties, name: string): CustomProperty | undefined {\n for (const p of props.properties) if (p.name === name) return p;\n return undefined;\n}\n\n// ---- bytes round-trip ------------------------------------------------------\n\nexport function customPropsToBytes(p: CustomProperties): Uint8Array {\n const root = el(PROPERTIES_NAME);\n for (const prop of p.properties) {\n const propEl = el(PROPERTY_NAME, {\n fmtid: prop.fmtid ?? CPROPS_FMTID,\n pid: String(prop.pid),\n name: prop.name,\n });\n propEl.children.push(prop.value);\n root.children.push(propEl);\n }\n return serializeXml(root);\n}\n\nexport function customPropsFromBytes(bytes: Uint8Array | string): CustomProperties {\n const root = parseXml(bytes);\n if (root.name !== PROPERTIES_NAME) {\n throw new OpenXmlSchemaError(`customPropsFromBytes: expected <Properties>, got \"${root.name}\"`);\n }\n const properties: CustomProperty[] = [];\n for (const propEl of root.children) {\n if (propEl.name !== PROPERTY_NAME) continue;\n const fmtid = propEl.attrs['fmtid'];\n const pidRaw = propEl.attrs['pid'];\n const name = propEl.attrs['name'];\n if (name === undefined || pidRaw === undefined) {\n throw new OpenXmlSchemaError('custom.xml: <property> requires name and pid attributes');\n }\n const pid = Number.parseInt(pidRaw, 10);\n if (!Number.isFinite(pid)) {\n throw new OpenXmlSchemaError(`custom.xml: <property> pid is not an integer (got \"${pidRaw}\")`);\n }\n const value = propEl.children[0];\n if (value === undefined) {\n throw new OpenXmlSchemaError(`custom.xml: <property name=\"${name}\"> has no typed-value child`);\n }\n const out: CustomProperty = { name, pid, value };\n if (fmtid !== undefined) out.fmtid = fmtid;\n properties.push(out);\n }\n return { properties };\n}\n\n// ---- Workbook ergonomic helpers ----------------------------------------\n\nimport type { Workbook } from '../workbook/workbook.js';\n\nconst ensureCustomProperties = (wb: Workbook): CustomProperties => {\n if (!wb.customProperties) wb.customProperties = makeCustomProperties();\n return wb.customProperties;\n};\n\nconst replaceOrAppend = (\n wb: Workbook,\n name: string,\n value: XmlNode,\n opts?: { fmtid?: string },\n): CustomProperty => {\n const props = ensureCustomProperties(wb);\n const existing = findCustomPropertyByName(props, name);\n if (existing) {\n existing.value = value;\n if (opts?.fmtid !== undefined) existing.fmtid = opts.fmtid;\n return existing;\n }\n return appendCustomProperty(props, name, value, opts);\n};\n\n/** Set (or replace) a custom string property. */\nexport const setCustomStringProperty = (wb: Workbook, name: string, value: string): CustomProperty =>\n replaceOrAppend(wb, name, makeStringValue(value));\n\n/**\n * Set (or replace) a custom numeric property. Integers (within Int32 range) are\n * stored as `vt:i4`; non-integer / out-of-range numbers as `vt:r8` doubles.\n */\nexport const setCustomNumberProperty = (wb: Workbook, name: string, value: number): CustomProperty => {\n if (!Number.isFinite(value)) {\n throw new OpenXmlSchemaError(`setCustomNumberProperty: value \"${value}\" is not finite`);\n }\n const isInt32 = Number.isInteger(value) && value >= -2147483648 && value <= 2147483647;\n const node = isInt32 ? makeIntValue(value) : makeDoubleValue(value);\n return replaceOrAppend(wb, name, node);\n};\n\n/** Set (or replace) a custom boolean property. */\nexport const setCustomBoolProperty = (wb: Workbook, name: string, value: boolean): CustomProperty =>\n replaceOrAppend(wb, name, makeBoolValue(value));\n\n/**\n * Set (or replace) a custom date property. Accepts a `Date` (converted to ISO\n * via `toISOString()`) or a pre-formatted W3C-DTF string.\n */\nexport const setCustomDateProperty = (\n wb: Workbook,\n name: string,\n value: Date | string,\n): CustomProperty => {\n const iso = value instanceof Date ? value.toISOString() : value;\n return replaceOrAppend(wb, name, makeFiletimeValue(iso));\n};\n\n/**\n * Read the typed value of a custom property by name. Tries each decoder in turn\n * — string, int, double, bool, filetime — and returns the first hit. Returns\n * `undefined` for unknown names or unsupported types.\n */\nexport const getCustomPropertyValue = (\n wb: Workbook,\n name: string,\n): string | number | boolean | undefined => {\n if (!wb.customProperties) return undefined;\n const prop = findCustomPropertyByName(wb.customProperties, name);\n if (!prop) return undefined;\n const s = readStringValue(prop.value);\n if (s !== undefined) return s;\n const i = readIntValue(prop.value);\n if (i !== undefined) return i;\n const d = readDoubleValue(prop.value);\n if (d !== undefined) return d;\n const b = readBoolValue(prop.value);\n if (b !== undefined) return b;\n const ft = readFiletimeValue(prop.value);\n if (ft !== undefined) return ft;\n return undefined;\n};\n\n/**\n * Remove a custom property by name. Returns `true` when one was removed,\n * `false` when the name wasn't found.\n */\nexport const removeCustomProperty = (wb: Workbook, name: string): boolean => {\n if (!wb.customProperties) return false;\n const arr = wb.customProperties.properties;\n const i = arr.findIndex((p) => p.name === name);\n if (i < 0) return false;\n arr.splice(i, 1);\n return true;\n};\n\n/** Read-only snapshot of every custom property. */\nexport const listCustomProperties = (wb: Workbook): ReadonlyArray<CustomProperty> => {\n return wb.customProperties?.properties ?? [];\n};\n","// `docProps/app.xml` — Office \"extended\" document properties.\n//\n// Mirrors openpyxl/openpyxl/packaging/extended.py. Most fields are flat (text\n// or numeric). The four vector-shaped children — HeadingPairs, TitlesOfParts,\n// HLinks, DigSig — are kept as raw XmlNode subtrees and round-tripped verbatim;\n// modelling vt:vector explicitly is a phase-3 concern at the earliest. See row\n// for `packaging/extended.py`.\n\nimport { defineSchema, type Schema } from '../schema/core.js';\nimport { fromTree, toTree } from '../schema/serialize.js';\nimport { XPROPS_NS } from '../xml/namespaces.js';\nimport { parseXml } from '../xml/parser.js';\nimport { serializeXml } from '../xml/serializer.js';\nimport type { XmlNode } from '../xml/tree.js';\n\nexport interface ExtendedProperties {\n application?: string;\n appVersion?: string;\n characters?: number;\n charactersWithSpaces?: number;\n company?: string;\n digitalSignature?: XmlNode;\n docSecurity?: number;\n hLinks?: XmlNode;\n headingPairs?: XmlNode;\n hiddenSlides?: number;\n hyperlinkBase?: string;\n hyperlinks?: XmlNode;\n hyperlinksChanged?: boolean;\n lines?: number;\n linksUpToDate?: boolean;\n manager?: string;\n mmClips?: number;\n notes?: number;\n pages?: number;\n paragraphs?: number;\n presentationFormat?: string;\n scaleCrop?: boolean;\n sharedDoc?: boolean;\n slides?: number;\n template?: string;\n titlesOfParts?: XmlNode;\n totalTime?: number;\n words?: number;\n}\n\nconst ExtendedSchema: Schema<ExtendedProperties> = defineSchema<ExtendedProperties>({\n tagname: 'Properties',\n xmlNs: XPROPS_NS,\n attrs: {},\n // Element order chosen to match the Office output convention.\n elements: [\n { kind: 'text', key: 'template', xmlNs: XPROPS_NS, name: 'Template', primitive: 'string', optional: true },\n { kind: 'text', key: 'manager', xmlNs: XPROPS_NS, name: 'Manager', primitive: 'string', optional: true },\n { kind: 'text', key: 'company', xmlNs: XPROPS_NS, name: 'Company', primitive: 'string', optional: true },\n { kind: 'text', key: 'pages', xmlNs: XPROPS_NS, name: 'Pages', primitive: 'int', optional: true },\n { kind: 'text', key: 'words', xmlNs: XPROPS_NS, name: 'Words', primitive: 'int', optional: true },\n { kind: 'text', key: 'characters', xmlNs: XPROPS_NS, name: 'Characters', primitive: 'int', optional: true },\n {\n kind: 'text',\n key: 'presentationFormat',\n xmlNs: XPROPS_NS,\n name: 'PresentationFormat',\n primitive: 'string',\n optional: true,\n },\n { kind: 'text', key: 'lines', xmlNs: XPROPS_NS, name: 'Lines', primitive: 'int', optional: true },\n { kind: 'text', key: 'paragraphs', xmlNs: XPROPS_NS, name: 'Paragraphs', primitive: 'int', optional: true },\n { kind: 'text', key: 'slides', xmlNs: XPROPS_NS, name: 'Slides', primitive: 'int', optional: true },\n { kind: 'text', key: 'notes', xmlNs: XPROPS_NS, name: 'Notes', primitive: 'int', optional: true },\n { kind: 'text', key: 'totalTime', xmlNs: XPROPS_NS, name: 'TotalTime', primitive: 'int', optional: true },\n { kind: 'text', key: 'hiddenSlides', xmlNs: XPROPS_NS, name: 'HiddenSlides', primitive: 'int', optional: true },\n { kind: 'text', key: 'mmClips', xmlNs: XPROPS_NS, name: 'MMClips', primitive: 'int', optional: true },\n { kind: 'text', key: 'scaleCrop', xmlNs: XPROPS_NS, name: 'ScaleCrop', primitive: 'bool', optional: true },\n { kind: 'raw', key: 'headingPairs', xmlNs: XPROPS_NS, name: 'HeadingPairs', optional: true },\n { kind: 'raw', key: 'titlesOfParts', xmlNs: XPROPS_NS, name: 'TitlesOfParts', optional: true },\n { kind: 'raw', key: 'hLinks', xmlNs: XPROPS_NS, name: 'HLinks', optional: true },\n { kind: 'raw', key: 'hyperlinks', xmlNs: XPROPS_NS, name: 'Hyperlinks', optional: true },\n { kind: 'text', key: 'linksUpToDate', xmlNs: XPROPS_NS, name: 'LinksUpToDate', primitive: 'bool', optional: true },\n { kind: 'text', key: 'sharedDoc', xmlNs: XPROPS_NS, name: 'SharedDoc', primitive: 'bool', optional: true },\n {\n kind: 'text',\n key: 'hyperlinkBase',\n xmlNs: XPROPS_NS,\n name: 'HyperlinkBase',\n primitive: 'string',\n optional: true,\n },\n {\n kind: 'text',\n key: 'hyperlinksChanged',\n xmlNs: XPROPS_NS,\n name: 'HyperlinksChanged',\n primitive: 'bool',\n optional: true,\n },\n { kind: 'raw', key: 'digitalSignature', xmlNs: XPROPS_NS, name: 'DigSig', optional: true },\n { kind: 'text', key: 'application', xmlNs: XPROPS_NS, name: 'Application', primitive: 'string', optional: true },\n { kind: 'text', key: 'appVersion', xmlNs: XPROPS_NS, name: 'AppVersion', primitive: 'string', optional: true },\n { kind: 'text', key: 'docSecurity', xmlNs: XPROPS_NS, name: 'DocSecurity', primitive: 'int', optional: true },\n {\n kind: 'text',\n key: 'charactersWithSpaces',\n xmlNs: XPROPS_NS,\n name: 'CharactersWithSpaces',\n primitive: 'int',\n optional: true,\n },\n ],\n});\n\nexport function makeExtendedProperties(): ExtendedProperties {\n return {};\n}\n\nexport function extendedPropsToBytes(p: ExtendedProperties): Uint8Array {\n return serializeXml(toTree(p, ExtendedSchema));\n}\n\nexport function extendedPropsFromBytes(bytes: Uint8Array | string): ExtendedProperties {\n return fromTree(parseXml(bytes), ExtendedSchema);\n}\n\n// ---- Workbook ergonomic helpers ----------------------------------------\n\nimport type { Workbook } from '../workbook/workbook.js';\n\nconst ensureAppProperties = (wb: Workbook): ExtendedProperties => {\n if (!wb.appProperties) wb.appProperties = {};\n return wb.appProperties;\n};\n\n/** Set the company name on docProps/app.xml. */\nexport const setWorkbookCompany = (wb: Workbook, company: string): void => {\n ensureAppProperties(wb).company = company;\n};\n\n/** Set the manager / supervisor name on docProps/app.xml. */\nexport const setWorkbookManager = (wb: Workbook, manager: string): void => {\n ensureAppProperties(wb).manager = manager;\n};\n\n/** Set the application name (e.g. `\"Microsoft Excel\"`). */\nexport const setWorkbookApplication = (wb: Workbook, application: string): void => {\n ensureAppProperties(wb).application = application;\n};\n\n/** Set the application version (typically `\"16.0300\"` for Excel 365). */\nexport const setWorkbookAppVersion = (wb: Workbook, version: string): void => {\n ensureAppProperties(wb).appVersion = version;\n};\n\n/** Set the hyperlink base URL — Excel uses this as a prefix for relative `&F` codes. */\nexport const setWorkbookHyperlinkBase = (wb: Workbook, base: string): void => {\n ensureAppProperties(wb).hyperlinkBase = base;\n};\n","// [Content_Types].xml — the package manifest. Tracks default content types per\n// file extension and per-part Override entries.\n\nimport { defineSchema, type Schema } from '../schema/core.js';\nimport { fromTree, toTree } from '../schema/serialize.js';\nimport { CONTYPES_NS } from '../xml/namespaces.js';\nimport { parseXml } from '../xml/parser.js';\nimport { serializeXml } from '../xml/serializer.js';\n\nexport interface DefaultEntry {\n /** File extension without leading dot (e.g. \"rels\", \"xml\", \"png\"). */\n ext: string;\n contentType: string;\n}\n\nexport interface OverrideEntry {\n /** Part name path including leading slash (e.g. \"/xl/workbook.xml\"). */\n partName: string;\n contentType: string;\n}\n\nexport interface Manifest {\n defaults: DefaultEntry[];\n overrides: OverrideEntry[];\n}\n\nconst DefaultSchema = defineSchema<DefaultEntry>({\n tagname: 'Default',\n xmlNs: CONTYPES_NS,\n attrs: {\n ext: { kind: 'string', xmlName: 'Extension' },\n contentType: { kind: 'string', xmlName: 'ContentType' },\n },\n elements: [],\n});\n\nconst OverrideSchema = defineSchema<OverrideEntry>({\n tagname: 'Override',\n xmlNs: CONTYPES_NS,\n attrs: {\n partName: { kind: 'string', xmlName: 'PartName' },\n contentType: { kind: 'string', xmlName: 'ContentType' },\n },\n elements: [],\n});\n\nconst ManifestSchema: Schema<Manifest> = defineSchema<Manifest>({\n tagname: 'Types',\n xmlNs: CONTYPES_NS,\n attrs: {},\n elements: [\n {\n kind: 'sequence',\n key: 'defaults',\n itemName: 'Default',\n itemNs: CONTYPES_NS,\n itemSchema: () => DefaultSchema,\n },\n {\n kind: 'sequence',\n key: 'overrides',\n itemName: 'Override',\n itemNs: CONTYPES_NS,\n itemSchema: () => OverrideSchema,\n },\n ],\n});\n\nexport function makeManifest(): Manifest {\n return { defaults: [], overrides: [] };\n}\n\n/** Register a default content type for an extension. Idempotent. */\nexport function addDefault(m: Manifest, ext: string, contentType: string): void {\n for (const d of m.defaults) {\n if (d.ext === ext) {\n if (d.contentType !== contentType) {\n d.contentType = contentType; // newer wins; matches openpyxl behaviour\n }\n return;\n }\n }\n m.defaults.push({ ext, contentType });\n}\n\n/** Register an Override for a specific part. Idempotent. */\nexport function addOverride(m: Manifest, partName: string, contentType: string): void {\n for (const o of m.overrides) {\n if (o.partName === partName) {\n if (o.contentType !== contentType) o.contentType = contentType;\n return;\n }\n }\n m.overrides.push({ partName, contentType });\n}\n\nexport function findOverride(m: Manifest, partName: string): OverrideEntry | undefined {\n for (const o of m.overrides) if (o.partName === partName) return o;\n return undefined;\n}\n\n/** Find the first Override matching a content type. */\nexport function findOverrideByContentType(m: Manifest, contentType: string): OverrideEntry | undefined {\n for (const o of m.overrides) if (o.contentType === contentType) return o;\n return undefined;\n}\n\nexport function manifestToBytes(m: Manifest): Uint8Array {\n return serializeXml(toTree(m, ManifestSchema));\n}\n\nexport function manifestFromBytes(bytes: Uint8Array | string): Manifest {\n return fromTree(parseXml(bytes), ManifestSchema);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parser-By6RWZVW.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.js';\nimport { qname } from './namespaces.js';\nimport { el, type XmlNode } from './tree.js';\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 TEXT_KEY = '#text';\nconst CDATA_KEY = '#cdata';\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 // Decode entities ourselves below. fast-xml-parser expands the five named\n // XML entities but leaves numeric character references untouched. Keeping\n // its processing disabled also lets us preserve XML's single-pass semantics\n // (`&#65;` is the literal text \"A\", not \"A\").\n processEntities: false,\n htmlEntities: false,\n // Without this, CDATA content is merged into `#text` and would go through\n // entity decoding, but CDATA is literal: `<![CDATA[&]]>` is \"&\".\n cdataPropName: CDATA_KEY,\n});\n\nconst XML_ENTITY_RE = /&(amp|lt|gt|quot|apos|#(?:[0-9]+|x[0-9A-Fa-f]+));/g;\n\n/** Decode the five predefined XML entities and decimal/hex character refs once. */\nconst decodeXmlEntities = (value: string): string =>\n value.replace(XML_ENTITY_RE, (reference, body: string) => {\n switch (body) {\n case 'amp':\n return '&';\n case 'lt':\n return '<';\n case 'gt':\n return '>';\n case 'quot':\n return '\"';\n case 'apos':\n return \"'\";\n default: {\n const radix = body[1] === 'x' ? 16 : 10;\n const digits = radix === 16 ? body.slice(2) : body.slice(1);\n const codePoint = Number.parseInt(digits, radix);\n if (!isXmlCodePoint(codePoint)) {\n throw new OpenXmlSchemaError(`parseXml: invalid XML character reference \"${reference}\"`);\n }\n return String.fromCodePoint(codePoint);\n }\n }\n });\n\nconst isXmlCodePoint = (codePoint: number): boolean =>\n codePoint === 0x09 ||\n codePoint === 0x0a ||\n codePoint === 0x0d ||\n (codePoint >= 0x20 && codePoint <= 0xd7ff) ||\n (codePoint >= 0xe000 && codePoint <= 0xfffd) ||\n (codePoint >= 0x10000 && codePoint <= 0x10ffff);\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 = ':@';\n\n// ---- public API -------------------------------------------------------------\n\nexport interface ParsedDocument {\n root: XmlNode;\n /**\n * The root element's own `xmlns` declarations, in source order (`prefix` is\n * `''` for the default one). Clark notation carries the namespace but not\n * the prefix, so these are only needed by parts that must be written back\n * with the prefixes the producer chose — `xl/workbook.xml`, whose\n * `mc:Ignorable` names them by prefix.\n */\n rootNamespaces: Array<{ prefix: string; ns: string }>;\n}\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 *\n * Shorthand for {@link parseXmlDocument} when the root's namespace prefixes\n * don't matter — which is everywhere except the handful of parts that carry an\n * `mc:Ignorable`.\n */\nexport function parseXml(input: Uint8Array | string): XmlNode {\n return parseXmlDocument(input).root;\n}\n\n/** {@link parseXml} plus the root element's namespace declarations. */\nexport function parseXmlDocument(input: Uint8Array | string): ParsedDocument {\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 { root: convertElement(root, initial), rootNamespaces: declarationsOf(root[ATTR_KEY] as FxpAttrs | undefined) };\n}\n\nconst declarationsOf = (attrs: FxpAttrs | undefined): Array<{ prefix: string; ns: string }> => {\n const out: Array<{ prefix: string; ns: string }> = [];\n for (const [k, v] of Object.entries(attrs ?? {})) {\n if (k === 'xmlns') out.push({ prefix: '', ns: decodeXmlEntities(v) });\n else if (k.startsWith('xmlns:')) out.push({ prefix: k.slice('xmlns:'.length), ns: decodeXmlEntities(v) });\n }\n return out;\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 = decodeXmlEntities(v);\n continue;\n }\n if (k.startsWith('xmlns:')) {\n const prefix = k.slice('xmlns:'.length);\n nextByPrefix ??= { ...parent.byPrefix };\n nextByPrefix[prefix] = decodeXmlEntities(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)] = decodeXmlEntities(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(decodeXmlEntities(t));\n continue;\n }\n if (Object.hasOwn(child, CDATA_KEY)) {\n const section = child[CDATA_KEY] as FxpEntry[];\n for (const part of section) {\n const t = part[TEXT_KEY];\n if (typeof t === 'string') textParts.push(t);\n }\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":"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"}
|