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.
- package/LICENSE +21 -0
- package/README.md +315 -0
- package/dist/DocxGenerator.d.ts +135 -0
- package/dist/DocxGenerator.d.ts.map +1 -0
- package/dist/DocxGenerator.js +365 -0
- package/dist/DocxGenerator.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +81 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/constants.d.ts +44 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +196 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/image.d.ts +59 -0
- package/dist/utils/image.d.ts.map +1 -0
- package/dist/utils/image.js +158 -0
- package/dist/utils/image.js.map +1 -0
- package/dist/utils/string.d.ts +49 -0
- package/dist/utils/string.d.ts.map +1 -0
- package/dist/utils/string.js +143 -0
- package/dist/utils/string.js.map +1 -0
- package/dist/utils/xml.d.ts +48 -0
- package/dist/utils/xml.d.ts.map +1 -0
- package/dist/utils/xml.js +129 -0
- package/dist/utils/xml.js.map +1 -0
- package/package.json +57 -0
|
@@ -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
|
+
}
|