@usejunior/docx-core 0.0.1 → 0.1.2
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 +216 -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,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline A: WmlComparer via dotnet CLI.
|
|
3
|
+
*
|
|
4
|
+
* Shells out to Docxodus's redline tool to perform document comparison.
|
|
5
|
+
* Requires .NET 8+ and Docxodus to be available.
|
|
6
|
+
*/
|
|
7
|
+
import { execFile } from 'child_process';
|
|
8
|
+
import { promisify } from 'util';
|
|
9
|
+
import { writeFile, readFile, unlink, mkdtemp } from 'fs/promises';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { tmpdir } from 'os';
|
|
12
|
+
const execFileAsync = promisify(execFile);
|
|
13
|
+
/**
|
|
14
|
+
* Check if dotnet CLI is available.
|
|
15
|
+
*/
|
|
16
|
+
export async function isDotnetAvailable(dotnetPath = 'dotnet') {
|
|
17
|
+
try {
|
|
18
|
+
await execFileAsync(dotnetPath, ['--version']);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Compare two DOCX documents using the dotnet CLI.
|
|
27
|
+
*
|
|
28
|
+
* @param original - Original document as Buffer
|
|
29
|
+
* @param revised - Revised document as Buffer
|
|
30
|
+
* @param options - CLI options
|
|
31
|
+
* @returns Comparison result with track changes
|
|
32
|
+
*/
|
|
33
|
+
export async function compareWithDotnet(original, revised, options = {}) {
|
|
34
|
+
const { author = 'Comparison', redlinePath, docxodusPath, dotnetPath = 'dotnet', timeout = 60000, } = options;
|
|
35
|
+
// Create a temporary directory for the comparison
|
|
36
|
+
const tempDir = await mkdtemp(join(tmpdir(), 'docx-compare-'));
|
|
37
|
+
const originalPath = join(tempDir, 'original.docx');
|
|
38
|
+
const revisedPath = join(tempDir, 'revised.docx');
|
|
39
|
+
const outputPath = join(tempDir, 'output.docx');
|
|
40
|
+
try {
|
|
41
|
+
// Write input files
|
|
42
|
+
await writeFile(originalPath, original);
|
|
43
|
+
await writeFile(revisedPath, revised);
|
|
44
|
+
// Determine command to run
|
|
45
|
+
let command;
|
|
46
|
+
let args;
|
|
47
|
+
if (redlinePath) {
|
|
48
|
+
// Use specified redline executable
|
|
49
|
+
command = redlinePath;
|
|
50
|
+
args = [originalPath, revisedPath, outputPath, `--author=${author}`];
|
|
51
|
+
}
|
|
52
|
+
else if (docxodusPath) {
|
|
53
|
+
// Use dotnet run with Docxodus project
|
|
54
|
+
command = dotnetPath;
|
|
55
|
+
args = [
|
|
56
|
+
'run',
|
|
57
|
+
'--project',
|
|
58
|
+
join(docxodusPath, 'tools', 'redline', 'redline.csproj'),
|
|
59
|
+
'--configuration',
|
|
60
|
+
'Release',
|
|
61
|
+
'--no-build',
|
|
62
|
+
'--',
|
|
63
|
+
originalPath,
|
|
64
|
+
revisedPath,
|
|
65
|
+
outputPath,
|
|
66
|
+
`--author=${author}`,
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Try using global tool or assume redline is in PATH
|
|
71
|
+
command = 'redline';
|
|
72
|
+
args = [originalPath, revisedPath, outputPath, `--author=${author}`];
|
|
73
|
+
}
|
|
74
|
+
// Execute comparison
|
|
75
|
+
const { stdout } = await execFileAsync(command, args, {
|
|
76
|
+
timeout,
|
|
77
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB
|
|
78
|
+
});
|
|
79
|
+
// Parse revision count from stdout if available
|
|
80
|
+
const revisionMatch = stdout.match(/(\d+) revision\(s\) found/);
|
|
81
|
+
const revisionCount = revisionMatch ? parseInt(revisionMatch[1] ?? '0', 10) : 0;
|
|
82
|
+
// Read output file
|
|
83
|
+
const outputBuffer = await readFile(outputPath);
|
|
84
|
+
// Return result
|
|
85
|
+
// Note: We can't get detailed stats without parsing the output DOCX
|
|
86
|
+
// For now, just return the revision count as insertions
|
|
87
|
+
const stats = {
|
|
88
|
+
insertions: revisionCount,
|
|
89
|
+
deletions: 0, // Would need to parse output to get this
|
|
90
|
+
modifications: 0,
|
|
91
|
+
};
|
|
92
|
+
return {
|
|
93
|
+
document: outputBuffer,
|
|
94
|
+
stats,
|
|
95
|
+
engine: 'wmlcomparer',
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
// Clean up temporary files
|
|
100
|
+
try {
|
|
101
|
+
await unlink(originalPath);
|
|
102
|
+
await unlink(revisedPath);
|
|
103
|
+
await unlink(outputPath);
|
|
104
|
+
// Note: Can't rmdir because it might not be empty
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Ignore cleanup errors
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check if Docxodus redline tool is available.
|
|
113
|
+
*
|
|
114
|
+
* @param docxodusPath - Path to Docxodus repository
|
|
115
|
+
* @param dotnetPath - Path to dotnet executable
|
|
116
|
+
*/
|
|
117
|
+
export async function isRedlineAvailable(docxodusPath, dotnetPath = 'dotnet') {
|
|
118
|
+
try {
|
|
119
|
+
if (docxodusPath) {
|
|
120
|
+
// Check if the project file exists
|
|
121
|
+
const projectPath = join(docxodusPath, 'tools', 'redline', 'redline.csproj');
|
|
122
|
+
await readFile(projectPath);
|
|
123
|
+
return await isDotnetAvailable(dotnetPath);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Try running redline --version
|
|
127
|
+
await execFileAsync('redline', ['--version']);
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=DotnetCli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DotnetCli.js","sourceRoot":"","sources":["../../../src/baselines/wmlcomparer/DotnetCli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark metrics collection.
|
|
3
|
+
*
|
|
4
|
+
* Defines the metrics collected during A/B baseline comparison.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Metrics collected from a comparison operation.
|
|
8
|
+
*/
|
|
9
|
+
export interface ComparisonMetrics {
|
|
10
|
+
/** Number of insertions detected */
|
|
11
|
+
insertions: number;
|
|
12
|
+
/** Number of deletions detected */
|
|
13
|
+
deletions: number;
|
|
14
|
+
/** Number of modifications (paragraphs with changes) */
|
|
15
|
+
modifications: number;
|
|
16
|
+
/** Average length of changed spans */
|
|
17
|
+
avgSpanLength: number;
|
|
18
|
+
/** Whether output opens in Word (requires manual verification or COM automation) */
|
|
19
|
+
opensInWord: boolean | null;
|
|
20
|
+
/** Whether OpenXML SDK can load the output */
|
|
21
|
+
openXmlSdkValid: boolean | null;
|
|
22
|
+
/** Whether all relationship parts are valid */
|
|
23
|
+
noBrokenRelationships: boolean | null;
|
|
24
|
+
/** Whether numbering was retained correctly */
|
|
25
|
+
numberingRetained: boolean | null;
|
|
26
|
+
/** Whether section headings are correct */
|
|
27
|
+
sectionHeadingsCorrect: boolean | null;
|
|
28
|
+
/** Whether defined terms are preserved */
|
|
29
|
+
definedTermsPreserved: boolean | null;
|
|
30
|
+
/** Whether tables remain intact */
|
|
31
|
+
tablesIntact: boolean | null;
|
|
32
|
+
/** Whether cross-references work */
|
|
33
|
+
crossRefsWorking: boolean | null;
|
|
34
|
+
/** Wall clock time in milliseconds */
|
|
35
|
+
wallTimeMs: number;
|
|
36
|
+
/** Peak RSS memory in megabytes */
|
|
37
|
+
peakRssMb: number;
|
|
38
|
+
/** Output file size in bytes */
|
|
39
|
+
outputSizeBytes: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create an empty metrics object with null values.
|
|
43
|
+
*/
|
|
44
|
+
export declare function createEmptyMetrics(): ComparisonMetrics;
|
|
45
|
+
/**
|
|
46
|
+
* Result of running a benchmark on a fixture.
|
|
47
|
+
*/
|
|
48
|
+
export interface BenchmarkResult {
|
|
49
|
+
/** Name of the fixture */
|
|
50
|
+
fixture: string;
|
|
51
|
+
/** Metrics from Baseline A (WmlComparer) */
|
|
52
|
+
baselineA: ComparisonMetrics | null;
|
|
53
|
+
/** Error from Baseline A if any */
|
|
54
|
+
baselineAError?: string;
|
|
55
|
+
/** Metrics from Baseline B (pure TS) */
|
|
56
|
+
baselineB: ComparisonMetrics | null;
|
|
57
|
+
/** Error from Baseline B if any */
|
|
58
|
+
baselineBError?: string;
|
|
59
|
+
/** Metrics from Word oracle (if available) */
|
|
60
|
+
wordOracle?: ComparisonMetrics | null;
|
|
61
|
+
/** Timestamp when benchmark was run */
|
|
62
|
+
timestamp: Date;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Measure memory usage.
|
|
66
|
+
*/
|
|
67
|
+
export declare function measureMemory(): number;
|
|
68
|
+
/**
|
|
69
|
+
* High-resolution timer for performance measurement.
|
|
70
|
+
*/
|
|
71
|
+
export declare function createTimer(): () => number;
|
|
72
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/benchmark/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAEhC,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,aAAa,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IAGtB,oFAAoF;IACpF,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,8CAA8C;IAC9C,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,+CAA+C;IAC/C,qBAAqB,EAAE,OAAO,GAAG,IAAI,CAAC;IAGtC,+CAA+C;IAC/C,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,2CAA2C;IAC3C,sBAAsB,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,0CAA0C;IAC1C,qBAAqB,EAAE,OAAO,GAAG,IAAI,CAAC;IACtC,mCAAmC;IACnC,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,oCAAoC;IACpC,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IAGjC,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,iBAAiB,CAkBtD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,mCAAmC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,mCAAmC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACtC,uCAAuC;IACvC,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,MAAM,CAM1C"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark metrics collection.
|
|
3
|
+
*
|
|
4
|
+
* Defines the metrics collected during A/B baseline comparison.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create an empty metrics object with null values.
|
|
8
|
+
*/
|
|
9
|
+
export function createEmptyMetrics() {
|
|
10
|
+
return {
|
|
11
|
+
insertions: 0,
|
|
12
|
+
deletions: 0,
|
|
13
|
+
modifications: 0,
|
|
14
|
+
avgSpanLength: 0,
|
|
15
|
+
opensInWord: null,
|
|
16
|
+
openXmlSdkValid: null,
|
|
17
|
+
noBrokenRelationships: null,
|
|
18
|
+
numberingRetained: null,
|
|
19
|
+
sectionHeadingsCorrect: null,
|
|
20
|
+
definedTermsPreserved: null,
|
|
21
|
+
tablesIntact: null,
|
|
22
|
+
crossRefsWorking: null,
|
|
23
|
+
wallTimeMs: 0,
|
|
24
|
+
peakRssMb: 0,
|
|
25
|
+
outputSizeBytes: 0,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Measure memory usage.
|
|
30
|
+
*/
|
|
31
|
+
export function measureMemory() {
|
|
32
|
+
const usage = process.memoryUsage();
|
|
33
|
+
return usage.rss / (1024 * 1024); // Convert to MB
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* High-resolution timer for performance measurement.
|
|
37
|
+
*/
|
|
38
|
+
export function createTimer() {
|
|
39
|
+
const start = process.hrtime.bigint();
|
|
40
|
+
return () => {
|
|
41
|
+
const end = process.hrtime.bigint();
|
|
42
|
+
return Number(end - start) / 1_000_000; // Convert to ms
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/benchmark/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6CH;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,CAAC;QACZ,aAAa,EAAE,CAAC;QAChB,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,IAAI;QACjB,eAAe,EAAE,IAAI;QACrB,qBAAqB,EAAE,IAAI;QAC3B,iBAAiB,EAAE,IAAI;QACvB,sBAAsB,EAAE,IAAI;QAC5B,qBAAqB,EAAE,IAAI;QAC3B,YAAY,EAAE,IAAI;QAClB,gBAAgB,EAAE,IAAI;QACtB,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,CAAC;QACZ,eAAe,EAAE,CAAC;KACnB,CAAC;AACJ,CAAC;AAsBD;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,OAAO,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,gBAAgB;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACtC,OAAO,GAAG,EAAE;QACV,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,gBAAgB;IAC1D,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark result reporter.
|
|
3
|
+
*
|
|
4
|
+
* Formats benchmark results for different output modes.
|
|
5
|
+
*/
|
|
6
|
+
import { BenchmarkResult } from './metrics.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate a markdown report from benchmark results.
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateMarkdownReport(results: BenchmarkResult[]): string;
|
|
11
|
+
/**
|
|
12
|
+
* Generate a console table from benchmark results.
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateConsoleTable(results: BenchmarkResult[]): string;
|
|
15
|
+
/**
|
|
16
|
+
* Generate JSON output from benchmark results.
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateJsonReport(results: BenchmarkResult[]): string;
|
|
19
|
+
/**
|
|
20
|
+
* Print a comparison summary to console.
|
|
21
|
+
*/
|
|
22
|
+
export declare function printSummary(results: BenchmarkResult[]): void;
|
|
23
|
+
//# sourceMappingURL=reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/benchmark/reporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAqB,MAAM,cAAc,CAAC;AAoBlE;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAuCzE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAuCvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CA+BrE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CA4B7D"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark result reporter.
|
|
3
|
+
*
|
|
4
|
+
* Formats benchmark results for different output modes.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Format metrics as a markdown table row.
|
|
8
|
+
*/
|
|
9
|
+
function formatMetricsRow(name, metrics, error) {
|
|
10
|
+
if (error) {
|
|
11
|
+
return `| ${name} | Error: ${error.slice(0, 50)}... | - | - | - | - |`;
|
|
12
|
+
}
|
|
13
|
+
if (!metrics) {
|
|
14
|
+
return `| ${name} | Skipped | - | - | - | - |`;
|
|
15
|
+
}
|
|
16
|
+
return `| ${name} | ${metrics.insertions} | ${metrics.deletions} | ${metrics.wallTimeMs.toFixed(1)}ms | ${metrics.peakRssMb.toFixed(1)}MB | ${(metrics.outputSizeBytes / 1024).toFixed(1)}KB |`;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate a markdown report from benchmark results.
|
|
20
|
+
*/
|
|
21
|
+
export function generateMarkdownReport(results) {
|
|
22
|
+
const lines = [];
|
|
23
|
+
lines.push('# Document Comparison Benchmark Results');
|
|
24
|
+
lines.push('');
|
|
25
|
+
lines.push(`Generated: ${new Date().toISOString()}`);
|
|
26
|
+
lines.push('');
|
|
27
|
+
for (const result of results) {
|
|
28
|
+
lines.push(`## Fixture: ${result.fixture}`);
|
|
29
|
+
lines.push('');
|
|
30
|
+
lines.push('| Baseline | Insertions | Deletions | Time | Memory | Output Size |');
|
|
31
|
+
lines.push('|----------|------------|-----------|------|--------|-------------|');
|
|
32
|
+
lines.push(formatMetricsRow('A (WmlComparer)', result.baselineA, result.baselineAError));
|
|
33
|
+
lines.push(formatMetricsRow('B (Pure TS)', result.baselineB, result.baselineBError));
|
|
34
|
+
if (result.wordOracle) {
|
|
35
|
+
lines.push(formatMetricsRow('Word Oracle', result.wordOracle));
|
|
36
|
+
}
|
|
37
|
+
lines.push('');
|
|
38
|
+
}
|
|
39
|
+
// Summary statistics
|
|
40
|
+
lines.push('## Summary');
|
|
41
|
+
lines.push('');
|
|
42
|
+
const successfulA = results.filter(r => r.baselineA !== null);
|
|
43
|
+
const successfulB = results.filter(r => r.baselineB !== null);
|
|
44
|
+
if (successfulA.length > 0) {
|
|
45
|
+
const avgTimeA = successfulA.reduce((sum, r) => sum + (r.baselineA?.wallTimeMs ?? 0), 0) / successfulA.length;
|
|
46
|
+
lines.push(`- Baseline A: ${successfulA.length}/${results.length} successful, avg time: ${avgTimeA.toFixed(1)}ms`);
|
|
47
|
+
}
|
|
48
|
+
if (successfulB.length > 0) {
|
|
49
|
+
const avgTimeB = successfulB.reduce((sum, r) => sum + (r.baselineB?.wallTimeMs ?? 0), 0) / successfulB.length;
|
|
50
|
+
lines.push(`- Baseline B: ${successfulB.length}/${results.length} successful, avg time: ${avgTimeB.toFixed(1)}ms`);
|
|
51
|
+
}
|
|
52
|
+
return lines.join('\n');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generate a console table from benchmark results.
|
|
56
|
+
*/
|
|
57
|
+
export function generateConsoleTable(results) {
|
|
58
|
+
const lines = [];
|
|
59
|
+
// Header
|
|
60
|
+
lines.push('┌────────────────────────┬──────────┬─────────────┬─────────────┬──────────┬──────────┐');
|
|
61
|
+
lines.push('│ Fixture │ Baseline │ Insertions │ Deletions │ Time │ Memory │');
|
|
62
|
+
lines.push('├────────────────────────┼──────────┼─────────────┼─────────────┼──────────┼──────────┤');
|
|
63
|
+
for (const result of results) {
|
|
64
|
+
const fixtureName = result.fixture.padEnd(22).slice(0, 22);
|
|
65
|
+
// Baseline A row
|
|
66
|
+
if (result.baselineAError) {
|
|
67
|
+
lines.push(`│ ${fixtureName} │ A │ ERROR │ │ │ │`);
|
|
68
|
+
}
|
|
69
|
+
else if (result.baselineA) {
|
|
70
|
+
const m = result.baselineA;
|
|
71
|
+
lines.push(`│ ${fixtureName} │ A │ ${String(m.insertions).padStart(11)} │ ${String(m.deletions).padStart(11)} │ ${m.wallTimeMs.toFixed(0).padStart(6)}ms │ ${m.peakRssMb.toFixed(1).padStart(6)}MB │`);
|
|
72
|
+
}
|
|
73
|
+
// Baseline B row
|
|
74
|
+
if (result.baselineBError) {
|
|
75
|
+
lines.push(`│ │ B │ ERROR │ │ │ │`);
|
|
76
|
+
}
|
|
77
|
+
else if (result.baselineB) {
|
|
78
|
+
const m = result.baselineB;
|
|
79
|
+
lines.push(`│ │ B │ ${String(m.insertions).padStart(11)} │ ${String(m.deletions).padStart(11)} │ ${m.wallTimeMs.toFixed(0).padStart(6)}ms │ ${m.peakRssMb.toFixed(1).padStart(6)}MB │`);
|
|
80
|
+
}
|
|
81
|
+
lines.push('├────────────────────────┼──────────┼─────────────┼─────────────┼──────────┼──────────┤');
|
|
82
|
+
}
|
|
83
|
+
// Remove last separator and add bottom border
|
|
84
|
+
lines.pop();
|
|
85
|
+
lines.push('└────────────────────────┴──────────┴─────────────┴─────────────┴──────────┴──────────┘');
|
|
86
|
+
return lines.join('\n');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Generate JSON output from benchmark results.
|
|
90
|
+
*/
|
|
91
|
+
export function generateJsonReport(results) {
|
|
92
|
+
return JSON.stringify({
|
|
93
|
+
timestamp: new Date().toISOString(),
|
|
94
|
+
results: results.map(r => ({
|
|
95
|
+
fixture: r.fixture,
|
|
96
|
+
timestamp: r.timestamp.toISOString(),
|
|
97
|
+
baselineA: r.baselineA
|
|
98
|
+
? {
|
|
99
|
+
success: true,
|
|
100
|
+
...r.baselineA,
|
|
101
|
+
}
|
|
102
|
+
: {
|
|
103
|
+
success: false,
|
|
104
|
+
error: r.baselineAError,
|
|
105
|
+
},
|
|
106
|
+
baselineB: r.baselineB
|
|
107
|
+
? {
|
|
108
|
+
success: true,
|
|
109
|
+
...r.baselineB,
|
|
110
|
+
}
|
|
111
|
+
: {
|
|
112
|
+
success: false,
|
|
113
|
+
error: r.baselineBError,
|
|
114
|
+
},
|
|
115
|
+
wordOracle: r.wordOracle ?? null,
|
|
116
|
+
})),
|
|
117
|
+
}, null, 2);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Print a comparison summary to console.
|
|
121
|
+
*/
|
|
122
|
+
export function printSummary(results) {
|
|
123
|
+
console.log('\n=== Benchmark Summary ===\n');
|
|
124
|
+
for (const result of results) {
|
|
125
|
+
console.log(`Fixture: ${result.fixture}`);
|
|
126
|
+
if (result.baselineA) {
|
|
127
|
+
console.log(` Baseline A: ${result.baselineA.insertions} ins, ${result.baselineA.deletions} del, ${result.baselineA.wallTimeMs.toFixed(0)}ms`);
|
|
128
|
+
}
|
|
129
|
+
else if (result.baselineAError) {
|
|
130
|
+
console.log(` Baseline A: Error - ${result.baselineAError}`);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
console.log(' Baseline A: Skipped');
|
|
134
|
+
}
|
|
135
|
+
if (result.baselineB) {
|
|
136
|
+
console.log(` Baseline B: ${result.baselineB.insertions} ins, ${result.baselineB.deletions} del, ${result.baselineB.wallTimeMs.toFixed(0)}ms`);
|
|
137
|
+
}
|
|
138
|
+
else if (result.baselineBError) {
|
|
139
|
+
console.log(` Baseline B: Error - ${result.baselineBError}`);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
console.log(' Baseline B: Skipped');
|
|
143
|
+
}
|
|
144
|
+
console.log('');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/benchmark/reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark runner for A/B baseline comparison.
|
|
3
|
+
*
|
|
4
|
+
* Runs both baselines against test fixtures and collects metrics.
|
|
5
|
+
*/
|
|
6
|
+
import type { BenchmarkResult } from './metrics.js';
|
|
7
|
+
/**
|
|
8
|
+
* Configuration for benchmark runs.
|
|
9
|
+
*/
|
|
10
|
+
export interface BenchmarkConfig {
|
|
11
|
+
/** Path to fixtures directory */
|
|
12
|
+
fixturesPath: string;
|
|
13
|
+
/** Author name for revisions */
|
|
14
|
+
author?: string;
|
|
15
|
+
/** Path to Docxodus repository (for CLI fallback) */
|
|
16
|
+
docxodusPath?: string;
|
|
17
|
+
/** Path to dotnet executable (e.g., /opt/homebrew/opt/dotnet@8/bin/dotnet) */
|
|
18
|
+
dotnetPath?: string;
|
|
19
|
+
/** Run Baseline A (WmlComparer) */
|
|
20
|
+
runBaselineA?: boolean;
|
|
21
|
+
/** Run Baseline B (pure TS) */
|
|
22
|
+
runBaselineB?: boolean;
|
|
23
|
+
/** Timeout for each comparison in ms */
|
|
24
|
+
timeout?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Run benchmark on all fixtures.
|
|
28
|
+
*/
|
|
29
|
+
export declare function runBenchmark(config: BenchmarkConfig): Promise<BenchmarkResult[]>;
|
|
30
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/benchmark/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,cAAc,CAAC;AAUtB;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA+KD;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,eAAe,EAAE,CAAC,CAoC5B"}
|