@office-kit/xlsx 0.9.2 → 0.10.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/dist/{cell-style-CN9JXOwm.mjs → cell-style-DuvS_Lsg.mjs} +2 -2
- package/dist/cell-style-DuvS_Lsg.mjs.map +1 -0
- package/dist/{differential-YEjxNScf.mjs → differential-DvKU8fJt.mjs} +2 -2
- package/dist/{differential-YEjxNScf.mjs.map → differential-DvKU8fJt.mjs.map} +1 -1
- package/dist/drawing/drawing-xml.d.ts +7 -0
- package/dist/drawing/drawing.d.ts +25 -0
- package/dist/drawing-BxzLuryn.mjs.map +1 -1
- package/dist/io.mjs +2 -2
- package/dist/{load-BA30X4-M.mjs → load-CnPfhGo3.mjs} +54 -10
- package/dist/load-CnPfhGo3.mjs.map +1 -0
- package/dist/{manifest-CVL1_t0O.mjs → manifest-Cm9K7D62.mjs} +5 -5
- package/dist/{manifest-CVL1_t0O.mjs.map → manifest-Cm9K7D62.mjs.map} +1 -1
- package/dist/node.mjs +1 -1
- package/dist/packaging.mjs +1 -1
- package/dist/{parser-nk0Lqmcb.mjs → parser-D3SLaOFe.mjs} +27 -4
- package/dist/parser-D3SLaOFe.mjs.map +1 -0
- package/dist/{save-C9ChJfWM.mjs → save-2moCT3Af.mjs} +68 -34
- package/dist/save-2moCT3Af.mjs.map +1 -0
- package/dist/schema.mjs +1 -1
- package/dist/{serialize-55EnT30e.mjs → serialize-BC2Wu3bR.mjs} +2 -2
- package/dist/{serialize-55EnT30e.mjs.map → serialize-BC2Wu3bR.mjs.map} +1 -1
- package/dist/{serializer-DQzTTNOS.mjs → serializer-BtO2TrI7.mjs} +21 -9
- package/dist/serializer-BtO2TrI7.mjs.map +1 -0
- package/dist/streaming.mjs +9 -12
- package/dist/streaming.mjs.map +1 -1
- package/dist/styles/stylesheet.d.ts +8 -0
- package/dist/styles.mjs +3 -3
- package/dist/{stylesheet-writer-DOGKBGEk.mjs → stylesheet-writer-BrOw4jMY.mjs} +87 -41
- package/dist/stylesheet-writer-BrOw4jMY.mjs.map +1 -0
- package/dist/{table-BifavDVW.mjs → table-1P8we2gS.mjs} +2 -2
- package/dist/{table-BifavDVW.mjs.map → table-1P8we2gS.mjs.map} +1 -1
- package/dist/{tree-Bbs1C8Rc.mjs → tree-BX-sRRVp.mjs} +3 -1
- package/dist/tree-BX-sRRVp.mjs.map +1 -0
- package/dist/{utf8-D91g1XTG.mjs → utf8-Tn3nzyik.mjs} +2 -2
- package/dist/{utf8-D91g1XTG.mjs.map → utf8-Tn3nzyik.mjs.map} +1 -1
- package/dist/workbook/shared-strings.d.ts +15 -5
- package/dist/workbook/views.d.ts +7 -0
- package/dist/workbook/workbook.d.ts +15 -0
- package/dist/{workbook-T1Y3lstQ.mjs → workbook-CARZS94U.mjs} +39 -14
- package/dist/workbook-CARZS94U.mjs.map +1 -0
- package/dist/workbook.mjs +1 -1
- package/dist/workbook.mjs.map +1 -1
- package/dist/worksheet/hyperlinks.d.ts +5 -0
- package/dist/worksheet/reader.d.ts +7 -2
- package/dist/worksheet/worksheet.d.ts +4 -0
- package/dist/{worksheet-C6CWgvP5.mjs → worksheet-C5Ensf_j.mjs} +167 -135
- package/dist/worksheet-C5Ensf_j.mjs.map +1 -0
- package/dist/worksheet.mjs +2 -2
- package/dist/xml/parser.d.ts +20 -0
- package/dist/xml/serializer.d.ts +8 -0
- package/dist/xml.mjs +4 -4
- package/package.json +1 -1
- package/dist/cell-style-CN9JXOwm.mjs.map +0 -1
- package/dist/load-BA30X4-M.mjs.map +0 -1
- package/dist/parser-nk0Lqmcb.mjs.map +0 -1
- package/dist/save-C9ChJfWM.mjs.map +0 -1
- package/dist/serializer-DQzTTNOS.mjs.map +0 -1
- package/dist/stylesheet-writer-DOGKBGEk.mjs.map +0 -1
- package/dist/tree-Bbs1C8Rc.mjs.map +0 -1
- package/dist/workbook-T1Y3lstQ.mjs.map +0 -1
- package/dist/worksheet-C6CWgvP5.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-CVL1_t0O.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';\nimport { fromTree, toTree } from '../schema/serialize';\nimport { PKG_REL_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\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';\nimport { fromTree, toTree } from '../schema/serialize';\nimport { COREPROPS_NS, DCORE_NS, DCTERMS_NS, XSI_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\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';\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';\nimport { CPROPS_FMTID, CUSTPROPS_NS, parseQName, VTYPES_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\nimport { el, type XmlNode } from '../xml/tree';\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';\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';\nimport { fromTree, toTree } from '../schema/serialize';\nimport { XPROPS_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\nimport type { XmlNode } from '../xml/tree';\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';\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';\nimport { fromTree, toTree } from '../schema/serialize';\nimport { CONTYPES_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\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
|
+
{"version":3,"file":"manifest-Cm9K7D62.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';\nimport { fromTree, toTree } from '../schema/serialize';\nimport { PKG_REL_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\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';\nimport { fromTree, toTree } from '../schema/serialize';\nimport { COREPROPS_NS, DCORE_NS, DCTERMS_NS, XSI_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\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';\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';\nimport { CPROPS_FMTID, CUSTPROPS_NS, parseQName, VTYPES_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\nimport { el, type XmlNode } from '../xml/tree';\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';\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';\nimport { fromTree, toTree } from '../schema/serialize';\nimport { XPROPS_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\nimport type { XmlNode } from '../xml/tree';\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';\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';\nimport { fromTree, toTree } from '../schema/serialize';\nimport { CONTYPES_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\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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"}
|
package/dist/node.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { i as OpenXmlIoError } from "./exceptions-D-CFwxgm.mjs";
|
|
2
|
-
import { t as saveWorkbook } from "./save-
|
|
2
|
+
import { t as saveWorkbook } from "./save-2moCT3Af.mjs";
|
|
3
3
|
import { createReadStream, createWriteStream, readFileSync } from "node:fs";
|
|
4
4
|
import { readFile, unlink } from "node:fs/promises";
|
|
5
5
|
import { once } from "node:events";
|
package/dist/packaging.mjs
CHANGED
|
@@ -1,2 +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-
|
|
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-Cm9K7D62.mjs";
|
|
2
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 };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { o as OpenXmlSchemaError } from "./exceptions-D-CFwxgm.mjs";
|
|
2
|
-
import { jt as qname, n as el } from "./tree-
|
|
2
|
+
import { jt as qname, n as el } from "./tree-BX-sRRVp.mjs";
|
|
3
3
|
import { XMLParser } from "fast-xml-parser";
|
|
4
4
|
//#region src/xml/parser.ts
|
|
5
5
|
const decoder = new TextDecoder("utf-8", { fatal: false });
|
|
@@ -29,8 +29,16 @@ const TEXT_KEY = "#text";
|
|
|
29
29
|
* Parse a UTF-8 XML payload into an {@link XmlNode} tree. Element and attribute
|
|
30
30
|
* names are returned in Clark notation. Throws {@link OpenXmlSchemaError} on
|
|
31
31
|
* DTD/entity declarations or on multi-root documents.
|
|
32
|
+
*
|
|
33
|
+
* Shorthand for {@link parseXmlDocument} when the root's namespace prefixes
|
|
34
|
+
* don't matter — which is everywhere except the handful of parts that carry an
|
|
35
|
+
* `mc:Ignorable`.
|
|
32
36
|
*/
|
|
33
37
|
function parseXml(input) {
|
|
38
|
+
return parseXmlDocument(input).root;
|
|
39
|
+
}
|
|
40
|
+
/** {@link parseXml} plus the root element's namespace declarations. */
|
|
41
|
+
function parseXmlDocument(input) {
|
|
34
42
|
const text = decodeForPrescan(input);
|
|
35
43
|
checkForDoctype(text);
|
|
36
44
|
let raw;
|
|
@@ -54,8 +62,23 @@ function parseXml(input) {
|
|
|
54
62
|
};
|
|
55
63
|
const [root] = roots;
|
|
56
64
|
if (root === void 0) throw new OpenXmlSchemaError("parseXml: no root element");
|
|
57
|
-
return
|
|
65
|
+
return {
|
|
66
|
+
root: convertElement(root, initial),
|
|
67
|
+
rootNamespaces: declarationsOf(root[ATTR_KEY])
|
|
68
|
+
};
|
|
58
69
|
}
|
|
70
|
+
const declarationsOf = (attrs) => {
|
|
71
|
+
const out = [];
|
|
72
|
+
for (const [k, v] of Object.entries(attrs ?? {})) if (k === "xmlns") out.push({
|
|
73
|
+
prefix: "",
|
|
74
|
+
ns: v
|
|
75
|
+
});
|
|
76
|
+
else if (k.startsWith("xmlns:")) out.push({
|
|
77
|
+
prefix: k.slice(6),
|
|
78
|
+
ns: v
|
|
79
|
+
});
|
|
80
|
+
return out;
|
|
81
|
+
};
|
|
59
82
|
const elementTag = (entry) => {
|
|
60
83
|
for (const k of Object.keys(entry)) {
|
|
61
84
|
if (k === ATTR_KEY) continue;
|
|
@@ -152,6 +175,6 @@ const convertElement = (entry, parentStack) => {
|
|
|
152
175
|
return node;
|
|
153
176
|
};
|
|
154
177
|
//#endregion
|
|
155
|
-
export { parseXml as t };
|
|
178
|
+
export { parseXmlDocument as n, parseXml as t };
|
|
156
179
|
|
|
157
|
-
//# sourceMappingURL=parser-
|
|
180
|
+
//# sourceMappingURL=parser-D3SLaOFe.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-D3SLaOFe.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 (& / < / > / " /\n // ') 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\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: v });\n else if (k.startsWith('xmlns:')) out.push({ prefix: k.slice('xmlns:'.length), ns: 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 = 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":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { i as OpenXmlIoError, o as OpenXmlSchemaError } from "./exceptions-D-CFwxgm.mjs";
|
|
2
2
|
import { m as IMAGE_FORMAT_MIME, p as IMAGE_FORMAT_EXTENSION } from "./drawing-BxzLuryn.mjs";
|
|
3
3
|
import { n as escapeXmlAttr, r as escapeXmlText } from "./escape-DFTE7ZJc.mjs";
|
|
4
|
-
import { M as CPROPS_TYPE, _ as ARC_WORKBOOK_RELS, c as ARC_CONTENT_TYPES, ct as PKG_REL_NS, f as ARC_ROOT_RELS, ft as SHEET_MAIN_NS, g as ARC_WORKBOOK, h as ARC_THEME, l as ARC_CORE, lt as REL_NS, m as ARC_STYLE, mt as THEME_TYPE, p as ARC_SHARED_STRINGS, pt as STYLES_TYPE, s as ARC_APP, u as ARC_CUSTOM, ut as SHARED_STRINGS_TYPE, wt as XLSX_TYPE, x as CHARTEX_TYPE, yt as WORKSHEET_TYPE } from "./tree-
|
|
5
|
-
import {
|
|
6
|
-
import { t as serializeXml } from "./serializer-
|
|
7
|
-
import { V as corePropsToBytes, a as makeManifest, l as extendedPropsToBytes, n as addOverride, rt as relsToBytes, s as manifestToBytes, t as addDefault, tt as makeRelationships, v as customPropsToBytes } from "./manifest-
|
|
8
|
-
import {
|
|
4
|
+
import { At as parseQName, M as CPROPS_TYPE, _ as ARC_WORKBOOK_RELS, c as ARC_CONTENT_TYPES, ct as PKG_REL_NS, f as ARC_ROOT_RELS, ft as SHEET_MAIN_NS, g as ARC_WORKBOOK, h as ARC_THEME, l as ARC_CORE, lt as REL_NS, m as ARC_STYLE, mt as THEME_TYPE, p as ARC_SHARED_STRINGS, pt as STYLES_TYPE, s as ARC_APP, u as ARC_CUSTOM, ut as SHARED_STRINGS_TYPE, wt as XLSX_TYPE, x as CHARTEX_TYPE, yt as WORKSHEET_TYPE } from "./tree-BX-sRRVp.mjs";
|
|
5
|
+
import { C as chartExToBytes, E as chartToBytes, S as userShapesToBytes, g as chartsheetToBytes, i as commentsToBytes, m as drawingToBytes, o as placeholderVmlDrawing, r as tableToBytes, t as stylesheetToBytes, y as worksheetToBytes } from "./stylesheet-writer-BrOw4jMY.mjs";
|
|
6
|
+
import { t as serializeXml } from "./serializer-BtO2TrI7.mjs";
|
|
7
|
+
import { V as corePropsToBytes, a as makeManifest, l as extendedPropsToBytes, n as addOverride, rt as relsToBytes, s as manifestToBytes, t as addDefault, tt as makeRelationships, v as customPropsToBytes } from "./manifest-Cm9K7D62.mjs";
|
|
8
|
+
import { D as makeSharedStrings, S as validateSheetTitle, j as sharedStringsToBytes } from "./workbook-CARZS94U.mjs";
|
|
9
9
|
import { t as createZipWriter } from "./writer-IyFccCRJ.mjs";
|
|
10
10
|
//#region src/io/save.ts
|
|
11
11
|
const CORE_PROPS_TYPE = "application/vnd.openxmlformats-package.core-properties+xml";
|
|
@@ -217,10 +217,22 @@ async function saveWorkbookImpl(wb, writer) {
|
|
|
217
217
|
target: `../drawings/drawing${id}.xml`
|
|
218
218
|
});
|
|
219
219
|
const drawingRels = makeRelationships();
|
|
220
|
+
const usedDrawingRIds = /* @__PURE__ */ new Set();
|
|
221
|
+
for (const rel of drawing.rawRels?.rels ?? []) {
|
|
222
|
+
drawingRels.rels.push(rel);
|
|
223
|
+
usedDrawingRIds.add(rel.id);
|
|
224
|
+
}
|
|
225
|
+
let nextDrawingRId = 1;
|
|
226
|
+
const allocateDrawingRId = () => {
|
|
227
|
+
let candidate = `rId${nextDrawingRId++}`;
|
|
228
|
+
while (usedDrawingRIds.has(candidate)) candidate = `rId${nextDrawingRId++}`;
|
|
229
|
+
usedDrawingRIds.add(candidate);
|
|
230
|
+
return candidate;
|
|
231
|
+
};
|
|
220
232
|
const itemsForXml = [];
|
|
221
233
|
for (const item of drawing.items) if (item.content.kind === "chart" && (item.content.chart.space || item.content.chart.cxSpace)) {
|
|
222
234
|
const chartId = nextChartId++;
|
|
223
|
-
const chartRId =
|
|
235
|
+
const chartRId = allocateDrawingRId();
|
|
224
236
|
const isCxChart = item.content.chart.cxSpace !== void 0;
|
|
225
237
|
drawingRels.rels.push({
|
|
226
238
|
id: chartRId,
|
|
@@ -272,7 +284,7 @@ async function saveWorkbookImpl(wb, writer) {
|
|
|
272
284
|
const img = item.content.picture.image;
|
|
273
285
|
const ext = IMAGE_FORMAT_EXTENSION[img.format];
|
|
274
286
|
const imageId = nextImageId++;
|
|
275
|
-
const picRId =
|
|
287
|
+
const picRId = allocateDrawingRId();
|
|
276
288
|
drawingRels.rels.push({
|
|
277
289
|
id: picRId,
|
|
278
290
|
type: IMAGE_REL,
|
|
@@ -300,7 +312,10 @@ async function saveWorkbookImpl(wb, writer) {
|
|
|
300
312
|
} else itemsForXml.push(item);
|
|
301
313
|
const emit = {
|
|
302
314
|
id,
|
|
303
|
-
bytes: drawingToBytes({
|
|
315
|
+
bytes: drawingToBytes({
|
|
316
|
+
items: itemsForXml,
|
|
317
|
+
...drawing.rawChildren ? { rawChildren: drawing.rawChildren } : {}
|
|
318
|
+
})
|
|
304
319
|
};
|
|
305
320
|
if (drawingRels.rels.length > 0) emit.rels = drawingRels;
|
|
306
321
|
drawingEmits.push(emit);
|
|
@@ -472,7 +487,17 @@ function nextFreeIndex(wb, pattern) {
|
|
|
472
487
|
}
|
|
473
488
|
/** Serialise the minimum `<workbook><sheets/></workbook>` Excel needs to load a sheet list. */
|
|
474
489
|
function serializeWorkbookXml(wb, sheetRIds) {
|
|
475
|
-
const
|
|
490
|
+
const rootNs = wb.workbookXmlRoot?.namespaces ?? [];
|
|
491
|
+
const nsDecls = rootNs.map((d) => ` xmlns:${d.prefix}="${escapeAttr(d.ns)}"`).join("");
|
|
492
|
+
const ignorable = wb.workbookXmlRoot?.ignorable;
|
|
493
|
+
const ignorableAttr = ignorable !== void 0 ? ` mc:Ignorable="${escapeAttr(ignorable)}"` : "";
|
|
494
|
+
const inScopePrefixes = {
|
|
495
|
+
[SHEET_MAIN_NS]: "",
|
|
496
|
+
[REL_NS]: "r"
|
|
497
|
+
};
|
|
498
|
+
for (const d of rootNs) inScopePrefixes[d.ns] ??= d.prefix;
|
|
499
|
+
const emitExtra = (node) => serializeChildNode(node, inScopePrefixes);
|
|
500
|
+
const parts = ["<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>", `<workbook xmlns="${SHEET_MAIN_NS}" xmlns:r="${REL_NS}"${nsDecls}${ignorableAttr}>`];
|
|
476
501
|
if (wb.fileVersion) {
|
|
477
502
|
const fv = serializeFileVersion(wb.fileVersion);
|
|
478
503
|
if (fv) parts.push(fv);
|
|
@@ -481,7 +506,6 @@ function serializeWorkbookXml(wb, sheetRIds) {
|
|
|
481
506
|
const fs = serializeFileSharing(wb.fileSharing);
|
|
482
507
|
if (fs) parts.push(fs);
|
|
483
508
|
}
|
|
484
|
-
if (wb.workbookXmlExtras?.beforeSheets) for (const node of wb.workbookXmlExtras.beforeSheets) parts.push(serializeChildNode(node));
|
|
485
509
|
const effectiveWp = effectiveWorkbookProperties(wb);
|
|
486
510
|
if (effectiveWp) {
|
|
487
511
|
const wp = serializeWorkbookProperties(effectiveWp);
|
|
@@ -491,7 +515,8 @@ function serializeWorkbookXml(wb, sheetRIds) {
|
|
|
491
515
|
const wp = serializeWorkbookProtection(wb.workbookProtection);
|
|
492
516
|
if (wp) parts.push(wp);
|
|
493
517
|
}
|
|
494
|
-
if (wb.
|
|
518
|
+
if (wb.workbookXmlExtras?.beforeSheets) for (const node of wb.workbookXmlExtras.beforeSheets) parts.push(emitExtra(node));
|
|
519
|
+
if (wb.bookViews && wb.bookViews.length > 0) parts.push(serializeBookViews(wb.bookViews, inScopePrefixes));
|
|
495
520
|
parts.push("<sheets>");
|
|
496
521
|
wb.sheets.forEach((ref, i) => {
|
|
497
522
|
const stateAttr = ref.state === "visible" ? "" : ` state="${ref.state}"`;
|
|
@@ -499,6 +524,16 @@ function serializeWorkbookXml(wb, sheetRIds) {
|
|
|
499
524
|
parts.push(`<sheet name="${escapeAttr(ref.sheet.title)}" sheetId="${ref.sheetId}"${stateAttr} r:id="${rId}"/>`);
|
|
500
525
|
});
|
|
501
526
|
parts.push("</sheets>");
|
|
527
|
+
if (wb.functionGroups) {
|
|
528
|
+
const fg = serializeFunctionGroups(wb.functionGroups);
|
|
529
|
+
if (fg) parts.push(fg);
|
|
530
|
+
}
|
|
531
|
+
if (wb.externalReferences && wb.externalReferences.length > 0) {
|
|
532
|
+
const inner = ["<externalReferences>"];
|
|
533
|
+
for (const er of wb.externalReferences) inner.push(`<externalReference r:id="${escapeAttr(er.rId)}"/>`);
|
|
534
|
+
inner.push("</externalReferences>");
|
|
535
|
+
parts.push(inner.join(""));
|
|
536
|
+
}
|
|
502
537
|
if (wb.definedNames.length > 0) {
|
|
503
538
|
parts.push("<definedNames>");
|
|
504
539
|
for (const dn of wb.definedNames) {
|
|
@@ -510,38 +545,28 @@ function serializeWorkbookXml(wb, sheetRIds) {
|
|
|
510
545
|
}
|
|
511
546
|
parts.push("</definedNames>");
|
|
512
547
|
}
|
|
513
|
-
if (wb.
|
|
514
|
-
const
|
|
515
|
-
if (
|
|
516
|
-
}
|
|
517
|
-
if (wb.externalReferences && wb.externalReferences.length > 0) {
|
|
518
|
-
const inner = ["<externalReferences>"];
|
|
519
|
-
for (const er of wb.externalReferences) inner.push(`<externalReference r:id="${escapeAttr(er.rId)}"/>`);
|
|
520
|
-
inner.push("</externalReferences>");
|
|
521
|
-
parts.push(inner.join(""));
|
|
548
|
+
if (wb.calcProperties) {
|
|
549
|
+
const cp = serializeCalcProperties(wb.calcProperties);
|
|
550
|
+
if (cp) parts.push(cp);
|
|
522
551
|
}
|
|
552
|
+
if (wb.oleSize !== void 0) parts.push(`<oleSize ref="${escapeAttr(wb.oleSize)}"/>`);
|
|
553
|
+
if (wb.customWorkbookViews && wb.customWorkbookViews.length > 0) parts.push(serializeCustomWorkbookViews(wb.customWorkbookViews));
|
|
523
554
|
if (wb.pivotCaches && wb.pivotCaches.length > 0) {
|
|
524
555
|
const inner = ["<pivotCaches>"];
|
|
525
556
|
for (const pc of wb.pivotCaches) inner.push(`<pivotCache cacheId="${pc.cacheId}" r:id="${escapeAttr(pc.rId)}"/>`);
|
|
526
557
|
inner.push("</pivotCaches>");
|
|
527
558
|
parts.push(inner.join(""));
|
|
528
559
|
}
|
|
529
|
-
if (wb.calcProperties) {
|
|
530
|
-
const cp = serializeCalcProperties(wb.calcProperties);
|
|
531
|
-
if (cp) parts.push(cp);
|
|
532
|
-
}
|
|
533
|
-
if (wb.oleSize !== void 0) parts.push(`<oleSize ref="${escapeAttr(wb.oleSize)}"/>`);
|
|
534
|
-
if (wb.customWorkbookViews && wb.customWorkbookViews.length > 0) parts.push(serializeCustomWorkbookViews(wb.customWorkbookViews));
|
|
535
560
|
if (wb.smartTagPr) {
|
|
536
561
|
const stp = serializeSmartTagPr(wb.smartTagPr);
|
|
537
562
|
if (stp) parts.push(stp);
|
|
538
563
|
}
|
|
539
564
|
if (wb.smartTagTypes && wb.smartTagTypes.length > 0) parts.push(serializeSmartTagTypes(wb.smartTagTypes));
|
|
540
|
-
if (wb.workbookXmlExtras?.afterSheets) for (const node of wb.workbookXmlExtras.afterSheets) parts.push(serializeChildNode(node));
|
|
541
565
|
if (wb.fileRecoveryPr) {
|
|
542
566
|
const fp = serializeFileRecoveryPr(wb.fileRecoveryPr);
|
|
543
567
|
if (fp) parts.push(fp);
|
|
544
568
|
}
|
|
569
|
+
if (wb.workbookXmlExtras?.afterSheets) for (const node of wb.workbookXmlExtras.afterSheets) parts.push(emitExtra(node));
|
|
545
570
|
parts.push("</workbook>");
|
|
546
571
|
return parts.join("");
|
|
547
572
|
}
|
|
@@ -693,7 +718,7 @@ function serializeCustomWorkbookViews(views) {
|
|
|
693
718
|
parts.push("</customWorkbookViews>");
|
|
694
719
|
return parts.join("");
|
|
695
720
|
}
|
|
696
|
-
function serializeBookViews(views) {
|
|
721
|
+
function serializeBookViews(views, prefixOf) {
|
|
697
722
|
const parts = ["<bookViews>"];
|
|
698
723
|
for (const v of views) {
|
|
699
724
|
let attrs = "";
|
|
@@ -710,6 +735,12 @@ function serializeBookViews(views) {
|
|
|
710
735
|
if (v.firstSheet !== void 0) attrs += ` firstSheet="${v.firstSheet}"`;
|
|
711
736
|
if (v.activeTab !== void 0) attrs += ` activeTab="${v.activeTab}"`;
|
|
712
737
|
if (v.autoFilterDateGrouping !== void 0) attrs += ` autoFilterDateGrouping="${v.autoFilterDateGrouping ? "1" : "0"}"`;
|
|
738
|
+
for (const [clark, value] of Object.entries(v.extAttrs ?? {})) {
|
|
739
|
+
const { ns, local } = parseQName(clark);
|
|
740
|
+
const prefix = prefixOf[ns];
|
|
741
|
+
if (prefix === void 0) continue;
|
|
742
|
+
attrs += ` ${prefix}:${local}="${escapeAttr(value)}"`;
|
|
743
|
+
}
|
|
713
744
|
parts.push(`<workbookView${attrs}/>`);
|
|
714
745
|
}
|
|
715
746
|
parts.push("</bookViews>");
|
|
@@ -745,15 +776,18 @@ const escapeAttr = escapeXmlAttr;
|
|
|
745
776
|
/**
|
|
746
777
|
* Serialise an XmlNode child of `<workbook>` for inline injection back into the
|
|
747
778
|
* workbook XML stream. Reuses serializeXml then strips the declaration.
|
|
748
|
-
* Captured nodes carry Clark-notation names so
|
|
749
|
-
*
|
|
750
|
-
*
|
|
779
|
+
* Captured nodes carry Clark-notation names, so `inScopePrefixes` is what keeps
|
|
780
|
+
* a child on the prefix the root declared for it instead of a freshly
|
|
781
|
+
* allocated one — which matters when `mc:Ignorable` names those prefixes.
|
|
751
782
|
*/
|
|
752
|
-
function serializeChildNode(node) {
|
|
753
|
-
const bytes = serializeXml(node, {
|
|
783
|
+
function serializeChildNode(node, inScopePrefixes) {
|
|
784
|
+
const bytes = serializeXml(node, {
|
|
785
|
+
xmlDeclaration: false,
|
|
786
|
+
...inScopePrefixes ? { inScopePrefixes } : {}
|
|
787
|
+
});
|
|
754
788
|
return new TextDecoder().decode(bytes);
|
|
755
789
|
}
|
|
756
790
|
//#endregion
|
|
757
791
|
export { workbookToBytes as n, saveWorkbook as t };
|
|
758
792
|
|
|
759
|
-
//# sourceMappingURL=save-
|
|
793
|
+
//# sourceMappingURL=save-2moCT3Af.mjs.map
|