dynamic-docx-generator 1.0.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,48 @@
1
+ /**
2
+ * XML manipulation utilities for DOCX processing
3
+ */
4
+ /**
5
+ * Find and replace content in XML string
6
+ */
7
+ export declare const replaceXmlContent: (xml: string, search: string, replacement: string) => string;
8
+ /**
9
+ * Insert content before a specific XML tag
10
+ */
11
+ export declare const insertBeforeTag: (xml: string, tag: string, content: string) => string;
12
+ /**
13
+ * Insert content after a specific XML tag
14
+ */
15
+ export declare const insertAfterTag: (xml: string, tag: string, content: string) => string;
16
+ /**
17
+ * Replace content between two tags
18
+ */
19
+ export declare const replaceBetweenTags: (xml: string, startTag: string, endTag: string, replacement: string) => string;
20
+ /**
21
+ * Add relationship to document.xml.rels
22
+ */
23
+ export declare const addRelationship: (relsContent: string, relationshipXml: string) => string;
24
+ /**
25
+ * Extract relationship IDs from rels XML
26
+ */
27
+ export declare const extractRelationshipIds: (relsContent: string) => string[];
28
+ /**
29
+ * Generate unique relationship ID not present in existing rels
30
+ */
31
+ export declare const generateUniqueRelId: (existingIds: string[]) => string;
32
+ /**
33
+ * Parse content types from [Content_Types].xml
34
+ */
35
+ export declare const addContentType: (contentTypesXml: string, extension: string, contentType: string) => string;
36
+ /**
37
+ * Common content types for images
38
+ */
39
+ export declare const IMAGE_CONTENT_TYPES: Record<string, string>;
40
+ /**
41
+ * Get content type for image extension
42
+ */
43
+ export declare const getImageContentType: (extension: string) => string;
44
+ /**
45
+ * Validate XML structure (basic check)
46
+ */
47
+ export declare const isValidXml: (xml: string) => boolean;
48
+ //# sourceMappingURL=xml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../src/utils/xml.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC1B,KAAK,MAAM,EACX,QAAQ,MAAM,EACd,aAAa,MAAM,KACpB,MAIF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GACxB,KAAK,MAAM,EACX,KAAK,MAAM,EACX,SAAS,MAAM,KAChB,MAKF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GACvB,KAAK,MAAM,EACX,KAAK,MAAM,EACX,SAAS,MAAM,KAChB,MAMF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC3B,KAAK,MAAM,EACX,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,aAAa,MAAM,KACpB,MAWF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GACxB,aAAa,MAAM,EACnB,iBAAiB,MAAM,KACxB,MAGF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,GAAI,aAAa,MAAM,KAAG,MAAM,EAKlE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,aAAa,MAAM,EAAE,KAAG,MAM3D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GACvB,iBAAiB,MAAM,EACvB,WAAW,MAAM,EACjB,aAAa,MAAM,KACpB,MASF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOtD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,WAAW,MAAM,KAAG,MAGvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,OAYxC,CAAC"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ /**
3
+ * XML manipulation utilities for DOCX processing
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isValidXml = exports.getImageContentType = exports.IMAGE_CONTENT_TYPES = exports.addContentType = exports.generateUniqueRelId = exports.extractRelationshipIds = exports.addRelationship = exports.replaceBetweenTags = exports.insertAfterTag = exports.insertBeforeTag = exports.replaceXmlContent = void 0;
7
+ const string_1 = require("./string");
8
+ /**
9
+ * Find and replace content in XML string
10
+ */
11
+ const replaceXmlContent = (xml, search, replacement) => {
12
+ let result = (0, string_1.replaceAll)(xml, search, replacement);
13
+ result = (0, string_1.fixDoubleEscaping)(result);
14
+ return result;
15
+ };
16
+ exports.replaceXmlContent = replaceXmlContent;
17
+ /**
18
+ * Insert content before a specific XML tag
19
+ */
20
+ const insertBeforeTag = (xml, tag, content) => {
21
+ const index = xml.indexOf(tag);
22
+ if (index === -1)
23
+ return xml;
24
+ return xml.slice(0, index) + content + xml.slice(index);
25
+ };
26
+ exports.insertBeforeTag = insertBeforeTag;
27
+ /**
28
+ * Insert content after a specific XML tag
29
+ */
30
+ const insertAfterTag = (xml, tag, content) => {
31
+ const index = xml.indexOf(tag);
32
+ if (index === -1)
33
+ return xml;
34
+ const endIndex = index + tag.length;
35
+ return xml.slice(0, endIndex) + content + xml.slice(endIndex);
36
+ };
37
+ exports.insertAfterTag = insertAfterTag;
38
+ /**
39
+ * Replace content between two tags
40
+ */
41
+ const replaceBetweenTags = (xml, startTag, endTag, replacement) => {
42
+ const startIndex = xml.indexOf(startTag);
43
+ const endIndex = xml.indexOf(endTag, startIndex);
44
+ if (startIndex === -1 || endIndex === -1)
45
+ return xml;
46
+ return (xml.slice(0, startIndex + startTag.length) +
47
+ replacement +
48
+ xml.slice(endIndex));
49
+ };
50
+ exports.replaceBetweenTags = replaceBetweenTags;
51
+ /**
52
+ * Add relationship to document.xml.rels
53
+ */
54
+ const addRelationship = (relsContent, relationshipXml) => {
55
+ const closingTag = '</Relationships>';
56
+ return (0, string_1.replaceAll)(relsContent, closingTag, relationshipXml + '\n' + closingTag);
57
+ };
58
+ exports.addRelationship = addRelationship;
59
+ /**
60
+ * Extract relationship IDs from rels XML
61
+ */
62
+ const extractRelationshipIds = (relsContent) => {
63
+ const matches = relsContent.match(/Id="([^"]+)"/g);
64
+ if (!matches)
65
+ return [];
66
+ return matches.map(m => m.replace('Id="', '').replace('"', ''));
67
+ };
68
+ exports.extractRelationshipIds = extractRelationshipIds;
69
+ /**
70
+ * Generate unique relationship ID not present in existing rels
71
+ */
72
+ const generateUniqueRelId = (existingIds) => {
73
+ let id = 1;
74
+ while (existingIds.includes(`rId${id}`)) {
75
+ id++;
76
+ }
77
+ return `rId${id}`;
78
+ };
79
+ exports.generateUniqueRelId = generateUniqueRelId;
80
+ /**
81
+ * Parse content types from [Content_Types].xml
82
+ */
83
+ const addContentType = (contentTypesXml, extension, contentType) => {
84
+ const existing = `Extension="${extension}"`;
85
+ if (contentTypesXml.includes(existing)) {
86
+ return contentTypesXml;
87
+ }
88
+ const newType = `<Default Extension="${extension}" ContentType="${contentType}" />`;
89
+ const closingTag = '</Types>';
90
+ return (0, string_1.replaceAll)(contentTypesXml, closingTag, newType + '\n' + closingTag);
91
+ };
92
+ exports.addContentType = addContentType;
93
+ /**
94
+ * Common content types for images
95
+ */
96
+ exports.IMAGE_CONTENT_TYPES = {
97
+ png: 'image/png',
98
+ jpg: 'image/jpeg',
99
+ jpeg: 'image/jpeg',
100
+ gif: 'image/gif',
101
+ bmp: 'image/bmp',
102
+ webp: 'image/webp'
103
+ };
104
+ /**
105
+ * Get content type for image extension
106
+ */
107
+ const getImageContentType = (extension) => {
108
+ const ext = extension.toLowerCase().replace('.', '');
109
+ return exports.IMAGE_CONTENT_TYPES[ext] || 'image/png';
110
+ };
111
+ exports.getImageContentType = getImageContentType;
112
+ /**
113
+ * Validate XML structure (basic check)
114
+ */
115
+ const isValidXml = (xml) => {
116
+ try {
117
+ // Basic check: matching opening/closing tags
118
+ const openTags = (xml.match(/<[^/][^>]*[^/]>/g) || []).length;
119
+ const closeTags = (xml.match(/<\/[^>]+>/g) || []).length;
120
+ const selfClose = (xml.match(/<[^>]+\/>/g) || []).length;
121
+ // This is a rough approximation
122
+ return Math.abs(openTags - closeTags - selfClose) < 5;
123
+ }
124
+ catch {
125
+ return false;
126
+ }
127
+ };
128
+ exports.isValidXml = isValidXml;
129
+ //# sourceMappingURL=xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/utils/xml.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "dynamic-docx-generator",
3
+ "version": "1.0.0",
4
+ "description": "Generate dynamic DOCX documents from templates with placeholder replacement, tables, and images",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "README.md",
10
+ "LICENSE"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "test": "jest",
15
+ "test:coverage": "jest --coverage",
16
+ "prepublishOnly": "npm run build && npm test",
17
+ "lint": "eslint src/**/*.ts",
18
+ "example": "node examples/basic-usage.js"
19
+ },
20
+ "keywords": [
21
+ "docx",
22
+ "word",
23
+ "document",
24
+ "template",
25
+ "generator",
26
+ "office",
27
+ "openxml",
28
+ "placeholder",
29
+ "dynamic",
30
+ "report"
31
+ ],
32
+ "author": "Your Name",
33
+ "license": "MIT",
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/your-username/dynamic-docx-generator.git"
37
+ },
38
+ "homepage": "https://github.com/your-username/dynamic-docx-generator#readme",
39
+ "bugs": {
40
+ "url": "https://github.com/your-username/dynamic-docx-generator/issues"
41
+ },
42
+ "engines": {
43
+ "node": ">=14.0.0"
44
+ },
45
+ "dependencies": {
46
+ "adm-zip": "^0.5.16",
47
+ "axios": "^1.7.9"
48
+ },
49
+ "devDependencies": {
50
+ "@types/adm-zip": "^0.5.7",
51
+ "@types/jest": "^29.5.14",
52
+ "@types/node": "^22.10.5",
53
+ "jest": "^29.7.0",
54
+ "ts-jest": "^29.2.5",
55
+ "typescript": "^5.7.3"
56
+ }
57
+ }