@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.
Files changed (252) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -28
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/atomizer.d.ts +218 -0
  5. package/dist/atomizer.d.ts.map +1 -0
  6. package/dist/atomizer.js +856 -0
  7. package/dist/atomizer.js.map +1 -0
  8. package/dist/baselines/atomizer/atomLcs.d.ts +96 -0
  9. package/dist/baselines/atomizer/atomLcs.d.ts.map +1 -0
  10. package/dist/baselines/atomizer/atomLcs.js +347 -0
  11. package/dist/baselines/atomizer/atomLcs.js.map +1 -0
  12. package/dist/baselines/atomizer/debug.d.ts +41 -0
  13. package/dist/baselines/atomizer/debug.d.ts.map +1 -0
  14. package/dist/baselines/atomizer/debug.js +85 -0
  15. package/dist/baselines/atomizer/debug.js.map +1 -0
  16. package/dist/baselines/atomizer/documentReconstructor.d.ts +64 -0
  17. package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -0
  18. package/dist/baselines/atomizer/documentReconstructor.js +939 -0
  19. package/dist/baselines/atomizer/documentReconstructor.js.map +1 -0
  20. package/dist/baselines/atomizer/hierarchicalLcs.d.ts +111 -0
  21. package/dist/baselines/atomizer/hierarchicalLcs.d.ts.map +1 -0
  22. package/dist/baselines/atomizer/hierarchicalLcs.js +469 -0
  23. package/dist/baselines/atomizer/hierarchicalLcs.js.map +1 -0
  24. package/dist/baselines/atomizer/inPlaceModifier.d.ts +183 -0
  25. package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -0
  26. package/dist/baselines/atomizer/inPlaceModifier.js +1600 -0
  27. package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -0
  28. package/dist/baselines/atomizer/numberingIntegration.d.ts +59 -0
  29. package/dist/baselines/atomizer/numberingIntegration.d.ts.map +1 -0
  30. package/dist/baselines/atomizer/numberingIntegration.js +209 -0
  31. package/dist/baselines/atomizer/numberingIntegration.js.map +1 -0
  32. package/dist/baselines/atomizer/pipeline.d.ts +65 -0
  33. package/dist/baselines/atomizer/pipeline.d.ts.map +1 -0
  34. package/dist/baselines/atomizer/pipeline.js +510 -0
  35. package/dist/baselines/atomizer/pipeline.js.map +1 -0
  36. package/dist/baselines/atomizer/premergeRuns.d.ts +26 -0
  37. package/dist/baselines/atomizer/premergeRuns.d.ts.map +1 -0
  38. package/dist/baselines/atomizer/premergeRuns.js +150 -0
  39. package/dist/baselines/atomizer/premergeRuns.js.map +1 -0
  40. package/dist/baselines/atomizer/trackChangesAcceptor.d.ts +63 -0
  41. package/dist/baselines/atomizer/trackChangesAcceptor.d.ts.map +1 -0
  42. package/dist/baselines/atomizer/trackChangesAcceptor.js +254 -0
  43. package/dist/baselines/atomizer/trackChangesAcceptor.js.map +1 -0
  44. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts +64 -0
  45. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -0
  46. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +586 -0
  47. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -0
  48. package/dist/baselines/atomizer/xmlToWmlElement.d.ts +65 -0
  49. package/dist/baselines/atomizer/xmlToWmlElement.d.ts.map +1 -0
  50. package/dist/baselines/atomizer/xmlToWmlElement.js +95 -0
  51. package/dist/baselines/atomizer/xmlToWmlElement.js.map +1 -0
  52. package/dist/baselines/diffmatch/documentBuilder.d.ts +44 -0
  53. package/dist/baselines/diffmatch/documentBuilder.d.ts.map +1 -0
  54. package/dist/baselines/diffmatch/documentBuilder.js +227 -0
  55. package/dist/baselines/diffmatch/documentBuilder.js.map +1 -0
  56. package/dist/baselines/diffmatch/paragraphAlignment.d.ts +75 -0
  57. package/dist/baselines/diffmatch/paragraphAlignment.d.ts.map +1 -0
  58. package/dist/baselines/diffmatch/paragraphAlignment.js +206 -0
  59. package/dist/baselines/diffmatch/paragraphAlignment.js.map +1 -0
  60. package/dist/baselines/diffmatch/pipeline.d.ts +33 -0
  61. package/dist/baselines/diffmatch/pipeline.d.ts.map +1 -0
  62. package/dist/baselines/diffmatch/pipeline.js +84 -0
  63. package/dist/baselines/diffmatch/pipeline.js.map +1 -0
  64. package/dist/baselines/diffmatch/runDiff.d.ts +53 -0
  65. package/dist/baselines/diffmatch/runDiff.d.ts.map +1 -0
  66. package/dist/baselines/diffmatch/runDiff.js +253 -0
  67. package/dist/baselines/diffmatch/runDiff.js.map +1 -0
  68. package/dist/baselines/diffmatch/trackChangesRenderer.d.ts +64 -0
  69. package/dist/baselines/diffmatch/trackChangesRenderer.d.ts.map +1 -0
  70. package/dist/baselines/diffmatch/trackChangesRenderer.js +178 -0
  71. package/dist/baselines/diffmatch/trackChangesRenderer.js.map +1 -0
  72. package/dist/baselines/diffmatch/xmlParser.d.ts +45 -0
  73. package/dist/baselines/diffmatch/xmlParser.d.ts.map +1 -0
  74. package/dist/baselines/diffmatch/xmlParser.js +216 -0
  75. package/dist/baselines/diffmatch/xmlParser.js.map +1 -0
  76. package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts +51 -0
  77. package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts.map +1 -0
  78. package/dist/baselines/wmlcomparer/DocxodusWasm.js +83 -0
  79. package/dist/baselines/wmlcomparer/DocxodusWasm.js.map +1 -0
  80. package/dist/baselines/wmlcomparer/DotnetCli.d.ts +40 -0
  81. package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -0
  82. package/dist/baselines/wmlcomparer/DotnetCli.js +135 -0
  83. package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -0
  84. package/dist/benchmark/metrics.d.ts +72 -0
  85. package/dist/benchmark/metrics.d.ts.map +1 -0
  86. package/dist/benchmark/metrics.js +45 -0
  87. package/dist/benchmark/metrics.js.map +1 -0
  88. package/dist/benchmark/reporter.d.ts +23 -0
  89. package/dist/benchmark/reporter.d.ts.map +1 -0
  90. package/dist/benchmark/reporter.js +147 -0
  91. package/dist/benchmark/reporter.js.map +1 -0
  92. package/dist/benchmark/runner.d.ts +30 -0
  93. package/dist/benchmark/runner.d.ts.map +1 -0
  94. package/dist/benchmark/runner.js +233 -0
  95. package/dist/benchmark/runner.js.map +1 -0
  96. package/dist/cli/compare-two.d.ts +28 -0
  97. package/dist/cli/compare-two.d.ts.map +1 -0
  98. package/dist/cli/compare-two.js +110 -0
  99. package/dist/cli/compare-two.js.map +1 -0
  100. package/dist/cli/index.d.ts +3 -0
  101. package/dist/cli/index.d.ts.map +1 -0
  102. package/dist/cli/index.js +21 -0
  103. package/dist/cli/index.js.map +1 -0
  104. package/dist/core-types.d.ts +296 -0
  105. package/dist/core-types.d.ts.map +1 -0
  106. package/dist/core-types.js +122 -0
  107. package/dist/core-types.js.map +1 -0
  108. package/dist/footnotes.d.ts +144 -0
  109. package/dist/footnotes.d.ts.map +1 -0
  110. package/dist/footnotes.js +291 -0
  111. package/dist/footnotes.js.map +1 -0
  112. package/dist/format-detection.d.ts +120 -0
  113. package/dist/format-detection.d.ts.map +1 -0
  114. package/dist/format-detection.js +338 -0
  115. package/dist/format-detection.js.map +1 -0
  116. package/dist/index.d.ts +177 -0
  117. package/dist/index.d.ts.map +1 -0
  118. package/dist/index.js +55 -0
  119. package/dist/index.js.map +1 -0
  120. package/dist/integration/output-artifacts.d.ts +6 -0
  121. package/dist/integration/output-artifacts.d.ts.map +1 -0
  122. package/dist/integration/output-artifacts.js +30 -0
  123. package/dist/integration/output-artifacts.js.map +1 -0
  124. package/dist/move-detection.d.ts +211 -0
  125. package/dist/move-detection.d.ts.map +1 -0
  126. package/dist/move-detection.js +391 -0
  127. package/dist/move-detection.js.map +1 -0
  128. package/dist/numbering.d.ts +136 -0
  129. package/dist/numbering.d.ts.map +1 -0
  130. package/dist/numbering.js +446 -0
  131. package/dist/numbering.js.map +1 -0
  132. package/dist/primitives/accept_changes.d.ts +30 -0
  133. package/dist/primitives/accept_changes.d.ts.map +1 -0
  134. package/dist/primitives/accept_changes.js +241 -0
  135. package/dist/primitives/accept_changes.js.map +1 -0
  136. package/dist/primitives/bookmarks.d.ts +12 -0
  137. package/dist/primitives/bookmarks.d.ts.map +1 -0
  138. package/dist/primitives/bookmarks.js +248 -0
  139. package/dist/primitives/bookmarks.js.map +1 -0
  140. package/dist/primitives/comments.d.ts +88 -0
  141. package/dist/primitives/comments.d.ts.map +1 -0
  142. package/dist/primitives/comments.js +703 -0
  143. package/dist/primitives/comments.js.map +1 -0
  144. package/dist/primitives/document.d.ts +168 -0
  145. package/dist/primitives/document.d.ts.map +1 -0
  146. package/dist/primitives/document.js +532 -0
  147. package/dist/primitives/document.js.map +1 -0
  148. package/dist/primitives/document_view.d.ts +93 -0
  149. package/dist/primitives/document_view.d.ts.map +1 -0
  150. package/dist/primitives/document_view.js +722 -0
  151. package/dist/primitives/document_view.js.map +1 -0
  152. package/dist/primitives/dom-helpers.d.ts +94 -0
  153. package/dist/primitives/dom-helpers.d.ts.map +1 -0
  154. package/dist/primitives/dom-helpers.js +219 -0
  155. package/dist/primitives/dom-helpers.js.map +1 -0
  156. package/dist/primitives/errors.d.ts +7 -0
  157. package/dist/primitives/errors.d.ts.map +1 -0
  158. package/dist/primitives/errors.js +10 -0
  159. package/dist/primitives/errors.js.map +1 -0
  160. package/dist/primitives/extract_revisions.d.ts +50 -0
  161. package/dist/primitives/extract_revisions.d.ts.map +1 -0
  162. package/dist/primitives/extract_revisions.js +340 -0
  163. package/dist/primitives/extract_revisions.js.map +1 -0
  164. package/dist/primitives/footnotes.d.ts +37 -0
  165. package/dist/primitives/footnotes.d.ts.map +1 -0
  166. package/dist/primitives/footnotes.js +552 -0
  167. package/dist/primitives/footnotes.js.map +1 -0
  168. package/dist/primitives/formatting_tags.d.ts +30 -0
  169. package/dist/primitives/formatting_tags.d.ts.map +1 -0
  170. package/dist/primitives/formatting_tags.js +217 -0
  171. package/dist/primitives/formatting_tags.js.map +1 -0
  172. package/dist/primitives/index.d.ts +26 -0
  173. package/dist/primitives/index.d.ts.map +1 -0
  174. package/dist/primitives/index.js +26 -0
  175. package/dist/primitives/index.js.map +1 -0
  176. package/dist/primitives/layout.d.ts +53 -0
  177. package/dist/primitives/layout.d.ts.map +1 -0
  178. package/dist/primitives/layout.js +178 -0
  179. package/dist/primitives/layout.js.map +1 -0
  180. package/dist/primitives/list_labels.d.ts +19 -0
  181. package/dist/primitives/list_labels.d.ts.map +1 -0
  182. package/dist/primitives/list_labels.js +57 -0
  183. package/dist/primitives/list_labels.js.map +1 -0
  184. package/dist/primitives/matching.d.ts +17 -0
  185. package/dist/primitives/matching.d.ts.map +1 -0
  186. package/dist/primitives/matching.js +144 -0
  187. package/dist/primitives/matching.js.map +1 -0
  188. package/dist/primitives/merge_runs.d.ts +23 -0
  189. package/dist/primitives/merge_runs.d.ts.map +1 -0
  190. package/dist/primitives/merge_runs.js +195 -0
  191. package/dist/primitives/merge_runs.js.map +1 -0
  192. package/dist/primitives/namespaces.d.ts +90 -0
  193. package/dist/primitives/namespaces.d.ts.map +1 -0
  194. package/dist/primitives/namespaces.js +107 -0
  195. package/dist/primitives/namespaces.js.map +1 -0
  196. package/dist/primitives/numbering.d.ts +27 -0
  197. package/dist/primitives/numbering.d.ts.map +1 -0
  198. package/dist/primitives/numbering.js +182 -0
  199. package/dist/primitives/numbering.js.map +1 -0
  200. package/dist/primitives/prevent_double_elevation.d.ts +18 -0
  201. package/dist/primitives/prevent_double_elevation.d.ts.map +1 -0
  202. package/dist/primitives/prevent_double_elevation.js +190 -0
  203. package/dist/primitives/prevent_double_elevation.js.map +1 -0
  204. package/dist/primitives/reject_changes.d.ts +27 -0
  205. package/dist/primitives/reject_changes.d.ts.map +1 -0
  206. package/dist/primitives/reject_changes.js +371 -0
  207. package/dist/primitives/reject_changes.js.map +1 -0
  208. package/dist/primitives/relationships.d.ts +7 -0
  209. package/dist/primitives/relationships.d.ts.map +1 -0
  210. package/dist/primitives/relationships.js +24 -0
  211. package/dist/primitives/relationships.js.map +1 -0
  212. package/dist/primitives/semantic_tags.d.ts +32 -0
  213. package/dist/primitives/semantic_tags.d.ts.map +1 -0
  214. package/dist/primitives/semantic_tags.js +139 -0
  215. package/dist/primitives/semantic_tags.js.map +1 -0
  216. package/dist/primitives/simplify_redlines.d.ts +19 -0
  217. package/dist/primitives/simplify_redlines.d.ts.map +1 -0
  218. package/dist/primitives/simplify_redlines.js +94 -0
  219. package/dist/primitives/simplify_redlines.js.map +1 -0
  220. package/dist/primitives/styles.d.ts +36 -0
  221. package/dist/primitives/styles.d.ts.map +1 -0
  222. package/dist/primitives/styles.js +190 -0
  223. package/dist/primitives/styles.js.map +1 -0
  224. package/dist/primitives/text.d.ts +27 -0
  225. package/dist/primitives/text.d.ts.map +1 -0
  226. package/dist/primitives/text.js +416 -0
  227. package/dist/primitives/text.js.map +1 -0
  228. package/dist/primitives/validate_document.d.ts +24 -0
  229. package/dist/primitives/validate_document.d.ts.map +1 -0
  230. package/dist/primitives/validate_document.js +147 -0
  231. package/dist/primitives/validate_document.js.map +1 -0
  232. package/dist/primitives/xml.d.ts +5 -0
  233. package/dist/primitives/xml.d.ts.map +1 -0
  234. package/dist/primitives/xml.js +19 -0
  235. package/dist/primitives/xml.js.map +1 -0
  236. package/dist/primitives/zip.d.ts +25 -0
  237. package/dist/primitives/zip.d.ts.map +1 -0
  238. package/dist/primitives/zip.js +78 -0
  239. package/dist/primitives/zip.js.map +1 -0
  240. package/dist/shared/docx/DocxArchive.d.ts +94 -0
  241. package/dist/shared/docx/DocxArchive.d.ts.map +1 -0
  242. package/dist/shared/docx/DocxArchive.js +169 -0
  243. package/dist/shared/docx/DocxArchive.js.map +1 -0
  244. package/dist/shared/ooxml/namespaces.d.ts +149 -0
  245. package/dist/shared/ooxml/namespaces.d.ts.map +1 -0
  246. package/dist/shared/ooxml/namespaces.js +224 -0
  247. package/dist/shared/ooxml/namespaces.js.map +1 -0
  248. package/dist/shared/ooxml/types.d.ts +136 -0
  249. package/dist/shared/ooxml/types.d.ts.map +1 -0
  250. package/dist/shared/ooxml/types.js +7 -0
  251. package/dist/shared/ooxml/types.js.map +1 -0
  252. 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"}