@usejunior/docx-core 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +86 -28
- package/dist/.tsbuildinfo +1 -0
- package/dist/atomizer.d.ts +218 -0
- package/dist/atomizer.d.ts.map +1 -0
- package/dist/atomizer.js +856 -0
- package/dist/atomizer.js.map +1 -0
- package/dist/baselines/atomizer/atomLcs.d.ts +96 -0
- package/dist/baselines/atomizer/atomLcs.d.ts.map +1 -0
- package/dist/baselines/atomizer/atomLcs.js +347 -0
- package/dist/baselines/atomizer/atomLcs.js.map +1 -0
- package/dist/baselines/atomizer/debug.d.ts +41 -0
- package/dist/baselines/atomizer/debug.d.ts.map +1 -0
- package/dist/baselines/atomizer/debug.js +85 -0
- package/dist/baselines/atomizer/debug.js.map +1 -0
- package/dist/baselines/atomizer/documentReconstructor.d.ts +64 -0
- package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -0
- package/dist/baselines/atomizer/documentReconstructor.js +939 -0
- package/dist/baselines/atomizer/documentReconstructor.js.map +1 -0
- package/dist/baselines/atomizer/hierarchicalLcs.d.ts +111 -0
- package/dist/baselines/atomizer/hierarchicalLcs.d.ts.map +1 -0
- package/dist/baselines/atomizer/hierarchicalLcs.js +469 -0
- package/dist/baselines/atomizer/hierarchicalLcs.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier.d.ts +183 -0
- package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier.js +1600 -0
- package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -0
- package/dist/baselines/atomizer/numberingIntegration.d.ts +59 -0
- package/dist/baselines/atomizer/numberingIntegration.d.ts.map +1 -0
- package/dist/baselines/atomizer/numberingIntegration.js +209 -0
- package/dist/baselines/atomizer/numberingIntegration.js.map +1 -0
- package/dist/baselines/atomizer/pipeline.d.ts +65 -0
- package/dist/baselines/atomizer/pipeline.d.ts.map +1 -0
- package/dist/baselines/atomizer/pipeline.js +510 -0
- package/dist/baselines/atomizer/pipeline.js.map +1 -0
- package/dist/baselines/atomizer/premergeRuns.d.ts +26 -0
- package/dist/baselines/atomizer/premergeRuns.d.ts.map +1 -0
- package/dist/baselines/atomizer/premergeRuns.js +150 -0
- package/dist/baselines/atomizer/premergeRuns.js.map +1 -0
- package/dist/baselines/atomizer/trackChangesAcceptor.d.ts +63 -0
- package/dist/baselines/atomizer/trackChangesAcceptor.d.ts.map +1 -0
- package/dist/baselines/atomizer/trackChangesAcceptor.js +254 -0
- package/dist/baselines/atomizer/trackChangesAcceptor.js.map +1 -0
- package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts +64 -0
- package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -0
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js +586 -0
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -0
- package/dist/baselines/atomizer/xmlToWmlElement.d.ts +65 -0
- package/dist/baselines/atomizer/xmlToWmlElement.d.ts.map +1 -0
- package/dist/baselines/atomizer/xmlToWmlElement.js +95 -0
- package/dist/baselines/atomizer/xmlToWmlElement.js.map +1 -0
- package/dist/baselines/diffmatch/documentBuilder.d.ts +44 -0
- package/dist/baselines/diffmatch/documentBuilder.d.ts.map +1 -0
- package/dist/baselines/diffmatch/documentBuilder.js +227 -0
- package/dist/baselines/diffmatch/documentBuilder.js.map +1 -0
- package/dist/baselines/diffmatch/paragraphAlignment.d.ts +75 -0
- package/dist/baselines/diffmatch/paragraphAlignment.d.ts.map +1 -0
- package/dist/baselines/diffmatch/paragraphAlignment.js +206 -0
- package/dist/baselines/diffmatch/paragraphAlignment.js.map +1 -0
- package/dist/baselines/diffmatch/pipeline.d.ts +33 -0
- package/dist/baselines/diffmatch/pipeline.d.ts.map +1 -0
- package/dist/baselines/diffmatch/pipeline.js +84 -0
- package/dist/baselines/diffmatch/pipeline.js.map +1 -0
- package/dist/baselines/diffmatch/runDiff.d.ts +53 -0
- package/dist/baselines/diffmatch/runDiff.d.ts.map +1 -0
- package/dist/baselines/diffmatch/runDiff.js +253 -0
- package/dist/baselines/diffmatch/runDiff.js.map +1 -0
- package/dist/baselines/diffmatch/trackChangesRenderer.d.ts +64 -0
- package/dist/baselines/diffmatch/trackChangesRenderer.d.ts.map +1 -0
- package/dist/baselines/diffmatch/trackChangesRenderer.js +178 -0
- package/dist/baselines/diffmatch/trackChangesRenderer.js.map +1 -0
- package/dist/baselines/diffmatch/xmlParser.d.ts +45 -0
- package/dist/baselines/diffmatch/xmlParser.d.ts.map +1 -0
- package/dist/baselines/diffmatch/xmlParser.js +344 -0
- package/dist/baselines/diffmatch/xmlParser.js.map +1 -0
- package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts +51 -0
- package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts.map +1 -0
- package/dist/baselines/wmlcomparer/DocxodusWasm.js +83 -0
- package/dist/baselines/wmlcomparer/DocxodusWasm.js.map +1 -0
- package/dist/baselines/wmlcomparer/DotnetCli.d.ts +40 -0
- package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -0
- package/dist/baselines/wmlcomparer/DotnetCli.js +135 -0
- package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -0
- package/dist/benchmark/metrics.d.ts +72 -0
- package/dist/benchmark/metrics.d.ts.map +1 -0
- package/dist/benchmark/metrics.js +45 -0
- package/dist/benchmark/metrics.js.map +1 -0
- package/dist/benchmark/reporter.d.ts +23 -0
- package/dist/benchmark/reporter.d.ts.map +1 -0
- package/dist/benchmark/reporter.js +147 -0
- package/dist/benchmark/reporter.js.map +1 -0
- package/dist/benchmark/runner.d.ts +30 -0
- package/dist/benchmark/runner.d.ts.map +1 -0
- package/dist/benchmark/runner.js +233 -0
- package/dist/benchmark/runner.js.map +1 -0
- package/dist/cli/compare-two.d.ts +28 -0
- package/dist/cli/compare-two.d.ts.map +1 -0
- package/dist/cli/compare-two.js +110 -0
- package/dist/cli/compare-two.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +21 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core-types.d.ts +296 -0
- package/dist/core-types.d.ts.map +1 -0
- package/dist/core-types.js +122 -0
- package/dist/core-types.js.map +1 -0
- package/dist/footnotes.d.ts +144 -0
- package/dist/footnotes.d.ts.map +1 -0
- package/dist/footnotes.js +291 -0
- package/dist/footnotes.js.map +1 -0
- package/dist/format-detection.d.ts +120 -0
- package/dist/format-detection.d.ts.map +1 -0
- package/dist/format-detection.js +338 -0
- package/dist/format-detection.js.map +1 -0
- package/dist/index.d.ts +177 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/output-artifacts.d.ts +6 -0
- package/dist/integration/output-artifacts.d.ts.map +1 -0
- package/dist/integration/output-artifacts.js +30 -0
- package/dist/integration/output-artifacts.js.map +1 -0
- package/dist/move-detection.d.ts +211 -0
- package/dist/move-detection.d.ts.map +1 -0
- package/dist/move-detection.js +391 -0
- package/dist/move-detection.js.map +1 -0
- package/dist/numbering.d.ts +136 -0
- package/dist/numbering.d.ts.map +1 -0
- package/dist/numbering.js +446 -0
- package/dist/numbering.js.map +1 -0
- package/dist/primitives/accept_changes.d.ts +30 -0
- package/dist/primitives/accept_changes.d.ts.map +1 -0
- package/dist/primitives/accept_changes.js +241 -0
- package/dist/primitives/accept_changes.js.map +1 -0
- package/dist/primitives/bookmarks.d.ts +12 -0
- package/dist/primitives/bookmarks.d.ts.map +1 -0
- package/dist/primitives/bookmarks.js +248 -0
- package/dist/primitives/bookmarks.js.map +1 -0
- package/dist/primitives/comments.d.ts +88 -0
- package/dist/primitives/comments.d.ts.map +1 -0
- package/dist/primitives/comments.js +703 -0
- package/dist/primitives/comments.js.map +1 -0
- package/dist/primitives/document.d.ts +168 -0
- package/dist/primitives/document.d.ts.map +1 -0
- package/dist/primitives/document.js +532 -0
- package/dist/primitives/document.js.map +1 -0
- package/dist/primitives/document_view.d.ts +93 -0
- package/dist/primitives/document_view.d.ts.map +1 -0
- package/dist/primitives/document_view.js +722 -0
- package/dist/primitives/document_view.js.map +1 -0
- package/dist/primitives/dom-helpers.d.ts +94 -0
- package/dist/primitives/dom-helpers.d.ts.map +1 -0
- package/dist/primitives/dom-helpers.js +219 -0
- package/dist/primitives/dom-helpers.js.map +1 -0
- package/dist/primitives/errors.d.ts +7 -0
- package/dist/primitives/errors.d.ts.map +1 -0
- package/dist/primitives/errors.js +10 -0
- package/dist/primitives/errors.js.map +1 -0
- package/dist/primitives/extract_revisions.d.ts +50 -0
- package/dist/primitives/extract_revisions.d.ts.map +1 -0
- package/dist/primitives/extract_revisions.js +340 -0
- package/dist/primitives/extract_revisions.js.map +1 -0
- package/dist/primitives/footnotes.d.ts +37 -0
- package/dist/primitives/footnotes.d.ts.map +1 -0
- package/dist/primitives/footnotes.js +552 -0
- package/dist/primitives/footnotes.js.map +1 -0
- package/dist/primitives/formatting_tags.d.ts +30 -0
- package/dist/primitives/formatting_tags.d.ts.map +1 -0
- package/dist/primitives/formatting_tags.js +217 -0
- package/dist/primitives/formatting_tags.js.map +1 -0
- package/dist/primitives/index.d.ts +26 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +26 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/layout.d.ts +53 -0
- package/dist/primitives/layout.d.ts.map +1 -0
- package/dist/primitives/layout.js +178 -0
- package/dist/primitives/layout.js.map +1 -0
- package/dist/primitives/list_labels.d.ts +19 -0
- package/dist/primitives/list_labels.d.ts.map +1 -0
- package/dist/primitives/list_labels.js +57 -0
- package/dist/primitives/list_labels.js.map +1 -0
- package/dist/primitives/matching.d.ts +17 -0
- package/dist/primitives/matching.d.ts.map +1 -0
- package/dist/primitives/matching.js +144 -0
- package/dist/primitives/matching.js.map +1 -0
- package/dist/primitives/merge_runs.d.ts +23 -0
- package/dist/primitives/merge_runs.d.ts.map +1 -0
- package/dist/primitives/merge_runs.js +195 -0
- package/dist/primitives/merge_runs.js.map +1 -0
- package/dist/primitives/namespaces.d.ts +90 -0
- package/dist/primitives/namespaces.d.ts.map +1 -0
- package/dist/primitives/namespaces.js +107 -0
- package/dist/primitives/namespaces.js.map +1 -0
- package/dist/primitives/numbering.d.ts +27 -0
- package/dist/primitives/numbering.d.ts.map +1 -0
- package/dist/primitives/numbering.js +182 -0
- package/dist/primitives/numbering.js.map +1 -0
- package/dist/primitives/prevent_double_elevation.d.ts +18 -0
- package/dist/primitives/prevent_double_elevation.d.ts.map +1 -0
- package/dist/primitives/prevent_double_elevation.js +190 -0
- package/dist/primitives/prevent_double_elevation.js.map +1 -0
- package/dist/primitives/reject_changes.d.ts +27 -0
- package/dist/primitives/reject_changes.d.ts.map +1 -0
- package/dist/primitives/reject_changes.js +371 -0
- package/dist/primitives/reject_changes.js.map +1 -0
- package/dist/primitives/relationships.d.ts +7 -0
- package/dist/primitives/relationships.d.ts.map +1 -0
- package/dist/primitives/relationships.js +24 -0
- package/dist/primitives/relationships.js.map +1 -0
- package/dist/primitives/semantic_tags.d.ts +32 -0
- package/dist/primitives/semantic_tags.d.ts.map +1 -0
- package/dist/primitives/semantic_tags.js +139 -0
- package/dist/primitives/semantic_tags.js.map +1 -0
- package/dist/primitives/simplify_redlines.d.ts +19 -0
- package/dist/primitives/simplify_redlines.d.ts.map +1 -0
- package/dist/primitives/simplify_redlines.js +94 -0
- package/dist/primitives/simplify_redlines.js.map +1 -0
- package/dist/primitives/styles.d.ts +36 -0
- package/dist/primitives/styles.d.ts.map +1 -0
- package/dist/primitives/styles.js +190 -0
- package/dist/primitives/styles.js.map +1 -0
- package/dist/primitives/text.d.ts +27 -0
- package/dist/primitives/text.d.ts.map +1 -0
- package/dist/primitives/text.js +416 -0
- package/dist/primitives/text.js.map +1 -0
- package/dist/primitives/validate_document.d.ts +24 -0
- package/dist/primitives/validate_document.d.ts.map +1 -0
- package/dist/primitives/validate_document.js +147 -0
- package/dist/primitives/validate_document.js.map +1 -0
- package/dist/primitives/xml.d.ts +5 -0
- package/dist/primitives/xml.d.ts.map +1 -0
- package/dist/primitives/xml.js +19 -0
- package/dist/primitives/xml.js.map +1 -0
- package/dist/primitives/zip.d.ts +25 -0
- package/dist/primitives/zip.d.ts.map +1 -0
- package/dist/primitives/zip.js +78 -0
- package/dist/primitives/zip.js.map +1 -0
- package/dist/shared/docx/DocxArchive.d.ts +94 -0
- package/dist/shared/docx/DocxArchive.d.ts.map +1 -0
- package/dist/shared/docx/DocxArchive.js +169 -0
- package/dist/shared/docx/DocxArchive.js.map +1 -0
- package/dist/shared/ooxml/namespaces.d.ts +149 -0
- package/dist/shared/ooxml/namespaces.d.ts.map +1 -0
- package/dist/shared/ooxml/namespaces.js +224 -0
- package/dist/shared/ooxml/namespaces.js.map +1 -0
- package/dist/shared/ooxml/types.d.ts +136 -0
- package/dist/shared/ooxml/types.d.ts.map +1 -0
- package/dist/shared/ooxml/types.js +7 -0
- package/dist/shared/ooxml/types.js.map +1 -0
- package/package.json +63 -6
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-Compare Run Pre-Merge
|
|
3
|
+
*
|
|
4
|
+
* Optional normalization step to merge adjacent <w:r> siblings with identical
|
|
5
|
+
* formatting before atomization.
|
|
6
|
+
*
|
|
7
|
+
* Motivation:
|
|
8
|
+
* - Some documents are heavily fragmented into multiple runs even when the
|
|
9
|
+
* formatting is identical. This can cause overly-granular diffs.
|
|
10
|
+
* - For `reconstructionMode: 'inplace'`, we intentionally disable atom-level
|
|
11
|
+
* cross-run text merging to keep atoms anchored to real runs. Pre-merging runs
|
|
12
|
+
* is a safer way to reduce fragmentation without creating atoms that span
|
|
13
|
+
* multiple runs.
|
|
14
|
+
*
|
|
15
|
+
* This step is intentionally conservative:
|
|
16
|
+
* - Only merges immediately-adjacent <w:r> siblings under the same parent.
|
|
17
|
+
* - Requires identical run attributes and identical <w:rPr> formatting subtree.
|
|
18
|
+
* - Only merges runs that contain a small, "safe" subset of child elements.
|
|
19
|
+
*/
|
|
20
|
+
import { createHash } from 'crypto';
|
|
21
|
+
import { getLeafText, childElements } from '../../primitives/index.js';
|
|
22
|
+
const SAFE_RUN_CHILD_TAGS = new Set([
|
|
23
|
+
'w:rPr',
|
|
24
|
+
'w:t',
|
|
25
|
+
'w:tab',
|
|
26
|
+
'w:br',
|
|
27
|
+
'w:cr',
|
|
28
|
+
// Deleted text can appear if input already has revisions.
|
|
29
|
+
'w:delText',
|
|
30
|
+
]);
|
|
31
|
+
function sha1(content) {
|
|
32
|
+
return createHash('sha1').update(content, 'utf8').digest('hex');
|
|
33
|
+
}
|
|
34
|
+
function hashElementDeep(element) {
|
|
35
|
+
const parts = [element.tagName];
|
|
36
|
+
for (let i = 0; i < element.attributes.length; i++) {
|
|
37
|
+
const attr = element.attributes[i];
|
|
38
|
+
parts.push(`${attr.name}=${attr.value}`);
|
|
39
|
+
}
|
|
40
|
+
// Sort for determinism
|
|
41
|
+
parts.sort();
|
|
42
|
+
// Re-add tagName at front after sort
|
|
43
|
+
const tagName = parts.shift();
|
|
44
|
+
const leafText = getLeafText(element);
|
|
45
|
+
if (leafText !== undefined) {
|
|
46
|
+
parts.push(leafText);
|
|
47
|
+
}
|
|
48
|
+
for (const child of childElements(element)) {
|
|
49
|
+
parts.push(hashElementDeep(child));
|
|
50
|
+
}
|
|
51
|
+
return sha1([tagName, ...parts].join('|'));
|
|
52
|
+
}
|
|
53
|
+
function attrsEqual(a, b) {
|
|
54
|
+
if (a.attributes.length !== b.attributes.length)
|
|
55
|
+
return false;
|
|
56
|
+
for (let i = 0; i < a.attributes.length; i++) {
|
|
57
|
+
const aAttr = a.attributes[i];
|
|
58
|
+
const bVal = b.getAttribute(aAttr.name);
|
|
59
|
+
if (bVal !== aAttr.value)
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
function findChild(parent, tagName) {
|
|
65
|
+
for (const child of childElements(parent)) {
|
|
66
|
+
if (child.tagName === tagName)
|
|
67
|
+
return child;
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
function runPropertiesEqual(aRun, bRun) {
|
|
72
|
+
const aRPr = findChild(aRun, 'w:rPr');
|
|
73
|
+
const bRPr = findChild(bRun, 'w:rPr');
|
|
74
|
+
if (!aRPr && !bRPr)
|
|
75
|
+
return true;
|
|
76
|
+
if (!aRPr || !bRPr)
|
|
77
|
+
return false;
|
|
78
|
+
return hashElementDeep(aRPr) === hashElementDeep(bRPr);
|
|
79
|
+
}
|
|
80
|
+
function runIsSafeToMerge(run) {
|
|
81
|
+
if (run.tagName !== 'w:r')
|
|
82
|
+
return false;
|
|
83
|
+
if (getLeafText(run) !== undefined)
|
|
84
|
+
return false;
|
|
85
|
+
for (const child of childElements(run)) {
|
|
86
|
+
if (!SAFE_RUN_CHILD_TAGS.has(child.tagName))
|
|
87
|
+
return false;
|
|
88
|
+
// Be conservative: disallow nested elements under non-rPr children.
|
|
89
|
+
if (child.tagName !== 'w:rPr' && childElements(child).length > 0)
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
function mergeRunInto(target, source) {
|
|
95
|
+
for (const child of childElements(source)) {
|
|
96
|
+
if (child.tagName === 'w:rPr')
|
|
97
|
+
continue;
|
|
98
|
+
target.appendChild(child);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function canMergeRuns(a, b) {
|
|
102
|
+
if (!runIsSafeToMerge(a) || !runIsSafeToMerge(b))
|
|
103
|
+
return false;
|
|
104
|
+
if (!attrsEqual(a, b))
|
|
105
|
+
return false;
|
|
106
|
+
if (!runPropertiesEqual(a, b))
|
|
107
|
+
return false;
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
function mergeAdjacentRunsInChildren(parent) {
|
|
111
|
+
const children = childElements(parent);
|
|
112
|
+
if (children.length < 2)
|
|
113
|
+
return 0;
|
|
114
|
+
let merges = 0;
|
|
115
|
+
// Re-scan after each merge since DOM is live
|
|
116
|
+
let keepGoing = true;
|
|
117
|
+
while (keepGoing) {
|
|
118
|
+
keepGoing = false;
|
|
119
|
+
const kids = childElements(parent);
|
|
120
|
+
for (let i = 0; i < kids.length - 1; i++) {
|
|
121
|
+
const a = kids[i];
|
|
122
|
+
const b = kids[i + 1];
|
|
123
|
+
if (a.tagName === 'w:r' && b.tagName === 'w:r' && canMergeRuns(a, b)) {
|
|
124
|
+
mergeRunInto(a, b);
|
|
125
|
+
parent.removeChild(b);
|
|
126
|
+
merges++;
|
|
127
|
+
keepGoing = true;
|
|
128
|
+
break; // restart scan
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return merges;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Merge adjacent runs throughout a DOM Element subtree.
|
|
136
|
+
*
|
|
137
|
+
* @returns The number of merges performed.
|
|
138
|
+
*/
|
|
139
|
+
export function premergeAdjacentRuns(root) {
|
|
140
|
+
let merges = 0;
|
|
141
|
+
function traverse(node) {
|
|
142
|
+
merges += mergeAdjacentRunsInChildren(node);
|
|
143
|
+
for (const child of childElements(node)) {
|
|
144
|
+
traverse(child);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
traverse(root);
|
|
148
|
+
return merges;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=premergeRuns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"premergeRuns.js","sourceRoot":"","sources":["../../../src/baselines/atomizer/premergeRuns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Track Changes Acceptor/Rejector
|
|
3
|
+
*
|
|
4
|
+
* Utilities to accept or reject all track changes in a document.
|
|
5
|
+
* Used for round-trip testing to verify comparison correctness.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Accept all track changes in document XML.
|
|
9
|
+
*
|
|
10
|
+
* - Removes w:del elements entirely (deleted content disappears)
|
|
11
|
+
* - Unwraps w:ins elements (inserted content becomes normal)
|
|
12
|
+
* - Handles w:moveFrom (remove) and w:moveTo (unwrap)
|
|
13
|
+
* - Converts w:delText back to w:t where needed
|
|
14
|
+
*
|
|
15
|
+
* @param documentXml - The document.xml content with track changes
|
|
16
|
+
* @returns Document XML with all changes accepted
|
|
17
|
+
*/
|
|
18
|
+
export declare function acceptAllChanges(documentXml: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Reject all track changes in document XML.
|
|
21
|
+
*
|
|
22
|
+
* - Removes w:ins elements entirely (inserted content disappears)
|
|
23
|
+
* - Unwraps w:del elements and converts w:delText to w:t
|
|
24
|
+
* - Handles w:moveFrom (unwrap) and w:moveTo (remove)
|
|
25
|
+
*
|
|
26
|
+
* @param documentXml - The document.xml content with track changes
|
|
27
|
+
* @returns Document XML with all changes rejected
|
|
28
|
+
*/
|
|
29
|
+
export declare function rejectAllChanges(documentXml: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Extract plain text content from document XML.
|
|
32
|
+
*
|
|
33
|
+
* @param documentXml - The document.xml content
|
|
34
|
+
* @returns Plain text content
|
|
35
|
+
*/
|
|
36
|
+
export declare function extractTextContent(documentXml: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Extract text in document order, respecting paragraph breaks.
|
|
39
|
+
*/
|
|
40
|
+
export declare function extractTextWithParagraphs(documentXml: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Normalize text for comparison (handles whitespace differences).
|
|
43
|
+
*
|
|
44
|
+
* Performs the following normalization:
|
|
45
|
+
* - Convert CRLF and CR to LF
|
|
46
|
+
* - Convert tabs to spaces
|
|
47
|
+
* - Collapse multiple spaces to single space
|
|
48
|
+
* - Strip trailing spaces from each line
|
|
49
|
+
* - Collapse multiple newlines to single newline
|
|
50
|
+
* - Trim leading/trailing whitespace
|
|
51
|
+
*/
|
|
52
|
+
export declare function normalizeText(text: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Compare two texts and return detailed differences.
|
|
55
|
+
*/
|
|
56
|
+
export declare function compareTexts(expected: string, actual: string): {
|
|
57
|
+
identical: boolean;
|
|
58
|
+
normalizedIdentical: boolean;
|
|
59
|
+
expectedLength: number;
|
|
60
|
+
actualLength: number;
|
|
61
|
+
differences: string[];
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=trackChangesAcceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trackChangesAcceptor.d.ts","sourceRoot":"","sources":["../../../src/baselines/atomizer/trackChangesAcceptor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAiC5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAiC5D;AAgFD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAiB9D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAqCrE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb;IACD,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAmCA"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Track Changes Acceptor/Rejector
|
|
3
|
+
*
|
|
4
|
+
* Utilities to accept or reject all track changes in a document.
|
|
5
|
+
* Used for round-trip testing to verify comparison correctness.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Accept all track changes in document XML.
|
|
9
|
+
*
|
|
10
|
+
* - Removes w:del elements entirely (deleted content disappears)
|
|
11
|
+
* - Unwraps w:ins elements (inserted content becomes normal)
|
|
12
|
+
* - Handles w:moveFrom (remove) and w:moveTo (unwrap)
|
|
13
|
+
* - Converts w:delText back to w:t where needed
|
|
14
|
+
*
|
|
15
|
+
* @param documentXml - The document.xml content with track changes
|
|
16
|
+
* @returns Document XML with all changes accepted
|
|
17
|
+
*/
|
|
18
|
+
export function acceptAllChanges(documentXml) {
|
|
19
|
+
let result = documentXml;
|
|
20
|
+
// Remove w:del elements entirely (including their content)
|
|
21
|
+
// This regex handles nested content
|
|
22
|
+
result = removeElements(result, 'w:del');
|
|
23
|
+
// Remove w:moveFrom elements entirely
|
|
24
|
+
result = removeElements(result, 'w:moveFrom');
|
|
25
|
+
// Remove move range markers
|
|
26
|
+
result = result.replace(/<w:moveFromRangeStart[^>]*\/>/g, '');
|
|
27
|
+
result = result.replace(/<w:moveFromRangeEnd[^>]*\/>/g, '');
|
|
28
|
+
result = result.replace(/<w:moveToRangeStart[^>]*\/>/g, '');
|
|
29
|
+
result = result.replace(/<w:moveToRangeEnd[^>]*\/>/g, '');
|
|
30
|
+
// Unwrap w:ins elements (keep content, remove wrapper)
|
|
31
|
+
result = unwrapElements(result, 'w:ins');
|
|
32
|
+
// Unwrap w:moveTo elements
|
|
33
|
+
result = unwrapElements(result, 'w:moveTo');
|
|
34
|
+
// Remove rPrChange elements (format change tracking)
|
|
35
|
+
result = removeElements(result, 'w:rPrChange');
|
|
36
|
+
// Remove pPrChange elements (paragraph property change tracking)
|
|
37
|
+
result = removeElements(result, 'w:pPrChange');
|
|
38
|
+
// Remove paragraphs that became empty after removing deleted content
|
|
39
|
+
// These are paragraphs that have no w:t elements (no text content)
|
|
40
|
+
result = removeEmptyParagraphs(result);
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Reject all track changes in document XML.
|
|
45
|
+
*
|
|
46
|
+
* - Removes w:ins elements entirely (inserted content disappears)
|
|
47
|
+
* - Unwraps w:del elements and converts w:delText to w:t
|
|
48
|
+
* - Handles w:moveFrom (unwrap) and w:moveTo (remove)
|
|
49
|
+
*
|
|
50
|
+
* @param documentXml - The document.xml content with track changes
|
|
51
|
+
* @returns Document XML with all changes rejected
|
|
52
|
+
*/
|
|
53
|
+
export function rejectAllChanges(documentXml) {
|
|
54
|
+
let result = documentXml;
|
|
55
|
+
// Remove w:ins elements entirely (including their content)
|
|
56
|
+
result = removeElements(result, 'w:ins');
|
|
57
|
+
// Remove w:moveTo elements entirely
|
|
58
|
+
result = removeElements(result, 'w:moveTo');
|
|
59
|
+
// Remove move range markers
|
|
60
|
+
result = result.replace(/<w:moveFromRangeStart[^>]*\/>/g, '');
|
|
61
|
+
result = result.replace(/<w:moveFromRangeEnd[^>]*\/>/g, '');
|
|
62
|
+
result = result.replace(/<w:moveToRangeStart[^>]*\/>/g, '');
|
|
63
|
+
result = result.replace(/<w:moveToRangeEnd[^>]*\/>/g, '');
|
|
64
|
+
// Unwrap w:del elements (keep content, remove wrapper)
|
|
65
|
+
result = unwrapElements(result, 'w:del');
|
|
66
|
+
// Unwrap w:moveFrom elements
|
|
67
|
+
result = unwrapElements(result, 'w:moveFrom');
|
|
68
|
+
// Convert w:delText to w:t
|
|
69
|
+
result = result.replace(/<w:delText([^>]*)>/g, '<w:t$1>');
|
|
70
|
+
result = result.replace(/<\/w:delText>/g, '</w:t>');
|
|
71
|
+
// Remove rPrChange elements but keep the current properties
|
|
72
|
+
result = removeElements(result, 'w:rPrChange');
|
|
73
|
+
// For pPrChange, we need to restore original properties
|
|
74
|
+
// This is complex - for now just remove the change tracking
|
|
75
|
+
result = removeElements(result, 'w:pPrChange');
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Remove elements and their content from XML.
|
|
80
|
+
* Uses regex for reliable matching.
|
|
81
|
+
* Uses word boundary matching to avoid matching tags with similar prefixes.
|
|
82
|
+
*/
|
|
83
|
+
function removeElements(xml, tagName) {
|
|
84
|
+
// Handle self-closing tags
|
|
85
|
+
// Match <tagName followed by optional attributes, then />
|
|
86
|
+
// Uses word boundary: tagName must be followed by \s, /, or >
|
|
87
|
+
const selfClosingRegex = new RegExp(`<${tagName}(\\s[^>]*)?\\/\\s*>`, 'g');
|
|
88
|
+
let result = xml.replace(selfClosingRegex, '');
|
|
89
|
+
// Handle elements with content - use recursive approach for nesting
|
|
90
|
+
// Match the opening tag (with word boundary), then non-greedy content, then closing tag
|
|
91
|
+
// This may need multiple passes for nested elements
|
|
92
|
+
const regex = new RegExp(`<${tagName}(\\s[^>]*)?>[\\s\\S]*?</${tagName}>`, 'g');
|
|
93
|
+
let prevLength = 0;
|
|
94
|
+
while (result.length !== prevLength) {
|
|
95
|
+
prevLength = result.length;
|
|
96
|
+
result = result.replace(regex, '');
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Unwrap elements - remove the wrapper but keep the content.
|
|
102
|
+
* Uses word boundary matching to avoid matching tags with similar prefixes
|
|
103
|
+
* (e.g., w:del should not match w:delText)
|
|
104
|
+
*/
|
|
105
|
+
function unwrapElements(xml, tagName) {
|
|
106
|
+
let result = xml;
|
|
107
|
+
// Remove opening tags with attributes
|
|
108
|
+
// Match <tagName followed by whitespace, /, or > to avoid matching longer tag names
|
|
109
|
+
// e.g., <w:del should not match <w:delText
|
|
110
|
+
const openTagRegex = new RegExp(`<${tagName}(\\s[^>]*)?>`, 'g');
|
|
111
|
+
result = result.replace(openTagRegex, '');
|
|
112
|
+
// Remove closing tags (exact match)
|
|
113
|
+
const closeTagRegex = new RegExp(`</${tagName}>`, 'g');
|
|
114
|
+
result = result.replace(closeTagRegex, '');
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Remove paragraphs that have no text content.
|
|
119
|
+
* A paragraph is considered empty if it has no w:t elements.
|
|
120
|
+
* This is used after accepting changes to clean up paragraphs
|
|
121
|
+
* that only contained deleted content.
|
|
122
|
+
*/
|
|
123
|
+
function removeEmptyParagraphs(xml) {
|
|
124
|
+
// Match each paragraph and check if it has any w:t elements
|
|
125
|
+
const pRegex = /<w:p(\s[^>]*)?>[\s\S]*?<\/w:p>/g;
|
|
126
|
+
return xml.replace(pRegex, (match) => {
|
|
127
|
+
// Check if the paragraph has any w:t elements (text content)
|
|
128
|
+
const hasText = /<w:t[^>]*>/.test(match);
|
|
129
|
+
// Check if it has any tabs or breaks (these are content too)
|
|
130
|
+
const hasTab = /<w:tab\/>/.test(match);
|
|
131
|
+
const hasBreak = /<w:br[^>]*\/>/.test(match);
|
|
132
|
+
// Check for symbols (special characters)
|
|
133
|
+
const hasSymbol = /<w:sym\s/.test(match);
|
|
134
|
+
// Check for drawings (images, shapes)
|
|
135
|
+
const hasDrawing = /<w:drawing>/.test(match);
|
|
136
|
+
// Keep the paragraph if it has any content
|
|
137
|
+
if (hasText || hasTab || hasBreak || hasSymbol || hasDrawing) {
|
|
138
|
+
return match;
|
|
139
|
+
}
|
|
140
|
+
// Remove empty paragraphs
|
|
141
|
+
return '';
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Extract plain text content from document XML.
|
|
146
|
+
*
|
|
147
|
+
* @param documentXml - The document.xml content
|
|
148
|
+
* @returns Plain text content
|
|
149
|
+
*/
|
|
150
|
+
export function extractTextContent(documentXml) {
|
|
151
|
+
const texts = [];
|
|
152
|
+
// Extract text from w:t elements
|
|
153
|
+
const tRegex = /<w:t[^>]*>([^<]*)<\/w:t>/g;
|
|
154
|
+
let match;
|
|
155
|
+
while ((match = tRegex.exec(documentXml)) !== null) {
|
|
156
|
+
texts.push(match[1] ?? '');
|
|
157
|
+
}
|
|
158
|
+
// Also extract from w:delText (for rejected changes)
|
|
159
|
+
const delTextRegex = /<w:delText[^>]*>([^<]*)<\/w:delText>/g;
|
|
160
|
+
while ((match = delTextRegex.exec(documentXml)) !== null) {
|
|
161
|
+
texts.push(match[1] ?? '');
|
|
162
|
+
}
|
|
163
|
+
return texts.join('');
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Extract text in document order, respecting paragraph breaks.
|
|
167
|
+
*/
|
|
168
|
+
export function extractTextWithParagraphs(documentXml) {
|
|
169
|
+
const paragraphs = [];
|
|
170
|
+
// Match each paragraph
|
|
171
|
+
const pRegex = /<w:p[^>]*>([\s\S]*?)<\/w:p>/g;
|
|
172
|
+
let pMatch;
|
|
173
|
+
while ((pMatch = pRegex.exec(documentXml)) !== null) {
|
|
174
|
+
const pContent = pMatch[1] ?? '';
|
|
175
|
+
const texts = [];
|
|
176
|
+
// Extract text from w:t elements within this paragraph
|
|
177
|
+
const tRegex = /<w:t[^>]*>([^<]*)<\/w:t>/g;
|
|
178
|
+
let tMatch;
|
|
179
|
+
while ((tMatch = tRegex.exec(pContent)) !== null) {
|
|
180
|
+
texts.push(tMatch[1] ?? '');
|
|
181
|
+
}
|
|
182
|
+
// Also check w:delText
|
|
183
|
+
const delTextRegex = /<w:delText[^>]*>([^<]*)<\/w:delText>/g;
|
|
184
|
+
while ((tMatch = delTextRegex.exec(pContent)) !== null) {
|
|
185
|
+
texts.push(tMatch[1] ?? '');
|
|
186
|
+
}
|
|
187
|
+
// Handle tabs and breaks
|
|
188
|
+
const tabCount = (pContent.match(/<w:tab\/>/g) || []).length;
|
|
189
|
+
const brCount = (pContent.match(/<w:br\/>/g) || []).length;
|
|
190
|
+
let paraText = texts.join('');
|
|
191
|
+
// Add tabs and breaks (simplified - in actual order would need more parsing)
|
|
192
|
+
paraText += '\t'.repeat(tabCount);
|
|
193
|
+
paraText += '\n'.repeat(brCount);
|
|
194
|
+
paragraphs.push(paraText);
|
|
195
|
+
}
|
|
196
|
+
return paragraphs.join('\n');
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Normalize text for comparison (handles whitespace differences).
|
|
200
|
+
*
|
|
201
|
+
* Performs the following normalization:
|
|
202
|
+
* - Convert CRLF and CR to LF
|
|
203
|
+
* - Convert tabs to spaces
|
|
204
|
+
* - Collapse multiple spaces to single space
|
|
205
|
+
* - Strip trailing spaces from each line
|
|
206
|
+
* - Collapse multiple newlines to single newline
|
|
207
|
+
* - Trim leading/trailing whitespace
|
|
208
|
+
*/
|
|
209
|
+
export function normalizeText(text) {
|
|
210
|
+
return text
|
|
211
|
+
.replace(/\r\n/g, '\n')
|
|
212
|
+
.replace(/\r/g, '\n')
|
|
213
|
+
.replace(/\t/g, ' ')
|
|
214
|
+
.replace(/ +/g, ' ')
|
|
215
|
+
.replace(/ \n/g, '\n') // Strip trailing spaces from lines
|
|
216
|
+
.replace(/\n /g, '\n') // Strip leading spaces from lines
|
|
217
|
+
.replace(/\n+/g, '\n')
|
|
218
|
+
.trim();
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Compare two texts and return detailed differences.
|
|
222
|
+
*/
|
|
223
|
+
export function compareTexts(expected, actual) {
|
|
224
|
+
const normalizedExpected = normalizeText(expected);
|
|
225
|
+
const normalizedActual = normalizeText(actual);
|
|
226
|
+
const differences = [];
|
|
227
|
+
if (expected !== actual) {
|
|
228
|
+
// Find first difference
|
|
229
|
+
let firstDiff = 0;
|
|
230
|
+
while (firstDiff < expected.length && firstDiff < actual.length) {
|
|
231
|
+
if (expected[firstDiff] !== actual[firstDiff]) {
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
firstDiff++;
|
|
235
|
+
}
|
|
236
|
+
if (firstDiff < expected.length || firstDiff < actual.length) {
|
|
237
|
+
const context = 50;
|
|
238
|
+
const start = Math.max(0, firstDiff - context);
|
|
239
|
+
const expectedSnippet = expected.slice(start, firstDiff + context);
|
|
240
|
+
const actualSnippet = actual.slice(start, firstDiff + context);
|
|
241
|
+
differences.push(`First difference at position ${firstDiff}:`);
|
|
242
|
+
differences.push(` Expected: "...${expectedSnippet}..."`);
|
|
243
|
+
differences.push(` Actual: "...${actualSnippet}..."`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
identical: expected === actual,
|
|
248
|
+
normalizedIdentical: normalizedExpected === normalizedActual,
|
|
249
|
+
expectedLength: expected.length,
|
|
250
|
+
actualLength: actual.length,
|
|
251
|
+
differences,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=trackChangesAcceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trackChangesAcceptor.js","sourceRoot":"","sources":["../../../src/baselines/atomizer/trackChangesAcceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Track Changes Acceptor/Rejector (AST-based)
|
|
3
|
+
*
|
|
4
|
+
* AST-based utilities to accept or reject all track changes in a document.
|
|
5
|
+
* Replaces the regex-based implementation for better reliability with nested structures.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Accept all track changes in document XML (AST-based).
|
|
9
|
+
*
|
|
10
|
+
* - Removes w:del elements entirely (deleted content disappears)
|
|
11
|
+
* - Unwraps w:ins elements (inserted content becomes normal)
|
|
12
|
+
* - Handles w:moveFrom (remove) and w:moveTo (unwrap)
|
|
13
|
+
* - Removes format change tracking elements
|
|
14
|
+
*
|
|
15
|
+
* @param documentXml - The document.xml content with track changes
|
|
16
|
+
* @returns Document XML with all changes accepted
|
|
17
|
+
*/
|
|
18
|
+
export declare function acceptAllChanges(documentXml: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Reject all track changes in document XML (AST-based).
|
|
21
|
+
*
|
|
22
|
+
* - Removes w:ins elements entirely (inserted content disappears)
|
|
23
|
+
* - Unwraps w:del elements and converts w:delText to w:t
|
|
24
|
+
* - Handles w:moveFrom (unwrap) and w:moveTo (remove)
|
|
25
|
+
* - Removes format change tracking elements
|
|
26
|
+
*
|
|
27
|
+
* @param documentXml - The document.xml content with track changes
|
|
28
|
+
* @returns Document XML with all changes rejected
|
|
29
|
+
*/
|
|
30
|
+
export declare function rejectAllChanges(documentXml: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Extract plain text content from document XML (AST-based).
|
|
33
|
+
*
|
|
34
|
+
* @param documentXml - The document.xml content
|
|
35
|
+
* @returns Plain text content
|
|
36
|
+
*/
|
|
37
|
+
export declare function extractTextContent(documentXml: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Extract text in document order, respecting paragraph breaks (AST-based).
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractTextWithParagraphs(documentXml: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Normalize text for comparison (handles whitespace differences).
|
|
44
|
+
*
|
|
45
|
+
* Performs the following normalization:
|
|
46
|
+
* - Convert CRLF and CR to LF
|
|
47
|
+
* - Convert tabs to spaces
|
|
48
|
+
* - Collapse multiple spaces to single space
|
|
49
|
+
* - Strip trailing spaces from each line
|
|
50
|
+
* - Collapse multiple newlines to single newline
|
|
51
|
+
* - Trim leading/trailing whitespace
|
|
52
|
+
*/
|
|
53
|
+
export declare function normalizeText(text: string): string;
|
|
54
|
+
/**
|
|
55
|
+
* Compare two texts and return detailed differences.
|
|
56
|
+
*/
|
|
57
|
+
export declare function compareTexts(expected: string, actual: string): {
|
|
58
|
+
identical: boolean;
|
|
59
|
+
normalizedIdentical: boolean;
|
|
60
|
+
expectedLength: number;
|
|
61
|
+
actualLength: number;
|
|
62
|
+
differences: string[];
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=trackChangesAcceptorAst.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trackChangesAcceptorAst.d.ts","sourceRoot":"","sources":["../../../src/baselines/atomizer/trackChangesAcceptorAst.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwUH;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA0I5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAmG5D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAqB9D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA4BrE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb;IACD,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAmCA"}
|