@usejunior/docx-core 0.9.1 → 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 +28 -8
- package/dist/atomizer.d.ts.map +1 -1
- package/dist/atomizer.js +96 -25
- 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 +333 -112
- package/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
- package/dist/baselines/atomizer/formattingFidelity.d.ts +99 -0
- package/dist/baselines/atomizer/formattingFidelity.d.ts.map +1 -0
- package/dist/baselines/atomizer/formattingFidelity.js +449 -0
- package/dist/baselines/atomizer/formattingFidelity.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts +37 -0
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js +189 -0
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts +74 -0
- package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-containers.js +171 -0
- package/dist/baselines/atomizer/inPlaceModifier-containers.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts +88 -0
- package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-deletion.js +326 -0
- package/dist/baselines/atomizer/inPlaceModifier-deletion.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts +85 -0
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.js +402 -0
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts +39 -0
- package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-presplit.js +265 -0
- package/dist/baselines/atomizer/inPlaceModifier-presplit.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts +62 -0
- package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-shared.js +139 -0
- package/dist/baselines/atomizer/inPlaceModifier-shared.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +198 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +475 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier.d.ts +6 -290
- package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -1
- package/dist/baselines/atomizer/inPlaceModifier.js +23 -1828
- package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -1
- package/dist/baselines/atomizer/pipeline.d.ts +36 -2
- package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
- package/dist/baselines/atomizer/pipeline.js +216 -144
- 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 +199 -173
- 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 +197 -0
- package/dist/compare-types.d.ts.map +1 -0
- package/dist/compare-types.js +2 -0
- package/dist/compare-types.js.map +1 -0
- package/dist/core-types.d.ts +5 -1
- package/dist/core-types.d.ts.map +1 -1
- package/dist/core-types.js +5 -1
- package/dist/core-types.js.map +1 -1
- package/dist/footnotes.d.ts +8 -3
- package/dist/footnotes.d.ts.map +1 -1
- package/dist/footnotes.js +8 -3
- package/dist/footnotes.js.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 +9 -150
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -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 +49 -0
- package/dist/integration/libreoffice-oracle.d.ts.map +1 -0
- package/dist/integration/libreoffice-oracle.js +290 -0
- package/dist/integration/libreoffice-oracle.js.map +1 -0
- 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 +4 -3
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +163 -77
- package/dist/primitives/accept_changes.js.map +1 -1
- package/dist/primitives/comments.d.ts +12 -3
- package/dist/primitives/comments.d.ts.map +1 -1
- package/dist/primitives/comments.js +374 -97
- package/dist/primitives/comments.js.map +1 -1
- package/dist/primitives/content_fingerprint.d.ts +29 -0
- package/dist/primitives/content_fingerprint.d.ts.map +1 -0
- package/dist/primitives/content_fingerprint.js +63 -0
- package/dist/primitives/content_fingerprint.js.map +1 -0
- package/dist/primitives/document.d.ts +94 -15
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +373 -36
- package/dist/primitives/document.js.map +1 -1
- package/dist/primitives/document_view-comments.d.ts +18 -0
- package/dist/primitives/document_view-comments.d.ts.map +1 -0
- package/dist/primitives/document_view-comments.js +160 -0
- package/dist/primitives/document_view-comments.js.map +1 -0
- package/dist/primitives/document_view-headings.d.ts +45 -0
- package/dist/primitives/document_view-headings.d.ts.map +1 -0
- package/dist/primitives/document_view-headings.js +247 -0
- package/dist/primitives/document_view-headings.js.map +1 -0
- package/dist/primitives/document_view-styles.d.ts +11 -0
- package/dist/primitives/document_view-styles.d.ts.map +1 -0
- package/dist/primitives/document_view-styles.js +104 -0
- package/dist/primitives/document_view-styles.js.map +1 -0
- package/dist/primitives/document_view-toon.d.ts +37 -0
- package/dist/primitives/document_view-toon.d.ts.map +1 -0
- package/dist/primitives/document_view-toon.js +199 -0
- package/dist/primitives/document_view-toon.js.map +1 -0
- package/dist/primitives/document_view-types.d.ts +152 -0
- package/dist/primitives/document_view-types.d.ts.map +1 -0
- package/dist/primitives/document_view-types.js +2 -0
- package/dist/primitives/document_view-types.js.map +1 -0
- package/dist/primitives/document_view.d.ts +8 -106
- package/dist/primitives/document_view.d.ts.map +1 -1
- package/dist/primitives/document_view.js +153 -312
- package/dist/primitives/document_view.js.map +1 -1
- package/dist/primitives/dom-helpers.d.ts +9 -0
- package/dist/primitives/dom-helpers.d.ts.map +1 -1
- package/dist/primitives/dom-helpers.js +10 -1
- package/dist/primitives/dom-helpers.js.map +1 -1
- package/dist/primitives/footnotes.d.ts +4 -3
- package/dist/primitives/footnotes.d.ts.map +1 -1
- package/dist/primitives/footnotes.js +232 -44
- package/dist/primitives/footnotes.js.map +1 -1
- package/dist/primitives/formatting_tags.d.ts +7 -0
- package/dist/primitives/formatting_tags.d.ts.map +1 -1
- package/dist/primitives/formatting_tags.js +22 -11
- package/dist/primitives/formatting_tags.js.map +1 -1
- package/dist/primitives/index.d.ts +10 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +9 -0
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/layout.d.ts +4 -3
- package/dist/primitives/layout.d.ts.map +1 -1
- package/dist/primitives/layout.js +45 -3
- package/dist/primitives/layout.js.map +1 -1
- package/dist/primitives/merge_runs.d.ts +21 -3
- package/dist/primitives/merge_runs.d.ts.map +1 -1
- package/dist/primitives/merge_runs.js +32 -10
- package/dist/primitives/merge_runs.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 +47 -0
- package/dist/primitives/namespaces.d.ts.map +1 -1
- package/dist/primitives/namespaces.js +52 -0
- package/dist/primitives/namespaces.js.map +1 -1
- package/dist/primitives/reject_changes.d.ts +6 -4
- package/dist/primitives/reject_changes.d.ts.map +1 -1
- package/dist/primitives/reject_changes.js +187 -91
- 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 +7 -0
- package/dist/primitives/semantic_tags.d.ts.map +1 -1
- package/dist/primitives/semantic_tags.js +23 -4
- package/dist/primitives/semantic_tags.js.map +1 -1
- package/dist/primitives/serialize_html.d.ts +37 -0
- package/dist/primitives/serialize_html.d.ts.map +1 -0
- package/dist/primitives/serialize_html.js +395 -0
- package/dist/primitives/serialize_html.js.map +1 -0
- package/dist/primitives/serialize_markdown.d.ts +16 -0
- package/dist/primitives/serialize_markdown.d.ts.map +1 -0
- package/dist/primitives/serialize_markdown.js +300 -0
- package/dist/primitives/serialize_markdown.js.map +1 -0
- package/dist/primitives/serialize_plaintext.d.ts +15 -0
- package/dist/primitives/serialize_plaintext.d.ts.map +1 -0
- package/dist/primitives/serialize_plaintext.js +154 -0
- package/dist/primitives/serialize_plaintext.js.map +1 -0
- package/dist/primitives/styles.d.ts +15 -0
- package/dist/primitives/styles.d.ts.map +1 -1
- package/dist/primitives/styles.js +33 -22
- package/dist/primitives/styles.js.map +1 -1
- package/dist/primitives/tables.d.ts.map +1 -1
- package/dist/primitives/tables.js +13 -3
- package/dist/primitives/tables.js.map +1 -1
- package/dist/primitives/text.d.ts +2 -1
- package/dist/primitives/text.d.ts.map +1 -1
- package/dist/primitives/text.js +116 -12
- package/dist/primitives/text.js.map +1 -1
- package/dist/primitives/track-changes-emitter.d.ts +148 -0
- package/dist/primitives/track-changes-emitter.d.ts.map +1 -0
- package/dist/primitives/track-changes-emitter.js +291 -0
- package/dist/primitives/track-changes-emitter.js.map +1 -0
- 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-helpers.d.ts +29 -0
- package/dist/primitives/xml-helpers.d.ts.map +1 -0
- package/dist/primitives/xml-helpers.js +35 -0
- package/dist/primitives/xml-helpers.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/dist/shared/ooxml/namespaces.d.ts +4 -1
- package/dist/shared/ooxml/namespaces.d.ts.map +1 -1
- package/dist/shared/ooxml/namespaces.js +4 -1
- package/dist/shared/ooxml/namespaces.js.map +1 -1
- package/package.json +13 -9
|
@@ -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":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,156 +6,8 @@
|
|
|
6
6
|
* - Baseline B: Pure TypeScript (diff-match-patch + OOXML renderer) - paragraph level (dev-only)
|
|
7
7
|
* - Atomizer: Pure TypeScript with atom-level comparison, move detection, format detection
|
|
8
8
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
author?: string;
|
|
12
|
-
/**
|
|
13
|
-
* Revision timestamp used for generated track changes (`w:date`).
|
|
14
|
-
* Default: current time.
|
|
15
|
-
*/
|
|
16
|
-
date?: Date;
|
|
17
|
-
/** Ignore formatting differences. Default: true (v1) */
|
|
18
|
-
ignoreFormatting?: boolean;
|
|
19
|
-
/**
|
|
20
|
-
* Atomizer-only normalization: merge adjacent <w:r> siblings with identical formatting
|
|
21
|
-
* prior to comparison. This can reduce overly-granular diffs for heavily-fragmented docs.
|
|
22
|
-
*
|
|
23
|
-
* Default: true.
|
|
24
|
-
*/
|
|
25
|
-
premergeRuns?: boolean;
|
|
26
|
-
/**
|
|
27
|
-
* How to reconstruct the output DOCX when using the atomizer engine:
|
|
28
|
-
* - 'rebuild': rebuild document.xml from scratch (more reject/accept stable)
|
|
29
|
-
* - 'inplace': modify the revised document AST in place (more experimental)
|
|
30
|
-
*
|
|
31
|
-
* Default: 'rebuild'
|
|
32
|
-
*/
|
|
33
|
-
reconstructionMode?: ReconstructionMode;
|
|
34
|
-
/**
|
|
35
|
-
* Comparison engine to use:
|
|
36
|
-
* - 'atomizer': Character-level comparison with move detection (recommended)
|
|
37
|
-
* - 'wmlcomparer': .NET WmlComparer (requires external runtime)
|
|
38
|
-
* - 'auto': Automatically select best available engine (currently 'atomizer')
|
|
39
|
-
*
|
|
40
|
-
* Default: 'auto'
|
|
41
|
-
*/
|
|
42
|
-
engine?: 'wmlcomparer' | 'atomizer' | 'auto';
|
|
43
|
-
}
|
|
44
|
-
export interface CompareStats {
|
|
45
|
-
insertions: number;
|
|
46
|
-
deletions: number;
|
|
47
|
-
modifications: number;
|
|
48
|
-
}
|
|
49
|
-
export type ReconstructionMode = 'rebuild' | 'inplace';
|
|
50
|
-
export type ReconstructionFallbackReason = 'round_trip_safety_check_failed';
|
|
51
|
-
export type ReconstructionSafetyCheckName = 'acceptText' | 'rejectText' | 'acceptBookmarks' | 'rejectBookmarks' | 'fieldStructure';
|
|
52
|
-
export interface ReconstructionSafetyChecks {
|
|
53
|
-
acceptText: boolean;
|
|
54
|
-
rejectText: boolean;
|
|
55
|
-
acceptBookmarks: boolean;
|
|
56
|
-
rejectBookmarks: boolean;
|
|
57
|
-
fieldStructure: boolean;
|
|
58
|
-
}
|
|
59
|
-
export interface ReconstructionTextMismatchDetails {
|
|
60
|
-
expectedLength: number;
|
|
61
|
-
actualLength: number;
|
|
62
|
-
firstDifferingParagraphIndex: number;
|
|
63
|
-
expectedParagraph: string;
|
|
64
|
-
actualParagraph: string;
|
|
65
|
-
differenceSample: string[];
|
|
66
|
-
}
|
|
67
|
-
export interface ReconstructionIdDelta {
|
|
68
|
-
missing: string[];
|
|
69
|
-
unexpected: string[];
|
|
70
|
-
}
|
|
71
|
-
export interface ReconstructionBookmarkMismatchDetails {
|
|
72
|
-
startNames: ReconstructionIdDelta;
|
|
73
|
-
referencedBookmarkNames: ReconstructionIdDelta;
|
|
74
|
-
unresolvedReferenceNames: ReconstructionIdDelta;
|
|
75
|
-
startIds: ReconstructionIdDelta;
|
|
76
|
-
endIds: ReconstructionIdDelta;
|
|
77
|
-
expectedDuplicateStartNames: string[];
|
|
78
|
-
actualDuplicateStartNames: string[];
|
|
79
|
-
expectedDuplicateStartIds: string[];
|
|
80
|
-
actualDuplicateStartIds: string[];
|
|
81
|
-
expectedDuplicateEndIds: string[];
|
|
82
|
-
actualDuplicateEndIds: string[];
|
|
83
|
-
expectedUnmatchedStartIds: string[];
|
|
84
|
-
actualUnmatchedStartIds: string[];
|
|
85
|
-
expectedUnmatchedEndIds: string[];
|
|
86
|
-
actualUnmatchedEndIds: string[];
|
|
87
|
-
}
|
|
88
|
-
export interface ReconstructionSafetyFailureDetails {
|
|
89
|
-
acceptText?: ReconstructionTextMismatchDetails;
|
|
90
|
-
rejectText?: ReconstructionTextMismatchDetails;
|
|
91
|
-
acceptBookmarks?: ReconstructionBookmarkMismatchDetails;
|
|
92
|
-
rejectBookmarks?: ReconstructionBookmarkMismatchDetails;
|
|
93
|
-
}
|
|
94
|
-
export interface ReconstructionIdDeltaSummary {
|
|
95
|
-
missingCount: number;
|
|
96
|
-
unexpectedCount: number;
|
|
97
|
-
firstMissing?: string;
|
|
98
|
-
firstUnexpected?: string;
|
|
99
|
-
}
|
|
100
|
-
export interface ReconstructionTextMismatchSummary {
|
|
101
|
-
firstDifferingParagraphIndex: number;
|
|
102
|
-
expectedParagraph: string;
|
|
103
|
-
actualParagraph: string;
|
|
104
|
-
firstDifference: string;
|
|
105
|
-
}
|
|
106
|
-
export interface ReconstructionBookmarkMismatchSummary {
|
|
107
|
-
startNames: ReconstructionIdDeltaSummary;
|
|
108
|
-
referencedBookmarkNames: ReconstructionIdDeltaSummary;
|
|
109
|
-
unresolvedReferenceNames: ReconstructionIdDeltaSummary;
|
|
110
|
-
startIds: ReconstructionIdDeltaSummary;
|
|
111
|
-
endIds: ReconstructionIdDeltaSummary;
|
|
112
|
-
unmatchedStartCount: number;
|
|
113
|
-
unmatchedEndCount: number;
|
|
114
|
-
firstUnmatchedStartId?: string;
|
|
115
|
-
firstUnmatchedEndId?: string;
|
|
116
|
-
}
|
|
117
|
-
export interface ReconstructionSafetyFailureSummary {
|
|
118
|
-
acceptText?: ReconstructionTextMismatchSummary;
|
|
119
|
-
rejectText?: ReconstructionTextMismatchSummary;
|
|
120
|
-
acceptBookmarks?: ReconstructionBookmarkMismatchSummary;
|
|
121
|
-
rejectBookmarks?: ReconstructionBookmarkMismatchSummary;
|
|
122
|
-
}
|
|
123
|
-
export interface ReconstructionAttemptDiagnostics {
|
|
124
|
-
pass: 'inplace_word_split' | 'inplace_run_level' | 'inplace_word_split_cross_run' | 'inplace_run_level_cross_run';
|
|
125
|
-
checks: ReconstructionSafetyChecks;
|
|
126
|
-
failedChecks: ReconstructionSafetyCheckName[];
|
|
127
|
-
failureDetails?: ReconstructionSafetyFailureDetails;
|
|
128
|
-
firstDiffSummary?: ReconstructionSafetyFailureSummary;
|
|
129
|
-
}
|
|
130
|
-
export interface ReconstructionFallbackDiagnostics {
|
|
131
|
-
attempts: ReconstructionAttemptDiagnostics[];
|
|
132
|
-
}
|
|
133
|
-
export interface CompareResult {
|
|
134
|
-
/** The resulting DOCX with track changes */
|
|
135
|
-
document: Buffer;
|
|
136
|
-
/** Statistics about the comparison */
|
|
137
|
-
stats: CompareStats;
|
|
138
|
-
/** Which engine was used */
|
|
139
|
-
engine: 'wmlcomparer' | 'atomizer';
|
|
140
|
-
/**
|
|
141
|
-
* Requested reconstruction mode. Present for atomizer outputs.
|
|
142
|
-
*/
|
|
143
|
-
reconstructionModeRequested?: ReconstructionMode;
|
|
144
|
-
/**
|
|
145
|
-
* Actual reconstruction mode used to produce the output. Present for atomizer outputs.
|
|
146
|
-
*/
|
|
147
|
-
reconstructionModeUsed?: ReconstructionMode;
|
|
148
|
-
/**
|
|
149
|
-
* Why the requested reconstruction mode could not be used.
|
|
150
|
-
* Present only when atomizer falls back.
|
|
151
|
-
*/
|
|
152
|
-
fallbackReason?: ReconstructionFallbackReason;
|
|
153
|
-
/**
|
|
154
|
-
* Detailed safety-check diagnostics for fallback decisions.
|
|
155
|
-
* Present only when atomizer falls back.
|
|
156
|
-
*/
|
|
157
|
-
fallbackDiagnostics?: ReconstructionFallbackDiagnostics;
|
|
158
|
-
}
|
|
9
|
+
import type { CompareOptions, CompareResult } from './compare-types.js';
|
|
10
|
+
export type { CompareOptions, CompareResult, CompareStats, ReconstructionAttemptDiagnostics, ReconstructionBookmarkMismatchDetails, ReconstructionBookmarkMismatchSummary, ReconstructionFallbackDiagnostics, ReconstructionFallbackReason, ReconstructionIdDelta, ReconstructionIdDeltaSummary, ReconstructionMode, ReconstructionSafetyCheckName, ReconstructionSafetyChecks, ReconstructionSafetyFailureDetails, ReconstructionSafetyFailureSummary, ReconstructionTextMismatchDetails, ReconstructionTextMismatchSummary, } from './compare-types.js';
|
|
159
11
|
/**
|
|
160
12
|
* Compare two DOCX documents and produce a document with track changes.
|
|
161
13
|
*
|
|
@@ -171,7 +23,14 @@ export * from './core-types.js';
|
|
|
171
23
|
export * from './atomizer.js';
|
|
172
24
|
export * from './move-detection.js';
|
|
173
25
|
export * from './format-detection.js';
|
|
26
|
+
export * from './baselines/atomizer/formattingFidelity.js';
|
|
174
27
|
export * from './numbering.js';
|
|
175
28
|
export * from './footnotes.js';
|
|
176
29
|
export * from './primitives/index.js';
|
|
30
|
+
export { allocateRevisionId, buildPPrChangeElement, buildTcPrChangeElement, buildTrPrChangeElement, buildRPrChangeElement, createRevisionContainer, createRevisionContext, createRevisionIdState, escapeXmlAttr, formatDate, prepareElementForDeletion, wrapElementWithDel, wrapElementWithIns, } from './primitives/track-changes-emitter.js';
|
|
31
|
+
export type { RevisionContext, RevisionContextOptions, RevisionIdState, } from './primitives/track-changes-emitter.js';
|
|
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';
|
|
177
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;
|
|
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
|
@@ -46,10 +46,24 @@ export * from './atomizer.js';
|
|
|
46
46
|
export * from './move-detection.js';
|
|
47
47
|
// Re-export format detection
|
|
48
48
|
export * from './format-detection.js';
|
|
49
|
+
// Re-export the formatting-fidelity comparison check
|
|
50
|
+
export * from './baselines/atomizer/formattingFidelity.js';
|
|
49
51
|
// Re-export numbering utilities
|
|
50
52
|
export * from './numbering.js';
|
|
51
53
|
// Re-export footnote utilities
|
|
52
54
|
export * from './footnotes.js';
|
|
53
55
|
// Re-export primitives (editing, DOM helpers, document operations)
|
|
54
56
|
export * from './primitives/index.js';
|
|
57
|
+
export { allocateRevisionId, buildPPrChangeElement, buildTcPrChangeElement, buildTrPrChangeElement, buildRPrChangeElement, createRevisionContainer, createRevisionContext, createRevisionIdState, escapeXmlAttr, formatDate, prepareElementForDeletion, wrapElementWithDel, wrapElementWithIns, } from './primitives/track-changes-emitter.js';
|
|
58
|
+
// Re-export the LibreOffice accept/reject oracle (gated reference voter; callers skip when
|
|
59
|
+
// `resolveSoffice()` is null). odf-core's round-trip tests drive it with `.odt` jobs.
|
|
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';
|
|
55
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;
|
|
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"}
|