@usejunior/docx-core 0.10.0 → 0.11.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 +202 -21
- package/NOTICE +2 -0
- package/README.md +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/atomizer.d.ts +13 -7
- package/dist/atomizer.d.ts.map +1 -1
- package/dist/atomizer.js +59 -24
- package/dist/atomizer.js.map +1 -1
- package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts +99 -0
- package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts.map +1 -0
- package/dist/baselines/atomizer/auxiliaryIdCollision.js +415 -0
- package/dist/baselines/atomizer/auxiliaryIdCollision.js.map +1 -0
- package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -1
- package/dist/baselines/atomizer/documentReconstructor.js +120 -27
- package/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +9 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +1 -1
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +52 -4
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +1 -1
- package/dist/baselines/atomizer/pipeline.d.ts +12 -53
- package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
- package/dist/baselines/atomizer/pipeline.js +126 -231
- package/dist/baselines/atomizer/pipeline.js.map +1 -1
- package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -1
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js +153 -23
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -1
- package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -1
- package/dist/baselines/wmlcomparer/DotnetCli.js +7 -0
- package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -1
- package/dist/cli/compare-two.d.ts.map +1 -1
- package/dist/cli/compare-two.js +3 -1
- package/dist/cli/compare-two.js.map +1 -1
- package/dist/cli/conformance-adapter.d.ts +3 -0
- package/dist/cli/conformance-adapter.d.ts.map +1 -0
- package/dist/cli/conformance-adapter.js +93 -0
- package/dist/cli/conformance-adapter.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/compare-types.d.ts +46 -0
- package/dist/compare-types.d.ts.map +1 -1
- package/dist/generation/compile.d.ts +21 -0
- package/dist/generation/compile.d.ts.map +1 -0
- package/dist/generation/compile.js +46 -0
- package/dist/generation/compile.js.map +1 -0
- package/dist/generation/context.d.ts +42 -0
- package/dist/generation/context.d.ts.map +1 -0
- package/dist/generation/context.js +65 -0
- package/dist/generation/context.js.map +1 -0
- package/dist/generation/emit/comments-part.d.ts +36 -0
- package/dist/generation/emit/comments-part.d.ts.map +1 -0
- package/dist/generation/emit/comments-part.js +116 -0
- package/dist/generation/emit/comments-part.js.map +1 -0
- package/dist/generation/emit/document-part.d.ts +24 -0
- package/dist/generation/emit/document-part.d.ts.map +1 -0
- package/dist/generation/emit/document-part.js +60 -0
- package/dist/generation/emit/document-part.js.map +1 -0
- package/dist/generation/emit/emit-context.d.ts +26 -0
- package/dist/generation/emit/emit-context.d.ts.map +1 -0
- package/dist/generation/emit/emit-context.js +19 -0
- package/dist/generation/emit/emit-context.js.map +1 -0
- package/dist/generation/emit/header-footer-part.d.ts +23 -0
- package/dist/generation/emit/header-footer-part.d.ts.map +1 -0
- package/dist/generation/emit/header-footer-part.js +57 -0
- package/dist/generation/emit/header-footer-part.js.map +1 -0
- package/dist/generation/emit/numbering-part.d.ts +29 -0
- package/dist/generation/emit/numbering-part.d.ts.map +1 -0
- package/dist/generation/emit/numbering-part.js +100 -0
- package/dist/generation/emit/numbering-part.js.map +1 -0
- package/dist/generation/emit/package-parts.d.ts +24 -0
- package/dist/generation/emit/package-parts.d.ts.map +1 -0
- package/dist/generation/emit/package-parts.js +121 -0
- package/dist/generation/emit/package-parts.js.map +1 -0
- package/dist/generation/emit/paragraph.d.ts +24 -0
- package/dist/generation/emit/paragraph.d.ts.map +1 -0
- package/dist/generation/emit/paragraph.js +63 -0
- package/dist/generation/emit/paragraph.js.map +1 -0
- package/dist/generation/emit/properties.d.ts +34 -0
- package/dist/generation/emit/properties.d.ts.map +1 -0
- package/dist/generation/emit/properties.js +138 -0
- package/dist/generation/emit/properties.js.map +1 -0
- package/dist/generation/emit/run.d.ts +15 -0
- package/dist/generation/emit/run.d.ts.map +1 -0
- package/dist/generation/emit/run.js +71 -0
- package/dist/generation/emit/run.js.map +1 -0
- package/dist/generation/emit/section.d.ts +29 -0
- package/dist/generation/emit/section.d.ts.map +1 -0
- package/dist/generation/emit/section.js +117 -0
- package/dist/generation/emit/section.js.map +1 -0
- package/dist/generation/emit/settings-part.d.ts +13 -0
- package/dist/generation/emit/settings-part.d.ts.map +1 -0
- package/dist/generation/emit/settings-part.js +24 -0
- package/dist/generation/emit/settings-part.js.map +1 -0
- package/dist/generation/emit/styles-part.d.ts +16 -0
- package/dist/generation/emit/styles-part.d.ts.map +1 -0
- package/dist/generation/emit/styles-part.js +80 -0
- package/dist/generation/emit/styles-part.js.map +1 -0
- package/dist/generation/emit/table.d.ts +26 -0
- package/dist/generation/emit/table.d.ts.map +1 -0
- package/dist/generation/emit/table.js +196 -0
- package/dist/generation/emit/table.js.map +1 -0
- package/dist/generation/errors.d.ts +22 -0
- package/dist/generation/errors.d.ts.map +1 -0
- package/dist/generation/errors.js +29 -0
- package/dist/generation/errors.js.map +1 -0
- package/dist/generation/index.d.ts +13 -0
- package/dist/generation/index.d.ts.map +1 -0
- package/dist/generation/index.js +12 -0
- package/dist/generation/index.js.map +1 -0
- package/dist/generation/ordering.d.ts +46 -0
- package/dist/generation/ordering.d.ts.map +1 -0
- package/dist/generation/ordering.js +119 -0
- package/dist/generation/ordering.js.map +1 -0
- package/dist/generation/recipes.d.ts +47 -0
- package/dist/generation/recipes.d.ts.map +1 -0
- package/dist/generation/recipes.js +84 -0
- package/dist/generation/recipes.js.map +1 -0
- package/dist/generation/structural-checks.d.ts +24 -0
- package/dist/generation/structural-checks.d.ts.map +1 -0
- package/dist/generation/structural-checks.js +318 -0
- package/dist/generation/structural-checks.js.map +1 -0
- package/dist/generation/types.d.ts +217 -0
- package/dist/generation/types.d.ts.map +1 -0
- package/dist/generation/types.js +16 -0
- package/dist/generation/types.js.map +1 -0
- package/dist/generation/validate-spec.d.ts +27 -0
- package/dist/generation/validate-spec.d.ts.map +1 -0
- package/dist/generation/validate-spec.js +307 -0
- package/dist/generation/validate-spec.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/integration/generation-probes.d.ts +15 -0
- package/dist/integration/generation-probes.d.ts.map +1 -0
- package/dist/integration/generation-probes.js +84 -0
- package/dist/integration/generation-probes.js.map +1 -0
- package/dist/integration/libreoffice-oracle.d.ts +8 -0
- package/dist/integration/libreoffice-oracle.d.ts.map +1 -1
- package/dist/integration/libreoffice-oracle.js +14 -6
- package/dist/integration/libreoffice-oracle.js.map +1 -1
- package/dist/integration/synthetic-docx-fixture.d.ts +72 -0
- package/dist/integration/synthetic-docx-fixture.d.ts.map +1 -1
- package/dist/integration/synthetic-docx-fixture.js +131 -4
- package/dist/integration/synthetic-docx-fixture.js.map +1 -1
- package/dist/primitives/accept_changes.d.ts +2 -1
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +153 -12
- package/dist/primitives/accept_changes.js.map +1 -1
- package/dist/primitives/document.d.ts +38 -0
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +75 -9
- package/dist/primitives/document.js.map +1 -1
- package/dist/primitives/document_view-comments.d.ts.map +1 -1
- package/dist/primitives/document_view-comments.js +4 -3
- package/dist/primitives/document_view-comments.js.map +1 -1
- package/dist/primitives/document_view-types.d.ts +15 -0
- package/dist/primitives/document_view-types.d.ts.map +1 -1
- package/dist/primitives/document_view.d.ts.map +1 -1
- package/dist/primitives/document_view.js +21 -13
- package/dist/primitives/document_view.js.map +1 -1
- package/dist/primitives/formatting_tags.d.ts +1 -0
- package/dist/primitives/formatting_tags.d.ts.map +1 -1
- package/dist/primitives/formatting_tags.js +16 -10
- package/dist/primitives/formatting_tags.js.map +1 -1
- package/dist/primitives/index.d.ts +4 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +4 -0
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/layout.d.ts.map +1 -1
- package/dist/primitives/layout.js +13 -0
- package/dist/primitives/layout.js.map +1 -1
- package/dist/primitives/minimal_save.d.ts +38 -0
- package/dist/primitives/minimal_save.d.ts.map +1 -0
- package/dist/primitives/minimal_save.js +323 -0
- package/dist/primitives/minimal_save.js.map +1 -0
- package/dist/primitives/namespaces.d.ts +41 -0
- package/dist/primitives/namespaces.d.ts.map +1 -1
- package/dist/primitives/namespaces.js +43 -0
- package/dist/primitives/namespaces.js.map +1 -1
- package/dist/primitives/reject_changes.d.ts +4 -2
- package/dist/primitives/reject_changes.d.ts.map +1 -1
- package/dist/primitives/reject_changes.js +177 -24
- package/dist/primitives/reject_changes.js.map +1 -1
- package/dist/primitives/revision-parts.d.ts +7 -0
- package/dist/primitives/revision-parts.d.ts.map +1 -0
- package/dist/primitives/revision-parts.js +27 -0
- package/dist/primitives/revision-parts.js.map +1 -0
- package/dist/primitives/revision-vocabulary.d.ts +7 -0
- package/dist/primitives/revision-vocabulary.d.ts.map +1 -0
- package/dist/primitives/revision-vocabulary.js +39 -0
- package/dist/primitives/revision-vocabulary.js.map +1 -0
- package/dist/primitives/schema-corpus-capture.d.ts +19 -0
- package/dist/primitives/schema-corpus-capture.d.ts.map +1 -0
- package/dist/primitives/schema-corpus-capture.js +29 -0
- package/dist/primitives/schema-corpus-capture.js.map +1 -0
- package/dist/primitives/sectPrAudit.d.ts +19 -0
- package/dist/primitives/sectPrAudit.d.ts.map +1 -0
- package/dist/primitives/sectPrAudit.js +165 -0
- package/dist/primitives/sectPrAudit.js.map +1 -0
- package/dist/primitives/semantic_tags.d.ts.map +1 -1
- package/dist/primitives/semantic_tags.js +2 -1
- package/dist/primitives/semantic_tags.js.map +1 -1
- package/dist/primitives/serialize_html.d.ts +1 -0
- package/dist/primitives/serialize_html.d.ts.map +1 -1
- package/dist/primitives/serialize_html.js +4 -2
- package/dist/primitives/serialize_html.js.map +1 -1
- package/dist/primitives/styles.d.ts +15 -0
- package/dist/primitives/styles.d.ts.map +1 -1
- package/dist/primitives/styles.js +11 -0
- package/dist/primitives/styles.js.map +1 -1
- package/dist/primitives/track-changes-emitter.d.ts +9 -0
- package/dist/primitives/track-changes-emitter.d.ts.map +1 -1
- package/dist/primitives/track-changes-emitter.js +54 -4
- package/dist/primitives/track-changes-emitter.js.map +1 -1
- package/dist/primitives/validate_ai_revisions.d.ts +35 -0
- package/dist/primitives/validate_ai_revisions.d.ts.map +1 -0
- package/dist/primitives/validate_ai_revisions.js +323 -0
- package/dist/primitives/validate_ai_revisions.js.map +1 -0
- package/dist/primitives/xml.d.ts +5 -0
- package/dist/primitives/xml.d.ts.map +1 -1
- package/dist/primitives/xml.js +5 -0
- package/dist/primitives/xml.js.map +1 -1
- package/dist/primitives/zip.d.ts +1 -0
- package/dist/primitives/zip.d.ts.map +1 -1
- package/dist/primitives/zip.js +21 -3
- package/dist/primitives/zip.js.map +1 -1
- package/dist/shared/field-structure.d.ts +14 -0
- package/dist/shared/field-structure.d.ts.map +1 -0
- package/dist/shared/field-structure.js +166 -0
- package/dist/shared/field-structure.js.map +1 -0
- package/package.json +7 -4
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-compile validation of a DocumentSpec.
|
|
3
|
+
*
|
|
4
|
+
* Two jobs:
|
|
5
|
+
* 1. Shape/referential checks for the spec subset whose emitters have shipped.
|
|
6
|
+
* 2. Loud rejection of declared-but-not-yet-implemented spec features. The
|
|
7
|
+
* type surface covers the full add-docx-generation change; emitters land
|
|
8
|
+
* in phases, and a spec feature without an emitter must fail compilation
|
|
9
|
+
* with a typed error naming the feature and its path — never be silently
|
|
10
|
+
* dropped (scenario SDX-GEN-003).
|
|
11
|
+
*
|
|
12
|
+
* Shipped so far: formatted text/tab/break runs, five-part PAGE/NUMPAGES
|
|
13
|
+
* fields, paragraph formatting, named styles + styles.xml, multi-section
|
|
14
|
+
* documents with per-section page setup, page numbering, break types,
|
|
15
|
+
* default/first/even headers and footers, tables (grid, spans, vertical
|
|
16
|
+
* merges, cell decoration, nesting), multi-level numbering with w:numPr
|
|
17
|
+
* list references, and drafting notes compiled to anchored comments (body
|
|
18
|
+
* story only — header/footer paragraphs cannot carry notes).
|
|
19
|
+
*
|
|
20
|
+
* Every declared feature now has an emitter; the loud-rejection contract
|
|
21
|
+
* (SDX-GEN-003) lives on as runtime guards against unrecognized block and
|
|
22
|
+
* inline kinds, which protect callers handing in JSON that the TypeScript
|
|
23
|
+
* surface never saw.
|
|
24
|
+
*/
|
|
25
|
+
import { GenerationSpecError } from './errors.js';
|
|
26
|
+
const COLOR_HEX_RE = /^[0-9A-Fa-f]{6}$/;
|
|
27
|
+
function unsupported(path, feature) {
|
|
28
|
+
throw new GenerationSpecError('unsupported_feature', path, `Spec feature '${feature}' is declared in the DocumentSpec type surface but its emitter has not shipped yet; ` +
|
|
29
|
+
'it is rejected rather than silently ignored');
|
|
30
|
+
}
|
|
31
|
+
export function validateSpec(spec) {
|
|
32
|
+
if (!Array.isArray(spec.sections) || spec.sections.length === 0) {
|
|
33
|
+
throw new GenerationSpecError('empty_sections', '/sections', 'DocumentSpec.sections must contain at least one section');
|
|
34
|
+
}
|
|
35
|
+
const declaredStyleIds = validateStyles(spec.styles ?? []);
|
|
36
|
+
const numbering = validateNumbering(spec.numbering ?? []);
|
|
37
|
+
spec.sections.forEach((section, sectionIndex) => {
|
|
38
|
+
validateSection(section, `/sections/${sectionIndex}`, declaredStyleIds, numbering);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Returns numId handle → set of declared levels, for list-reference checks. */
|
|
42
|
+
function validateNumbering(definitions) {
|
|
43
|
+
const declared = new Map();
|
|
44
|
+
definitions.forEach((definition, index) => {
|
|
45
|
+
const path = `/numbering/${index}`;
|
|
46
|
+
if (!definition.numId) {
|
|
47
|
+
throw new GenerationSpecError('invalid_value', `${path}/numId`, 'NumberingSpec requires a numId handle');
|
|
48
|
+
}
|
|
49
|
+
if (declared.has(definition.numId)) {
|
|
50
|
+
throw new GenerationSpecError('invalid_value', `${path}/numId`, `Duplicate numbering handle '${definition.numId}'`);
|
|
51
|
+
}
|
|
52
|
+
if (!Array.isArray(definition.levels) || definition.levels.length === 0) {
|
|
53
|
+
throw new GenerationSpecError('invalid_value', `${path}/levels`, 'Numbering definitions require at least one level');
|
|
54
|
+
}
|
|
55
|
+
const levels = new Set();
|
|
56
|
+
definition.levels.forEach((level, levelIndex) => {
|
|
57
|
+
const levelPath = `${path}/levels/${levelIndex}`;
|
|
58
|
+
if (!Number.isInteger(level.ilvl) || level.ilvl < 0 || level.ilvl > 8) {
|
|
59
|
+
throw new GenerationSpecError('invalid_value', `${levelPath}/ilvl`, 'ilvl must be an integer between 0 and 8');
|
|
60
|
+
}
|
|
61
|
+
if (levels.has(level.ilvl)) {
|
|
62
|
+
throw new GenerationSpecError('invalid_value', `${levelPath}/ilvl`, `Duplicate ilvl ${level.ilvl} in numbering '${definition.numId}'`);
|
|
63
|
+
}
|
|
64
|
+
levels.add(level.ilvl);
|
|
65
|
+
if (typeof level.lvlText !== 'string' || level.lvlText.length === 0) {
|
|
66
|
+
throw new GenerationSpecError('invalid_value', `${levelPath}/lvlText`, 'Numbering levels require a lvlText pattern');
|
|
67
|
+
}
|
|
68
|
+
if (level.start !== undefined && (!Number.isInteger(level.start) || level.start < 0)) {
|
|
69
|
+
throw new GenerationSpecError('invalid_value', `${levelPath}/start`, 'Level start must be a non-negative integer');
|
|
70
|
+
}
|
|
71
|
+
if (level.runProps)
|
|
72
|
+
validateRunProps(level.runProps, `${levelPath}/runProps`);
|
|
73
|
+
});
|
|
74
|
+
declared.set(definition.numId, levels);
|
|
75
|
+
});
|
|
76
|
+
return declared;
|
|
77
|
+
}
|
|
78
|
+
/** Returns the set of resolvable style ids (declared styles + implicit Normal). */
|
|
79
|
+
function validateStyles(styles) {
|
|
80
|
+
const ids = new Set(['Normal']);
|
|
81
|
+
styles.forEach((style, index) => {
|
|
82
|
+
const path = `/styles/${index}`;
|
|
83
|
+
if (!style.styleId || !style.name) {
|
|
84
|
+
throw new GenerationSpecError('invalid_value', path, 'StyleSpec requires styleId and name');
|
|
85
|
+
}
|
|
86
|
+
if (ids.has(style.styleId)) {
|
|
87
|
+
throw new GenerationSpecError('invalid_value', `${path}/styleId`, `Duplicate styleId '${style.styleId}'`);
|
|
88
|
+
}
|
|
89
|
+
ids.add(style.styleId);
|
|
90
|
+
if (style.run)
|
|
91
|
+
validateRunProps(style.run, `${path}/run`);
|
|
92
|
+
});
|
|
93
|
+
// basedOn / next must resolve against the full declared set (forward refs allowed).
|
|
94
|
+
styles.forEach((style, index) => {
|
|
95
|
+
const path = `/styles/${index}`;
|
|
96
|
+
for (const key of ['basedOn', 'next']) {
|
|
97
|
+
const ref = style[key];
|
|
98
|
+
if (ref !== undefined && !ids.has(ref)) {
|
|
99
|
+
throw new GenerationSpecError('dangling_style_reference', `${path}/${key}`, `Style '${style.styleId}' references undeclared style '${ref}' via ${key}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
return ids;
|
|
104
|
+
}
|
|
105
|
+
function validateSection(section, path, styleIds, numbering) {
|
|
106
|
+
if (section.pageNumbering?.start !== undefined) {
|
|
107
|
+
const start = section.pageNumbering.start;
|
|
108
|
+
if (!Number.isInteger(start) || start < 1) {
|
|
109
|
+
throw new GenerationSpecError('invalid_value', `${path}/pageNumbering/start`, 'Page numbering start must be a positive integer');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
for (const [kind, set] of [['headers', section.headers], ['footers', section.footers]]) {
|
|
113
|
+
if (!set)
|
|
114
|
+
continue;
|
|
115
|
+
for (const slot of ['default', 'first', 'even']) {
|
|
116
|
+
const content = set[slot];
|
|
117
|
+
if (!content)
|
|
118
|
+
continue;
|
|
119
|
+
const slotPath = `${path}/${kind}/${slot}`;
|
|
120
|
+
if (!Array.isArray(content.blocks) || content.blocks.length === 0) {
|
|
121
|
+
throw new GenerationSpecError('invalid_value', `${slotPath}/blocks`, 'Header/footer blocks must be a non-empty array');
|
|
122
|
+
}
|
|
123
|
+
content.blocks.forEach((block, blockIndex) => {
|
|
124
|
+
validateBlock(block, `${slotPath}/blocks/${blockIndex}`, styleIds, numbering, 'headerFooter');
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const size = section.page?.sizeTwips;
|
|
129
|
+
if (size && (!(size.w > 0) || !(size.h > 0))) {
|
|
130
|
+
throw new GenerationSpecError('invalid_value', `${path}/page/sizeTwips`, 'Page size dimensions must be positive twips');
|
|
131
|
+
}
|
|
132
|
+
const margins = section.page?.marginsTwips;
|
|
133
|
+
if (margins) {
|
|
134
|
+
for (const [key, value] of Object.entries(margins)) {
|
|
135
|
+
if (value !== undefined && (typeof value !== 'number' || value < 0 || !Number.isFinite(value))) {
|
|
136
|
+
throw new GenerationSpecError('invalid_value', `${path}/page/marginsTwips/${key}`, 'Margins must be non-negative finite twips');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (!Array.isArray(section.blocks)) {
|
|
141
|
+
throw new GenerationSpecError('invalid_value', `${path}/blocks`, 'Section blocks must be an array');
|
|
142
|
+
}
|
|
143
|
+
section.blocks.forEach((block, blockIndex) => {
|
|
144
|
+
validateBlock(block, `${path}/blocks/${blockIndex}`, styleIds, numbering, 'body');
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
function validateBlock(block, path, styleIds, numbering, story) {
|
|
148
|
+
if (block.kind === 'table')
|
|
149
|
+
validateTable(block, path, styleIds, numbering, story);
|
|
150
|
+
else if (block.kind === 'paragraph')
|
|
151
|
+
validateParagraph(block, path, styleIds, numbering, story);
|
|
152
|
+
else
|
|
153
|
+
unsupported(path, `block kind '${block.kind}'`);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Table shape and grid arithmetic. Every row's effective column count
|
|
157
|
+
* (the sum of its cells' gridSpans) must equal the declared grid, and a
|
|
158
|
+
* vertical-merge continuation must sit at exactly the grid position and
|
|
159
|
+
* span of a merge cell in the previous row — otherwise readers either show
|
|
160
|
+
* a recovery dialog or silently reflow the table.
|
|
161
|
+
*/
|
|
162
|
+
function validateTable(table, path, styleIds, numbering, story) {
|
|
163
|
+
if (!Array.isArray(table.columnWidthsTwips) || table.columnWidthsTwips.length === 0) {
|
|
164
|
+
throw new GenerationSpecError('invalid_value', `${path}/columnWidthsTwips`, 'Tables require at least one column width');
|
|
165
|
+
}
|
|
166
|
+
table.columnWidthsTwips.forEach((width, i) => {
|
|
167
|
+
if (!(width > 0) || !Number.isFinite(width)) {
|
|
168
|
+
throw new GenerationSpecError('invalid_value', `${path}/columnWidthsTwips/${i}`, 'Column widths must be positive finite twips');
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
if (table.borders)
|
|
172
|
+
validateBorders(table.borders, `${path}/borders`);
|
|
173
|
+
if (!Array.isArray(table.rows) || table.rows.length === 0) {
|
|
174
|
+
throw new GenerationSpecError('invalid_value', `${path}/rows`, 'Tables require at least one row');
|
|
175
|
+
}
|
|
176
|
+
const columnCount = table.columnWidthsTwips.length;
|
|
177
|
+
// Grid start → span of every merge-participating cell in the previous row.
|
|
178
|
+
let previousMerges = new Map();
|
|
179
|
+
table.rows.forEach((row, rowIndex) => {
|
|
180
|
+
const rowPath = `${path}/rows/${rowIndex}`;
|
|
181
|
+
if (!Array.isArray(row.cells) || row.cells.length === 0) {
|
|
182
|
+
throw new GenerationSpecError('invalid_value', `${rowPath}/cells`, 'Rows require at least one cell');
|
|
183
|
+
}
|
|
184
|
+
if (row.heightTwips !== undefined && (!(row.heightTwips > 0) || !Number.isFinite(row.heightTwips))) {
|
|
185
|
+
throw new GenerationSpecError('invalid_value', `${rowPath}/heightTwips`, 'Row height must be positive finite twips');
|
|
186
|
+
}
|
|
187
|
+
const currentMerges = new Map();
|
|
188
|
+
let gridOffset = 0;
|
|
189
|
+
row.cells.forEach((cell, cellIndex) => {
|
|
190
|
+
const cellPath = `${rowPath}/cells/${cellIndex}`;
|
|
191
|
+
if (cell.gridSpan !== undefined && (!Number.isInteger(cell.gridSpan) || cell.gridSpan < 1)) {
|
|
192
|
+
throw new GenerationSpecError('invalid_value', `${cellPath}/gridSpan`, 'gridSpan must be a positive integer');
|
|
193
|
+
}
|
|
194
|
+
const span = cell.gridSpan ?? 1;
|
|
195
|
+
if (cell.vMerge === 'continue') {
|
|
196
|
+
if (rowIndex === 0) {
|
|
197
|
+
throw new GenerationSpecError('grid_mismatch', `${cellPath}/vMerge`, 'A vertical merge cannot continue in the first row');
|
|
198
|
+
}
|
|
199
|
+
if (previousMerges.get(gridOffset) !== span) {
|
|
200
|
+
throw new GenerationSpecError('grid_mismatch', `${cellPath}/vMerge`, `vMerge continuation at grid column ${gridOffset} (span ${span}) has no matching merge cell in the previous row`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (cell.vMerge !== undefined)
|
|
204
|
+
currentMerges.set(gridOffset, span);
|
|
205
|
+
if (cell.widthTwips !== undefined && (!(cell.widthTwips > 0) || !Number.isFinite(cell.widthTwips))) {
|
|
206
|
+
throw new GenerationSpecError('invalid_value', `${cellPath}/widthTwips`, 'Cell width must be positive finite twips');
|
|
207
|
+
}
|
|
208
|
+
if (cell.borders)
|
|
209
|
+
validateBorders(cell.borders, `${cellPath}/borders`);
|
|
210
|
+
if (cell.shadingHex !== undefined && !COLOR_HEX_RE.test(cell.shadingHex)) {
|
|
211
|
+
throw new GenerationSpecError('invalid_value', `${cellPath}/shadingHex`, `shadingHex must be six hex digits without '#', got '${cell.shadingHex}'`);
|
|
212
|
+
}
|
|
213
|
+
if (cell.marginsTwips) {
|
|
214
|
+
for (const [key, value] of Object.entries(cell.marginsTwips)) {
|
|
215
|
+
if (value !== undefined && (typeof value !== 'number' || value < 0 || !Number.isFinite(value))) {
|
|
216
|
+
throw new GenerationSpecError('invalid_value', `${cellPath}/marginsTwips/${key}`, 'Cell margins must be non-negative finite twips');
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (!Array.isArray(cell.blocks)) {
|
|
221
|
+
throw new GenerationSpecError('invalid_value', `${cellPath}/blocks`, 'Cell blocks must be an array (empty allowed; an empty cell compiles to an empty paragraph)');
|
|
222
|
+
}
|
|
223
|
+
cell.blocks.forEach((block, blockIndex) => {
|
|
224
|
+
validateBlock(block, `${cellPath}/blocks/${blockIndex}`, styleIds, numbering, story);
|
|
225
|
+
});
|
|
226
|
+
gridOffset += span;
|
|
227
|
+
});
|
|
228
|
+
if (gridOffset !== columnCount) {
|
|
229
|
+
throw new GenerationSpecError('grid_mismatch', rowPath, `Row spans ${gridOffset} grid column(s) but the table declares ${columnCount}`);
|
|
230
|
+
}
|
|
231
|
+
previousMerges = currentMerges;
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
function validateBorders(borders, path) {
|
|
235
|
+
for (const [edge, spec] of Object.entries(borders)) {
|
|
236
|
+
if (!spec)
|
|
237
|
+
continue;
|
|
238
|
+
if (spec.colorHex !== undefined && !COLOR_HEX_RE.test(spec.colorHex)) {
|
|
239
|
+
throw new GenerationSpecError('invalid_value', `${path}/${edge}/colorHex`, `colorHex must be six hex digits without '#', got '${spec.colorHex}'`);
|
|
240
|
+
}
|
|
241
|
+
if (spec.sizeEighthPt !== undefined && (!(spec.sizeEighthPt > 0) || !Number.isFinite(spec.sizeEighthPt))) {
|
|
242
|
+
throw new GenerationSpecError('invalid_value', `${path}/${edge}/sizeEighthPt`, 'Border size must be positive finite eighth-points');
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
function validateParagraph(paragraph, path, styleIds, numbering, story) {
|
|
247
|
+
if (paragraph.note !== undefined) {
|
|
248
|
+
if (story === 'headerFooter') {
|
|
249
|
+
throw new GenerationSpecError('invalid_value', `${path}/note`, 'Drafting notes anchor as document-story comments and cannot live in headers or footers');
|
|
250
|
+
}
|
|
251
|
+
if (typeof paragraph.note.text !== 'string' || paragraph.note.text.length === 0) {
|
|
252
|
+
throw new GenerationSpecError('invalid_value', `${path}/note/text`, 'Drafting notes require non-empty text');
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (paragraph.list !== undefined) {
|
|
256
|
+
const levels = numbering.get(paragraph.list.numId);
|
|
257
|
+
if (!levels) {
|
|
258
|
+
throw new GenerationSpecError('dangling_numbering_reference', `${path}/list/numId`, `Paragraph references undeclared numbering '${paragraph.list.numId}'`);
|
|
259
|
+
}
|
|
260
|
+
if (!levels.has(paragraph.list.ilvl)) {
|
|
261
|
+
throw new GenerationSpecError('dangling_numbering_reference', `${path}/list/ilvl`, `Numbering '${paragraph.list.numId}' declares no level ${paragraph.list.ilvl}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (paragraph.styleId !== undefined && !styleIds.has(paragraph.styleId)) {
|
|
265
|
+
throw new GenerationSpecError('dangling_style_reference', `${path}/styleId`, `Paragraph references undeclared style '${paragraph.styleId}'`);
|
|
266
|
+
}
|
|
267
|
+
if (paragraph.tabs) {
|
|
268
|
+
paragraph.tabs.forEach((stop, i) => {
|
|
269
|
+
if (!(stop.posTwips >= 0) || !Number.isFinite(stop.posTwips)) {
|
|
270
|
+
throw new GenerationSpecError('invalid_value', `${path}/tabs/${i}/posTwips`, 'Tab stop position must be a non-negative finite twips value');
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
if (!Array.isArray(paragraph.runs)) {
|
|
275
|
+
throw new GenerationSpecError('invalid_value', `${path}/runs`, 'Paragraph runs must be an array');
|
|
276
|
+
}
|
|
277
|
+
paragraph.runs.forEach((run, runIndex) => {
|
|
278
|
+
validateInline(run, `${path}/runs/${runIndex}`);
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
function validateInline(run, path) {
|
|
282
|
+
if (run.kind !== 'tab' && run.kind !== 'break' && run.kind !== 'field' && run.kind !== 'text') {
|
|
283
|
+
unsupported(path, `inline kind '${run.kind}'`);
|
|
284
|
+
}
|
|
285
|
+
if (run.kind === 'tab' || run.kind === 'break')
|
|
286
|
+
return;
|
|
287
|
+
if (run.kind === 'field') {
|
|
288
|
+
if (typeof run.cachedResult !== 'string' || run.cachedResult.length === 0) {
|
|
289
|
+
throw new GenerationSpecError('invalid_value', `${path}/cachedResult`, 'Fields require a non-empty cachedResult — the no-recovery-dialog guarantee is unrepresentable-by-omission');
|
|
290
|
+
}
|
|
291
|
+
validateRunProps(run, path);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
if (typeof run.text !== 'string') {
|
|
295
|
+
throw new GenerationSpecError('invalid_value', `${path}/text`, 'Text runs must carry a string');
|
|
296
|
+
}
|
|
297
|
+
validateRunProps(run, path);
|
|
298
|
+
}
|
|
299
|
+
function validateRunProps(props, path) {
|
|
300
|
+
if (props.colorHex !== undefined && !COLOR_HEX_RE.test(props.colorHex)) {
|
|
301
|
+
throw new GenerationSpecError('invalid_value', `${path}/colorHex`, `colorHex must be six hex digits without '#', got '${props.colorHex}'`);
|
|
302
|
+
}
|
|
303
|
+
if (props.sizePt !== undefined && (!(props.sizePt > 0) || !Number.isFinite(props.sizePt))) {
|
|
304
|
+
throw new GenerationSpecError('invalid_value', `${path}/sizePt`, 'sizePt must be a positive finite number');
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=validate-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-spec.js","sourceRoot":"","sources":["../../src/generation/validate-spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAelD,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAExC,SAAS,WAAW,CAAC,IAAY,EAAE,OAAe;IAChD,MAAM,IAAI,mBAAmB,CAC3B,qBAAqB,EACrB,IAAI,EACJ,iBAAiB,OAAO,sFAAsF;QAC5G,6CAA6C,CAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAkB;IAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,mBAAmB,CAAC,gBAAgB,EAAE,WAAW,EAAE,yDAAyD,CAAC,CAAC;IAC1H,CAAC;IAED,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAE1D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE;QAC9C,eAAe,CAAC,OAAO,EAAE,aAAa,YAAY,EAAE,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,SAAS,iBAAiB,CAAC,WAA4B;IACrD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAChD,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,cAAc,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,QAAQ,EAAE,uCAAuC,CAAC,CAAC;QAC3G,CAAC;QACD,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,QAAQ,EAAE,+BAA+B,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;QACtH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,SAAS,EAAE,kDAAkD,CAAC,CAAC;QACvH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;YAC9C,MAAM,SAAS,GAAG,GAAG,IAAI,WAAW,UAAU,EAAE,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACtE,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,SAAS,OAAO,EAAE,yCAAyC,CAAC,CAAC;YACjH,CAAC;YACD,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,SAAS,OAAO,EAAE,kBAAkB,KAAK,CAAC,IAAI,kBAAkB,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;YACzI,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpE,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,SAAS,UAAU,EAAE,4CAA4C,CAAC,CAAC;YACvH,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACrF,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,SAAS,QAAQ,EAAE,4CAA4C,CAAC,CAAC;YACrH,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ;gBAAE,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,SAAS,WAAW,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,mFAAmF;AACnF,SAAS,cAAc,CAAC,MAAmB;IACzC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,WAAW,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,IAAI,EAAE,qCAAqC,CAAC,CAAC;QAC9F,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,UAAU,EAAE,sBAAsB,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5G,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,KAAK,CAAC,GAAG;YAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IACH,oFAAoF;IACpF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,WAAW,KAAK,EAAE,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAU,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,mBAAmB,CAC3B,0BAA0B,EAC1B,GAAG,IAAI,IAAI,GAAG,EAAE,EAChB,UAAU,KAAK,CAAC,OAAO,kCAAkC,GAAG,SAAS,GAAG,EAAE,CAC3E,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,OAAoB,EAAE,IAAY,EAAE,QAAqB,EAAE,SAAmC;IACrH,IAAI,OAAO,CAAC,aAAa,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,sBAAsB,EAAE,iDAAiD,CAAC,CAAC;QACnI,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAU,EAAE,CAAC;QAChG,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAU,EAAE,CAAC;YACzD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,QAAQ,SAAS,EAAE,gDAAgD,CAAC,CAAC;YACzH,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;gBAC3C,aAAa,CAAC,KAAK,EAAE,GAAG,QAAQ,WAAW,UAAU,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;YAChG,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;IACrC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,iBAAiB,EAAE,6CAA6C,CAAC,CAAC;IAC1H,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC;IAC3C,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC/F,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,sBAAsB,GAAG,EAAE,EAAE,2CAA2C,CAAC,CAAC;YAClI,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,SAAS,EAAE,iCAAiC,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;QAC3C,aAAa,CAAC,KAAK,EAAE,GAAG,IAAI,WAAW,UAAU,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC;AAKD,SAAS,aAAa,CACpB,KAAgB,EAChB,IAAY,EACZ,QAAqB,EACrB,SAAmC,EACnC,KAAmB;IAEnB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;SAC9E,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;QAAE,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;;QAC3F,WAAW,CAAC,IAAI,EAAE,eAAgB,KAA0B,CAAC,IAAI,GAAG,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,KAAgB,EAAE,IAAY,EAAE,QAAqB,EAAE,SAAmC,EAAE,KAAmB;IACpI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,oBAAoB,EAAE,0CAA0C,CAAC,CAAC;IAC1H,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3C,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,sBAAsB,CAAC,EAAE,EAAE,6CAA6C,CAAC,CAAC;QAClI,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,OAAO;QAAE,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,UAAU,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,OAAO,EAAE,iCAAiC,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC;IACnD,2EAA2E;IAC3E,IAAI,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,GAAG,IAAI,SAAS,QAAQ,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,OAAO,QAAQ,EAAE,gCAAgC,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YACnG,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,OAAO,cAAc,EAAE,0CAA0C,CAAC,CAAC;QACvH,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;QAChD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;YACpC,MAAM,QAAQ,GAAG,GAAG,OAAO,UAAU,SAAS,EAAE,CAAC;YACjD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC3F,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,QAAQ,WAAW,EAAE,qCAAqC,CAAC,CAAC;YAChH,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC/B,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACnB,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,QAAQ,SAAS,EAAE,mDAAmD,CAAC,CAAC;gBAC5H,CAAC;gBACD,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC5C,MAAM,IAAI,mBAAmB,CAC3B,eAAe,EACf,GAAG,QAAQ,SAAS,EACpB,sCAAsC,UAAU,UAAU,IAAI,kDAAkD,CACjH,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACnE,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBACnG,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,QAAQ,aAAa,EAAE,0CAA0C,CAAC,CAAC;YACvH,CAAC;YACD,IAAI,IAAI,CAAC,OAAO;gBAAE,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,UAAU,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzE,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,QAAQ,aAAa,EAAE,uDAAuD,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YACtJ,CAAC;YACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC7D,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;wBAC/F,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,QAAQ,iBAAiB,GAAG,EAAE,EAAE,gDAAgD,CAAC,CAAC;oBACtI,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,QAAQ,SAAS,EAAE,4FAA4F,CAAC,CAAC;YACrK,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;gBACxC,aAAa,CAAC,KAAK,EAAE,GAAG,QAAQ,WAAW,UAAU,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACvF,CAAC,CAAC,CAAC;YACH,UAAU,IAAI,IAAI,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,mBAAmB,CAC3B,eAAe,EACf,OAAO,EACP,aAAa,UAAU,0CAA0C,WAAW,EAAE,CAC/E,CAAC;QACJ,CAAC;QACD,cAAc,GAAG,aAAa,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,OAAqB,EAAE,IAAY;IAC1D,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAA4C,EAAE,CAAC;QAC9F,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,IAAI,IAAI,WAAW,EAAE,qDAAqD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QACpJ,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACzG,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,IAAI,IAAI,eAAe,EAAE,mDAAmD,CAAC,CAAC;QACtI,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,SAAwB,EACxB,IAAY,EACZ,QAAqB,EACrB,SAAmC,EACnC,KAAmB;IAEnB,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;YAC7B,MAAM,IAAI,mBAAmB,CAC3B,eAAe,EACf,GAAG,IAAI,OAAO,EACd,wFAAwF,CACzF,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChF,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,YAAY,EAAE,uCAAuC,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,mBAAmB,CAC3B,8BAA8B,EAC9B,GAAG,IAAI,aAAa,EACpB,8CAA8C,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,CACtE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,mBAAmB,CAC3B,8BAA8B,EAC9B,GAAG,IAAI,YAAY,EACnB,cAAc,SAAS,CAAC,IAAI,CAAC,KAAK,uBAAuB,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,mBAAmB,CAC3B,0BAA0B,EAC1B,GAAG,IAAI,UAAU,EACjB,0CAA0C,SAAS,CAAC,OAAO,GAAG,CAC/D,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACjC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,SAAS,CAAC,WAAW,EAAE,6DAA6D,CAAC,CAAC;YAC9I,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,OAAO,EAAE,iCAAiC,CAAC,CAAC;IACpG,CAAC;IACD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;QACvC,cAAc,CAAC,GAAG,EAAE,GAAG,IAAI,SAAS,QAAQ,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,GAAe,EAAE,IAAY;IACnD,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9F,WAAW,CAAC,IAAI,EAAE,gBAAiB,GAAwB,CAAC,IAAI,GAAG,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO;IACvD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,mBAAmB,CAC3B,eAAe,EACf,GAAG,IAAI,eAAe,EACtB,2GAA2G,CAC5G,CAAC;QACJ,CAAC;QACD,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,OAAO,EAAE,+BAA+B,CAAC,CAAC;IAClG,CAAC;IACD,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAe,EAAE,IAAY;IACrD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,WAAW,EAAE,qDAAqD,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC7I,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAC1F,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,GAAG,IAAI,SAAS,EAAE,yCAAyC,CAAC,CAAC;IAC9G,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -30,4 +30,7 @@ export * from './primitives/index.js';
|
|
|
30
30
|
export { allocateRevisionId, buildPPrChangeElement, buildTcPrChangeElement, buildTrPrChangeElement, buildRPrChangeElement, createRevisionContainer, createRevisionContext, createRevisionIdState, escapeXmlAttr, formatDate, prepareElementForDeletion, wrapElementWithDel, wrapElementWithIns, } from './primitives/track-changes-emitter.js';
|
|
31
31
|
export type { RevisionContext, RevisionContextOptions, RevisionIdState, } from './primitives/track-changes-emitter.js';
|
|
32
32
|
export { resolveSoffice, runLibreOfficeOracle, type OracleJob } from './integration/libreoffice-oracle.js';
|
|
33
|
+
export { buildSyntheticDocx, buildDocxFromParts, type SyntheticDocxOptions, type DocxPartsOptions, } from './integration/synthetic-docx-fixture.js';
|
|
34
|
+
export { generateDocx, type GenerateDocxOptions, GenerationSpecError, GenerationInternalError, type GenerationSpecErrorCode, checkGeneratedPackage, type StructuralCheckResult, type StructuralIssue, coverTermsTable, signatureBlock, type CoverTermsOptions, type SignatureBlockOptions, } from './generation/index.js';
|
|
35
|
+
export type { BlockSpec, BorderSpec, BreakSpec, DocumentMetaSpec, DocumentSpec, DraftingNoteSpec, FieldSpec, HeaderFooterSet, HeaderFooterSpec, InlineSpec, NumberingSpec, ParagraphSpec, RunProps, RunSpec, SectionSpec, StyleSpec, TableBorders, TableCellSpec, TableRowSpec, TableSpec, TabSpec, } from './generation/index.js';
|
|
33
36
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExE,YAAY,EACV,cAAc,EACd,aAAa,EACb,YAAY,EACZ,gCAAgC,EAChC,qCAAqC,EACrC,qCAAqC,EACrC,iCAAiC,EACjC,4BAA4B,EAC5B,qBAAqB,EACrB,4BAA4B,EAC5B,kBAAkB,EAClB,6BAA6B,EAC7B,0BAA0B,EAC1B,kCAAkC,EAClC,kCAAkC,EAClC,iCAAiC,EACjC,iCAAiC,GAClC,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CA0BxB;AAGD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AAGxC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,eAAe,CAAC;AAG9B,cAAc,qBAAqB,CAAC;AAGpC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,4CAA4C,CAAC;AAG3D,cAAc,gBAAgB,CAAC;AAG/B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,UAAU,EACV,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,eAAe,GAChB,MAAM,uCAAuC,CAAC;AAI/C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,qCAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExE,YAAY,EACV,cAAc,EACd,aAAa,EACb,YAAY,EACZ,gCAAgC,EAChC,qCAAqC,EACrC,qCAAqC,EACrC,iCAAiC,EACjC,4BAA4B,EAC5B,qBAAqB,EACrB,4BAA4B,EAC5B,kBAAkB,EAClB,6BAA6B,EAC7B,0BAA0B,EAC1B,kCAAkC,EAClC,kCAAkC,EAClC,iCAAiC,EACjC,iCAAiC,GAClC,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CA0BxB;AAGD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AAGxC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,eAAe,CAAC;AAG9B,cAAc,qBAAqB,CAAC;AAGpC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,4CAA4C,CAAC;AAG3D,cAAc,gBAAgB,CAAC;AAG/B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,UAAU,EACV,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,eAAe,GAChB,MAAM,uCAAuC,CAAC;AAI/C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAK3G,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,GACtB,MAAM,yCAAyC,CAAC;AAKjD,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,uBAAuB,EAC5B,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,eAAe,EACf,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,aAAa,EACb,QAAQ,EACR,OAAO,EACP,WAAW,EACX,SAAS,EACT,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,SAAS,EACT,OAAO,GACR,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -58,4 +58,12 @@ export { allocateRevisionId, buildPPrChangeElement, buildTcPrChangeElement, buil
|
|
|
58
58
|
// Re-export the LibreOffice accept/reject oracle (gated reference voter; callers skip when
|
|
59
59
|
// `resolveSoffice()` is null). odf-core's round-trip tests drive it with `.odt` jobs.
|
|
60
60
|
export { resolveSoffice, runLibreOfficeOracle } from './integration/libreoffice-oracle.js';
|
|
61
|
+
// Synthetic-DOCX fixture builders re-exported for downstream packages' test suites
|
|
62
|
+
// (odf-core's DOCX→ODT conversion tests build their inputs with these). They live under
|
|
63
|
+
// `integration/` because `src/testing/**` is excluded from the package build.
|
|
64
|
+
export { buildSyntheticDocx, buildDocxFromParts, } from './integration/synthetic-docx-fixture.js';
|
|
65
|
+
// From-scratch generation (OpenSpec capability: docx-generation). Public as of
|
|
66
|
+
// the final phase of add-docx-generation: compatibility matrix recorded, all
|
|
67
|
+
// scenario coverage enforced strictly in CI.
|
|
68
|
+
export { generateDocx, GenerationSpecError, GenerationInternalError, checkGeneratedPackage, coverTermsTable, signatureBlock, } from './generation/index.js';
|
|
61
69
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAuB5E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,OAAe,EACf,UAA0B,EAAE;IAE5B,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAEpF,+CAA+C;IAC/C,IAAK,MAAiB,KAAK,WAAW,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,+DAA+D;YAC/D,iDAAiD,CAClD,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/C,OAAO,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE;YACjD,MAAM;YACN,IAAI;YACJ,kBAAkB;YAClB,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAED,6DAA6D;IAC7D,MAAM,IAAI,KAAK,CACb,kEAAkE;QAClE,2DAA2D,CAC5D,CAAC;AACJ,CAAC;AAED,6BAA6B;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AAExC,mCAAmC;AACnC,cAAc,iBAAiB,CAAC;AAEhC,+BAA+B;AAC/B,cAAc,eAAe,CAAC;AAE9B,2BAA2B;AAC3B,cAAc,qBAAqB,CAAC;AAEpC,6BAA6B;AAC7B,cAAc,uBAAuB,CAAC;AAEtC,qDAAqD;AACrD,cAAc,4CAA4C,CAAC;AAE3D,gCAAgC;AAChC,cAAc,gBAAgB,CAAC;AAE/B,+BAA+B;AAC/B,cAAc,gBAAgB,CAAC;AAE/B,mEAAmE;AACnE,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,UAAU,EACV,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,uCAAuC,CAAC;AAO/C,2FAA2F;AAC3F,sFAAsF;AACtF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAkB,MAAM,qCAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAuB5E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,OAAe,EACf,UAA0B,EAAE;IAE5B,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAEpF,+CAA+C;IAC/C,IAAK,MAAiB,KAAK,WAAW,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,+DAA+D;YAC/D,iDAAiD,CAClD,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/C,OAAO,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE;YACjD,MAAM;YACN,IAAI;YACJ,kBAAkB;YAClB,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAED,6DAA6D;IAC7D,MAAM,IAAI,KAAK,CACb,kEAAkE;QAClE,2DAA2D,CAC5D,CAAC;AACJ,CAAC;AAED,6BAA6B;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AAExC,mCAAmC;AACnC,cAAc,iBAAiB,CAAC;AAEhC,+BAA+B;AAC/B,cAAc,eAAe,CAAC;AAE9B,2BAA2B;AAC3B,cAAc,qBAAqB,CAAC;AAEpC,6BAA6B;AAC7B,cAAc,uBAAuB,CAAC;AAEtC,qDAAqD;AACrD,cAAc,4CAA4C,CAAC;AAE3D,gCAAgC;AAChC,cAAc,gBAAgB,CAAC;AAE/B,+BAA+B;AAC/B,cAAc,gBAAgB,CAAC;AAE/B,mEAAmE;AACnE,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,UAAU,EACV,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,uCAAuC,CAAC;AAO/C,2FAA2F;AAC3F,sFAAsF;AACtF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAkB,MAAM,qCAAqC,CAAC;AAE3G,mFAAmF;AACnF,wFAAwF;AACxF,8EAA8E;AAC9E,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,yCAAyC,CAAC;AAEjD,+EAA+E;AAC/E,6EAA6E;AAC7E,6CAA6C;AAC7C,OAAO,EACL,YAAY,EAEZ,mBAAmB,EACnB,uBAAuB,EAEvB,qBAAqB,EAGrB,eAAe,EACf,cAAc,GAGf,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type DocxIdentityProbeResult = {
|
|
2
|
+
/** The package as re-saved by LibreOffice's DOCX export filter. */
|
|
3
|
+
savedPackage: Buffer;
|
|
4
|
+
};
|
|
5
|
+
export type DocxPdfProbeResult = {
|
|
6
|
+
pdf: Buffer;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Load→save a complete generated package through LibreOffice's DOCX filter.
|
|
10
|
+
* Throws when LibreOffice cannot load the package (no output is produced).
|
|
11
|
+
*/
|
|
12
|
+
export declare function probeDocxIdentity(generated: Buffer, soffice?: string | null): Promise<DocxIdentityProbeResult>;
|
|
13
|
+
/** Render a generated package to PDF headlessly — the headless-renderer probe. */
|
|
14
|
+
export declare function probeDocxToPdf(generated: Buffer, soffice?: string | null): Promise<DocxPdfProbeResult>;
|
|
15
|
+
//# sourceMappingURL=generation-probes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-probes.d.ts","sourceRoot":"","sources":["../../src/integration/generation-probes.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,uBAAuB,GAAG;IACpC,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AA+CF;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAAM,GAAG,IAAuB,GACxC,OAAO,CAAC,uBAAuB,CAAC,CAIlC;AAED,kFAAkF;AAClF,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAAM,GAAG,IAAuB,GACxC,OAAO,CAAC,kBAAkB,CAAC,CAI7B"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LibreOffice probes for generated full-package documents.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately separate from runLibreOfficeOracle: the oracle's contract is
|
|
5
|
+
* "main XML string per accept/reject/identity job over a bare document.xml or
|
|
6
|
+
* .odt", driven by an injected Basic macro because the resolve-all commands
|
|
7
|
+
* are dispatch-only. These probes have a different contract — a complete
|
|
8
|
+
* generated package goes in, and the *saved package* (or rendered PDF) comes
|
|
9
|
+
* back out — and need no macro: `--convert-to` performs exactly the
|
|
10
|
+
* load→save (or load→render) cycle that exposes recovery-dialog failures,
|
|
11
|
+
* because a package LibreOffice cannot load cleanly produces no output.
|
|
12
|
+
*
|
|
13
|
+
* Local-only, like the oracle: callers skip when `resolveSoffice()` is null
|
|
14
|
+
* (CI does not install LibreOffice; the structural checks are the
|
|
15
|
+
* CI-enforceable proxy).
|
|
16
|
+
*/
|
|
17
|
+
import { execFile } from 'node:child_process';
|
|
18
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
19
|
+
import os from 'node:os';
|
|
20
|
+
import path from 'node:path';
|
|
21
|
+
import { pathToFileURL } from 'node:url';
|
|
22
|
+
import { promisify } from 'node:util';
|
|
23
|
+
import { resolveSoffice } from './libreoffice-oracle.js';
|
|
24
|
+
const execFileAsync = promisify(execFile);
|
|
25
|
+
async function runConvert(input, convertTo, outExt, soffice) {
|
|
26
|
+
const work = mkdtempSync(path.join(os.tmpdir(), 'sdx-gen-probe-'));
|
|
27
|
+
try {
|
|
28
|
+
const inDir = path.join(work, 'in');
|
|
29
|
+
const outDir = path.join(work, 'out');
|
|
30
|
+
const profile = path.join(work, 'profile');
|
|
31
|
+
mkdirSync(inDir, { recursive: true });
|
|
32
|
+
mkdirSync(outDir, { recursive: true });
|
|
33
|
+
mkdirSync(profile, { recursive: true });
|
|
34
|
+
const inPath = path.join(inDir, 'probe.docx');
|
|
35
|
+
writeFileSync(inPath, new Uint8Array(input));
|
|
36
|
+
const args = [
|
|
37
|
+
'--headless',
|
|
38
|
+
'--norestore',
|
|
39
|
+
'--nologo',
|
|
40
|
+
`-env:UserInstallation=${pathToFileURL(profile).href}`,
|
|
41
|
+
'--convert-to',
|
|
42
|
+
convertTo,
|
|
43
|
+
'--outdir',
|
|
44
|
+
outDir,
|
|
45
|
+
inPath,
|
|
46
|
+
];
|
|
47
|
+
let diag = '';
|
|
48
|
+
try {
|
|
49
|
+
const r = await execFileAsync(soffice, args, { timeout: 45_000, killSignal: 'SIGKILL', maxBuffer: 8 * 1024 * 1024 });
|
|
50
|
+
diag = String(r.stderr ?? '') || String(r.stdout ?? '');
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
const e = err;
|
|
54
|
+
diag = String(e.stderr ?? e.stdout ?? e.message ?? '');
|
|
55
|
+
}
|
|
56
|
+
const outPath = path.join(outDir, `probe.${outExt}`);
|
|
57
|
+
if (!existsSync(outPath)) {
|
|
58
|
+
throw new Error(`LibreOffice could not convert the generated package to ${outExt} — likely a load failure ` +
|
|
59
|
+
`(the recovery-dialog class of bug).\nsoffice output:\n${diag.trim() || '(no output)'}`);
|
|
60
|
+
}
|
|
61
|
+
return readFileSync(outPath);
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
rmSync(work, { recursive: true, force: true });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Load→save a complete generated package through LibreOffice's DOCX filter.
|
|
69
|
+
* Throws when LibreOffice cannot load the package (no output is produced).
|
|
70
|
+
*/
|
|
71
|
+
export async function probeDocxIdentity(generated, soffice = resolveSoffice()) {
|
|
72
|
+
if (!soffice)
|
|
73
|
+
throw new Error('probeDocxIdentity: no soffice binary (call resolveSoffice() and skip)');
|
|
74
|
+
const savedPackage = await runConvert(generated, 'docx:MS Word 2007 XML', 'docx', soffice);
|
|
75
|
+
return { savedPackage };
|
|
76
|
+
}
|
|
77
|
+
/** Render a generated package to PDF headlessly — the headless-renderer probe. */
|
|
78
|
+
export async function probeDocxToPdf(generated, soffice = resolveSoffice()) {
|
|
79
|
+
if (!soffice)
|
|
80
|
+
throw new Error('probeDocxToPdf: no soffice binary (call resolveSoffice() and skip)');
|
|
81
|
+
const pdf = await runConvert(generated, 'pdf', 'pdf', soffice);
|
|
82
|
+
return { pdf };
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=generation-probes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-probes.js","sourceRoot":"","sources":["../../src/integration/generation-probes.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,10 @@ export declare function extractDocumentXml(docx: Buffer): Promise<string>;
|
|
|
14
14
|
* DOCX jobs carry a bare `word/document.xml` (packed into a minimal package and read back out);
|
|
15
15
|
* ODT jobs carry a complete `.odt` package buffer (ODF packaging — mimetype-first STORED — is
|
|
16
16
|
* the caller's concern) and return its post-op `content.xml`.
|
|
17
|
+
*
|
|
18
|
+
* CONVERSION jobs (`docx` + `saveAs: 'odt'`) carry a complete `.docx` package buffer and save
|
|
19
|
+
* through LibreOffice's `writer8` filter, returning the converted `content.xml` — the reference
|
|
20
|
+
* path for differential-testing odf-core's native DOCX→ODT converter (issue #331).
|
|
17
21
|
*/
|
|
18
22
|
type OracleOp = 'accept' | 'reject' | 'identity';
|
|
19
23
|
export type OracleJob = {
|
|
@@ -22,6 +26,10 @@ export type OracleJob = {
|
|
|
22
26
|
} | {
|
|
23
27
|
op: OracleOp;
|
|
24
28
|
odt: Buffer;
|
|
29
|
+
} | {
|
|
30
|
+
op: OracleOp;
|
|
31
|
+
docx: Buffer;
|
|
32
|
+
saveAs: 'odt';
|
|
25
33
|
};
|
|
26
34
|
/**
|
|
27
35
|
* Run LibreOffice over a batch of jobs in ONE headless launch and return each job's resulting
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libreoffice-oracle.d.ts","sourceRoot":"","sources":["../../src/integration/libreoffice-oracle.ts"],"names":[],"mappings":"AAoEA,4FAA4F;AAC5F,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAU9C;AAeD,iFAAiF;AACjF,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1E;AAED,4DAA4D;AAC5D,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAItE;AA+DD
|
|
1
|
+
{"version":3,"file":"libreoffice-oracle.d.ts","sourceRoot":"","sources":["../../src/integration/libreoffice-oracle.ts"],"names":[],"mappings":"AAoEA,4FAA4F;AAC5F,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAU9C;AAeD,iFAAiF;AACjF,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1E;AAED,4DAA4D;AAC5D,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAItE;AA+DD;;;;;;;;;;;;;;GAcG;AACH,KAAK,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AACjD,MAAM,MAAM,SAAS,GACjB;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,CAAC;AAUlD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,OAAO,gBAAmB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4F3G;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,EAAE,CAkB7D"}
|
|
@@ -164,6 +164,9 @@ End Sub
|
|
|
164
164
|
function isOdtJob(job) {
|
|
165
165
|
return 'odt' in job;
|
|
166
166
|
}
|
|
167
|
+
function isConvertJob(job) {
|
|
168
|
+
return 'docx' in job;
|
|
169
|
+
}
|
|
167
170
|
/**
|
|
168
171
|
* Run LibreOffice over a batch of jobs in ONE headless launch and return each job's resulting
|
|
169
172
|
* main XML part — `word/document.xml` for DOCX jobs, `content.xml` for ODT jobs. Throws if the
|
|
@@ -192,11 +195,16 @@ export async function runLibreOfficeOracle(jobs, soffice = resolveSoffice()) {
|
|
|
192
195
|
const jobLines = [];
|
|
193
196
|
for (let i = 0; i < jobs.length; i++) {
|
|
194
197
|
const job = jobs[i];
|
|
195
|
-
const
|
|
196
|
-
const
|
|
197
|
-
const
|
|
198
|
-
const
|
|
199
|
-
|
|
198
|
+
const inExt = isOdtJob(job) ? 'odt' : 'docx';
|
|
199
|
+
const outExt = isOdtJob(job) || isConvertJob(job) ? 'odt' : 'docx';
|
|
200
|
+
const filter = isOdtJob(job) || isConvertJob(job) ? 'writer8' : 'MS Word 2007 XML';
|
|
201
|
+
const inPath = path.join(inDir, `job${i}.${inExt}`);
|
|
202
|
+
const outPath = path.join(outDir, `job${i}.${outExt}`);
|
|
203
|
+
writeFileSync(inPath, isOdtJob(job)
|
|
204
|
+
? new Uint8Array(job.odt)
|
|
205
|
+
: isConvertJob(job)
|
|
206
|
+
? new Uint8Array(job.docx)
|
|
207
|
+
: new Uint8Array(await packMinimalDocx(job.documentXml)));
|
|
200
208
|
outPaths.push(outPath);
|
|
201
209
|
jobLines.push(`${job.op}|${inPath}|${outPath}|${filter}`);
|
|
202
210
|
}
|
|
@@ -233,7 +241,7 @@ export async function runLibreOfficeOracle(jobs, soffice = resolveSoffice()) {
|
|
|
233
241
|
return Promise.all(outPaths.map(async (p, i) => {
|
|
234
242
|
if (!existsSync(p))
|
|
235
243
|
throw new Error(`LibreOffice oracle produced no output for ${path.basename(p)}`);
|
|
236
|
-
if (isOdtJob(jobs[i])) {
|
|
244
|
+
if (isOdtJob(jobs[i]) || isConvertJob(jobs[i])) {
|
|
237
245
|
const contentXml = await readZipText(readFileSync(p), 'content.xml');
|
|
238
246
|
if (contentXml == null)
|
|
239
247
|
throw new Error(`content.xml not found in oracle output ${path.basename(p)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libreoffice-oracle.js","sourceRoot":"","sources":["../../src/integration/libreoffice-oracle.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"libreoffice-oracle.js","sourceRoot":"","sources":["../../src/integration/libreoffice-oracle.ts"],"names":[],"mappings":"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"}
|