@office-open/docx 0.8.1 → 0.9.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.
@@ -0,0 +1,490 @@
1
+ import { E as fontTableDesc, M as endnotesDesc, N as footnotesDesc, T as bibliographyDesc, a as stringifyBodyChild, b as commentsDesc, d as customPropertiesDesc, f as corePropertiesDesc, n as DocxWriteContext, o as stringifyDocumentXml, u as webSettingsDesc, v as buildContentTypes, w as glossaryDesc, y as contentTypesDesc, z as settingsDesc } from "./context-Ca7nmKV2.mjs";
2
+ import { w as DocumentAttributeNamespaces } from "./document-CWr8C_OX.mjs";
3
+ import { APP_PROPS_XML, OoxmlMimeType, addSmartArtRelationships, createPacker, findAndReplaceImagePlaceholders, formatId, hasPlaceholders, replaceAllPlaceholders, replaceNumberingPlaceholders } from "@office-open/core";
4
+ import { escapeXml } from "@office-open/xml";
5
+ import { DEFAULT_DRAWING_XML, getColorXml, getLayoutXml, getStyleXml } from "@office-open/core/smartart";
6
+ //#region src/parts/fonts/obfuscate-ttf-to-odttf.ts
7
+ /**
8
+ * Font obfuscation module for embedding fonts in WordprocessingML documents.
9
+ *
10
+ * This module implements the OOXML font obfuscation algorithm used to embed
11
+ * fonts in DOCX documents. Obfuscation is required by the OOXML specification
12
+ * to prevent simple extraction of embedded font files.
13
+ *
14
+ * Reference: ECMA-376 Part 2, Section 11.1 (Font Embedding)
15
+ *
16
+ * @module
17
+ */
18
+ /** Start offset for obfuscation in the font file */
19
+ const obfuscatedStartOffset = 0;
20
+ /** End offset for obfuscation (first 32 bytes are obfuscated) */
21
+ const obfuscatedEndOffset = 32;
22
+ /** Expected GUID size (32 hex characters without dashes) */
23
+ const guidSize = 32;
24
+ /**
25
+ * Obfuscates a TrueType font file for embedding in OOXML documents.
26
+ *
27
+ * The obfuscation algorithm XORs the first 32 bytes of the font file
28
+ * with a reversed byte sequence derived from the font's GUID key.
29
+ * This prevents simple extraction while maintaining font functionality.
30
+ *
31
+ * @param buf - The original font file as a byte array
32
+ * @param fontKey - The GUID key for the font (with or without dashes)
33
+ * @returns The obfuscated font data
34
+ * @throws Error if the fontKey is not a valid 32-character GUID
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const fontData = readFileSync("font.ttf");
39
+ * const fontKey = "00000000-0000-0000-0000-000000000000";
40
+ * const obfuscatedData = obfuscate(fontData, fontKey);
41
+ * ```
42
+ *
43
+ * @internal
44
+ */
45
+ const obfuscate = (buf, fontKey) => {
46
+ const guid = fontKey.replace(/-/g, "");
47
+ if (guid.length !== guidSize) throw new Error(`Error: Cannot extract GUID from font filename: ${fontKey}`);
48
+ const hexNumbers = guid.replace(/(..)/g, "$1 ").trim().split(" ").map((hexString) => parseInt(hexString, 16));
49
+ hexNumbers.reverse();
50
+ const obfuscatedBytes = buf.slice(obfuscatedStartOffset, obfuscatedEndOffset).map((byte, i) => byte ^ hexNumbers[i % hexNumbers.length]);
51
+ const out = new Uint8Array(obfuscatedStartOffset + obfuscatedBytes.length + Math.max(0, buf.length - obfuscatedEndOffset));
52
+ out.set(buf.slice(0, obfuscatedStartOffset));
53
+ out.set(obfuscatedBytes, obfuscatedStartOffset);
54
+ out.set(buf.slice(obfuscatedEndOffset), obfuscatedStartOffset + obfuscatedBytes.length);
55
+ return out;
56
+ };
57
+ //#endregion
58
+ //#region src/parts/header-footer.ts
59
+ /**
60
+ * Namespace keys used by header elements.
61
+ * @internal
62
+ */
63
+ const HEADER_NAMESPACES = [
64
+ "cx",
65
+ "cx1",
66
+ "cx2",
67
+ "cx3",
68
+ "cx4",
69
+ "cx5",
70
+ "cx6",
71
+ "cx7",
72
+ "cx8",
73
+ "m",
74
+ "mc",
75
+ "o",
76
+ "r",
77
+ "v",
78
+ "w",
79
+ "w10",
80
+ "w14",
81
+ "w15",
82
+ "w16cid",
83
+ "w16se",
84
+ "wne",
85
+ "wp",
86
+ "wp14",
87
+ "wpc",
88
+ "wpg",
89
+ "wpi",
90
+ "wps"
91
+ ];
92
+ /**
93
+ * Namespace keys used by footer elements.
94
+ * @internal
95
+ */
96
+ const FOOTER_NAMESPACES = [
97
+ "m",
98
+ "mc",
99
+ "o",
100
+ "r",
101
+ "v",
102
+ "w",
103
+ "w10",
104
+ "w14",
105
+ "w15",
106
+ "wne",
107
+ "wp",
108
+ "wp14",
109
+ "wpc",
110
+ "wpg",
111
+ "wpi",
112
+ "wps"
113
+ ];
114
+ /**
115
+ * Serialize a header or footer to XML.
116
+ *
117
+ * Builds the `<w:hdr>` or `<w:ftr>` element with namespace declarations,
118
+ * then serializes each child element via `stringifyBodyChild()`.
119
+ *
120
+ * @param tag - Element tag name ("w:hdr" or "w:ftr")
121
+ * @param namespaces - Namespace keys to declare on the root element
122
+ * @param children - Block-level child elements (raw SectionChild objects)
123
+ * @param ctx - Body context for stringification
124
+ */
125
+ function stringifyHeaderFooter(tag, namespaces, children, ctx) {
126
+ const attrParts = [];
127
+ for (const ns of namespaces) attrParts.push(`xmlns:${ns}="${escapeXml(DocumentAttributeNamespaces[ns])}"`);
128
+ const attrStr = attrParts.join(" ");
129
+ const childParts = [];
130
+ for (const child of children) childParts.push(stringifyBodyChild(child, ctx));
131
+ const body = childParts.join("");
132
+ return body.length === 0 ? `<${tag} ${attrStr}/>` : `<${tag} ${attrStr}>${body}</${tag}>`;
133
+ }
134
+ //#endregion
135
+ //#region src/compiler.ts
136
+ /**
137
+ * DOCX document compiler — pure function entry point.
138
+ *
139
+ * compileDocument() accepts DocumentOptions directly,
140
+ * creates a DocxWriteContext internally, and produces a Zippable result.
141
+ * All XML parts are produced via descriptors or serialize() —
142
+ * no Formatter dependency.
143
+ *
144
+ * @module
145
+ */
146
+ /** Reusable TextEncoder (stateless, safe to share). */
147
+ const encoder = new TextEncoder();
148
+ /** XML declaration prepended to every OOXML part. */
149
+ const XML_DECL = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
150
+ /**
151
+ * Compile document options into a flat file map suitable for fflate zipSync.
152
+ *
153
+ * This is the primary entry point for DOCX generation — accepts DocumentOptions
154
+ * directly.
155
+ */
156
+ function compileDocument(options, overrides = [], mediaLevel = 0) {
157
+ const ctx = new DocxWriteContext(options);
158
+ const files = {};
159
+ const xmlifiedFileMapping = xmlifyContext(ctx, /* @__PURE__ */ new Map(), /* @__PURE__ */ new Map());
160
+ const map = new Map(Object.entries(xmlifiedFileMapping));
161
+ for (const [, obj] of map) if (Array.isArray(obj)) for (const subFile of obj) files[subFile.path] = typeof subFile.data === "string" ? encoder.encode(subFile.data) : subFile.data;
162
+ else {
163
+ const fileObj = obj;
164
+ files[fileObj.path] = typeof fileObj.data === "string" ? encoder.encode(fileObj.data) : fileObj.data;
165
+ }
166
+ for (const subFile of overrides) files[subFile.path] = typeof subFile.data === "string" ? encoder.encode(subFile.data) : subFile.data;
167
+ const mediaArray = ctx.media.array;
168
+ for (const mediaData of mediaArray) {
169
+ files[`word/media/${mediaData.fileName}`] = [mediaData.data, { level: mediaLevel }];
170
+ if (mediaData.type === "svg") files[`word/media/${mediaData.fallback.fileName}`] = [mediaData.fallback.data, { level: mediaLevel }];
171
+ }
172
+ for (const { data: buffer, name, fontKey } of ctx.fontTable.fontOptionsWithKey) {
173
+ const [nameWithoutExtension] = name.split(".");
174
+ files[`word/fonts/${nameWithoutExtension}.odttf`] = obfuscate(buffer, fontKey);
175
+ }
176
+ return files;
177
+ }
178
+ function xmlifyContext(ctx, headerFormattedViews, footerFormattedViews) {
179
+ const mkCtx = (viewWrapper = ctx.document) => ({
180
+ fileData: ctx,
181
+ file: ctx,
182
+ viewWrapper,
183
+ stringifyChild: stringifyBodyChild,
184
+ addRelationship: (type, target, mode) => ctx.addRelationship(type, target, mode),
185
+ addMedia: (data, type) => ctx.addMedia(data, type)
186
+ });
187
+ const documentRelationshipCount = ctx.document.relationships.relationshipCount + 1;
188
+ const documentXmlData = XML_DECL + stringifyDocumentXml(ctx, mkCtx(ctx.document));
189
+ const commentRelationshipCount = ctx.comments.relationships.relationshipCount + 1;
190
+ const commentCtx = mkCtx({ relationships: ctx.comments.relationships });
191
+ const commentXmlData = XML_DECL + commentsDesc.stringify(ctx._options.comments ?? { children: [] }, commentCtx);
192
+ const footnoteRelationshipCount = ctx.footNotes.relationships.relationshipCount + 1;
193
+ const footnoteCtx = mkCtx({ relationships: ctx.footNotes.relationships });
194
+ const footnoteXmlData = XML_DECL + (footnotesDesc.stringify({ notes: ctx.footNotes.notes }, footnoteCtx) ?? "");
195
+ const documentMedia = findAndReplaceImagePlaceholders(documentXmlData, ctx.media.array, documentRelationshipCount);
196
+ const commentMedia = findAndReplaceImagePlaceholders(commentXmlData, ctx.media.array, commentRelationshipCount);
197
+ const footnoteMedia = findAndReplaceImagePlaceholders(footnoteXmlData, ctx.media.array, footnoteRelationshipCount);
198
+ return {
199
+ AppProperties: {
200
+ data: XML_DECL + APP_PROPS_XML,
201
+ path: "docProps/app.xml"
202
+ },
203
+ Comments: {
204
+ data: (() => {
205
+ return replaceNumberingPlaceholders(commentMedia.referenced.length > 0 ? commentMedia.xml : commentXmlData, ctx.numbering.concreteNumbering);
206
+ })(),
207
+ path: "word/comments.xml"
208
+ },
209
+ CommentsRelationships: {
210
+ data: (() => {
211
+ for (let i = 0; i < commentMedia.referenced.length; i++) ctx.comments.relationships.addRelationship(commentRelationshipCount + i, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", `media/${commentMedia.referenced[i].fileName}`);
212
+ return XML_DECL + ctx.comments.relationships.serialize();
213
+ })(),
214
+ path: "word/_rels/comments.xml.rels"
215
+ },
216
+ ContentTypes: {
217
+ data: XML_DECL + (contentTypesDesc.stringify(buildContentTypes({
218
+ headerCount: ctx.headers.length,
219
+ footerCount: ctx.footers.length,
220
+ chartCount: ctx.charts.array.length,
221
+ smartArtCount: ctx.smartArts.array.length,
222
+ hasBibliography: !!ctx._options.bibliography,
223
+ hasGlossary: !!ctx.glossaryOptions,
224
+ hasWebSettings: !!ctx.webSettings,
225
+ altChunks: ctx.altChunks.array.map((ac) => ({
226
+ path: `/word/${ac.path}`,
227
+ contentType: ac.contentType ?? "application/xhtml+xml"
228
+ })),
229
+ subDocs: ctx.subDocs.array.map((sd) => ({ path: `/word/${sd.path}` }))
230
+ }), ctx) ?? ""),
231
+ path: "[Content_Types].xml"
232
+ },
233
+ CustomProperties: {
234
+ data: XML_DECL + (customPropertiesDesc.stringify({ properties: ctx._options.customProperties ?? [] }, ctx) ?? ""),
235
+ path: "docProps/custom.xml"
236
+ },
237
+ Document: {
238
+ data: (() => {
239
+ let xmlData = documentMedia.referenced.length > 0 ? documentMedia.xml : documentXmlData;
240
+ if (hasPlaceholders(xmlData)) {
241
+ const mediaCount = documentMedia.referenced.length;
242
+ const chartKeys = ctx.charts.array.map((c) => c.key);
243
+ const smartArtKeys = ctx.smartArts.array.map((s) => s.key);
244
+ const chartOffset = documentRelationshipCount + mediaCount;
245
+ const smartArtOffset = chartOffset + chartKeys.length;
246
+ const entries = [];
247
+ for (let i = 0; i < chartKeys.length; i++) entries.push({
248
+ prefix: "chart:",
249
+ key: chartKeys[i],
250
+ value: formatId(chartOffset, i, "rId")
251
+ });
252
+ const saPrefixes = [
253
+ "smartart:",
254
+ "smartart-lo:",
255
+ "smartart-qs:",
256
+ "smartart-cs:"
257
+ ];
258
+ for (let i = 0; i < smartArtKeys.length; i++) for (let p = 0; p < saPrefixes.length; p++) entries.push({
259
+ prefix: saPrefixes[p],
260
+ key: smartArtKeys[i],
261
+ value: formatId(smartArtOffset + p * smartArtKeys.length, i, "rId")
262
+ });
263
+ for (const { reference, instance, numId } of ctx.numbering.concreteNumbering) entries.push({
264
+ key: `${reference}-${instance}`,
265
+ value: numId.toString()
266
+ });
267
+ xmlData = replaceAllPlaceholders(xmlData, entries);
268
+ } else xmlData = replaceNumberingPlaceholders(xmlData, ctx.numbering.concreteNumbering);
269
+ return xmlData;
270
+ })(),
271
+ path: "word/document.xml"
272
+ },
273
+ Endnotes: {
274
+ data: (() => {
275
+ const endnoteCtx = mkCtx({ relationships: ctx.endnotes.relationships });
276
+ const xmlData = XML_DECL + (endnotesDesc.stringify({ notes: ctx.endnotes.notes }, endnoteCtx) ?? "");
277
+ const endnoteRelCount = ctx.endnotes.relationships.relationshipCount + 1;
278
+ const endnoteMedia = findAndReplaceImagePlaceholders(xmlData, ctx.media.array, endnoteRelCount);
279
+ if (endnoteMedia.referenced.length > 0) {
280
+ for (let i = 0; i < endnoteMedia.referenced.length; i++) ctx.endnotes.relationships.addRelationship(endnoteRelCount + i, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", `media/${endnoteMedia.referenced[i].fileName}`);
281
+ return replaceNumberingPlaceholders(endnoteMedia.xml, ctx.numbering.concreteNumbering);
282
+ }
283
+ return replaceNumberingPlaceholders(xmlData, ctx.numbering.concreteNumbering);
284
+ })(),
285
+ path: "word/endnotes.xml"
286
+ },
287
+ EndnotesRelationships: {
288
+ data: XML_DECL + ctx.endnotes.relationships.serialize(),
289
+ path: "word/_rels/endnotes.xml.rels"
290
+ },
291
+ FileRelationships: {
292
+ data: XML_DECL + ctx.fileRelationships.serialize(),
293
+ path: "_rels/.rels"
294
+ },
295
+ FontTable: {
296
+ data: XML_DECL + (fontTableDesc.stringify({ fonts: ctx.fontTable.fontOptionsWithKey }, ctx) ?? ""),
297
+ path: "word/fontTable.xml"
298
+ },
299
+ FontTableRelationships: {
300
+ data: XML_DECL + ctx.fontTable.relationships.serialize(),
301
+ path: "word/_rels/fontTable.xml.rels"
302
+ },
303
+ FootNotes: {
304
+ data: (() => {
305
+ return replaceNumberingPlaceholders(footnoteMedia.referenced.length > 0 ? footnoteMedia.xml : footnoteXmlData, ctx.numbering.concreteNumbering);
306
+ })(),
307
+ path: "word/footnotes.xml"
308
+ },
309
+ FootNotesRelationships: {
310
+ data: (() => {
311
+ for (let i = 0; i < footnoteMedia.referenced.length; i++) ctx.footNotes.relationships.addRelationship(footnoteRelationshipCount + i, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", `media/${footnoteMedia.referenced[i].fileName}`);
312
+ return XML_DECL + ctx.footNotes.relationships.serialize();
313
+ })(),
314
+ path: "word/_rels/footnotes.xml.rels"
315
+ },
316
+ FooterRelationships: ctx.footers.map((entry, index) => {
317
+ const footerCtx = mkCtx({ relationships: entry.relationships });
318
+ const xmlData = XML_DECL + stringifyHeaderFooter("w:ftr", FOOTER_NAMESPACES, entry.children, footerCtx);
319
+ footerFormattedViews.set(index, xmlData);
320
+ const footerMedia = findAndReplaceImagePlaceholders(xmlData, ctx.media.array, 0);
321
+ for (let i = 0; i < footerMedia.referenced.length; i++) entry.relationships.addRelationship(i, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", `media/${footerMedia.referenced[i].fileName}`);
322
+ return {
323
+ data: XML_DECL + entry.relationships.serialize(),
324
+ path: `word/_rels/footer${index + 1}.xml.rels`
325
+ };
326
+ }),
327
+ Footers: ctx.footers.map((_entry, index) => {
328
+ const tempXmlData = footerFormattedViews.get(index);
329
+ const footerMedia = findAndReplaceImagePlaceholders(tempXmlData, ctx.media.array, 0);
330
+ return {
331
+ data: replaceNumberingPlaceholders(footerMedia.referenced.length > 0 ? footerMedia.xml : tempXmlData, ctx.numbering.concreteNumbering),
332
+ path: `word/footer${index + 1}.xml`
333
+ };
334
+ }),
335
+ HeaderRelationships: ctx.headers.map((entry, index) => {
336
+ const headerCtx = mkCtx({ relationships: entry.relationships });
337
+ const xmlData = XML_DECL + stringifyHeaderFooter("w:hdr", HEADER_NAMESPACES, entry.children, headerCtx);
338
+ headerFormattedViews.set(index, xmlData);
339
+ const headerMedia = findAndReplaceImagePlaceholders(xmlData, ctx.media.array, 0);
340
+ for (let i = 0; i < headerMedia.referenced.length; i++) entry.relationships.addRelationship(i, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", `media/${headerMedia.referenced[i].fileName}`);
341
+ return {
342
+ data: XML_DECL + entry.relationships.serialize(),
343
+ path: `word/_rels/header${index + 1}.xml.rels`
344
+ };
345
+ }),
346
+ Headers: ctx.headers.map((_entry, index) => {
347
+ const tempXmlData = headerFormattedViews.get(index);
348
+ const headerMedia = findAndReplaceImagePlaceholders(tempXmlData, ctx.media.array, 0);
349
+ return {
350
+ data: replaceNumberingPlaceholders(headerMedia.referenced.length > 0 ? headerMedia.xml : tempXmlData, ctx.numbering.concreteNumbering),
351
+ path: `word/header${index + 1}.xml`
352
+ };
353
+ }),
354
+ Numbering: {
355
+ data: ctx.numbering.serialize(),
356
+ path: "word/numbering.xml"
357
+ },
358
+ Properties: {
359
+ data: XML_DECL + (corePropertiesDesc.stringify(ctx._options, ctx) ?? ""),
360
+ path: "docProps/core.xml"
361
+ },
362
+ Relationships: {
363
+ data: (() => {
364
+ for (let i = 0; i < documentMedia.referenced.length; i++) ctx.document.relationships.addRelationship(documentRelationshipCount + i, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", `media/${documentMedia.referenced[i].fileName}`);
365
+ const chartOffset = documentRelationshipCount + documentMedia.referenced.length;
366
+ for (let i = 0; i < ctx.charts.array.length; i++) ctx.document.relationships.addRelationship(chartOffset + i, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart", `charts/chart${i + 1}.xml`);
367
+ addSmartArtRelationships(ctx.smartArts.array.map((s) => s.key), (id, type, target) => {
368
+ ctx.document.relationships.addRelationship(id, type, target);
369
+ }, documentRelationshipCount + documentMedia.referenced.length + ctx.charts.array.length, 0, {
370
+ pathPrefix: "",
371
+ styleRelType: "http://schemas.microsoft.com/office/2007/relationships/diagramStyle"
372
+ });
373
+ ctx.document.relationships.addRelationship(ctx.document.relationships.relationshipCount + 1, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable", "fontTable.xml");
374
+ return XML_DECL + ctx.document.relationships.serialize();
375
+ })(),
376
+ path: "word/_rels/document.xml.rels"
377
+ },
378
+ Settings: {
379
+ data: XML_DECL + (settingsDesc.stringify(ctx._settingsOptions, ctx) ?? ""),
380
+ path: "word/settings.xml"
381
+ },
382
+ Styles: {
383
+ data: (() => {
384
+ return replaceNumberingPlaceholders(ctx.styles.serialize(), ctx.numbering.concreteNumbering);
385
+ })(),
386
+ path: "word/styles.xml"
387
+ },
388
+ ...ctx._options.bibliography ? { Bibliography: {
389
+ data: XML_DECL + (bibliographyDesc.stringify(ctx._options.bibliography, ctx) ?? ""),
390
+ path: "word/bibliography.xml"
391
+ } } : {},
392
+ ...ctx.charts.array.length > 0 ? { Charts: ctx.charts.array.flatMap((chartData, i) => [{
393
+ data: XML_DECL + chartData.chartSpaceXml,
394
+ path: `word/charts/chart${i + 1}.xml`
395
+ }, {
396
+ data: "<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"/>",
397
+ path: `word/charts/_rels/chart${i + 1}.xml.rels`
398
+ }]) } : {},
399
+ ...ctx.smartArts.array.length > 0 ? {
400
+ DiagramData: ctx.smartArts.array.map((smartArtData, i) => ({
401
+ data: XML_DECL + smartArtData.dataModelXml,
402
+ path: `word/diagrams/data${i + 1}.xml`
403
+ })),
404
+ DiagramLayout: ctx.smartArts.array.map((smartArtData, i) => ({
405
+ data: getLayoutXml(smartArtData.layout),
406
+ path: `word/diagrams/layout${i + 1}.xml`
407
+ })),
408
+ DiagramStyle: ctx.smartArts.array.map((smartArtData, i) => ({
409
+ data: getStyleXml(smartArtData.style),
410
+ path: `word/diagrams/quickStyle${i + 1}.xml`
411
+ })),
412
+ DiagramColors: ctx.smartArts.array.map((smartArtData, i) => ({
413
+ data: getColorXml(smartArtData.color),
414
+ path: `word/diagrams/colors${i + 1}.xml`
415
+ })),
416
+ DiagramDrawing: ctx.smartArts.array.map((_, i) => ({
417
+ data: DEFAULT_DRAWING_XML,
418
+ path: `word/diagrams/drawing${i + 1}.xml`
419
+ }))
420
+ } : {},
421
+ ...ctx.altChunks.array.length > 0 ? { AltChunks: ctx.altChunks.array.map((altChunkData) => ({
422
+ data: altChunkData.data,
423
+ path: `word/${altChunkData.path}`
424
+ })) } : {},
425
+ ...ctx.subDocs.array.length > 0 ? { SubDocs: ctx.subDocs.array.map((subDocData) => ({
426
+ data: subDocData.data,
427
+ path: `word/${subDocData.path}`
428
+ })) } : {},
429
+ ...ctx.glossaryOptions ? { Glossary: {
430
+ data: (() => {
431
+ const glossaryCtx = mkCtx(void 0);
432
+ return XML_DECL + (glossaryDesc.stringify(ctx.glossaryOptions, glossaryCtx) ?? "");
433
+ })(),
434
+ path: "word/glossary/document.xml"
435
+ } } : {},
436
+ ...ctx.webSettings ? { WebSettings: {
437
+ data: XML_DECL + (webSettingsDesc.stringify(ctx._options.webSettings ?? {}, ctx) ?? ""),
438
+ path: "word/webSettings.xml"
439
+ } } : {}
440
+ };
441
+ }
442
+ //#endregion
443
+ //#region src/generate.ts
444
+ /**
445
+ * Pure function API for generating DOCX files.
446
+ *
447
+ * @module
448
+ */
449
+ /** @internal Packer instance for DOCX generation. */
450
+ const Packer = createPacker({
451
+ compile: (options, overrides, mediaLevel) => compileDocument(options, overrides, mediaLevel),
452
+ mimeType: OoxmlMimeType.DOCX
453
+ });
454
+ /**
455
+ * Generate a DOCX file from pure JSON options.
456
+ *
457
+ * The output format is controlled by `packerOptions.type` (default: `"nodebuffer"` → Buffer).
458
+ * For synchronous generation, use {@link generateDocumentSync}. For streaming, use {@link generateDocumentStream}.
459
+ *
460
+ * @param options - Document options (sections, styles, numbering, etc.)
461
+ * @param packerOptions - Optional packer configuration (type, compression, overrides, etc.)
462
+ *
463
+ * @example
464
+ * ```typescript
465
+ * import { generateDocument } from "@office-open/docx";
466
+ *
467
+ * const buffer = await generateDocument({ sections: [...] });
468
+ * const bytes = await generateDocument({ sections: [...] }, { type: "uint8array" });
469
+ * const blob = await generateDocument({ sections: [...] }, { type: "blob" });
470
+ * ```
471
+ */
472
+ function generateDocument(options, packerOptions) {
473
+ return Packer.pack(options, packerOptions);
474
+ }
475
+ /**
476
+ * Synchronously generate a DOCX file from pure JSON options.
477
+ */
478
+ function generateDocumentSync(options, packerOptions) {
479
+ return Packer.packSync(options, packerOptions);
480
+ }
481
+ /**
482
+ * Generate a DOCX file as a `ReadableStream<Uint8Array>`.
483
+ */
484
+ function generateDocumentStream(options, packerOptions) {
485
+ return Packer.toStream(options, packerOptions);
486
+ }
487
+ //#endregion
488
+ export { generateDocumentStream as n, generateDocumentSync as r, generateDocument as t };
489
+
490
+ //# sourceMappingURL=generate-m1Cw7CHL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-m1Cw7CHL.mjs","names":[],"sources":["../src/parts/fonts/obfuscate-ttf-to-odttf.ts","../src/parts/header-footer.ts","../src/compiler.ts","../src/generate.ts"],"sourcesContent":["/**\n * Font obfuscation module for embedding fonts in WordprocessingML documents.\n *\n * This module implements the OOXML font obfuscation algorithm used to embed\n * fonts in DOCX documents. Obfuscation is required by the OOXML specification\n * to prevent simple extraction of embedded font files.\n *\n * Reference: ECMA-376 Part 2, Section 11.1 (Font Embedding)\n *\n * @module\n */\n\n/** Start offset for obfuscation in the font file */\nconst obfuscatedStartOffset = 0;\n/** End offset for obfuscation (first 32 bytes are obfuscated) */\nconst obfuscatedEndOffset = 32;\n/** Expected GUID size (32 hex characters without dashes) */\nconst guidSize = 32;\n\n/**\n * Obfuscates a TrueType font file for embedding in OOXML documents.\n *\n * The obfuscation algorithm XORs the first 32 bytes of the font file\n * with a reversed byte sequence derived from the font's GUID key.\n * This prevents simple extraction while maintaining font functionality.\n *\n * @param buf - The original font file as a byte array\n * @param fontKey - The GUID key for the font (with or without dashes)\n * @returns The obfuscated font data\n * @throws Error if the fontKey is not a valid 32-character GUID\n *\n * @example\n * ```typescript\n * const fontData = readFileSync(\"font.ttf\");\n * const fontKey = \"00000000-0000-0000-0000-000000000000\";\n * const obfuscatedData = obfuscate(fontData, fontKey);\n * ```\n *\n * @internal\n */\nexport const obfuscate = (buf: Uint8Array, fontKey: string): Uint8Array => {\n const guid = fontKey.replace(/-/g, \"\");\n if (guid.length !== guidSize) {\n throw new Error(`Error: Cannot extract GUID from font filename: ${fontKey}`);\n }\n\n const hexStrings = guid.replace(/(..)/g, \"$1 \").trim().split(\" \");\n const hexNumbers = hexStrings.map((hexString) => parseInt(hexString, 16));\n hexNumbers.reverse();\n\n const bytesToObfuscate = buf.slice(obfuscatedStartOffset, obfuscatedEndOffset);\n const obfuscatedBytes = bytesToObfuscate.map(\n (byte, i) => byte ^ hexNumbers[i % hexNumbers.length],\n );\n\n const out = new Uint8Array(\n obfuscatedStartOffset + obfuscatedBytes.length + Math.max(0, buf.length - obfuscatedEndOffset),\n );\n out.set(buf.slice(0, obfuscatedStartOffset));\n out.set(obfuscatedBytes, obfuscatedStartOffset);\n out.set(buf.slice(obfuscatedEndOffset), obfuscatedStartOffset + obfuscatedBytes.length);\n return out;\n};\n","/**\n * Header/Footer entry module for WordprocessingML documents.\n *\n * Replaces the former HeaderWrapper/FooterWrapper/Header/Footer/HeaderFooterBase\n * class hierarchy with a simple data structure + pure serialization function.\n *\n * Reference: ISO/IEC 29500-4, wml.xsd, CT_HdrFtr\n *\n * @module\n */\n\nimport type { Relationships } from \"@office-open/core\";\nimport { escapeXml } from \"@office-open/xml\";\nimport type { SectionChild } from \"@shared/section\";\n\nimport { stringifyBodyChild } from \"../body\";\nimport type { BodyContext } from \"../context\";\nimport { DocumentAttributeNamespaces } from \"./document/document-attributes\";\nimport type { DocumentAttributeNamespace } from \"./document/document-attributes\";\n\n/**\n * Simple data structure for a header or footer entry.\n *\n * Replaces HeaderWrapper/FooterWrapper — holds children, relationships,\n * and the reference ID needed for section property references.\n *\n * Children are raw SectionChild objects (plain JSON or class instances).\n */\nexport interface HeaderFooterEntry {\n children: SectionChild[];\n relationships: Relationships;\n referenceId: number;\n}\n\n/**\n * Namespace keys used by header elements.\n * @internal\n */\nexport const HEADER_NAMESPACES: DocumentAttributeNamespace[] = [\n \"cx\",\n \"cx1\",\n \"cx2\",\n \"cx3\",\n \"cx4\",\n \"cx5\",\n \"cx6\",\n \"cx7\",\n \"cx8\",\n \"m\",\n \"mc\",\n \"o\",\n \"r\",\n \"v\",\n \"w\",\n \"w10\",\n \"w14\",\n \"w15\",\n \"w16cid\",\n \"w16se\",\n \"wne\",\n \"wp\",\n \"wp14\",\n \"wpc\",\n \"wpg\",\n \"wpi\",\n \"wps\",\n];\n\n/**\n * Namespace keys used by footer elements.\n * @internal\n */\nexport const FOOTER_NAMESPACES: DocumentAttributeNamespace[] = [\n \"m\",\n \"mc\",\n \"o\",\n \"r\",\n \"v\",\n \"w\",\n \"w10\",\n \"w14\",\n \"w15\",\n \"wne\",\n \"wp\",\n \"wp14\",\n \"wpc\",\n \"wpg\",\n \"wpi\",\n \"wps\",\n];\n\n/**\n * Serialize a header or footer to XML.\n *\n * Builds the `<w:hdr>` or `<w:ftr>` element with namespace declarations,\n * then serializes each child element via `stringifyBodyChild()`.\n *\n * @param tag - Element tag name (\"w:hdr\" or \"w:ftr\")\n * @param namespaces - Namespace keys to declare on the root element\n * @param children - Block-level child elements (raw SectionChild objects)\n * @param ctx - Body context for stringification\n */\nexport function stringifyHeaderFooter(\n tag: string,\n namespaces: DocumentAttributeNamespace[],\n children: SectionChild[],\n ctx: BodyContext,\n): string {\n const attrParts: string[] = [];\n for (const ns of namespaces) {\n attrParts.push(`xmlns:${ns}=\"${escapeXml(DocumentAttributeNamespaces[ns])}\"`);\n }\n const attrStr = attrParts.join(\" \");\n\n const childParts: string[] = [];\n for (const child of children) {\n childParts.push(stringifyBodyChild(child, ctx));\n }\n\n const body = childParts.join(\"\");\n return body.length === 0 ? `<${tag} ${attrStr}/>` : `<${tag} ${attrStr}>${body}</${tag}>`;\n}\n","/**\n * DOCX document compiler — pure function entry point.\n *\n * compileDocument() accepts DocumentOptions directly,\n * creates a DocxWriteContext internally, and produces a Zippable result.\n * All XML parts are produced via descriptors or serialize() —\n * no Formatter dependency.\n *\n * @module\n */\n\nimport {\n addSmartArtRelationships,\n findAndReplaceImagePlaceholders,\n formatId,\n hasPlaceholders,\n replaceAllPlaceholders,\n replaceNumberingPlaceholders,\n} from \"@office-open/core\";\nimport type { XmlifyedFile, ZipOptions, Zippable } from \"@office-open/core\";\nimport { APP_PROPS_XML } from \"@office-open/core\";\nimport {\n DEFAULT_DRAWING_XML,\n getColorXml,\n getLayoutXml,\n getStyleXml,\n} from \"@office-open/core/smartart\";\nimport type { DocumentOptions } from \"@parts/core-properties\";\nimport { obfuscate } from \"@parts/fonts/obfuscate-ttf-to-odttf\";\nimport { HEADER_NAMESPACES, FOOTER_NAMESPACES, stringifyHeaderFooter } from \"@parts/header-footer\";\n\nimport { stringifyDocumentXml, stringifyBodyChild, type BodyContext } from \"./body\";\nimport { DocxWriteContext } from \"./context\";\nimport {\n corePropertiesDesc,\n customPropertiesDesc,\n contentTypesDesc,\n buildContentTypes,\n fontTableDesc,\n webSettingsDesc,\n commentsDesc,\n bibliographyDesc,\n settingsDesc,\n footnotesDesc,\n endnotesDesc,\n glossaryDesc,\n} from \"./parts\";\n\n/** Reusable TextEncoder (stateless, safe to share). */\nconst encoder = new TextEncoder();\n\n/** XML declaration prepended to every OOXML part. */\nconst XML_DECL = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n\n/** Extended context for header/footer formatted view caching. */\ntype DocxContext = BodyContext & {\n headerFormattedViews?: Map<number, string>;\n footerFormattedViews?: Map<number, string>;\n};\n\n// ── Public API ──\n\n/**\n * Compile document options into a flat file map suitable for fflate zipSync.\n *\n * This is the primary entry point for DOCX generation — accepts DocumentOptions\n * directly.\n */\nexport function compileDocument(\n options: DocumentOptions,\n overrides: XmlifyedFile[] = [],\n mediaLevel: number = 0,\n): Zippable {\n const ctx = new DocxWriteContext(options);\n const files: Zippable = {};\n\n const headerFormattedViews = new Map<number, string>();\n const footerFormattedViews = new Map<number, string>();\n\n const xmlifiedFileMapping = xmlifyContext(ctx, headerFormattedViews, footerFormattedViews);\n const map = new Map<string, XmlifyedFile | XmlifyedFile[]>(Object.entries(xmlifiedFileMapping));\n\n for (const [, obj] of map) {\n if (Array.isArray(obj)) {\n for (const subFile of obj as XmlifyedFile[]) {\n files[subFile.path] =\n typeof subFile.data === \"string\" ? encoder.encode(subFile.data) : subFile.data;\n }\n } else {\n const fileObj = obj as XmlifyedFile;\n files[fileObj.path] =\n typeof fileObj.data === \"string\" ? encoder.encode(fileObj.data) : fileObj.data;\n }\n }\n\n for (const subFile of overrides) {\n files[subFile.path] =\n typeof subFile.data === \"string\" ? encoder.encode(subFile.data) : subFile.data;\n }\n\n // Media files\n const mediaArray = ctx.media.array;\n for (const mediaData of mediaArray) {\n files[`word/media/${mediaData.fileName}`] = [\n mediaData.data as Uint8Array,\n { level: mediaLevel as ZipOptions[\"level\"] },\n ];\n if (mediaData.type === \"svg\") {\n files[`word/media/${mediaData.fallback.fileName}`] = [\n mediaData.fallback.data as Uint8Array,\n { level: mediaLevel as ZipOptions[\"level\"] },\n ];\n }\n }\n\n // Font files\n for (const { data: buffer, name, fontKey } of ctx.fontTable.fontOptionsWithKey) {\n const [nameWithoutExtension] = name.split(\".\");\n files[`word/fonts/${nameWithoutExtension}.odttf`] = obfuscate(buffer, fontKey);\n }\n\n return files;\n}\n\n// ── Internal ──\n\n/**\n * Complete mapping of all XML files in an OOXML document package.\n */\ninterface XmlifyedFileMapping {\n Document: XmlifyedFile;\n Styles: XmlifyedFile;\n Properties: XmlifyedFile;\n Numbering: XmlifyedFile;\n Relationships: XmlifyedFile;\n FileRelationships: XmlifyedFile;\n Headers: XmlifyedFile[];\n Footers: XmlifyedFile[];\n HeaderRelationships: XmlifyedFile[];\n FooterRelationships: XmlifyedFile[];\n ContentTypes: XmlifyedFile;\n CustomProperties: XmlifyedFile;\n AppProperties: XmlifyedFile;\n FootNotes: XmlifyedFile;\n FootNotesRelationships: XmlifyedFile;\n Endnotes: XmlifyedFile;\n EndnotesRelationships: XmlifyedFile;\n Settings: XmlifyedFile;\n Comments?: XmlifyedFile;\n CommentsRelationships?: XmlifyedFile;\n FontTable?: XmlifyedFile;\n FontTableRelationships?: XmlifyedFile;\n Bibliography?: XmlifyedFile;\n Charts?: XmlifyedFile[];\n DiagramData?: XmlifyedFile[];\n DiagramLayout?: XmlifyedFile[];\n DiagramStyle?: XmlifyedFile[];\n DiagramColors?: XmlifyedFile[];\n DiagramDrawing?: XmlifyedFile[];\n AltChunks?: XmlifyedFile[];\n SubDocs?: XmlifyedFile[];\n Glossary?: XmlifyedFile;\n WebSettings?: XmlifyedFile;\n}\n\nfunction xmlifyContext(\n ctx: DocxWriteContext,\n headerFormattedViews: Map<number, string>,\n footerFormattedViews: Map<number, string>,\n): XmlifyedFileMapping {\n const mkCtx = (viewWrapper: DocxContext[\"viewWrapper\"] = ctx.document): DocxContext => ({\n fileData: ctx,\n file: ctx,\n viewWrapper,\n stringifyChild: stringifyBodyChild,\n addRelationship: (type: string, target: string, mode?: string) =>\n ctx.addRelationship(type, target, mode),\n addMedia: (data: Uint8Array, type: string) => ctx.addMedia(data, type),\n });\n\n const documentRelationshipCount = ctx.document.relationships.relationshipCount + 1;\n const docCtx = mkCtx(ctx.document);\n const documentXmlData = XML_DECL + stringifyDocumentXml(ctx, docCtx);\n\n const commentRelationshipCount = ctx.comments.relationships.relationshipCount + 1;\n const commentCtx = mkCtx({ relationships: ctx.comments.relationships });\n const commentXmlData =\n XML_DECL + commentsDesc.stringify(ctx._options.comments ?? { children: [] }, commentCtx);\n\n const footnoteRelationshipCount = ctx.footNotes.relationships.relationshipCount + 1;\n const footnoteCtx = mkCtx({\n relationships: ctx.footNotes.relationships,\n });\n const footnoteXmlData =\n XML_DECL + (footnotesDesc.stringify({ notes: ctx.footNotes.notes }, footnoteCtx) ?? \"\");\n\n const documentMedia = findAndReplaceImagePlaceholders(\n documentXmlData,\n ctx.media.array,\n documentRelationshipCount,\n );\n const commentMedia = findAndReplaceImagePlaceholders(\n commentXmlData,\n ctx.media.array,\n commentRelationshipCount,\n );\n const footnoteMedia = findAndReplaceImagePlaceholders(\n footnoteXmlData,\n ctx.media.array,\n footnoteRelationshipCount,\n );\n\n return {\n AppProperties: {\n data: XML_DECL + APP_PROPS_XML,\n path: \"docProps/app.xml\",\n },\n Comments: {\n data: (() => {\n const xmlData = commentMedia.referenced.length > 0 ? commentMedia.xml : commentXmlData;\n return replaceNumberingPlaceholders(xmlData, ctx.numbering.concreteNumbering);\n })(),\n path: \"word/comments.xml\",\n },\n CommentsRelationships: {\n data: (() => {\n for (let i = 0; i < commentMedia.referenced.length; i++) {\n ctx.comments.relationships.addRelationship(\n commentRelationshipCount + i,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n `media/${commentMedia.referenced[i].fileName}`,\n );\n }\n return XML_DECL + ctx.comments.relationships.serialize();\n })(),\n path: \"word/_rels/comments.xml.rels\",\n },\n ContentTypes: {\n data:\n XML_DECL +\n (contentTypesDesc.stringify(\n buildContentTypes({\n headerCount: ctx.headers.length,\n footerCount: ctx.footers.length,\n chartCount: ctx.charts.array.length,\n smartArtCount: ctx.smartArts.array.length,\n hasBibliography: !!ctx._options.bibliography,\n hasGlossary: !!ctx.glossaryOptions,\n hasWebSettings: !!ctx.webSettings,\n altChunks: ctx.altChunks.array.map((ac) => ({\n path: `/word/${ac.path}`,\n contentType: ac.contentType ?? \"application/xhtml+xml\",\n })),\n subDocs: ctx.subDocs.array.map((sd) => ({ path: `/word/${sd.path}` })),\n }),\n ctx,\n ) ?? \"\"),\n path: \"[Content_Types].xml\",\n },\n CustomProperties: {\n data:\n XML_DECL +\n (customPropertiesDesc.stringify({ properties: ctx._options.customProperties ?? [] }, ctx) ??\n \"\"),\n path: \"docProps/custom.xml\",\n },\n Document: {\n data: (() => {\n let xmlData = documentMedia.referenced.length > 0 ? documentMedia.xml : documentXmlData;\n if (hasPlaceholders(xmlData)) {\n const mediaCount = documentMedia.referenced.length;\n const chartKeys = ctx.charts.array.map((c) => c.key);\n const smartArtKeys = ctx.smartArts.array.map((s) => s.key);\n const chartOffset = documentRelationshipCount + mediaCount;\n const smartArtOffset = chartOffset + chartKeys.length;\n\n // Build combined replacement entries for charts, smartart, and numbering\n const entries: Array<{ prefix?: string; key: string; value: string }> = [];\n for (let i = 0; i < chartKeys.length; i++) {\n entries.push({\n prefix: \"chart:\",\n key: chartKeys[i],\n value: formatId(chartOffset, i, \"rId\"),\n });\n }\n const saPrefixes = [\"smartart:\", \"smartart-lo:\", \"smartart-qs:\", \"smartart-cs:\"];\n for (let i = 0; i < smartArtKeys.length; i++) {\n for (let p = 0; p < saPrefixes.length; p++) {\n entries.push({\n prefix: saPrefixes[p],\n key: smartArtKeys[i],\n value: formatId(smartArtOffset + p * smartArtKeys.length, i, \"rId\"),\n });\n }\n }\n for (const { reference, instance, numId } of ctx.numbering.concreteNumbering) {\n entries.push({ key: `${reference}-${instance}`, value: numId.toString() });\n }\n xmlData = replaceAllPlaceholders(xmlData, entries);\n } else {\n xmlData = replaceNumberingPlaceholders(xmlData, ctx.numbering.concreteNumbering);\n }\n return xmlData;\n })(),\n path: \"word/document.xml\",\n },\n Endnotes: {\n data: (() => {\n const endnoteCtx = mkCtx({\n relationships: ctx.endnotes.relationships,\n });\n const xmlData =\n XML_DECL + (endnotesDesc.stringify({ notes: ctx.endnotes.notes }, endnoteCtx) ?? \"\");\n const endnoteRelCount = ctx.endnotes.relationships.relationshipCount + 1;\n const endnoteMedia = findAndReplaceImagePlaceholders(\n xmlData,\n ctx.media.array,\n endnoteRelCount,\n );\n if (endnoteMedia.referenced.length > 0) {\n for (let i = 0; i < endnoteMedia.referenced.length; i++) {\n ctx.endnotes.relationships.addRelationship(\n endnoteRelCount + i,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n `media/${endnoteMedia.referenced[i].fileName}`,\n );\n }\n return replaceNumberingPlaceholders(endnoteMedia.xml, ctx.numbering.concreteNumbering);\n }\n return replaceNumberingPlaceholders(xmlData, ctx.numbering.concreteNumbering);\n })(),\n path: \"word/endnotes.xml\",\n },\n EndnotesRelationships: {\n data: XML_DECL + ctx.endnotes.relationships.serialize(),\n path: \"word/_rels/endnotes.xml.rels\",\n },\n FileRelationships: {\n data: XML_DECL + ctx.fileRelationships.serialize(),\n path: \"_rels/.rels\",\n },\n FontTable: {\n data:\n XML_DECL +\n (fontTableDesc.stringify({ fonts: ctx.fontTable.fontOptionsWithKey }, ctx) ?? \"\"),\n path: \"word/fontTable.xml\",\n },\n FontTableRelationships: {\n data: XML_DECL + ctx.fontTable.relationships.serialize(),\n path: \"word/_rels/fontTable.xml.rels\",\n },\n FootNotes: {\n data: (() => {\n const xmlData = footnoteMedia.referenced.length > 0 ? footnoteMedia.xml : footnoteXmlData;\n return replaceNumberingPlaceholders(xmlData, ctx.numbering.concreteNumbering);\n })(),\n path: \"word/footnotes.xml\",\n },\n FootNotesRelationships: {\n data: (() => {\n for (let i = 0; i < footnoteMedia.referenced.length; i++) {\n ctx.footNotes.relationships.addRelationship(\n footnoteRelationshipCount + i,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n `media/${footnoteMedia.referenced[i].fileName}`,\n );\n }\n return XML_DECL + ctx.footNotes.relationships.serialize();\n })(),\n path: \"word/_rels/footnotes.xml.rels\",\n },\n FooterRelationships: ctx.footers.map((entry, index) => {\n const footerCtx = mkCtx({ relationships: entry.relationships });\n const xmlData =\n XML_DECL + stringifyHeaderFooter(\"w:ftr\", FOOTER_NAMESPACES, entry.children, footerCtx);\n footerFormattedViews.set(index, xmlData);\n const footerMedia = findAndReplaceImagePlaceholders(xmlData, ctx.media.array, 0);\n\n for (let i = 0; i < footerMedia.referenced.length; i++) {\n entry.relationships.addRelationship(\n i,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n `media/${footerMedia.referenced[i].fileName}`,\n );\n }\n\n return {\n data: XML_DECL + entry.relationships.serialize(),\n path: `word/_rels/footer${index + 1}.xml.rels`,\n };\n }),\n Footers: ctx.footers.map((_entry, index) => {\n const tempXmlData = footerFormattedViews.get(index)!;\n const footerMedia = findAndReplaceImagePlaceholders(tempXmlData, ctx.media.array, 0);\n const xmlData = footerMedia.referenced.length > 0 ? footerMedia.xml : tempXmlData;\n\n return {\n data: replaceNumberingPlaceholders(xmlData, ctx.numbering.concreteNumbering),\n path: `word/footer${index + 1}.xml`,\n };\n }),\n HeaderRelationships: ctx.headers.map((entry, index) => {\n const headerCtx = mkCtx({ relationships: entry.relationships });\n const xmlData =\n XML_DECL + stringifyHeaderFooter(\"w:hdr\", HEADER_NAMESPACES, entry.children, headerCtx);\n headerFormattedViews.set(index, xmlData);\n const headerMedia = findAndReplaceImagePlaceholders(xmlData, ctx.media.array, 0);\n\n for (let i = 0; i < headerMedia.referenced.length; i++) {\n entry.relationships.addRelationship(\n i,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n `media/${headerMedia.referenced[i].fileName}`,\n );\n }\n\n return {\n data: XML_DECL + entry.relationships.serialize(),\n path: `word/_rels/header${index + 1}.xml.rels`,\n };\n }),\n Headers: ctx.headers.map((_entry, index) => {\n const tempXmlData = headerFormattedViews.get(index)!;\n const headerMedia = findAndReplaceImagePlaceholders(tempXmlData, ctx.media.array, 0);\n const xmlData = headerMedia.referenced.length > 0 ? headerMedia.xml : tempXmlData;\n\n return {\n data: replaceNumberingPlaceholders(xmlData, ctx.numbering.concreteNumbering),\n path: `word/header${index + 1}.xml`,\n };\n }),\n Numbering: {\n data: ctx.numbering.serialize(),\n path: \"word/numbering.xml\",\n },\n Properties: {\n data: XML_DECL + (corePropertiesDesc.stringify(ctx._options, ctx) ?? \"\"),\n path: \"docProps/core.xml\",\n },\n Relationships: {\n data: (() => {\n for (let i = 0; i < documentMedia.referenced.length; i++) {\n ctx.document.relationships.addRelationship(\n documentRelationshipCount + i,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n `media/${documentMedia.referenced[i].fileName}`,\n );\n }\n\n const chartOffset = documentRelationshipCount + documentMedia.referenced.length;\n for (let i = 0; i < ctx.charts.array.length; i++) {\n ctx.document.relationships.addRelationship(\n chartOffset + i,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\",\n `charts/chart${i + 1}.xml`,\n );\n }\n\n addSmartArtRelationships(\n ctx.smartArts.array.map((s) => s.key),\n (id, type, target) => {\n ctx.document.relationships.addRelationship(id, type, target);\n },\n documentRelationshipCount + documentMedia.referenced.length + ctx.charts.array.length,\n 0,\n {\n pathPrefix: \"\",\n styleRelType: \"http://schemas.microsoft.com/office/2007/relationships/diagramStyle\",\n },\n );\n\n ctx.document.relationships.addRelationship(\n ctx.document.relationships.relationshipCount + 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\",\n \"fontTable.xml\",\n );\n\n return XML_DECL + ctx.document.relationships.serialize();\n })(),\n path: \"word/_rels/document.xml.rels\",\n },\n Settings: {\n data: XML_DECL + (settingsDesc.stringify(ctx._settingsOptions, ctx) ?? \"\"),\n path: \"word/settings.xml\",\n },\n Styles: {\n data: (() => {\n const xmlStyles = ctx.styles.serialize();\n return replaceNumberingPlaceholders(xmlStyles, ctx.numbering.concreteNumbering);\n })(),\n path: \"word/styles.xml\",\n },\n ...(ctx._options.bibliography\n ? {\n Bibliography: {\n data: XML_DECL + (bibliographyDesc.stringify(ctx._options.bibliography, ctx) ?? \"\"),\n path: \"word/bibliography.xml\",\n },\n }\n : {}),\n ...(ctx.charts.array.length > 0\n ? {\n Charts: ctx.charts.array.flatMap((chartData, i) => [\n {\n data: XML_DECL + chartData.chartSpaceXml,\n path: `word/charts/chart${i + 1}.xml`,\n },\n {\n data: '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"/>',\n path: `word/charts/_rels/chart${i + 1}.xml.rels`,\n },\n ]),\n }\n : {}),\n ...(ctx.smartArts.array.length > 0\n ? {\n DiagramData: ctx.smartArts.array.map((smartArtData, i) => ({\n data: XML_DECL + smartArtData.dataModelXml,\n path: `word/diagrams/data${i + 1}.xml`,\n })),\n DiagramLayout: ctx.smartArts.array.map((smartArtData, i) => ({\n data: getLayoutXml(smartArtData.layout),\n path: `word/diagrams/layout${i + 1}.xml`,\n })),\n DiagramStyle: ctx.smartArts.array.map((smartArtData, i) => ({\n data: getStyleXml(smartArtData.style),\n path: `word/diagrams/quickStyle${i + 1}.xml`,\n })),\n DiagramColors: ctx.smartArts.array.map((smartArtData, i) => ({\n data: getColorXml(smartArtData.color),\n path: `word/diagrams/colors${i + 1}.xml`,\n })),\n DiagramDrawing: ctx.smartArts.array.map((_, i) => ({\n data: DEFAULT_DRAWING_XML,\n path: `word/diagrams/drawing${i + 1}.xml`,\n })),\n }\n : {}),\n ...(ctx.altChunks.array.length > 0\n ? {\n AltChunks: ctx.altChunks.array.map((altChunkData) => ({\n data: altChunkData.data,\n path: `word/${altChunkData.path}`,\n })),\n }\n : {}),\n ...(ctx.subDocs.array.length > 0\n ? {\n SubDocs: ctx.subDocs.array.map((subDocData) => ({\n data: subDocData.data,\n path: `word/${subDocData.path}`,\n })),\n }\n : {}),\n ...(ctx.glossaryOptions\n ? {\n Glossary: {\n data: (() => {\n const glossaryCtx = mkCtx(undefined);\n return XML_DECL + (glossaryDesc.stringify(ctx.glossaryOptions!, glossaryCtx) ?? \"\");\n })(),\n path: \"word/glossary/document.xml\",\n },\n }\n : {}),\n ...(ctx.webSettings\n ? {\n WebSettings: {\n data: XML_DECL + (webSettingsDesc.stringify(ctx._options.webSettings ?? {}, ctx) ?? \"\"),\n path: \"word/webSettings.xml\",\n },\n }\n : {}),\n };\n}\n","/**\n * Pure function API for generating DOCX files.\n *\n * @module\n */\n\nimport { createPacker, OoxmlMimeType } from \"@office-open/core\";\nimport type { OutputByType, OutputType, PackerOptions } from \"@office-open/core\";\nimport type { DocumentOptions } from \"@parts/core-properties\";\n\nimport { compileDocument } from \"./compiler\";\n\n/** @internal Packer instance for DOCX generation. */\nconst Packer = createPacker<DocumentOptions>({\n compile: (options, overrides, mediaLevel) => compileDocument(options, overrides, mediaLevel),\n mimeType: OoxmlMimeType.DOCX,\n});\n\n/**\n * Generate a DOCX file from pure JSON options.\n *\n * The output format is controlled by `packerOptions.type` (default: `\"nodebuffer\"` → Buffer).\n * For synchronous generation, use {@link generateDocumentSync}. For streaming, use {@link generateDocumentStream}.\n *\n * @param options - Document options (sections, styles, numbering, etc.)\n * @param packerOptions - Optional packer configuration (type, compression, overrides, etc.)\n *\n * @example\n * ```typescript\n * import { generateDocument } from \"@office-open/docx\";\n *\n * const buffer = await generateDocument({ sections: [...] });\n * const bytes = await generateDocument({ sections: [...] }, { type: \"uint8array\" });\n * const blob = await generateDocument({ sections: [...] }, { type: \"blob\" });\n * ```\n */\nexport function generateDocument<T extends OutputType = \"nodebuffer\">(\n options: DocumentOptions,\n packerOptions?: PackerOptions<T>,\n): Promise<OutputByType[T]> {\n return Packer.pack(options, packerOptions) as Promise<OutputByType[T]>;\n}\n\n/**\n * Synchronously generate a DOCX file from pure JSON options.\n */\nexport function generateDocumentSync<T extends OutputType = \"nodebuffer\">(\n options: DocumentOptions,\n packerOptions?: PackerOptions<T>,\n): OutputByType[T] {\n return Packer.packSync(options, packerOptions) as OutputByType[T];\n}\n\n/**\n * Generate a DOCX file as a `ReadableStream<Uint8Array>`.\n */\nexport function generateDocumentStream(\n options: DocumentOptions,\n packerOptions?: PackerOptions,\n): ReadableStream<Uint8Array> {\n return Packer.toStream(options, packerOptions);\n}\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { n as DocumentOptions } from "./core-properties-B3ztqzLD.mjs";
2
+ import { OutputByType, OutputType, PackerOptions } from "@office-open/core";
3
+
4
+ //#region src/generate.d.ts
5
+ declare function generateDocument<T extends OutputType = "nodebuffer">(options: DocumentOptions, packerOptions?: PackerOptions<T>): Promise<OutputByType[T]>;
6
+ declare function generateDocumentSync<T extends OutputType = "nodebuffer">(options: DocumentOptions, packerOptions?: PackerOptions<T>): OutputByType[T];
7
+ declare function generateDocumentStream(options: DocumentOptions, packerOptions?: PackerOptions): ReadableStream<Uint8Array>;
8
+ //#endregion
9
+ export { generateDocument, generateDocumentStream, generateDocumentSync };
10
+ //# sourceMappingURL=generate.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.mts","names":[],"sources":["../src/generate.ts"],"mappings":";;;;iBAoCgB,gBAAA,WAA2B,UAAA,iBACzC,OAAA,EAAS,eAAA,EACT,aAAA,GAAgB,aAAA,CAAc,CAAA,IAC7B,OAAA,CAAQ,YAAA,CAAa,CAAA;AAAA,iBAOR,oBAAA,WAA+B,UAAA,iBAC7C,OAAA,EAAS,eAAA,EACT,aAAA,GAAgB,aAAA,CAAc,CAAA,IAC7B,YAAA,CAAa,CAAA;AAAA,iBAOA,sBAAA,CACd,OAAA,EAAS,eAAA,EACT,aAAA,GAAgB,aAAA,GACf,cAAA,CAAe,UAAA"}
@@ -0,0 +1,2 @@
1
+ import { n as generateDocumentStream, r as generateDocumentSync, t as generateDocument } from "./generate-m1Cw7CHL.mjs";
2
+ export { generateDocument, generateDocumentStream, generateDocumentSync };