Compare commits
28 Commits
Author | SHA1 | Date | |
---|---|---|---|
eb2174e566 | |||
2a56360875 | |||
ba862766a6 | |||
71291dab8f | |||
974ba7b450 | |||
8f7df39c07 | |||
ca3d8f0121 | |||
46c517d195 | |||
ff37f3b460 | |||
7b9b474484 | |||
e80a50d36c | |||
df99f96469 | |||
f87ad6a43c | |||
8bf5220e31 | |||
da8148251a | |||
01183ac34d | |||
d553e4763a | |||
213c3d29f3 | |||
697c1d91c6 | |||
b22de4ac4f | |||
0af9d27dcc | |||
b89b571c4e | |||
64505a295f | |||
c247bbf409 | |||
4c60e6a0c0 | |||
086e5ef184 | |||
7e81f7b368 | |||
defa431aa9 |
@ -8,11 +8,14 @@
|
|||||||
// words - list of words to be always considered correct
|
// words - list of words to be always considered correct
|
||||||
"words": [
|
"words": [
|
||||||
"Abjad",
|
"Abjad",
|
||||||
|
"aink",
|
||||||
"aiueo",
|
"aiueo",
|
||||||
"ATLEAST",
|
"ATLEAST",
|
||||||
"chosung",
|
"chosung",
|
||||||
"clippy",
|
"clippy",
|
||||||
"datas",
|
"datas",
|
||||||
|
"dcmitype",
|
||||||
|
"dcterms",
|
||||||
"docsify",
|
"docsify",
|
||||||
"dolan",
|
"dolan",
|
||||||
"execa",
|
"execa",
|
||||||
@ -32,6 +35,7 @@
|
|||||||
"panose",
|
"panose",
|
||||||
"rels",
|
"rels",
|
||||||
"rsid",
|
"rsid",
|
||||||
|
"sdtdh",
|
||||||
"twip",
|
"twip",
|
||||||
"twips",
|
"twips",
|
||||||
"Xmlable",
|
"Xmlable",
|
||||||
|
243
.eslintrc.yml
243
.eslintrc.yml
@ -1,243 +0,0 @@
|
|||||||
extends: eslint:recommended
|
|
||||||
env:
|
|
||||||
browser: true
|
|
||||||
es6: true
|
|
||||||
node: true
|
|
||||||
parser: "@typescript-eslint/parser"
|
|
||||||
parserOptions:
|
|
||||||
project:
|
|
||||||
- tsconfig.json
|
|
||||||
sourceType: module
|
|
||||||
plugins:
|
|
||||||
- eslint-plugin-import
|
|
||||||
- eslint-plugin-no-null
|
|
||||||
- eslint-plugin-unicorn
|
|
||||||
- eslint-plugin-jsdoc
|
|
||||||
- eslint-plugin-prefer-arrow
|
|
||||||
- "@typescript-eslint"
|
|
||||||
- eslint-plugin-functional
|
|
||||||
root: true
|
|
||||||
rules:
|
|
||||||
no-undef: "off"
|
|
||||||
no-extra-boolean-cast: "off"
|
|
||||||
no-alert: error
|
|
||||||
no-self-compare: error
|
|
||||||
no-unreachable-loop: error
|
|
||||||
no-template-curly-in-string: error
|
|
||||||
no-unused-private-class-members: error
|
|
||||||
no-extend-native: error
|
|
||||||
no-floating-decimal: error
|
|
||||||
no-implied-eval: error
|
|
||||||
no-iterator: error
|
|
||||||
no-lone-blocks: error
|
|
||||||
no-loop-func: error
|
|
||||||
no-new-object: error
|
|
||||||
no-proto: error
|
|
||||||
no-useless-catch: error
|
|
||||||
one-var-declaration-per-line: error
|
|
||||||
prefer-arrow-callback: error
|
|
||||||
prefer-destructuring: error
|
|
||||||
prefer-exponentiation-operator: error
|
|
||||||
prefer-promise-reject-errors: error
|
|
||||||
prefer-regex-literals: error
|
|
||||||
prefer-spread: error
|
|
||||||
prefer-template: error
|
|
||||||
require-await: error
|
|
||||||
"@typescript-eslint/adjacent-overload-signatures": error
|
|
||||||
"@typescript-eslint/array-type":
|
|
||||||
- error
|
|
||||||
- default: array
|
|
||||||
"@typescript-eslint/no-restricted-types":
|
|
||||||
- error
|
|
||||||
- types:
|
|
||||||
Object:
|
|
||||||
message: Avoid using the `Object` type. Did you mean `object`?
|
|
||||||
fixWith: object
|
|
||||||
Function:
|
|
||||||
message: >-
|
|
||||||
Avoid using the `Function` type. Prefer a specific function type,
|
|
||||||
like `() => void`.
|
|
||||||
Boolean:
|
|
||||||
message: Avoid using the `Boolean` type. Did you mean `boolean`?
|
|
||||||
fixWith: boolean
|
|
||||||
Number:
|
|
||||||
message: Avoid using the `Number` type. Did you mean `number`?
|
|
||||||
fixWith: number
|
|
||||||
String:
|
|
||||||
message: Avoid using the `String` type. Did you mean `string`?
|
|
||||||
fixWith: string
|
|
||||||
Symbol:
|
|
||||||
message: Avoid using the `Symbol` type. Did you mean `symbol`?
|
|
||||||
fixWith: symbol
|
|
||||||
"@typescript-eslint/consistent-type-assertions": error
|
|
||||||
"@typescript-eslint/dot-notation": error
|
|
||||||
"@typescript-eslint/explicit-function-return-type":
|
|
||||||
- error
|
|
||||||
- allowExpressions: true
|
|
||||||
allowTypedFunctionExpressions: true
|
|
||||||
allowHigherOrderFunctions: false
|
|
||||||
allowDirectConstAssertionInArrowFunctions: true
|
|
||||||
allowConciseArrowFunctionExpressionsStartingWithVoid: true
|
|
||||||
"@typescript-eslint/explicit-member-accessibility":
|
|
||||||
- error
|
|
||||||
- accessibility: explicit
|
|
||||||
overrides:
|
|
||||||
accessors: explicit
|
|
||||||
"@typescript-eslint/explicit-module-boundary-types":
|
|
||||||
- error
|
|
||||||
- allowArgumentsExplicitlyTypedAsAny: true
|
|
||||||
allowDirectConstAssertionInArrowFunctions: true
|
|
||||||
allowHigherOrderFunctions: false
|
|
||||||
allowTypedFunctionExpressions: false
|
|
||||||
"@typescript-eslint/naming-convention":
|
|
||||||
- error
|
|
||||||
- selector:
|
|
||||||
- objectLiteralProperty
|
|
||||||
leadingUnderscore: allow
|
|
||||||
format:
|
|
||||||
- camelCase
|
|
||||||
- PascalCase
|
|
||||||
- UPPER_CASE # for constants
|
|
||||||
filter:
|
|
||||||
regex: (^[a-z]+:.+)|_attr|[0-9]
|
|
||||||
match: false
|
|
||||||
"@typescript-eslint/no-empty-function": error
|
|
||||||
"@typescript-eslint/no-empty-interface": error
|
|
||||||
"@typescript-eslint/no-explicit-any": error
|
|
||||||
"@typescript-eslint/no-misused-new": error
|
|
||||||
"@typescript-eslint/no-namespace": error
|
|
||||||
"@typescript-eslint/no-parameter-properties": "off"
|
|
||||||
"@typescript-eslint/no-require-imports": error
|
|
||||||
"@typescript-eslint/no-shadow":
|
|
||||||
- error
|
|
||||||
- hoist: all
|
|
||||||
"@typescript-eslint/no-this-alias": error
|
|
||||||
"@typescript-eslint/no-unused-expressions": error
|
|
||||||
"@typescript-eslint/no-use-before-define": "off"
|
|
||||||
"@typescript-eslint/no-var-requires": error
|
|
||||||
"@typescript-eslint/prefer-for-of": error
|
|
||||||
"@typescript-eslint/prefer-function-type": error
|
|
||||||
"@typescript-eslint/prefer-namespace-keyword": error
|
|
||||||
"@typescript-eslint/prefer-readonly": error
|
|
||||||
"@typescript-eslint/triple-slash-reference":
|
|
||||||
- error
|
|
||||||
- path: always
|
|
||||||
types: prefer-import
|
|
||||||
lib: always
|
|
||||||
"@typescript-eslint/typedef":
|
|
||||||
- error
|
|
||||||
- parameter: true
|
|
||||||
propertyDeclaration: true
|
|
||||||
"@typescript-eslint/unified-signatures": error
|
|
||||||
arrow-body-style: error
|
|
||||||
complexity: "off"
|
|
||||||
consistent-return: error
|
|
||||||
constructor-super: error
|
|
||||||
curly: error
|
|
||||||
dot-notation: "off"
|
|
||||||
eqeqeq:
|
|
||||||
- error
|
|
||||||
- smart
|
|
||||||
guard-for-in: error
|
|
||||||
id-denylist:
|
|
||||||
- error
|
|
||||||
- any
|
|
||||||
- Number
|
|
||||||
- number
|
|
||||||
- String
|
|
||||||
- string
|
|
||||||
- Boolean
|
|
||||||
- boolean
|
|
||||||
- Undefined
|
|
||||||
- undefined
|
|
||||||
id-match: error
|
|
||||||
import/no-default-export: error
|
|
||||||
import/no-extraneous-dependencies: "off"
|
|
||||||
import/no-internal-modules: "off"
|
|
||||||
import/order: error
|
|
||||||
indent: "off"
|
|
||||||
jsdoc/check-alignment: error
|
|
||||||
jsdoc/check-indentation: "off"
|
|
||||||
max-classes-per-file: "off"
|
|
||||||
max-len: "off"
|
|
||||||
new-parens: error
|
|
||||||
no-bitwise: error
|
|
||||||
no-caller: error
|
|
||||||
no-cond-assign: error
|
|
||||||
no-console: error
|
|
||||||
no-debugger: error
|
|
||||||
no-duplicate-case: error
|
|
||||||
no-duplicate-imports: error
|
|
||||||
no-empty: error
|
|
||||||
no-empty-function: "off"
|
|
||||||
no-eval: error
|
|
||||||
no-extra-bind: error
|
|
||||||
no-fallthrough: "off"
|
|
||||||
no-invalid-this: "off"
|
|
||||||
no-multiple-empty-lines: error
|
|
||||||
no-new-func: error
|
|
||||||
no-new-wrappers: error
|
|
||||||
no-null/no-null: error
|
|
||||||
no-param-reassign: error
|
|
||||||
no-redeclare: error
|
|
||||||
no-return-await: error
|
|
||||||
no-sequences: error
|
|
||||||
no-shadow: "off"
|
|
||||||
no-sparse-arrays: error
|
|
||||||
no-throw-literal: error
|
|
||||||
no-trailing-spaces: error
|
|
||||||
no-undef-init: error
|
|
||||||
no-underscore-dangle:
|
|
||||||
- error
|
|
||||||
- allow:
|
|
||||||
- _attr
|
|
||||||
no-unsafe-finally: error
|
|
||||||
no-unused-expressions: "off"
|
|
||||||
no-unused-labels: error
|
|
||||||
no-use-before-define: "off"
|
|
||||||
no-useless-constructor: error
|
|
||||||
no-var: error
|
|
||||||
object-shorthand: "off"
|
|
||||||
one-var:
|
|
||||||
- error
|
|
||||||
- never
|
|
||||||
prefer-arrow/prefer-arrow-functions: error
|
|
||||||
prefer-const: error
|
|
||||||
prefer-object-spread: error
|
|
||||||
radix: error
|
|
||||||
space-in-parens:
|
|
||||||
- error
|
|
||||||
- never
|
|
||||||
spaced-comment:
|
|
||||||
- error
|
|
||||||
- always
|
|
||||||
- markers:
|
|
||||||
- /
|
|
||||||
unicorn/filename-case: error
|
|
||||||
unicorn/prefer-ternary: error
|
|
||||||
use-isnan: error
|
|
||||||
valid-typeof: "off"
|
|
||||||
functional/immutable-data:
|
|
||||||
- error
|
|
||||||
- ignoreImmediateMutation: true
|
|
||||||
ignoreAccessorPattern:
|
|
||||||
- "**.root*"
|
|
||||||
- "**.numberingReferences*"
|
|
||||||
- "**.sections*"
|
|
||||||
- "**.properties*"
|
|
||||||
functional/prefer-property-signatures: error
|
|
||||||
functional/no-mixed-types: error
|
|
||||||
functional/prefer-readonly-type: error
|
|
||||||
no-unused-vars:
|
|
||||||
- error
|
|
||||||
- argsIgnorePattern: ^[_]+$
|
|
||||||
ignorePatterns:
|
|
||||||
- vite.config.ts
|
|
||||||
overrides:
|
|
||||||
- files:
|
|
||||||
- "*.spec.ts"
|
|
||||||
rules:
|
|
||||||
"@typescript-eslint/no-unused-expressions": "off"
|
|
||||||
"@typescript-eslint/dot-notation": "off"
|
|
||||||
prefer-destructuring: "off"
|
|
||||||
"@typescript-eslint/explicit-function-return-type": "off"
|
|
2
.github/workflows/default.yml
vendored
2
.github/workflows/default.yml
vendored
@ -65,5 +65,5 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: npm ci --force
|
run: npm ci --force
|
||||||
- name: Prettier
|
- name: CSpell
|
||||||
run: npm run cspell
|
run: npm run cspell
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -33,8 +33,7 @@ node_modules
|
|||||||
.node_repl_history
|
.node_repl_history
|
||||||
|
|
||||||
# build
|
# build
|
||||||
build
|
dist
|
||||||
build-tests
|
|
||||||
|
|
||||||
# Documentation
|
# Documentation
|
||||||
docs/api/
|
docs/api/
|
||||||
|
@ -10,7 +10,7 @@ import tsEslint from "typescript-eslint";
|
|||||||
|
|
||||||
const config: Linter.Config<Linter.RulesRecord>[] = [
|
const config: Linter.Config<Linter.RulesRecord>[] = [
|
||||||
{
|
{
|
||||||
ignores: ["**/vite.config.ts", "**/build/**", "**/coverage/**", "**/*.js", "eslint.config.ts", "**/demo/**", "**/scripts/**"],
|
ignores: ["**/vite.config.ts", "**/dist/**", "**/coverage/**", "**/*.js", "eslint.config.ts", "**/demo/**", "**/scripts/**"],
|
||||||
},
|
},
|
||||||
eslint.configs.recommended,
|
eslint.configs.recommended,
|
||||||
importPlugin.flatConfigs.recommended,
|
importPlugin.flatConfigs.recommended,
|
||||||
|
5888
package-lock.json
generated
5888
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
31
package.json
31
package.json
@ -1,21 +1,25 @@
|
|||||||
{
|
{
|
||||||
"name": "docx",
|
"name": "docx",
|
||||||
"version": "9.1.0",
|
"version": "9.1.1",
|
||||||
"description": "Easily generate .docx files with JS/TS with a nice declarative API. Works for Node and on the Browser.",
|
"description": "Easily generate .docx files with JS/TS with a nice declarative API. Works for Node and on the Browser.",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "build/index.umd.js",
|
"main": "dist/index.umd.cjs",
|
||||||
"module": "./build/index.mjs",
|
"module": "./dist/index.mjs",
|
||||||
"types": "./build/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
".": {
|
".": {
|
||||||
"require": "./build/index.cjs",
|
"import": {
|
||||||
"types": "./build/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
"import": "./build/index.mjs",
|
"default": "./dist/index.mjs"
|
||||||
"default": "./build/index.mjs"
|
},
|
||||||
|
"require": {
|
||||||
|
"types": "./dist/index.d.cts",
|
||||||
|
"default": "./dist/index.cjs"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"build"
|
"dist"
|
||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc && vite build",
|
"build": "tsc && vite build",
|
||||||
@ -68,7 +72,6 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://docx.js.org",
|
"homepage": "https://docx.js.org",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/compat": "^1.2.1",
|
|
||||||
"@types/eslint__js": "^8.42.3",
|
"@types/eslint__js": "^8.42.3",
|
||||||
"@types/inquirer": "^9.0.3",
|
"@types/inquirer": "^9.0.3",
|
||||||
"@types/prompt": "^1.1.1",
|
"@types/prompt": "^1.1.1",
|
||||||
@ -76,7 +79,7 @@
|
|||||||
"@types/xml": "^1.0.8",
|
"@types/xml": "^1.0.8",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.8.1",
|
"@typescript-eslint/eslint-plugin": "^8.8.1",
|
||||||
"@typescript-eslint/parser": "^8.8.1",
|
"@typescript-eslint/parser": "^8.8.1",
|
||||||
"@vitest/coverage-v8": "^1.1.0",
|
"@vitest/coverage-v8": "^2.1.8",
|
||||||
"@vitest/ui": "^2.1.2",
|
"@vitest/ui": "^2.1.2",
|
||||||
"cspell": "^8.2.3",
|
"cspell": "^8.2.3",
|
||||||
"docsify-cli": "^4.3.0",
|
"docsify-cli": "^4.3.0",
|
||||||
@ -97,15 +100,15 @@
|
|||||||
"prettier": "^3.1.1",
|
"prettier": "^3.1.1",
|
||||||
"tsconfig-paths": "^4.0.0",
|
"tsconfig-paths": "^4.0.0",
|
||||||
"tsx": "^4.7.0",
|
"tsx": "^4.7.0",
|
||||||
"typedoc": "^0.26.9",
|
"typedoc": "^0.27.3",
|
||||||
"typescript": "5.3.3",
|
"typescript": "5.3.3",
|
||||||
"typescript-eslint": "^8.10.0",
|
"typescript-eslint": "^8.10.0",
|
||||||
"unzipper": "^0.12.3",
|
"unzipper": "^0.12.3",
|
||||||
"vite": "^5.0.10",
|
"vite": "^6.0.1",
|
||||||
"vite-plugin-dts": "^4.2.4",
|
"vite-plugin-dts": "^4.2.4",
|
||||||
"vite-plugin-node-polyfills": "^0.22.0",
|
"vite-plugin-node-polyfills": "^0.22.0",
|
||||||
"vite-tsconfig-paths": "^5.0.1",
|
"vite-tsconfig-paths": "^5.0.1",
|
||||||
"vitest": "^1.1.0"
|
"vitest": "^2.1.8"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
|
@ -2,7 +2,7 @@ import { FontOptions } from "@file/fonts/font-table";
|
|||||||
import { ICommentsOptions } from "@file/paragraph/run/comment-run";
|
import { ICommentsOptions } from "@file/paragraph/run/comment-run";
|
||||||
import { IHyphenationOptions } from "@file/settings";
|
import { IHyphenationOptions } from "@file/settings";
|
||||||
import { ICompatibilityOptions } from "@file/settings/compatibility";
|
import { ICompatibilityOptions } from "@file/settings/compatibility";
|
||||||
import { StringContainer, XmlComponent } from "@file/xml-components";
|
import { StringContainer, XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||||
import { dateTimeValue } from "@util/values";
|
import { dateTimeValue } from "@util/values";
|
||||||
|
|
||||||
import { ICustomPropertyOptions } from "../custom-properties";
|
import { ICustomPropertyOptions } from "../custom-properties";
|
||||||
@ -75,15 +75,7 @@ export type IPropertiesOptions = {
|
|||||||
export class CoreProperties extends XmlComponent {
|
export class CoreProperties extends XmlComponent {
|
||||||
public constructor(options: Omit<IPropertiesOptions, "sections">) {
|
public constructor(options: Omit<IPropertiesOptions, "sections">) {
|
||||||
super("cp:coreProperties");
|
super("cp:coreProperties");
|
||||||
this.root.push(
|
this.root.push(new DocumentAttributes(["cp", "dc", "dcterms", "dcmitype", "xsi"]));
|
||||||
new DocumentAttributes({
|
|
||||||
cp: "http://schemas.openxmlformats.org/package/2006/metadata/core-properties",
|
|
||||||
dc: "http://purl.org/dc/elements/1.1/",
|
|
||||||
dcterms: "http://purl.org/dc/terms/",
|
|
||||||
dcmitype: "http://purl.org/dc/dcmitype/",
|
|
||||||
xsi: "http://www.w3.org/2001/XMLSchema-instance",
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
if (options.title) {
|
if (options.title) {
|
||||||
this.root.push(new StringContainer("dc:title", options.title));
|
this.root.push(new StringContainer("dc:title", options.title));
|
||||||
}
|
}
|
||||||
@ -110,11 +102,15 @@ export class CoreProperties extends XmlComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TimestampElementProperties extends XmlAttributeComponent<{ readonly type: string }> {
|
||||||
|
protected readonly xmlKeys = { type: "xsi:type" };
|
||||||
|
}
|
||||||
|
|
||||||
class TimestampElement extends XmlComponent {
|
class TimestampElement extends XmlComponent {
|
||||||
public constructor(name: string) {
|
public constructor(name: string) {
|
||||||
super(name);
|
super(name);
|
||||||
this.root.push(
|
this.root.push(
|
||||||
new DocumentAttributes({
|
new TimestampElementProperties({
|
||||||
type: "dcterms:W3CDTF",
|
type: "dcterms:W3CDTF",
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
@ -1,89 +1,60 @@
|
|||||||
import { XmlAttributeComponent } from "@file/xml-components";
|
import { AttributeMap, XmlAttributeComponent } from "@file/xml-components";
|
||||||
|
|
||||||
/* cSpell:disable */
|
/* cSpell:disable */
|
||||||
export type IDocumentAttributesProperties = {
|
export const DocumentAttributeNamespaces = {
|
||||||
readonly wpc?: string;
|
wpc: "http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",
|
||||||
readonly mc?: string;
|
mc: "http://schemas.openxmlformats.org/markup-compatibility/2006",
|
||||||
readonly o?: string;
|
o: "urn:schemas-microsoft-com:office:office",
|
||||||
readonly r?: string;
|
r: "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
|
||||||
readonly m?: string;
|
m: "http://schemas.openxmlformats.org/officeDocument/2006/math",
|
||||||
readonly v?: string;
|
v: "urn:schemas-microsoft-com:vml",
|
||||||
readonly wp14?: string;
|
wp14: "http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",
|
||||||
readonly wp?: string;
|
wp: "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",
|
||||||
readonly w10?: string;
|
w10: "urn:schemas-microsoft-com:office:word",
|
||||||
readonly w?: string;
|
w: "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
|
||||||
readonly w14?: string;
|
w14: "http://schemas.microsoft.com/office/word/2010/wordml",
|
||||||
readonly w15?: string;
|
w15: "http://schemas.microsoft.com/office/word/2012/wordml",
|
||||||
readonly wpg?: string;
|
wpg: "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",
|
||||||
readonly wpi?: string;
|
wpi: "http://schemas.microsoft.com/office/word/2010/wordprocessingInk",
|
||||||
readonly wne?: string;
|
wne: "http://schemas.microsoft.com/office/word/2006/wordml",
|
||||||
readonly wps?: string;
|
wps: "http://schemas.microsoft.com/office/word/2010/wordprocessingShape",
|
||||||
readonly Ignorable?: string;
|
cp: "http://schemas.openxmlformats.org/package/2006/metadata/core-properties",
|
||||||
readonly cp?: string;
|
dc: "http://purl.org/dc/elements/1.1/",
|
||||||
readonly dc?: string;
|
dcterms: "http://purl.org/dc/terms/",
|
||||||
readonly dcterms?: string;
|
dcmitype: "http://purl.org/dc/dcmitype/",
|
||||||
readonly dcmitype?: string;
|
xsi: "http://www.w3.org/2001/XMLSchema-instance",
|
||||||
readonly xsi?: string;
|
cx: "http://schemas.microsoft.com/office/drawing/2014/chartex",
|
||||||
readonly type?: string;
|
cx1: "http://schemas.microsoft.com/office/drawing/2015/9/8/chartex",
|
||||||
readonly cx?: string;
|
cx2: "http://schemas.microsoft.com/office/drawing/2015/10/21/chartex",
|
||||||
readonly cx1?: string;
|
cx3: "http://schemas.microsoft.com/office/drawing/2016/5/9/chartex",
|
||||||
readonly cx2?: string;
|
cx4: "http://schemas.microsoft.com/office/drawing/2016/5/10/chartex",
|
||||||
readonly cx3?: string;
|
cx5: "http://schemas.microsoft.com/office/drawing/2016/5/11/chartex",
|
||||||
readonly cx4?: string;
|
cx6: "http://schemas.microsoft.com/office/drawing/2016/5/12/chartex",
|
||||||
readonly cx5?: string;
|
cx7: "http://schemas.microsoft.com/office/drawing/2016/5/13/chartex",
|
||||||
readonly cx6?: string;
|
cx8: "http://schemas.microsoft.com/office/drawing/2016/5/14/chartex",
|
||||||
readonly cx7?: string;
|
aink: "http://schemas.microsoft.com/office/drawing/2016/ink",
|
||||||
readonly cx8?: string;
|
am3d: "http://schemas.microsoft.com/office/drawing/2017/model3d",
|
||||||
readonly aink?: string;
|
w16cex: "http://schemas.microsoft.com/office/word/2018/wordml/cex",
|
||||||
readonly am3d?: string;
|
w16cid: "http://schemas.microsoft.com/office/word/2016/wordml/cid",
|
||||||
readonly w16cex?: string;
|
w16: "http://schemas.microsoft.com/office/word/2018/wordml",
|
||||||
readonly w16cid?: string;
|
w16sdtdh: "http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash",
|
||||||
readonly w16?: string;
|
w16se: "http://schemas.microsoft.com/office/word/2015/wordml/symex",
|
||||||
readonly w16sdtdh?: string;
|
|
||||||
readonly w16se?: string;
|
|
||||||
};
|
};
|
||||||
/* cSpell:enable */
|
/* cSpell:enable */
|
||||||
|
|
||||||
|
export type DocumentAttributeNamespace = keyof typeof DocumentAttributeNamespaces;
|
||||||
|
|
||||||
|
export type IDocumentAttributesProperties = Partial<Record<DocumentAttributeNamespace, string>> & {
|
||||||
|
readonly Ignorable?: string;
|
||||||
|
};
|
||||||
|
|
||||||
export class DocumentAttributes extends XmlAttributeComponent<IDocumentAttributesProperties> {
|
export class DocumentAttributes extends XmlAttributeComponent<IDocumentAttributesProperties> {
|
||||||
protected readonly xmlKeys = {
|
protected readonly xmlKeys = {
|
||||||
wpc: "xmlns:wpc",
|
|
||||||
mc: "xmlns:mc",
|
|
||||||
o: "xmlns:o",
|
|
||||||
r: "xmlns:r",
|
|
||||||
m: "xmlns:m",
|
|
||||||
v: "xmlns:v",
|
|
||||||
wp14: "xmlns:wp14",
|
|
||||||
wp: "xmlns:wp",
|
|
||||||
w10: "xmlns:w10",
|
|
||||||
w: "xmlns:w",
|
|
||||||
w14: "xmlns:w14",
|
|
||||||
w15: "xmlns:w15",
|
|
||||||
wpg: "xmlns:wpg",
|
|
||||||
wpi: "xmlns:wpi",
|
|
||||||
wne: "xmlns:wne",
|
|
||||||
wps: "xmlns:wps",
|
|
||||||
Ignorable: "mc:Ignorable",
|
Ignorable: "mc:Ignorable",
|
||||||
cp: "xmlns:cp",
|
...Object.fromEntries(Object.keys(DocumentAttributeNamespaces).map((key) => [key, `xmlns:${key}`])),
|
||||||
dc: "xmlns:dc",
|
} as AttributeMap<IDocumentAttributesProperties>;
|
||||||
dcterms: "xmlns:dcterms",
|
|
||||||
dcmitype: "xmlns:dcmitype",
|
public constructor(ns: readonly DocumentAttributeNamespace[], Ignorable?: string) {
|
||||||
xsi: "xmlns:xsi",
|
super({ Ignorable, ...Object.fromEntries(ns.map((n) => [n, DocumentAttributeNamespaces[n]])) });
|
||||||
type: "xsi:type",
|
}
|
||||||
cx: "xmlns:cx",
|
|
||||||
cx1: "xmlns:cx1",
|
|
||||||
cx2: "xmlns:cx2",
|
|
||||||
cx3: "xmlns:cx3",
|
|
||||||
cx4: "xmlns:cx4",
|
|
||||||
cx5: "xmlns:cx5",
|
|
||||||
cx6: "xmlns:cx6",
|
|
||||||
cx7: "xmlns:cx7",
|
|
||||||
cx8: "xmlns:cx8",
|
|
||||||
aink: "xmlns:aink",
|
|
||||||
am3d: "xmlns:am3d",
|
|
||||||
w16cex: "xmlns:w16cex",
|
|
||||||
w16cid: "xmlns:w16cid",
|
|
||||||
w16: "xmlns:w16",
|
|
||||||
w16sdtdh: "xmlns:w16sdtdh",
|
|
||||||
w16se: "xmlns:w16se",
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
@ -37,41 +37,43 @@ export class Document extends XmlComponent {
|
|||||||
public constructor(options: IDocumentOptions) {
|
public constructor(options: IDocumentOptions) {
|
||||||
super("w:document");
|
super("w:document");
|
||||||
this.root.push(
|
this.root.push(
|
||||||
new DocumentAttributes({
|
new DocumentAttributes(
|
||||||
wpc: "http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",
|
[
|
||||||
mc: "http://schemas.openxmlformats.org/markup-compatibility/2006",
|
"wpc",
|
||||||
o: "urn:schemas-microsoft-com:office:office",
|
"mc",
|
||||||
r: "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
|
"o",
|
||||||
m: "http://schemas.openxmlformats.org/officeDocument/2006/math",
|
"r",
|
||||||
v: "urn:schemas-microsoft-com:vml",
|
"m",
|
||||||
wp14: "http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",
|
"v",
|
||||||
wp: "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",
|
"wp14",
|
||||||
w10: "urn:schemas-microsoft-com:office:word",
|
"wp",
|
||||||
w: "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
|
"w10",
|
||||||
w14: "http://schemas.microsoft.com/office/word/2010/wordml",
|
"w",
|
||||||
w15: "http://schemas.microsoft.com/office/word/2012/wordml",
|
"w14",
|
||||||
wpg: "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",
|
"w15",
|
||||||
wpi: "http://schemas.microsoft.com/office/word/2010/wordprocessingInk",
|
"wpg",
|
||||||
wne: "http://schemas.microsoft.com/office/word/2006/wordml",
|
"wpi",
|
||||||
wps: "http://schemas.microsoft.com/office/word/2010/wordprocessingShape",
|
"wne",
|
||||||
cx: "http://schemas.microsoft.com/office/drawing/2014/chartex",
|
"wps",
|
||||||
cx1: "http://schemas.microsoft.com/office/drawing/2015/9/8/chartex",
|
"cx",
|
||||||
cx2: "http://schemas.microsoft.com/office/drawing/2015/10/21/chartex",
|
"cx1",
|
||||||
cx3: "http://schemas.microsoft.com/office/drawing/2016/5/9/chartex",
|
"cx2",
|
||||||
cx4: "http://schemas.microsoft.com/office/drawing/2016/5/10/chartex",
|
"cx3",
|
||||||
cx5: "http://schemas.microsoft.com/office/drawing/2016/5/11/chartex",
|
"cx4",
|
||||||
cx6: "http://schemas.microsoft.com/office/drawing/2016/5/12/chartex",
|
"cx5",
|
||||||
cx7: "http://schemas.microsoft.com/office/drawing/2016/5/13/chartex",
|
"cx6",
|
||||||
cx8: "http://schemas.microsoft.com/office/drawing/2016/5/14/chartex",
|
"cx7",
|
||||||
aink: "http://schemas.microsoft.com/office/drawing/2016/ink",
|
"cx8",
|
||||||
am3d: "http://schemas.microsoft.com/office/drawing/2017/model3d",
|
"aink",
|
||||||
w16cex: "http://schemas.microsoft.com/office/word/2018/wordml/cex",
|
"am3d",
|
||||||
w16cid: "http://schemas.microsoft.com/office/word/2016/wordml/cid",
|
"w16cex",
|
||||||
w16: "http://schemas.microsoft.com/office/word/2018/wordml",
|
"w16cid",
|
||||||
w16sdtdh: "http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash",
|
"w16",
|
||||||
w16se: "http://schemas.microsoft.com/office/word/2015/wordml/symex",
|
"w16sdtdh",
|
||||||
Ignorable: "w14 w15 wp14",
|
"w16se",
|
||||||
}),
|
],
|
||||||
|
"w14 w15 wp14",
|
||||||
|
),
|
||||||
);
|
);
|
||||||
this.body = new Body();
|
this.body = new Body();
|
||||||
if (options.background) {
|
if (options.background) {
|
||||||
|
@ -2,7 +2,7 @@ const obfuscatedStartOffset = 0;
|
|||||||
const obfuscatedEndOffset = 32;
|
const obfuscatedEndOffset = 32;
|
||||||
const guidSize = 32;
|
const guidSize = 32;
|
||||||
|
|
||||||
export const obfuscate = (buf: Buffer, fontKey: string): Buffer => {
|
export const obfuscate = (buf: Uint8Array, fontKey: string): Uint8Array => {
|
||||||
const guid = fontKey.replace(/-/g, "");
|
const guid = fontKey.replace(/-/g, "");
|
||||||
if (guid.length !== guidSize) {
|
if (guid.length !== guidSize) {
|
||||||
throw new Error(`Error: Cannot extract GUID from font filename: ${fontKey}`);
|
throw new Error(`Error: Cannot extract GUID from font filename: ${fontKey}`);
|
||||||
@ -17,6 +17,9 @@ export const obfuscate = (buf: Buffer, fontKey: string): Buffer => {
|
|||||||
// eslint-disable-next-line no-bitwise
|
// eslint-disable-next-line no-bitwise
|
||||||
const obfuscatedBytes = bytesToObfuscate.map((byte, i) => byte ^ hexNumbers[i % hexNumbers.length]);
|
const obfuscatedBytes = bytesToObfuscate.map((byte, i) => byte ^ hexNumbers[i % hexNumbers.length]);
|
||||||
|
|
||||||
const out = Buffer.concat([buf.slice(0, obfuscatedStartOffset), obfuscatedBytes, buf.slice(obfuscatedEndOffset)]);
|
const out = new Uint8Array(obfuscatedStartOffset + obfuscatedBytes.length + Math.max(0, buf.length - obfuscatedEndOffset));
|
||||||
|
out.set(buf.slice(0, obfuscatedStartOffset));
|
||||||
|
out.set(obfuscatedBytes, obfuscatedStartOffset);
|
||||||
|
out.set(buf.slice(obfuscatedEndOffset), obfuscatedStartOffset + obfuscatedBytes.length);
|
||||||
return out;
|
return out;
|
||||||
};
|
};
|
||||||
|
@ -37,25 +37,10 @@ export class Numbering extends XmlComponent {
|
|||||||
public constructor(options: INumberingOptions) {
|
public constructor(options: INumberingOptions) {
|
||||||
super("w:numbering");
|
super("w:numbering");
|
||||||
this.root.push(
|
this.root.push(
|
||||||
new DocumentAttributes({
|
new DocumentAttributes(
|
||||||
wpc: "http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",
|
["wpc", "mc", "o", "r", "m", "v", "wp14", "wp", "w10", "w", "w14", "w15", "wpg", "wpi", "wne", "wps"],
|
||||||
mc: "http://schemas.openxmlformats.org/markup-compatibility/2006",
|
"w14 w15 wp14",
|
||||||
o: "urn:schemas-microsoft-com:office:office",
|
),
|
||||||
r: "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
|
|
||||||
m: "http://schemas.openxmlformats.org/officeDocument/2006/math",
|
|
||||||
v: "urn:schemas-microsoft-com:vml",
|
|
||||||
wp14: "http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",
|
|
||||||
wp: "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",
|
|
||||||
w10: "urn:schemas-microsoft-com:office:word",
|
|
||||||
w: "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
|
|
||||||
w14: "http://schemas.microsoft.com/office/word/2010/wordml",
|
|
||||||
w15: "http://schemas.microsoft.com/office/word/2012/wordml",
|
|
||||||
wpg: "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",
|
|
||||||
wpi: "http://schemas.microsoft.com/office/word/2010/wordprocessingInk",
|
|
||||||
wne: "http://schemas.microsoft.com/office/word/2006/wordml",
|
|
||||||
wps: "http://schemas.microsoft.com/office/word/2010/wordprocessingShape",
|
|
||||||
Ignorable: "w14 w15 wp14",
|
|
||||||
}),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const abstractNumbering = new AbstractNumbering(this.abstractNumUniqueNumericId(), [
|
const abstractNumbering = new AbstractNumbering(this.abstractNumUniqueNumericId(), [
|
||||||
|
@ -155,7 +155,7 @@ export class Run extends XmlComponent {
|
|||||||
|
|
||||||
this.root.push(child);
|
this.root.push(child);
|
||||||
}
|
}
|
||||||
} else if (options.text) {
|
} else if (options.text !== undefined) {
|
||||||
this.root.push(new Text(options.text));
|
this.root.push(new Text(options.text));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,14 @@ describe("TextRun", () => {
|
|||||||
"w:r": [{ "w:t": [{ _attr: { "xml:space": "preserve" } }, "test"] }],
|
"w:r": [{ "w:t": [{ _attr: { "xml:space": "preserve" } }, "test"] }],
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should add empty text into run", () => {
|
||||||
|
run = new TextRun({ text: "" });
|
||||||
|
const f = new Formatter().format(run);
|
||||||
|
expect(f).to.deep.equal({
|
||||||
|
"w:r": [{ "w:t": [{ _attr: { "xml:space": "preserve" } }, ""] }],
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("#referenceFootnote()", () => {
|
describe("#referenceFootnote()", () => {
|
||||||
|
@ -1,14 +1,7 @@
|
|||||||
import { IRunOptions, Run } from "./run";
|
import { IRunOptions, Run } from "./run";
|
||||||
import { Text } from "./run-components/text";
|
|
||||||
|
|
||||||
export class TextRun extends Run {
|
export class TextRun extends Run {
|
||||||
public constructor(options: IRunOptions | string) {
|
public constructor(options: IRunOptions | string) {
|
||||||
if (typeof options === "string") {
|
super(typeof options === "string" ? { text: options } : options);
|
||||||
super({});
|
|
||||||
this.root.push(new Text(options));
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
super(options);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -144,6 +144,10 @@ describe("External styles factory", () => {
|
|||||||
expect(() => new ExternalStylesFactory().newInstance(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo/>`)).to.throw(
|
expect(() => new ExternalStylesFactory().newInstance(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo/>`)).to.throw(
|
||||||
"can not find styles element",
|
"can not find styles element",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
expect(() => new ExternalStylesFactory().newInstance(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>`)).to.throw(
|
||||||
|
"can not find styles element",
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should parse styles elements", () => {
|
it("should parse styles elements", () => {
|
||||||
|
@ -38,14 +38,7 @@ export type IDefaultStylesOptions = {
|
|||||||
|
|
||||||
export class DefaultStylesFactory {
|
export class DefaultStylesFactory {
|
||||||
public newInstance(options: IDefaultStylesOptions = {}): IStylesOptions {
|
public newInstance(options: IDefaultStylesOptions = {}): IStylesOptions {
|
||||||
const documentAttributes = new DocumentAttributes({
|
const documentAttributes = new DocumentAttributes(["mc", "r", "w", "w14", "w15"], "w14 w15");
|
||||||
mc: "http://schemas.openxmlformats.org/markup-compatibility/2006",
|
|
||||||
r: "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
|
|
||||||
w: "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
|
|
||||||
w14: "http://schemas.microsoft.com/office/word/2010/wordml",
|
|
||||||
w15: "http://schemas.microsoft.com/office/word/2012/wordml",
|
|
||||||
Ignorable: "w14 w15",
|
|
||||||
});
|
|
||||||
return {
|
return {
|
||||||
initialStyles: documentAttributes,
|
initialStyles: documentAttributes,
|
||||||
importedStyles: [
|
importedStyles: [
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { BaseXmlComponent, IContext } from "./base";
|
import { BaseXmlComponent, IContext } from "./base";
|
||||||
import { IXmlAttribute, IXmlableObject } from "./xmlable-object";
|
import { IXmlAttribute, IXmlableObject } from "./xmlable-object";
|
||||||
|
|
||||||
type AttributeMap<T> = Record<keyof T, string>;
|
export type AttributeMap<T> = Record<keyof T, string>;
|
||||||
|
|
||||||
export type AttributeData = Record<string, boolean | number | string>;
|
export type AttributeData = Record<string, boolean | number | string>;
|
||||||
export type AttributePayload<T> = { readonly [P in keyof T]: { readonly key: string; readonly value: T[P] } };
|
export type AttributePayload<T> = { readonly [P in keyof T]: { readonly key: string; readonly value: T[P] } };
|
||||||
|
@ -2,6 +2,7 @@ import JSZip from "jszip";
|
|||||||
import { Element, js2xml } from "xml-js";
|
import { Element, js2xml } from "xml-js";
|
||||||
|
|
||||||
import { ImageReplacer } from "@export/packer/image-replacer";
|
import { ImageReplacer } from "@export/packer/image-replacer";
|
||||||
|
import { DocumentAttributeNamespaces } from "@file/document";
|
||||||
import { IViewWrapper } from "@file/document-wrapper";
|
import { IViewWrapper } from "@file/document-wrapper";
|
||||||
import { File } from "@file/file";
|
import { File } from "@file/file";
|
||||||
import { FileChild } from "@file/file-child";
|
import { FileChild } from "@file/file-child";
|
||||||
@ -100,6 +101,24 @@ export const patchDocument = async <T extends PatchDocumentOutputType = PatchDoc
|
|||||||
}
|
}
|
||||||
|
|
||||||
const json = toJson(await value.async("text"));
|
const json = toJson(await value.async("text"));
|
||||||
|
|
||||||
|
if (key === "word/document.xml") {
|
||||||
|
const document = json.elements?.find((i) => i.name === "w:document");
|
||||||
|
if (document) {
|
||||||
|
// We could check all namespaces from Document, but we'll instead
|
||||||
|
// check only those that may be used by our element types.
|
||||||
|
|
||||||
|
// eslint-disable-next-line functional/immutable-data
|
||||||
|
document.attributes = document.attributes ?? {};
|
||||||
|
for (const ns of ["mc", "wp", "r", "w15", "m"] as const) {
|
||||||
|
// eslint-disable-next-line functional/immutable-data
|
||||||
|
document.attributes[`xmlns:${ns}`] = DocumentAttributeNamespaces[ns];
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line functional/immutable-data
|
||||||
|
document.attributes["mc:Ignorable"] = `${document.attributes["mc:Ignorable"] || ""} w15`.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (key.startsWith("word/") && !key.endsWith(".xml.rels")) {
|
if (key.startsWith("word/") && !key.endsWith(".xml.rels")) {
|
||||||
const context: IContext = {
|
const context: IContext = {
|
||||||
file,
|
file,
|
||||||
|
@ -3,7 +3,6 @@ import { describe, expect, it, vi } from "vitest";
|
|||||||
import { IViewWrapper } from "@file/document-wrapper";
|
import { IViewWrapper } from "@file/document-wrapper";
|
||||||
import { File } from "@file/file";
|
import { File } from "@file/file";
|
||||||
import { Paragraph, TextRun } from "@file/paragraph";
|
import { Paragraph, TextRun } from "@file/paragraph";
|
||||||
import { IContext } from "@file/xml-components";
|
|
||||||
|
|
||||||
import { PatchType } from "./from-docx";
|
import { PatchType } from "./from-docx";
|
||||||
import { replacer } from "./replacer";
|
import { replacer } from "./replacer";
|
||||||
@ -77,7 +76,7 @@ export const MOCK_JSON = {
|
|||||||
|
|
||||||
describe("replacer", () => {
|
describe("replacer", () => {
|
||||||
describe("replacer", () => {
|
describe("replacer", () => {
|
||||||
it("should throw an error if nothing is added", () => {
|
it("should return { didFindOccurrence: false } if nothing is added", () => {
|
||||||
const { didFindOccurrence } = replacer({
|
const { didFindOccurrence } = replacer({
|
||||||
json: {
|
json: {
|
||||||
elements: [],
|
elements: [],
|
||||||
@ -87,8 +86,7 @@ describe("replacer", () => {
|
|||||||
children: [],
|
children: [],
|
||||||
},
|
},
|
||||||
patchText: "hello",
|
patchText: "hello",
|
||||||
// eslint-disable-next-line functional/prefer-readonly-type
|
context: vi.fn()(),
|
||||||
context: vi.fn<[], IContext>()(),
|
|
||||||
});
|
});
|
||||||
expect(didFindOccurrence).toBe(false);
|
expect(didFindOccurrence).toBe(false);
|
||||||
});
|
});
|
||||||
@ -660,5 +658,71 @@ describe("replacer", () => {
|
|||||||
expect(JSON.stringify(element)).to.contain("Lorem ipsum paragraph");
|
expect(JSON.stringify(element)).to.contain("Lorem ipsum paragraph");
|
||||||
expect(didFindOccurrence).toBe(true);
|
expect(didFindOccurrence).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should handle empty runs in patches", () => {
|
||||||
|
// cspell:disable
|
||||||
|
const { element, didFindOccurrence } = replacer({
|
||||||
|
json: {
|
||||||
|
elements: [
|
||||||
|
{
|
||||||
|
type: "element",
|
||||||
|
name: "w:hdr",
|
||||||
|
elements: [
|
||||||
|
{
|
||||||
|
type: "element",
|
||||||
|
name: "w:p",
|
||||||
|
elements: [
|
||||||
|
{
|
||||||
|
type: "element",
|
||||||
|
name: "w:r",
|
||||||
|
elements: [
|
||||||
|
{ type: "text", text: "\n " },
|
||||||
|
{
|
||||||
|
type: "element",
|
||||||
|
name: "w:rPr",
|
||||||
|
elements: [
|
||||||
|
{ type: "text", text: "\n " },
|
||||||
|
{
|
||||||
|
type: "element",
|
||||||
|
name: "w:rFonts",
|
||||||
|
attributes: { "w:eastAsia": "Times New Roman" },
|
||||||
|
},
|
||||||
|
{ type: "text", text: "\n " },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{ type: "text", text: "\n " },
|
||||||
|
{
|
||||||
|
type: "element",
|
||||||
|
name: "w:t",
|
||||||
|
elements: [{ type: "text", text: "{{empty}}" }],
|
||||||
|
},
|
||||||
|
{ type: "text", text: "\n " },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
// cspell:enable
|
||||||
|
patch: {
|
||||||
|
type: PatchType.PARAGRAPH,
|
||||||
|
children: [new TextRun({})],
|
||||||
|
},
|
||||||
|
patchText: "{{empty}}",
|
||||||
|
context: {
|
||||||
|
file: {} as unknown as File,
|
||||||
|
viewWrapper: {
|
||||||
|
Relationships: {},
|
||||||
|
} as unknown as IViewWrapper,
|
||||||
|
stack: [],
|
||||||
|
},
|
||||||
|
keepOriginalStyles: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(JSON.stringify(element)).not.to.contain("{{empty}}");
|
||||||
|
expect(didFindOccurrence).toBe(true);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -74,7 +74,7 @@ export const replacer = ({
|
|||||||
|
|
||||||
newRunElements = textJson.map((e) => ({
|
newRunElements = textJson.map((e) => ({
|
||||||
...e,
|
...e,
|
||||||
elements: [...runElementNonTextualElements, ...e.elements!],
|
elements: [...runElementNonTextualElements, ...(e.elements ?? [])],
|
||||||
}));
|
}));
|
||||||
|
|
||||||
patchedRightElement = {
|
patchedRightElement = {
|
||||||
|
@ -3,12 +3,18 @@ import dts from "vite-plugin-dts";
|
|||||||
import { nodePolyfills } from "vite-plugin-node-polyfills";
|
import { nodePolyfills } from "vite-plugin-node-polyfills";
|
||||||
import tsconfigPaths from "vite-tsconfig-paths";
|
import tsconfigPaths from "vite-tsconfig-paths";
|
||||||
import { configDefaults, defineConfig } from "vitest/config";
|
import { configDefaults, defineConfig } from "vitest/config";
|
||||||
|
import { copyFileSync } from "node:fs";
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [
|
plugins: [
|
||||||
tsconfigPaths(),
|
tsconfigPaths(),
|
||||||
dts({
|
dts({
|
||||||
rollupTypes: true
|
rollupTypes: true,
|
||||||
|
afterBuild: () => {
|
||||||
|
// https://github.com/dolanmiu/docx/pull/2883
|
||||||
|
// To pass publint - `npx publint@latest`
|
||||||
|
copyFileSync("dist/index.d.ts", "dist/index.d.cts");
|
||||||
|
},
|
||||||
}),
|
}),
|
||||||
nodePolyfills({
|
nodePolyfills({
|
||||||
exclude: [],
|
exclude: [],
|
||||||
@ -34,7 +40,7 @@ export default defineConfig({
|
|||||||
name: "docx",
|
name: "docx",
|
||||||
fileName: (d) => {
|
fileName: (d) => {
|
||||||
if (d === "umd") {
|
if (d === "umd") {
|
||||||
return "index.umd.js";
|
return "index.umd.cjs";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d === "cjs") {
|
if (d === "cjs") {
|
||||||
@ -53,7 +59,7 @@ export default defineConfig({
|
|||||||
},
|
},
|
||||||
formats: ["iife", "es", "cjs", "umd"],
|
formats: ["iife", "es", "cjs", "umd"],
|
||||||
},
|
},
|
||||||
outDir: resolve(__dirname, "build"),
|
outDir: resolve(__dirname, "dist"),
|
||||||
commonjsOptions: {
|
commonjsOptions: {
|
||||||
include: [/node_modules/],
|
include: [/node_modules/],
|
||||||
},
|
},
|
||||||
@ -71,24 +77,16 @@ export default defineConfig({
|
|||||||
},
|
},
|
||||||
exclude: [
|
exclude: [
|
||||||
...configDefaults.exclude,
|
...configDefaults.exclude,
|
||||||
'**/build/**',
|
"**/dist/**",
|
||||||
'**/demo/**',
|
"**/demo/**",
|
||||||
'**/docs/**',
|
"**/docs/**",
|
||||||
'**/scripts/**',
|
"**/scripts/**",
|
||||||
'**/src/**/index.ts',
|
"**/src/**/index.ts",
|
||||||
'**/src/**/types.ts',
|
"**/src/**/types.ts",
|
||||||
|
"**/*.spec.ts",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
include: [
|
include: ["**/src/**/*.spec.ts", "**/packages/**/*.spec.ts"],
|
||||||
'**/src/**/*.spec.ts',
|
exclude: [...configDefaults.exclude, "**/build/**", "**/demo/**", "**/docs/**", "**/scripts/**"],
|
||||||
'**/packages/**/*.spec.ts'
|
|
||||||
],
|
|
||||||
exclude: [
|
|
||||||
...configDefaults.exclude,
|
|
||||||
'**/build/**',
|
|
||||||
'**/demo/**',
|
|
||||||
'**/docs/**',
|
|
||||||
'**/scripts/**'
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user