@otomate/docx 0.0.1

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/xml.js ADDED
@@ -0,0 +1,47 @@
1
+ // ---------------------------------------------------------------------------
2
+ // XML parsing/building wrapper for OOXML
3
+ // ---------------------------------------------------------------------------
4
+ import { XMLParser, XMLBuilder } from "fast-xml-parser";
5
+ const parserOptions = {
6
+ ignoreAttributes: false,
7
+ attributeNamePrefix: "@_",
8
+ textNodeName: "#text",
9
+ trimValues: false,
10
+ preserveOrder: false,
11
+ isArray: (name) => {
12
+ return [
13
+ "w:p", "w:r", "w:t", "w:tbl", "w:tr", "w:tc",
14
+ "w:hyperlink", "w:drawing", "w:style",
15
+ "w:abstractNum", "w:num", "w:lvl",
16
+ ].includes(name);
17
+ },
18
+ };
19
+ /** Parser that preserves element order — used for document body */
20
+ const orderedParserOptions = {
21
+ ignoreAttributes: false,
22
+ attributeNamePrefix: "@_",
23
+ textNodeName: "#text",
24
+ trimValues: false,
25
+ preserveOrder: true,
26
+ };
27
+ const orderedParser = new XMLParser(orderedParserOptions);
28
+ const builderOptions = {
29
+ ignoreAttributes: false,
30
+ attributeNamePrefix: "@_",
31
+ textNodeName: "#text",
32
+ format: true,
33
+ suppressEmptyNode: true,
34
+ };
35
+ const parser = new XMLParser(parserOptions);
36
+ const builder = new XMLBuilder(builderOptions);
37
+ export function parseXml(xml) {
38
+ return parser.parse(xml);
39
+ }
40
+ /** Parse XML preserving element order. Returns an array of { tagName: children[], :@: attrs } */
41
+ export function parseXmlOrdered(xml) {
42
+ return orderedParser.parse(xml);
43
+ }
44
+ export function buildXml(obj) {
45
+ return builder.build(obj);
46
+ }
47
+ //# sourceMappingURL=xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../src/xml.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,aAAa,GAAG;IACpB,gBAAgB,EAAE,KAAK;IACvB,mBAAmB,EAAE,IAAI;IACzB,YAAY,EAAE,OAAO;IACrB,UAAU,EAAE,KAAK;IACjB,aAAa,EAAE,KAAK;IACpB,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE;QACxB,OAAO;YACL,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;YAC5C,aAAa,EAAE,WAAW,EAAE,SAAS;YACrC,eAAe,EAAE,OAAO,EAAE,OAAO;SAClC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;CACF,CAAC;AAEF,mEAAmE;AACnE,MAAM,oBAAoB,GAAG;IAC3B,gBAAgB,EAAE,KAAK;IACvB,mBAAmB,EAAE,IAAI;IACzB,YAAY,EAAE,OAAO;IACrB,UAAU,EAAE,KAAK;IACjB,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAC;AAE1D,MAAM,cAAc,GAAG;IACrB,gBAAgB,EAAE,KAAK;IACvB,mBAAmB,EAAE,IAAI;IACzB,YAAY,EAAE,OAAO;IACrB,MAAM,EAAE,IAAI;IACZ,iBAAiB,EAAE,IAAI;CACxB,CAAC;AAEF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC;AAC5C,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC;AAE/C,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAA4B;IACnD,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC"}
package/dist/zip.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ export interface DocxParts {
2
+ document: string;
3
+ styles?: string;
4
+ numbering?: string;
5
+ relationships?: string;
6
+ contentTypes?: string;
7
+ media: Map<string, Uint8Array>;
8
+ rawParts: Map<string, string>;
9
+ }
10
+ /** Extract a .docx buffer into structured parts. */
11
+ export declare function extractDocx(buffer: ArrayBuffer | Uint8Array): Promise<DocxParts>;
12
+ /** Pack structured parts back into a .docx buffer. */
13
+ export declare function packDocx(parts: DocxParts): Promise<Uint8Array>;
14
+ //# sourceMappingURL=zip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../src/zip.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAUD,oDAAoD;AACpD,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAgCtF;AAED,sDAAsD;AACtD,wBAAsB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAsBpE"}
package/dist/zip.js ADDED
@@ -0,0 +1,84 @@
1
+ // ---------------------------------------------------------------------------
2
+ // JSZip wrapper for reading/writing .docx archives
3
+ // ---------------------------------------------------------------------------
4
+ import JSZip from "jszip";
5
+ const KNOWN_PARTS = new Set([
6
+ "word/document.xml",
7
+ "word/styles.xml",
8
+ "word/numbering.xml",
9
+ "word/_rels/document.xml.rels",
10
+ "[Content_Types].xml",
11
+ ]);
12
+ /** Extract a .docx buffer into structured parts. */
13
+ export async function extractDocx(buffer) {
14
+ const zip = await JSZip.loadAsync(buffer);
15
+ const parts = { document: "", media: new Map(), rawParts: new Map() };
16
+ for (const [path, file] of Object.entries(zip.files)) {
17
+ if (file.dir)
18
+ continue;
19
+ if (path === "word/document.xml") {
20
+ parts.document = await file.async("string");
21
+ }
22
+ else if (path === "word/styles.xml") {
23
+ parts.styles = await file.async("string");
24
+ }
25
+ else if (path === "word/numbering.xml") {
26
+ parts.numbering = await file.async("string");
27
+ }
28
+ else if (path === "word/_rels/document.xml.rels") {
29
+ parts.relationships = await file.async("string");
30
+ }
31
+ else if (path === "[Content_Types].xml") {
32
+ parts.contentTypes = await file.async("string");
33
+ }
34
+ else if (path.startsWith("word/media/")) {
35
+ parts.media.set(path, await file.async("uint8array"));
36
+ }
37
+ else {
38
+ // Store as raw string for round-trip
39
+ try {
40
+ parts.rawParts.set(path, await file.async("string"));
41
+ }
42
+ catch {
43
+ // Binary files that aren't media — store as base64
44
+ const data = await file.async("uint8array");
45
+ parts.rawParts.set(path, Buffer.from(data).toString("base64"));
46
+ }
47
+ }
48
+ }
49
+ return parts;
50
+ }
51
+ /** Pack structured parts back into a .docx buffer. */
52
+ export async function packDocx(parts) {
53
+ const zip = new JSZip();
54
+ zip.file("[Content_Types].xml", parts.contentTypes ?? DEFAULT_CONTENT_TYPES);
55
+ zip.file("word/document.xml", parts.document);
56
+ if (parts.styles)
57
+ zip.file("word/styles.xml", parts.styles);
58
+ if (parts.numbering)
59
+ zip.file("word/numbering.xml", parts.numbering);
60
+ if (parts.relationships)
61
+ zip.file("word/_rels/document.xml.rels", parts.relationships);
62
+ // Media
63
+ for (const [path, data] of parts.media) {
64
+ zip.file(path, data);
65
+ }
66
+ // Raw parts (round-trip preservation)
67
+ for (const [path, content] of parts.rawParts) {
68
+ if (!zip.file(path)) { // Don't overwrite parts we already wrote
69
+ zip.file(path, content);
70
+ }
71
+ }
72
+ return zip.generateAsync({ type: "uint8array" });
73
+ }
74
+ const DEFAULT_CONTENT_TYPES = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
75
+ <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
76
+ <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
77
+ <Default Extension="xml" ContentType="application/xml"/>
78
+ <Default Extension="png" ContentType="image/png"/>
79
+ <Default Extension="jpeg" ContentType="image/jpeg"/>
80
+ <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
81
+ <Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>
82
+ <Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/>
83
+ </Types>`;
84
+ //# sourceMappingURL=zip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../src/zip.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@otomate/docx",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": { ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js" } },
8
+ "files": ["dist"],
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "test": "node --test --import tsx src/__tests__/*.test.ts",
12
+ "typecheck": "tsc --noEmit"
13
+ },
14
+ "dependencies": {
15
+ "@otomate/core": "workspace:*",
16
+ "@otomate/css-docx": "workspace:*",
17
+ "jszip": "^3.10.0",
18
+ "fast-xml-parser": "^4.4.0"
19
+ },
20
+ "devDependencies": {
21
+ "@otomate/diff": "workspace:*",
22
+ "@otomate/html": "workspace:*",
23
+ "@types/node": "^25.5.2",
24
+ "tsx": "^4.19.0",
25
+ "typescript": "^5.7.0"
26
+ },
27
+ "description": "docx adapter for the Universal Document Model",
28
+ "license": "BUSL-1.1",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/Alessio-G/occam",
32
+ "directory": "packages/docx"
33
+ }
34
+ }