@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,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline A: WmlComparer via Docxodus WASM.
|
|
3
|
+
*
|
|
4
|
+
* Uses the Docxodus npm package's WASM-based comparison in Node.js.
|
|
5
|
+
*
|
|
6
|
+
* Note: WASM support in Node.js requires additional setup:
|
|
7
|
+
* 1. WASM files must be served or loaded from the filesystem
|
|
8
|
+
* 2. May need polyfills for browser APIs used by Blazor WASM
|
|
9
|
+
*
|
|
10
|
+
* This implementation is a placeholder - full WASM integration requires
|
|
11
|
+
* building Docxodus and hosting the WASM files.
|
|
12
|
+
*/
|
|
13
|
+
/** Whether WASM runtime has been initialized */
|
|
14
|
+
let wasmInitialized = false;
|
|
15
|
+
/**
|
|
16
|
+
* Initialize the WASM runtime.
|
|
17
|
+
*
|
|
18
|
+
* Must be called before using compareWithWasm().
|
|
19
|
+
*
|
|
20
|
+
* @param wasmPath - Path to the directory containing WASM files
|
|
21
|
+
*/
|
|
22
|
+
export async function initializeWasm(wasmPath) {
|
|
23
|
+
// TODO: Implement WASM initialization
|
|
24
|
+
// This requires:
|
|
25
|
+
// 1. Loading the Docxodus WASM module
|
|
26
|
+
// 2. Initializing the .NET runtime
|
|
27
|
+
// 3. Setting up any required polyfills for Node.js
|
|
28
|
+
throw new Error(`WASM initialization not yet implemented. ` +
|
|
29
|
+
`WASM path: ${wasmPath}. ` +
|
|
30
|
+
`For now, use compareWithDotnet() as a fallback.`);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if WASM runtime is initialized.
|
|
34
|
+
*/
|
|
35
|
+
export function isWasmInitialized() {
|
|
36
|
+
return wasmInitialized;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Compare two DOCX documents using WASM.
|
|
40
|
+
*
|
|
41
|
+
* @param original - Original document as Buffer
|
|
42
|
+
* @param revised - Revised document as Buffer
|
|
43
|
+
* @param options - WASM options
|
|
44
|
+
* @returns Comparison result with track changes
|
|
45
|
+
*/
|
|
46
|
+
export async function compareWithWasm(original, revised, options = {}) {
|
|
47
|
+
if (!wasmInitialized) {
|
|
48
|
+
throw new Error('WASM runtime not initialized. Call initializeWasm() first, ' +
|
|
49
|
+
'or use compareWithDotnet() as a fallback.');
|
|
50
|
+
}
|
|
51
|
+
const { author = 'Comparison', detailThreshold = 0.15, caseInsensitive = false, } = options;
|
|
52
|
+
// TODO: Implement WASM-based comparison
|
|
53
|
+
// This would call into the Docxodus WASM module:
|
|
54
|
+
//
|
|
55
|
+
// const docxodus = await import('docxodus');
|
|
56
|
+
// const result = await docxodus.compareDocuments(
|
|
57
|
+
// new Uint8Array(original),
|
|
58
|
+
// new Uint8Array(revised),
|
|
59
|
+
// { authorName: author, detailThreshold, caseInsensitive }
|
|
60
|
+
// );
|
|
61
|
+
throw new Error(`WASM comparison not yet implemented. ` +
|
|
62
|
+
`Options: author=${author}, detailThreshold=${detailThreshold}, caseInsensitive=${caseInsensitive}. ` +
|
|
63
|
+
`Original size: ${original.length}, Revised size: ${revised.length}. ` +
|
|
64
|
+
`Use compareWithDotnet() as a fallback.`);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if WASM is available and can be used in this environment.
|
|
68
|
+
*
|
|
69
|
+
* Note: WASM in Node.js has limitations compared to browser environments.
|
|
70
|
+
*/
|
|
71
|
+
export async function isWasmAvailable() {
|
|
72
|
+
// Check for WebAssembly support
|
|
73
|
+
// WebAssembly is available in Node.js since v8
|
|
74
|
+
try {
|
|
75
|
+
// Simple check that WebAssembly is available
|
|
76
|
+
const testModule = new WebAssembly.Module(new Uint8Array([0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00]));
|
|
77
|
+
return testModule !== null;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=DocxodusWasm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocxodusWasm.js","sourceRoot":"","sources":["../../../src/baselines/wmlcomparer/DocxodusWasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,gDAAgD;AAChD,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,sCAAsC;IACtC,iBAAiB;IACjB,sCAAsC;IACtC,mCAAmC;IACnC,mDAAmD;IAEnD,MAAM,IAAI,KAAK,CACb,2CAA2C;QACzC,cAAc,QAAQ,IAAI;QAC1B,iDAAiD,CACpD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,OAAe,EACf,UAAuB,EAAE;IAEzB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,6DAA6D;YAC3D,2CAA2C,CAC9C,CAAC;IACJ,CAAC;IAED,MAAM,EACJ,MAAM,GAAG,YAAY,EACrB,eAAe,GAAG,IAAI,EACtB,eAAe,GAAG,KAAK,GACxB,GAAG,OAAO,CAAC;IAEZ,wCAAwC;IACxC,iDAAiD;IACjD,EAAE;IACF,6CAA6C;IAC7C,kDAAkD;IAClD,8BAA8B;IAC9B,6BAA6B;IAC7B,6DAA6D;IAC7D,KAAK;IAEL,MAAM,IAAI,KAAK,CACb,uCAAuC;QACrC,mBAAmB,MAAM,qBAAqB,eAAe,qBAAqB,eAAe,IAAI;QACrG,kBAAkB,QAAQ,CAAC,MAAM,mBAAmB,OAAO,CAAC,MAAM,IAAI;QACtE,wCAAwC,CAC3C,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,gCAAgC;IAChC,+CAA+C;IAC/C,IAAI,CAAC;QACH,6CAA6C;QAC7C,MAAM,UAAU,GAAG,IAAI,WAAW,CAAC,MAAM,CACvC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CACjE,CAAC;QACF,OAAO,UAAU,KAAK,IAAI,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
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 type { CompareResult } from '../../index.js';
|
|
8
|
+
export interface DotnetCliOptions {
|
|
9
|
+
/** Author name for revisions. Default: "Comparison" */
|
|
10
|
+
author?: string;
|
|
11
|
+
/** Path to the redline executable or project. Default: uses global 'dotnet run' */
|
|
12
|
+
redlinePath?: string;
|
|
13
|
+
/** Path to Docxodus repository if using 'dotnet run'. */
|
|
14
|
+
docxodusPath?: string;
|
|
15
|
+
/** Path to dotnet executable. Default: 'dotnet' */
|
|
16
|
+
dotnetPath?: string;
|
|
17
|
+
/** Timeout in milliseconds. Default: 60000 (1 minute) */
|
|
18
|
+
timeout?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if dotnet CLI is available.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isDotnetAvailable(dotnetPath?: string): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Compare two DOCX documents using the dotnet CLI.
|
|
26
|
+
*
|
|
27
|
+
* @param original - Original document as Buffer
|
|
28
|
+
* @param revised - Revised document as Buffer
|
|
29
|
+
* @param options - CLI options
|
|
30
|
+
* @returns Comparison result with track changes
|
|
31
|
+
*/
|
|
32
|
+
export declare function compareWithDotnet(original: Buffer, revised: Buffer, options?: DotnetCliOptions): Promise<CompareResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Check if Docxodus redline tool is available.
|
|
35
|
+
*
|
|
36
|
+
* @param docxodusPath - Path to Docxodus repository
|
|
37
|
+
* @param dotnetPath - Path to dotnet executable
|
|
38
|
+
*/
|
|
39
|
+
export declare function isRedlineAvailable(docxodusPath?: string, dotnetPath?: string): Promise<boolean>;
|
|
40
|
+
//# sourceMappingURL=DotnetCli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DotnetCli.d.ts","sourceRoot":"","sources":["../../../src/baselines/wmlcomparer/DotnetCli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,gBAAgB,CAAC;AAIlE,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/E;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,aAAa,CAAC,CAwFxB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAevG"}
|
|
@@ -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"}
|