@paperjsx/json-to-xlsx-pro 0.0.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.
Files changed (175) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +61 -0
  3. package/dist/assembly/xlsx-assembler.d.ts +53 -0
  4. package/dist/assembly/xlsx-assembler.d.ts.map +1 -0
  5. package/dist/benchmarks/phase2.d.ts +72 -0
  6. package/dist/benchmarks/phase2.d.ts.map +1 -0
  7. package/dist/benchmarks/phase2.js +14 -0
  8. package/dist/benchmarks/phase2.js.map +7 -0
  9. package/dist/benchmarks/report.d.ts +21 -0
  10. package/dist/benchmarks/report.d.ts.map +1 -0
  11. package/dist/benchmarks/report.js +13 -0
  12. package/dist/benchmarks/report.js.map +7 -0
  13. package/dist/benchmarks/rigorous.d.ts +85 -0
  14. package/dist/benchmarks/rigorous.d.ts.map +1 -0
  15. package/dist/benchmarks/rigorous.js +534 -0
  16. package/dist/benchmarks/rigorous.js.map +7 -0
  17. package/dist/chaos-lab/index.d.ts +69 -0
  18. package/dist/chaos-lab/index.d.ts.map +1 -0
  19. package/dist/chaos-lab/index.js +1696 -0
  20. package/dist/chaos-lab/index.js.map +7 -0
  21. package/dist/chunk-2IVXCH6I.js +1002 -0
  22. package/dist/chunk-2IVXCH6I.js.map +7 -0
  23. package/dist/chunk-IYMS2CLX.js +478 -0
  24. package/dist/chunk-IYMS2CLX.js.map +7 -0
  25. package/dist/chunk-PQSLPEN5.js +290 -0
  26. package/dist/chunk-PQSLPEN5.js.map +7 -0
  27. package/dist/chunk-QDWDSM74.js +142 -0
  28. package/dist/chunk-QDWDSM74.js.map +7 -0
  29. package/dist/chunk-S5RMAWLC.js +25347 -0
  30. package/dist/chunk-S5RMAWLC.js.map +7 -0
  31. package/dist/chunk-Z2JSZFNG.js +308 -0
  32. package/dist/chunk-Z2JSZFNG.js.map +7 -0
  33. package/dist/diagnostics/corruption.d.ts +9 -0
  34. package/dist/diagnostics/corruption.d.ts.map +1 -0
  35. package/dist/diagnostics/workloads.d.ts +6 -0
  36. package/dist/diagnostics/workloads.d.ts.map +1 -0
  37. package/dist/diff/document-diff.d.ts +5 -0
  38. package/dist/diff/document-diff.d.ts.map +1 -0
  39. package/dist/document-diff/src/index.d.ts +50 -0
  40. package/dist/document-diff/src/index.d.ts.map +1 -0
  41. package/dist/errors.d.ts +35 -0
  42. package/dist/errors.d.ts.map +1 -0
  43. package/dist/fixtures/phase1.d.ts +14 -0
  44. package/dist/fixtures/phase1.d.ts.map +1 -0
  45. package/dist/fixtures/phase2.d.ts +9 -0
  46. package/dist/fixtures/phase2.d.ts.map +1 -0
  47. package/dist/fixtures/phase3.d.ts +9 -0
  48. package/dist/fixtures/phase3.d.ts.map +1 -0
  49. package/dist/fixtures/phase4.d.ts +10 -0
  50. package/dist/fixtures/phase4.d.ts.map +1 -0
  51. package/dist/fixtures/phase5.d.ts +9 -0
  52. package/dist/fixtures/phase5.d.ts.map +1 -0
  53. package/dist/formulas/builder.d.ts +91 -0
  54. package/dist/formulas/builder.d.ts.map +1 -0
  55. package/dist/formulas/evaluator.d.ts +25 -0
  56. package/dist/formulas/evaluator.d.ts.map +1 -0
  57. package/dist/formulas/shift.d.ts +14 -0
  58. package/dist/formulas/shift.d.ts.map +1 -0
  59. package/dist/index-pro.d.ts +12 -0
  60. package/dist/index-pro.d.ts.map +1 -0
  61. package/dist/index.d.ts +41 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +2167 -0
  64. package/dist/index.js.map +7 -0
  65. package/dist/layout/column-width.d.ts +32 -0
  66. package/dist/layout/column-width.d.ts.map +1 -0
  67. package/dist/layout/row-height.d.ts +3 -0
  68. package/dist/layout/row-height.d.ts.map +1 -0
  69. package/dist/preflight.d.ts +31 -0
  70. package/dist/preflight.d.ts.map +1 -0
  71. package/dist/public-quality-types.d.ts +44 -0
  72. package/dist/public-quality-types.d.ts.map +1 -0
  73. package/dist/quality/accessibility-contract.d.ts +38 -0
  74. package/dist/quality/accessibility-contract.d.ts.map +1 -0
  75. package/dist/quality/accessibility.d.ts +33 -0
  76. package/dist/quality/accessibility.d.ts.map +1 -0
  77. package/dist/quality/shared-quality.d.ts +4 -0
  78. package/dist/quality/shared-quality.d.ts.map +1 -0
  79. package/dist/quality/structural-validation.d.ts +11 -0
  80. package/dist/quality/structural-validation.d.ts.map +1 -0
  81. package/dist/quality/workbook-quality.d.ts +63 -0
  82. package/dist/quality/workbook-quality.d.ts.map +1 -0
  83. package/dist/render-metrics.d.ts +67 -0
  84. package/dist/render-metrics.d.ts.map +1 -0
  85. package/dist/render-plan.d.ts +40 -0
  86. package/dist/render-plan.d.ts.map +1 -0
  87. package/dist/serializers/chart-serializer.d.ts +3 -0
  88. package/dist/serializers/chart-serializer.d.ts.map +1 -0
  89. package/dist/serializers/comment-serializer.d.ts +12 -0
  90. package/dist/serializers/comment-serializer.d.ts.map +1 -0
  91. package/dist/serializers/doc-props-serializer.d.ts +5 -0
  92. package/dist/serializers/doc-props-serializer.d.ts.map +1 -0
  93. package/dist/serializers/drawing-serializer.d.ts +24 -0
  94. package/dist/serializers/drawing-serializer.d.ts.map +1 -0
  95. package/dist/serializers/package-serializer.d.ts +13 -0
  96. package/dist/serializers/package-serializer.d.ts.map +1 -0
  97. package/dist/serializers/pivot-serializer.d.ts +37 -0
  98. package/dist/serializers/pivot-serializer.d.ts.map +1 -0
  99. package/dist/serializers/shared-strings.d.ts +11 -0
  100. package/dist/serializers/shared-strings.d.ts.map +1 -0
  101. package/dist/serializers/sheet-serializer.d.ts +58 -0
  102. package/dist/serializers/sheet-serializer.d.ts.map +1 -0
  103. package/dist/serializers/sheet-xml-builder.d.ts +33 -0
  104. package/dist/serializers/sheet-xml-builder.d.ts.map +1 -0
  105. package/dist/serializers/style-registry.d.ts +2 -0
  106. package/dist/serializers/style-registry.d.ts.map +1 -0
  107. package/dist/serializers/table-serializer.d.ts +20 -0
  108. package/dist/serializers/table-serializer.d.ts.map +1 -0
  109. package/dist/serializers/theme-serializer.d.ts +3 -0
  110. package/dist/serializers/theme-serializer.d.ts.map +1 -0
  111. package/dist/serializers/workbook-serializer.d.ts +16 -0
  112. package/dist/serializers/workbook-serializer.d.ts.map +1 -0
  113. package/dist/serializers/worksheet-rels-serializer.d.ts +7 -0
  114. package/dist/serializers/worksheet-rels-serializer.d.ts.map +1 -0
  115. package/dist/source-js-extension-loader.mjs +44 -0
  116. package/dist/spreadsheet-engine.d.ts +50 -0
  117. package/dist/spreadsheet-engine.d.ts.map +1 -0
  118. package/dist/styles/border-serializer.d.ts +6 -0
  119. package/dist/styles/border-serializer.d.ts.map +1 -0
  120. package/dist/styles/color.d.ts +5 -0
  121. package/dist/styles/color.d.ts.map +1 -0
  122. package/dist/styles/component-registry.d.ts +13 -0
  123. package/dist/styles/component-registry.d.ts.map +1 -0
  124. package/dist/styles/conditional-formatting.d.ts +8 -0
  125. package/dist/styles/conditional-formatting.d.ts.map +1 -0
  126. package/dist/styles/fill-serializer.d.ts +9 -0
  127. package/dist/styles/fill-serializer.d.ts.map +1 -0
  128. package/dist/styles/font-serializer.d.ts +11 -0
  129. package/dist/styles/font-serializer.d.ts.map +1 -0
  130. package/dist/styles/numfmt-registry.d.ts +7 -0
  131. package/dist/styles/numfmt-registry.d.ts.map +1 -0
  132. package/dist/styles/presets.d.ts +190 -0
  133. package/dist/styles/presets.d.ts.map +1 -0
  134. package/dist/styles/style-registry.d.ts +24 -0
  135. package/dist/styles/style-registry.d.ts.map +1 -0
  136. package/dist/styles/style-utils.d.ts +11 -0
  137. package/dist/styles/style-utils.d.ts.map +1 -0
  138. package/dist/template-assembler.d.ts +26 -0
  139. package/dist/template-assembler.d.ts.map +1 -0
  140. package/dist/template-parser.d.ts +96 -0
  141. package/dist/template-parser.d.ts.map +1 -0
  142. package/dist/types/spreadsheet-ast.d.ts +470 -0
  143. package/dist/types/spreadsheet-ast.d.ts.map +1 -0
  144. package/dist/utils/cell-ref.d.ts +21 -0
  145. package/dist/utils/cell-ref.d.ts.map +1 -0
  146. package/dist/utils/date.d.ts +32 -0
  147. package/dist/utils/date.d.ts.map +1 -0
  148. package/dist/utils/hyperlinks.d.ts +16 -0
  149. package/dist/utils/hyperlinks.d.ts.map +1 -0
  150. package/dist/utils/xml.d.ts +7 -0
  151. package/dist/utils/xml.d.ts.map +1 -0
  152. package/dist/validation/spreadsheet-schema.d.ts +1513 -0
  153. package/dist/validation/spreadsheet-schema.d.ts.map +1 -0
  154. package/dist/workers/sheet-serialization-worker-pool.d.ts +32 -0
  155. package/dist/workers/sheet-serialization-worker-pool.d.ts.map +1 -0
  156. package/dist/workers/sheet-serializer-worker.d.ts +2 -0
  157. package/dist/workers/sheet-serializer-worker.d.ts.map +1 -0
  158. package/dist/workers/sheet-serializer-worker.js +2565 -0
  159. package/dist/workers/sheet-serializer-worker.js.map +7 -0
  160. package/dist/worksheet/structure.d.ts +33 -0
  161. package/dist/worksheet/structure.d.ts.map +1 -0
  162. package/dist-pro/benchmarks/phase2.js +1 -0
  163. package/dist-pro/benchmarks/report.js +1 -0
  164. package/dist-pro/benchmarks/rigorous.js +2 -0
  165. package/dist-pro/chaos-lab/index.js +2 -0
  166. package/dist-pro/chunk-FFIHITWB.js +1 -0
  167. package/dist-pro/chunk-INDNGGXB.js +2 -0
  168. package/dist-pro/chunk-K2MQYNU6.js +1 -0
  169. package/dist-pro/chunk-MEZHQFH3.js +2 -0
  170. package/dist-pro/chunk-RB42Q36L.js +1 -0
  171. package/dist-pro/chunk-WYTH4W4N.js +48 -0
  172. package/dist-pro/index.js +3 -0
  173. package/dist-pro/source-js-extension-loader.mjs +44 -0
  174. package/dist-pro/workers/sheet-serializer-worker.js +3 -0
  175. package/package.json +62 -0
@@ -0,0 +1,534 @@
1
+ import {
2
+ runCorrectnessSweep,
3
+ runRenderBenchmark
4
+ } from "../chunk-QDWDSM74.js";
5
+ import {
6
+ runPhase2BenchmarkSuite
7
+ } from "../chunk-2IVXCH6I.js";
8
+ import {
9
+ createDuplicateTableCorruptionBuffer,
10
+ createRepairableCorruptionBuffer,
11
+ createTemplateBenchmarkDocument
12
+ } from "../chunk-IYMS2CLX.js";
13
+ import {
14
+ validateXlsxStructure
15
+ } from "../chunk-PQSLPEN5.js";
16
+ import {
17
+ SpreadsheetEngine,
18
+ getPhase1Fixture,
19
+ validateSpreadsheetBuffer
20
+ } from "../chunk-S5RMAWLC.js";
21
+
22
+ // src/benchmarks/rigorous.ts
23
+ import { performance } from "node:perf_hooks";
24
+ import process from "node:process";
25
+ function createBenchmarkContext(options = {}) {
26
+ const mode = options.mode ?? "free";
27
+ return {
28
+ mode,
29
+ engine: options.engine ?? SpreadsheetEngine,
30
+ metadata: {
31
+ mode,
32
+ buildType: options.buildType ?? "source",
33
+ packageName: options.packageName ?? (mode === "pro" ? "@paperjsx/json-to-xlsx-pro" : "@paperjsx/json-to-xlsx"),
34
+ keyPresent: options.keyPresent ?? Boolean(process.env.PAPERJSX_LICENSE_KEY),
35
+ gitSha: options.gitSha
36
+ }
37
+ };
38
+ }
39
+ function blockedBenchmark(context, id, group, name, target, observed, notes) {
40
+ return {
41
+ id,
42
+ tier: context.mode,
43
+ bucket: "pro-only",
44
+ group,
45
+ name,
46
+ target,
47
+ status: "blocked",
48
+ observed,
49
+ notes
50
+ };
51
+ }
52
+ function validateBuffer(buffer) {
53
+ return validateSpreadsheetBuffer(buffer);
54
+ }
55
+ function percentile(sorted, point) {
56
+ if (sorted.length === 0) {
57
+ return 0;
58
+ }
59
+ const position = Math.min(sorted.length - 1, Math.max(0, Math.ceil(point / 100 * sorted.length) - 1));
60
+ return sorted[position] ?? 0;
61
+ }
62
+ function summarize(values) {
63
+ const sorted = [...values].sort((left, right) => left - right);
64
+ const total = sorted.reduce((sum, value) => sum + value, 0);
65
+ return {
66
+ min: sorted[0] ?? 0,
67
+ mean: sorted.length === 0 ? 0 : total / sorted.length,
68
+ p50: percentile(sorted, 50),
69
+ p95: percentile(sorted, 95),
70
+ max: sorted[sorted.length - 1] ?? 0
71
+ };
72
+ }
73
+ async function measureAsync(iterations, operation) {
74
+ const durations = [];
75
+ const rssDeltas = [];
76
+ let lastValue;
77
+ for (let index = 0; index < iterations; index += 1) {
78
+ if (typeof global.gc === "function") {
79
+ global.gc();
80
+ }
81
+ const rssBefore = process.memoryUsage().rss;
82
+ const start = performance.now();
83
+ lastValue = await operation();
84
+ durations.push(performance.now() - start);
85
+ rssDeltas.push(Math.max(0, process.memoryUsage().rss - rssBefore));
86
+ }
87
+ if (lastValue === void 0) {
88
+ throw new Error("Benchmark operation did not produce a result.");
89
+ }
90
+ return {
91
+ measurement: {
92
+ durationMs: summarize(durations),
93
+ rssDeltaBytes: summarize(rssDeltas)
94
+ },
95
+ lastValue
96
+ };
97
+ }
98
+ function formatMs(value) {
99
+ return `${value.toFixed(1)}ms`;
100
+ }
101
+ function formatBytes(value) {
102
+ if (value >= 1024 * 1024) {
103
+ return `${(value / (1024 * 1024)).toFixed(1)} MB`;
104
+ }
105
+ if (value >= 1024) {
106
+ return `${(value / 1024).toFixed(1)} KB`;
107
+ }
108
+ return `${value} B`;
109
+ }
110
+ function formatPercent(value) {
111
+ return `${(value * 100).toFixed(1)}%`;
112
+ }
113
+ function latencyStatus(measurement, passP95Ms, failP95Ms) {
114
+ if (measurement.durationMs.p95 <= passP95Ms) {
115
+ return "pass";
116
+ }
117
+ if (measurement.durationMs.p95 <= failP95Ms) {
118
+ return "warn";
119
+ }
120
+ return "fail";
121
+ }
122
+ function reduceSummary(results) {
123
+ return results.reduce((summary, result) => {
124
+ summary.total += 1;
125
+ if (result.status === "pass") summary.passed += 1;
126
+ if (result.status === "warn") summary.warned += 1;
127
+ if (result.status === "fail") summary.failed += 1;
128
+ if (result.status === "blocked") summary.blocked += 1;
129
+ return summary;
130
+ }, {
131
+ total: 0,
132
+ passed: 0,
133
+ warned: 0,
134
+ failed: 0,
135
+ blocked: 0
136
+ });
137
+ }
138
+ function maybeGc() {
139
+ if (typeof global.gc === "function") {
140
+ global.gc();
141
+ }
142
+ }
143
+ function mapPhase2Result(context, result) {
144
+ return {
145
+ id: result.id,
146
+ tier: context.mode,
147
+ bucket: result.status === "blocked" ? "shared" : "free-safe",
148
+ group: `P2-${result.group}`,
149
+ name: result.name,
150
+ target: result.target,
151
+ status: result.status,
152
+ observed: result.observed,
153
+ notes: result.notes,
154
+ diagnostics: result.diagnostics
155
+ };
156
+ }
157
+ async function runCoreBenchmarks(context, iterations) {
158
+ const { engine, mode } = context;
159
+ const correctness = await runCorrectnessSweep();
160
+ const largeBuffer = await engine.render(getPhase1Fixture("large-50k").document);
161
+ const validation = mode === "pro" ? await measureAsync(iterations, () => validateBuffer(largeBuffer)) : void 0;
162
+ const metrics = await engine.renderWithMetrics(getPhase1Fixture("large-10k").document);
163
+ const deltaRatio = metrics.plan.qualityReport.estimates.projectedZipBytes === 0 ? 0 : Math.abs(metrics.metrics.outputSizeDeltaBytes) / metrics.plan.qualityReport.estimates.projectedZipBytes;
164
+ const largePreflight = mode === "pro" ? engine.preflight(getPhase1Fixture("large-100k").document, { largeDataset: true }) : void 0;
165
+ const hasRenderStream = typeof engine.renderStream === "function";
166
+ return [
167
+ {
168
+ id: "A1",
169
+ tier: context.mode,
170
+ bucket: "free-safe",
171
+ group: "A",
172
+ name: "Phase 1 structural correctness sweep",
173
+ target: "14/14 fixture renders are structurally valid and deterministic",
174
+ status: correctness.failures.length === 0 ? "pass" : "fail",
175
+ observed: `${correctness.passed}/${correctness.total} fixtures passed`,
176
+ notes: correctness.failures.length > 0 ? correctness.failures.join("; ") : void 0
177
+ },
178
+ mode === "pro" ? {
179
+ id: "A2",
180
+ tier: context.mode,
181
+ bucket: "pro-only",
182
+ group: "A",
183
+ name: "Validate clean 50K workbook",
184
+ target: "clean verdict and p95 < 1,500ms",
185
+ status: validation.lastValue.verdict !== "clean" ? "fail" : latencyStatus(validation.measurement, 1500, 2500),
186
+ observed: `verdict ${validation.lastValue.verdict}; p95 ${formatMs(validation.measurement.durationMs.p95)}`,
187
+ notes: validation.lastValue.findings.length > 0 ? validation.lastValue.findings.map((finding) => finding.code).join(", ") : void 0,
188
+ measurement: validation.measurement
189
+ } : blockedBenchmark(
190
+ context,
191
+ "A2",
192
+ "A",
193
+ "Validate clean 50K workbook",
194
+ "clean verdict and p95 < 1,500ms",
195
+ "Skipped on free surface because buffer validation is a Pro capability."
196
+ ),
197
+ mode === "pro" ? {
198
+ id: "A3",
199
+ tier: context.mode,
200
+ bucket: "pro-only",
201
+ group: "A",
202
+ name: "Preflight flags stream-mode workloads",
203
+ target: "100K-row workbook recommends stream mode and emits STREAM_MODE_RECOMMENDED",
204
+ status: largePreflight.recommendedRenderMode === "stream" && largePreflight.findings.some((finding) => finding.code === "STREAM_MODE_RECOMMENDED") ? "pass" : "fail",
205
+ observed: `mode ${largePreflight.recommendedRenderMode}; findings ${largePreflight.findings.map((finding) => finding.code).join(", ") || "none"}`
206
+ } : blockedBenchmark(
207
+ context,
208
+ "A3",
209
+ "A",
210
+ "Preflight flags stream-mode workloads",
211
+ "100K-row workbook recommends stream mode and emits STREAM_MODE_RECOMMENDED",
212
+ "Skipped on free surface because preflight quality reporting is a Pro capability."
213
+ ),
214
+ {
215
+ id: "A4",
216
+ tier: context.mode,
217
+ bucket: "shared",
218
+ group: "A",
219
+ name: "Preflight size estimate delta",
220
+ target: "Projected ZIP size is within 35% of the actual output",
221
+ status: deltaRatio <= 0.35 ? "pass" : deltaRatio <= 0.6 ? "warn" : "fail",
222
+ observed: `delta ${formatPercent(deltaRatio)}; estimated ${formatBytes(metrics.plan.qualityReport.estimates.projectedZipBytes)} vs actual ${formatBytes(metrics.metrics.outputSizeBytes)}`
223
+ },
224
+ {
225
+ id: "A5",
226
+ tier: context.mode,
227
+ bucket: "free-safe",
228
+ group: "A",
229
+ name: "Stream execution path availability",
230
+ target: "`renderStream(...)` exists when preflight recommends stream mode",
231
+ status: hasRenderStream ? "pass" : "fail",
232
+ observed: hasRenderStream ? "SpreadsheetEngine.renderStream is available" : "SpreadsheetEngine.renderStream is not implemented",
233
+ notes: hasRenderStream ? void 0 : "Preflight can recommend stream mode today, but the package still has no stream render API."
234
+ }
235
+ ];
236
+ }
237
+ async function runQualityBenchmarks(context, iterations) {
238
+ const { engine, mode } = context;
239
+ if (mode === "free") {
240
+ return [
241
+ blockedBenchmark(context, "B1", "B", "Repairable corruption corpus is detected", "Validation surfaces the seeded repairable workbook defects", "Skipped on free surface because workbook repair lifecycle verification is a Pro capability."),
242
+ blockedBenchmark(context, "B2", "B", "Repair repairable corruption corpus", "Repair returns a clean or warnings-only workbook and p95 < 1,800ms", "Skipped on free surface because repair is a Pro capability."),
243
+ blockedBenchmark(context, "B3", "B", "Validate-and-repair repairable corruption corpus", "validateAndRepair converges to clean or warnings-only and p95 < 2,500ms", "Skipped on free surface because validateAndRepair is a Pro capability."),
244
+ blockedBenchmark(context, "B4", "B", "Duplicate table recovery", "Duplicate table names and invalid table refs repair cleanly", "Skipped on free surface because repair is a Pro capability.")
245
+ ];
246
+ }
247
+ const repairableBuffer = await createRepairableCorruptionBuffer();
248
+ const duplicateTableBuffer = await createDuplicateTableCorruptionBuffer();
249
+ const repairableOriginal = await validateBuffer(repairableBuffer);
250
+ const duplicateOriginal = await validateBuffer(duplicateTableBuffer);
251
+ const repairMeasurement = await measureAsync(Math.max(1, Math.min(iterations, 2)), () => engine.repair(repairableBuffer));
252
+ const repairValidation = await validateBuffer(repairMeasurement.lastValue.buffer);
253
+ const validateRepairMeasurement = await measureAsync(Math.max(1, Math.min(iterations, 2)), () => engine.validateAndRepair(repairableBuffer));
254
+ const duplicateRepair = await measureAsync(iterations, () => engine.repair(duplicateTableBuffer));
255
+ const duplicateValidation = await validateBuffer(duplicateRepair.lastValue.buffer);
256
+ return [
257
+ {
258
+ id: "B1",
259
+ tier: context.mode,
260
+ bucket: "pro-only",
261
+ group: "B",
262
+ name: "Repairable corruption corpus is detected",
263
+ target: "Validation surfaces the seeded repairable workbook defects",
264
+ status: repairableOriginal.verdict === "errors" ? "pass" : "fail",
265
+ observed: `verdict ${repairableOriginal.verdict}; findings ${repairableOriginal.findings.map((finding) => finding.code).join(", ") || "none"}`
266
+ },
267
+ {
268
+ id: "B2",
269
+ tier: context.mode,
270
+ bucket: "pro-only",
271
+ group: "B",
272
+ name: "Repair repairable corruption corpus",
273
+ target: "Repair returns a clean or warnings-only workbook and p95 < 1,800ms",
274
+ status: repairValidation.verdict === "errors" ? "fail" : latencyStatus(repairMeasurement.measurement, 1800, 3e3),
275
+ observed: `repaired verdict ${repairValidation.verdict}; p95 ${formatMs(repairMeasurement.measurement.durationMs.p95)}; actions ${repairMeasurement.lastValue.actions.length}`,
276
+ notes: repairValidation.findings.length > 0 ? `post-repair findings: ${repairValidation.findings.map((finding) => finding.code).join(", ")}` : void 0,
277
+ measurement: repairMeasurement.measurement
278
+ },
279
+ {
280
+ id: "B3",
281
+ tier: context.mode,
282
+ bucket: "pro-only",
283
+ group: "B",
284
+ name: "Validate-and-repair repairable corruption corpus",
285
+ target: "validateAndRepair converges to clean or warnings-only and p95 < 2,500ms",
286
+ status: validateRepairMeasurement.lastValue.repaired.verdict === "errors" ? "fail" : latencyStatus(validateRepairMeasurement.measurement, 2500, 4e3),
287
+ observed: `original ${validateRepairMeasurement.lastValue.original.verdict} -> repaired ${validateRepairMeasurement.lastValue.repaired.verdict}; p95 ${formatMs(validateRepairMeasurement.measurement.durationMs.p95)}`,
288
+ notes: validateRepairMeasurement.lastValue.repair.actions.length > 0 ? `actions: ${validateRepairMeasurement.lastValue.repair.actions.map((action) => action.code).join(", ")}` : void 0,
289
+ measurement: validateRepairMeasurement.measurement
290
+ },
291
+ {
292
+ id: "B4",
293
+ tier: context.mode,
294
+ bucket: "pro-only",
295
+ group: "B",
296
+ name: "Duplicate table recovery",
297
+ target: "Duplicate table names and invalid table refs repair cleanly",
298
+ status: duplicateOriginal.findings.some((finding) => finding.code === "DUPLICATE_TABLE_NAME") && duplicateValidation.verdict !== "errors" ? latencyStatus(duplicateRepair.measurement, 1200, 2e3) : "fail",
299
+ observed: `original findings ${duplicateOriginal.findings.map((finding) => finding.code).join(", ") || "none"}; repaired verdict ${duplicateValidation.verdict}; p95 ${formatMs(duplicateRepair.measurement.durationMs.p95)}`,
300
+ notes: duplicateValidation.findings.length > 0 ? `post-repair findings: ${duplicateValidation.findings.map((finding) => finding.code).join(", ")}` : void 0,
301
+ measurement: duplicateRepair.measurement
302
+ }
303
+ ];
304
+ }
305
+ function createTemplateAssemblyInput() {
306
+ return {
307
+ namedRanges: {
308
+ InvoiceHeader: "Globex Corp"
309
+ },
310
+ cells: {
311
+ Invoice: {
312
+ B2: new Date(Date.UTC(2026, 3, 1))
313
+ }
314
+ }
315
+ };
316
+ }
317
+ function createTemplateRowExpansionInput() {
318
+ return {
319
+ namedRanges: {
320
+ InvoiceHeader: "Globex Corp"
321
+ },
322
+ rowExpansions: {
323
+ LineItems: {
324
+ rows: [
325
+ ["Starter", 1, 10, void 0],
326
+ ["Growth", 2, 25, void 0],
327
+ ["Enterprise", 1, 80, void 0]
328
+ ]
329
+ }
330
+ }
331
+ };
332
+ }
333
+ async function runTemplateBenchmarks(context, iterations) {
334
+ const { engine, mode } = context;
335
+ if (mode === "free") {
336
+ return [
337
+ blockedBenchmark(context, "C1", "C", "Template inventory parse", "Template parsing inventories the workbook and p95 < 150ms", "Skipped on free surface because template parsing is a Pro capability."),
338
+ blockedBenchmark(context, "C2", "C", "Template direct assembly", "Named-range/cell injection stays structurally valid and p95 < 250ms", "Skipped on free surface because template assembly is a Pro capability."),
339
+ blockedBenchmark(context, "C3", "C", "Template row expansion", "Row expansion keeps formulas/tables structurally valid and p95 < 400ms", "Skipped on free surface because template assembly is a Pro capability.")
340
+ ];
341
+ }
342
+ const templateDocument = createTemplateBenchmarkDocument();
343
+ const templateBuffer = await engine.render(templateDocument);
344
+ const parseMeasurement = await measureAsync(iterations, () => engine.parseTemplate(templateBuffer));
345
+ const directAssembly = await measureAsync(iterations, async () => {
346
+ const index = await engine.parseTemplate(templateBuffer);
347
+ return engine.assembleFromTemplate(index, createTemplateAssemblyInput());
348
+ });
349
+ const rowExpansionAssembly = await measureAsync(iterations, async () => {
350
+ const index = await engine.parseTemplate(templateBuffer);
351
+ return engine.assembleFromTemplate(index, createTemplateRowExpansionInput());
352
+ });
353
+ const directStructure = await validateXlsxStructure(directAssembly.lastValue);
354
+ const directValidation = await validateBuffer(directAssembly.lastValue);
355
+ const rowExpansionStructure = await validateXlsxStructure(rowExpansionAssembly.lastValue);
356
+ const rowExpansionValidation = await validateBuffer(rowExpansionAssembly.lastValue);
357
+ return [
358
+ {
359
+ id: "C1",
360
+ tier: context.mode,
361
+ bucket: "pro-only",
362
+ group: "C",
363
+ name: "Template inventory parse",
364
+ target: "Template parsing inventories the workbook and p95 < 150ms",
365
+ status: parseMeasurement.lastValue.namedRanges.length >= 2 && parseMeasurement.lastValue.tables.length >= 1 ? latencyStatus(parseMeasurement.measurement, 150, 300) : "fail",
366
+ observed: `named ranges ${parseMeasurement.lastValue.namedRanges.length}; tables ${parseMeasurement.lastValue.tables.length}; p95 ${formatMs(parseMeasurement.measurement.durationMs.p95)}`,
367
+ measurement: parseMeasurement.measurement
368
+ },
369
+ {
370
+ id: "C2",
371
+ tier: context.mode,
372
+ bucket: "pro-only",
373
+ group: "C",
374
+ name: "Template direct assembly",
375
+ target: "Named-range/cell injection stays structurally valid and p95 < 250ms",
376
+ status: directStructure.passed && directValidation.verdict !== "errors" ? latencyStatus(directAssembly.measurement, 250, 500) : "fail",
377
+ observed: `structural ${directStructure.passed ? "pass" : "fail"}; verdict ${directValidation.verdict}; p95 ${formatMs(directAssembly.measurement.durationMs.p95)}`,
378
+ notes: directValidation.findings.length > 0 ? `findings: ${directValidation.findings.map((finding) => finding.code).join(", ")}` : void 0,
379
+ measurement: directAssembly.measurement
380
+ },
381
+ {
382
+ id: "C3",
383
+ tier: context.mode,
384
+ bucket: "pro-only",
385
+ group: "C",
386
+ name: "Template row expansion",
387
+ target: "Row expansion keeps formulas/tables structurally valid and p95 < 400ms",
388
+ status: rowExpansionStructure.passed && rowExpansionValidation.verdict !== "errors" ? latencyStatus(rowExpansionAssembly.measurement, 400, 700) : "fail",
389
+ observed: `structural ${rowExpansionStructure.passed ? "pass" : "fail"}; verdict ${rowExpansionValidation.verdict}; p95 ${formatMs(rowExpansionAssembly.measurement.durationMs.p95)}`,
390
+ notes: rowExpansionValidation.findings.length > 0 ? `findings: ${rowExpansionValidation.findings.map((finding) => finding.code).join(", ")}` : void 0,
391
+ measurement: rowExpansionAssembly.measurement
392
+ }
393
+ ];
394
+ }
395
+ function createCompatibilityBenchmarks(context) {
396
+ return [
397
+ {
398
+ id: "X1",
399
+ tier: context.mode,
400
+ bucket: "shared",
401
+ group: "X",
402
+ name: "Cross-app import and round-trip matrix",
403
+ target: "Open, edit, save, and re-open in Excel Win/Mac, Sheets, Numbers, and LibreOffice",
404
+ status: "blocked",
405
+ observed: "Requires target spreadsheet apps and manual captures",
406
+ notes: "Needs Excel on Windows or macOS, a scripted Google Sheets account, Apple Numbers on macOS, and LibreOffice desktop automation to run a truthful open/edit/save/reopen matrix."
407
+ },
408
+ {
409
+ id: "X2",
410
+ tier: context.mode,
411
+ bucket: "shared",
412
+ group: "X",
413
+ name: "Repaired workbook compatibility matrix",
414
+ target: "Repaired third-party workbooks open without repair prompts across target apps",
415
+ status: "blocked",
416
+ observed: "Requires repaired-workbook validation in Excel-family apps",
417
+ notes: "Use the chaos-lab repair corpus outputs once Excel on Windows or macOS, Google Sheets automation, Apple Numbers on macOS, and LibreOffice desktop automation are available."
418
+ }
419
+ ];
420
+ }
421
+ async function runRigorousBenchmarkSuite(options = 2) {
422
+ const normalizedOptions = typeof options === "number" ? { iterations: options } : options;
423
+ const context = createBenchmarkContext(normalizedOptions);
424
+ const iterations = normalizedOptions.iterations ?? 2;
425
+ maybeGc();
426
+ const phase2 = await runPhase2BenchmarkSuite(iterations);
427
+ maybeGc();
428
+ const renderBaselines = [
429
+ await runRenderBenchmark("large-10k", iterations),
430
+ await runRenderBenchmark("large-50k", Math.max(1, Math.min(iterations, 2))),
431
+ await runRenderBenchmark("large-100k", Math.max(1, Math.min(iterations, 2)))
432
+ ];
433
+ maybeGc();
434
+ const core = await runCoreBenchmarks(context, iterations);
435
+ maybeGc();
436
+ const quality = await runQualityBenchmarks(context, iterations);
437
+ maybeGc();
438
+ const template = await runTemplateBenchmarks(context, iterations);
439
+ const results = [
440
+ ...core,
441
+ ...quality,
442
+ ...template,
443
+ ...phase2.results.map((result) => mapPhase2Result(context, result)),
444
+ ...createCompatibilityBenchmarks(context)
445
+ ];
446
+ return {
447
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
448
+ iterations,
449
+ environment: {
450
+ node: process.version,
451
+ platform: process.platform,
452
+ arch: process.arch
453
+ },
454
+ metadata: context.metadata,
455
+ summary: reduceSummary(results),
456
+ renderBaselines,
457
+ results
458
+ };
459
+ }
460
+ function renderBaselineTable(baselines) {
461
+ const lines = [
462
+ "| Fixture | p50 | p95 | max | rows/sec | cells/sec | file size | RSS delta |",
463
+ "| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |"
464
+ ];
465
+ for (const baseline of baselines) {
466
+ lines.push(
467
+ `| ${baseline.name} | ${baseline.stats.p50.toFixed(1)}ms | ${baseline.stats.p95.toFixed(1)}ms | ${baseline.stats.max.toFixed(1)}ms | ${baseline.rowsPerSecond.toFixed(0)} | ${baseline.cellsPerSecond.toFixed(0)} | ${formatBytes(baseline.fileSizeBytes)} | ${formatBytes(baseline.rssDeltaBytes)} |`
468
+ );
469
+ }
470
+ return lines;
471
+ }
472
+ function renderGroup(results, group, label) {
473
+ const groupResults = results.filter((result) => result.group === group);
474
+ if (groupResults.length === 0) {
475
+ return [];
476
+ }
477
+ const lines = [`## ${label}`, ""];
478
+ for (const result of groupResults) {
479
+ const marker = result.status === "pass" ? "PASS" : result.status === "warn" ? "WARN" : result.status === "fail" ? "FAIL" : "BLOCKED";
480
+ lines.push(`- \`${result.id}\` ${marker} ${result.name}`);
481
+ lines.push(` tier: ${result.tier}; bucket: ${result.bucket}`);
482
+ lines.push(` target: ${result.target}`);
483
+ lines.push(` observed: ${result.observed}`);
484
+ if (result.notes) {
485
+ lines.push(` notes: ${result.notes}`);
486
+ }
487
+ }
488
+ lines.push("");
489
+ return lines;
490
+ }
491
+ function formatRigorousBenchmarkReport(report) {
492
+ const lines = [
493
+ "# XLSX Rigorous Benchmark Report",
494
+ "",
495
+ `Generated: ${report.generatedAt}`,
496
+ "",
497
+ `Environment: Node ${report.environment.node} on ${report.environment.platform} ${report.environment.arch}`,
498
+ "",
499
+ `Mode: ${report.metadata.mode}`,
500
+ "",
501
+ `Build: ${report.metadata.buildType}`,
502
+ "",
503
+ `Package: ${report.metadata.packageName}`,
504
+ "",
505
+ `License Key Present: ${report.metadata.keyPresent ? "yes" : "no"}`,
506
+ "",
507
+ `Git SHA: ${report.metadata.gitSha ?? "unknown"}`,
508
+ "",
509
+ `Summary: ${report.summary.passed} pass / ${report.summary.warned} warn / ${report.summary.failed} fail / ${report.summary.blocked} blocked / ${report.summary.total} total`,
510
+ "",
511
+ "## Large Render Baselines",
512
+ "",
513
+ ...renderBaselineTable(report.renderBaselines),
514
+ "",
515
+ ...renderGroup(report.results, "A", "Core"),
516
+ ...renderGroup(report.results, "B", "Quality Lifecycle"),
517
+ ...renderGroup(report.results, "C", "Template Lifecycle"),
518
+ ...renderGroup(report.results, "P2-E", "Phase 2 Correctness"),
519
+ ...renderGroup(report.results, "P2-F", "Phase 2 Style Performance"),
520
+ ...renderGroup(report.results, "P2-G", "Phase 2 Size Efficiency"),
521
+ ...renderGroup(report.results, "P2-H", "Phase 2 Layout Sizing"),
522
+ ...renderGroup(report.results, "X", "Compatibility")
523
+ ];
524
+ return lines.join("\n");
525
+ }
526
+ async function renderRigorousBenchmarkReport(options = 2) {
527
+ return formatRigorousBenchmarkReport(await runRigorousBenchmarkSuite(options));
528
+ }
529
+ export {
530
+ formatRigorousBenchmarkReport,
531
+ renderRigorousBenchmarkReport,
532
+ runRigorousBenchmarkSuite
533
+ };
534
+ //# sourceMappingURL=rigorous.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/benchmarks/rigorous.ts"],
4
+ "sourcesContent": ["import { performance } from \"node:perf_hooks\";\nimport process from \"node:process\";\nimport { getPhase1Fixture } from \"../fixtures/phase1.js\";\nimport {\n runCorrectnessSweep,\n runRenderBenchmark,\n type Phase1BenchmarkResult,\n} from \"./report.js\";\nimport {\n runPhase2BenchmarkSuite,\n type Phase2BenchmarkDiagnostics,\n type Phase2BenchmarkResult,\n} from \"./phase2.js\";\nimport { SpreadsheetEngine } from \"../spreadsheet-engine.js\";\nimport type { SpreadsheetDocument } from \"../types/spreadsheet-ast.js\";\nimport {\n validateSpreadsheetBuffer,\n type SpreadsheetValidationSummary,\n} from \"../quality/workbook-quality.js\";\nimport { validateXlsxStructure } from \"../quality/structural-validation.js\";\nimport {\n createDuplicateTableCorruptionBuffer,\n createRepairableCorruptionBuffer,\n} from \"../diagnostics/corruption.js\";\nimport {\n createTemplateBenchmarkDocument,\n} from \"../diagnostics/workloads.js\";\n\nexport type XlsxRigorousBenchmarkStatus = \"pass\" | \"warn\" | \"fail\" | \"blocked\";\nexport type XlsxRigorousBenchmarkTier = \"free\" | \"pro\";\nexport type XlsxRigorousBenchmarkBucket = \"free-safe\" | \"pro-only\" | \"shared\";\n\ntype SpreadsheetDocumentInput = Parameters<typeof SpreadsheetEngine.render>[0];\ntype SpreadsheetRenderOptions = Parameters<typeof SpreadsheetEngine.render>[1];\ntype SpreadsheetTemplateIndexLike = Awaited<ReturnType<typeof SpreadsheetEngine.parseTemplate>>;\ntype SpreadsheetTemplateAssemblyInputLike = Parameters<typeof SpreadsheetEngine.assembleFromTemplate>[1];\n\nexport interface XlsxRigorousBenchmarkMetadata {\n mode: XlsxRigorousBenchmarkTier;\n buildType: string;\n packageName: string;\n keyPresent: boolean;\n gitSha?: string;\n}\n\nexport interface XlsxRigorousBenchmarkOptions {\n iterations?: number;\n mode?: XlsxRigorousBenchmarkTier;\n buildType?: string;\n packageName?: string;\n keyPresent?: boolean;\n gitSha?: string;\n engine?: XlsxRigorousBenchmarkEngine;\n}\n\nexport interface XlsxRigorousBenchmarkEngine {\n render: (document: SpreadsheetDocumentInput, options?: SpreadsheetRenderOptions) => Promise<Buffer>;\n renderStream: (document: SpreadsheetDocumentInput, options?: SpreadsheetRenderOptions) => Promise<NodeJS.ReadableStream>;\n renderWithMetrics: typeof SpreadsheetEngine.renderWithMetrics;\n preflight: typeof SpreadsheetEngine.preflight;\n repair: typeof SpreadsheetEngine.repair;\n validateAndRepair: typeof SpreadsheetEngine.validateAndRepair;\n parseTemplate: (buffer: Buffer) => Promise<SpreadsheetTemplateIndexLike>;\n assembleFromTemplate: (\n index: SpreadsheetTemplateIndexLike,\n injection: SpreadsheetTemplateAssemblyInputLike,\n ) => Promise<Buffer>;\n}\n\ninterface XlsxRigorousBenchmarkContext {\n mode: XlsxRigorousBenchmarkTier;\n engine: XlsxRigorousBenchmarkEngine;\n metadata: XlsxRigorousBenchmarkMetadata;\n}\n\nexport interface XlsxRigorousMetricStats {\n min: number;\n mean: number;\n p50: number;\n p95: number;\n max: number;\n}\n\nexport interface XlsxRigorousMeasurement {\n durationMs: XlsxRigorousMetricStats;\n rssDeltaBytes: XlsxRigorousMetricStats;\n}\n\nexport interface XlsxRigorousBenchmarkResult {\n id: string;\n tier: XlsxRigorousBenchmarkTier;\n bucket: XlsxRigorousBenchmarkBucket;\n group: string;\n name: string;\n target: string;\n status: XlsxRigorousBenchmarkStatus;\n observed: string;\n notes?: string;\n diagnostics?: Phase2BenchmarkDiagnostics;\n measurement?: XlsxRigorousMeasurement;\n}\n\nexport interface XlsxRigorousBenchmarkSummary {\n total: number;\n passed: number;\n warned: number;\n failed: number;\n blocked: number;\n}\n\nexport interface XlsxRigorousBenchmarkReport {\n generatedAt: string;\n iterations: number;\n environment: {\n node: string;\n platform: string;\n arch: string;\n };\n metadata: XlsxRigorousBenchmarkMetadata;\n summary: XlsxRigorousBenchmarkSummary;\n renderBaselines: Phase1BenchmarkResult[];\n results: XlsxRigorousBenchmarkResult[];\n}\n\ninterface TimedMeasurement<T> {\n measurement: XlsxRigorousMeasurement;\n lastValue: T;\n}\n\nfunction createBenchmarkContext(options: XlsxRigorousBenchmarkOptions = {}): XlsxRigorousBenchmarkContext {\n const mode = options.mode ?? \"free\";\n return {\n mode,\n engine: options.engine ?? SpreadsheetEngine,\n metadata: {\n mode,\n buildType: options.buildType ?? \"source\",\n packageName: options.packageName ?? (mode === \"pro\" ? \"@paperjsx/json-to-xlsx-pro\" : \"@paperjsx/json-to-xlsx\"),\n keyPresent: options.keyPresent ?? Boolean(process.env.PAPERJSX_LICENSE_KEY),\n gitSha: options.gitSha,\n },\n };\n}\n\nfunction blockedBenchmark(\n context: XlsxRigorousBenchmarkContext,\n id: string,\n group: string,\n name: string,\n target: string,\n observed: string,\n notes?: string,\n): XlsxRigorousBenchmarkResult {\n return {\n id,\n tier: context.mode,\n bucket: \"pro-only\",\n group,\n name,\n target,\n status: \"blocked\",\n observed,\n notes,\n };\n}\n\nfunction validateBuffer(buffer: Buffer): Promise<SpreadsheetValidationSummary> {\n return validateSpreadsheetBuffer(buffer);\n}\n\nfunction percentile(sorted: number[], point: number): number {\n if (sorted.length === 0) {\n return 0;\n }\n const position = Math.min(sorted.length - 1, Math.max(0, Math.ceil((point / 100) * sorted.length) - 1));\n return sorted[position] ?? 0;\n}\n\nfunction summarize(values: number[]): XlsxRigorousMetricStats {\n const sorted = [...values].sort((left, right) => left - right);\n const total = sorted.reduce((sum, value) => sum + value, 0);\n return {\n min: sorted[0] ?? 0,\n mean: sorted.length === 0 ? 0 : total / sorted.length,\n p50: percentile(sorted, 50),\n p95: percentile(sorted, 95),\n max: sorted[sorted.length - 1] ?? 0,\n };\n}\n\nasync function measureAsync<T>(\n iterations: number,\n operation: () => Promise<T>,\n): Promise<TimedMeasurement<T>> {\n const durations: number[] = [];\n const rssDeltas: number[] = [];\n let lastValue: T | undefined;\n\n for (let index = 0; index < iterations; index += 1) {\n if (typeof global.gc === \"function\") {\n global.gc();\n }\n const rssBefore = process.memoryUsage().rss;\n const start = performance.now();\n lastValue = await operation();\n durations.push(performance.now() - start);\n rssDeltas.push(Math.max(0, process.memoryUsage().rss - rssBefore));\n }\n\n if (lastValue === undefined) {\n throw new Error(\"Benchmark operation did not produce a result.\");\n }\n\n return {\n measurement: {\n durationMs: summarize(durations),\n rssDeltaBytes: summarize(rssDeltas),\n },\n lastValue,\n };\n}\n\nfunction formatMs(value: number): string {\n return `${value.toFixed(1)}ms`;\n}\n\nfunction formatBytes(value: number): string {\n if (value >= 1024 * 1024) {\n return `${(value / (1024 * 1024)).toFixed(1)} MB`;\n }\n if (value >= 1024) {\n return `${(value / 1024).toFixed(1)} KB`;\n }\n return `${value} B`;\n}\n\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(1)}%`;\n}\n\nfunction latencyStatus(\n measurement: XlsxRigorousMeasurement,\n passP95Ms: number,\n failP95Ms: number,\n): XlsxRigorousBenchmarkStatus {\n if (measurement.durationMs.p95 <= passP95Ms) {\n return \"pass\";\n }\n if (measurement.durationMs.p95 <= failP95Ms) {\n return \"warn\";\n }\n return \"fail\";\n}\n\nfunction reduceSummary(results: XlsxRigorousBenchmarkResult[]): XlsxRigorousBenchmarkSummary {\n return results.reduce<XlsxRigorousBenchmarkSummary>((summary, result) => {\n summary.total += 1;\n if (result.status === \"pass\") summary.passed += 1;\n if (result.status === \"warn\") summary.warned += 1;\n if (result.status === \"fail\") summary.failed += 1;\n if (result.status === \"blocked\") summary.blocked += 1;\n return summary;\n }, {\n total: 0,\n passed: 0,\n warned: 0,\n failed: 0,\n blocked: 0,\n });\n}\n\nfunction maybeGc(): void {\n if (typeof global.gc === \"function\") {\n global.gc();\n }\n}\n\nfunction mapPhase2Result(\n context: XlsxRigorousBenchmarkContext,\n result: Phase2BenchmarkResult,\n): XlsxRigorousBenchmarkResult {\n return {\n id: result.id,\n tier: context.mode,\n bucket: result.status === \"blocked\" ? \"shared\" : \"free-safe\",\n group: `P2-${result.group}`,\n name: result.name,\n target: result.target,\n status: result.status,\n observed: result.observed,\n notes: result.notes,\n diagnostics: result.diagnostics,\n };\n}\n\nasync function runCoreBenchmarks(\n context: XlsxRigorousBenchmarkContext,\n iterations: number,\n): Promise<XlsxRigorousBenchmarkResult[]> {\n const { engine, mode } = context;\n const correctness = await runCorrectnessSweep();\n const largeBuffer = await engine.render(getPhase1Fixture(\"large-50k\").document);\n const validation = mode === \"pro\"\n ? await measureAsync(iterations, () => validateBuffer(largeBuffer))\n : undefined;\n const metrics = await engine.renderWithMetrics(getPhase1Fixture(\"large-10k\").document);\n const deltaRatio = metrics.plan.qualityReport.estimates.projectedZipBytes === 0\n ? 0\n : Math.abs(metrics.metrics.outputSizeDeltaBytes) / metrics.plan.qualityReport.estimates.projectedZipBytes;\n const largePreflight = mode === \"pro\"\n ? engine.preflight(getPhase1Fixture(\"large-100k\").document, { largeDataset: true })\n : undefined;\n const hasRenderStream = typeof (engine as unknown as { renderStream?: unknown }).renderStream === \"function\";\n\n return [\n {\n id: \"A1\",\n tier: context.mode,\n bucket: \"free-safe\",\n group: \"A\",\n name: \"Phase 1 structural correctness sweep\",\n target: \"14/14 fixture renders are structurally valid and deterministic\",\n status: correctness.failures.length === 0 ? \"pass\" : \"fail\",\n observed: `${correctness.passed}/${correctness.total} fixtures passed`,\n notes: correctness.failures.length > 0 ? correctness.failures.join(\"; \") : undefined,\n },\n mode === \"pro\"\n ? {\n id: \"A2\",\n tier: context.mode,\n bucket: \"pro-only\",\n group: \"A\",\n name: \"Validate clean 50K workbook\",\n target: \"clean verdict and p95 < 1,500ms\",\n status: validation!.lastValue.verdict !== \"clean\"\n ? \"fail\"\n : latencyStatus(validation!.measurement, 1_500, 2_500),\n observed: `verdict ${validation!.lastValue.verdict}; p95 ${formatMs(validation!.measurement.durationMs.p95)}`,\n notes: validation!.lastValue.findings.length > 0\n ? validation!.lastValue.findings.map((finding) => finding.code).join(\", \")\n : undefined,\n measurement: validation!.measurement,\n }\n : blockedBenchmark(\n context,\n \"A2\",\n \"A\",\n \"Validate clean 50K workbook\",\n \"clean verdict and p95 < 1,500ms\",\n \"Skipped on free surface because buffer validation is a Pro capability.\",\n ),\n mode === \"pro\"\n ? {\n id: \"A3\",\n tier: context.mode,\n bucket: \"pro-only\",\n group: \"A\",\n name: \"Preflight flags stream-mode workloads\",\n target: \"100K-row workbook recommends stream mode and emits STREAM_MODE_RECOMMENDED\",\n status: largePreflight!.recommendedRenderMode === \"stream\"\n && largePreflight!.findings.some((finding) => finding.code === \"STREAM_MODE_RECOMMENDED\")\n ? \"pass\"\n : \"fail\",\n observed: `mode ${largePreflight!.recommendedRenderMode}; findings ${largePreflight!.findings.map((finding) => finding.code).join(\", \") || \"none\"}`,\n }\n : blockedBenchmark(\n context,\n \"A3\",\n \"A\",\n \"Preflight flags stream-mode workloads\",\n \"100K-row workbook recommends stream mode and emits STREAM_MODE_RECOMMENDED\",\n \"Skipped on free surface because preflight quality reporting is a Pro capability.\",\n ),\n {\n id: \"A4\",\n tier: context.mode,\n bucket: \"shared\",\n group: \"A\",\n name: \"Preflight size estimate delta\",\n target: \"Projected ZIP size is within 35% of the actual output\",\n status: deltaRatio <= 0.35 ? \"pass\" : (deltaRatio <= 0.60 ? \"warn\" : \"fail\"),\n observed: `delta ${formatPercent(deltaRatio)}; estimated ${formatBytes(metrics.plan.qualityReport.estimates.projectedZipBytes)} vs actual ${formatBytes(metrics.metrics.outputSizeBytes)}`,\n },\n {\n id: \"A5\",\n tier: context.mode,\n bucket: \"free-safe\",\n group: \"A\",\n name: \"Stream execution path availability\",\n target: \"`renderStream(...)` exists when preflight recommends stream mode\",\n status: hasRenderStream ? \"pass\" : \"fail\",\n observed: hasRenderStream ? \"SpreadsheetEngine.renderStream is available\" : \"SpreadsheetEngine.renderStream is not implemented\",\n notes: hasRenderStream ? undefined : \"Preflight can recommend stream mode today, but the package still has no stream render API.\",\n },\n ];\n}\n\nasync function runQualityBenchmarks(\n context: XlsxRigorousBenchmarkContext,\n iterations: number,\n): Promise<XlsxRigorousBenchmarkResult[]> {\n const { engine, mode } = context;\n if (mode === \"free\") {\n return [\n blockedBenchmark(context, \"B1\", \"B\", \"Repairable corruption corpus is detected\", \"Validation surfaces the seeded repairable workbook defects\", \"Skipped on free surface because workbook repair lifecycle verification is a Pro capability.\"),\n blockedBenchmark(context, \"B2\", \"B\", \"Repair repairable corruption corpus\", \"Repair returns a clean or warnings-only workbook and p95 < 1,800ms\", \"Skipped on free surface because repair is a Pro capability.\"),\n blockedBenchmark(context, \"B3\", \"B\", \"Validate-and-repair repairable corruption corpus\", \"validateAndRepair converges to clean or warnings-only and p95 < 2,500ms\", \"Skipped on free surface because validateAndRepair is a Pro capability.\"),\n blockedBenchmark(context, \"B4\", \"B\", \"Duplicate table recovery\", \"Duplicate table names and invalid table refs repair cleanly\", \"Skipped on free surface because repair is a Pro capability.\"),\n ];\n }\n const repairableBuffer = await createRepairableCorruptionBuffer();\n const duplicateTableBuffer = await createDuplicateTableCorruptionBuffer();\n\n const repairableOriginal = await validateBuffer(repairableBuffer);\n const duplicateOriginal = await validateBuffer(duplicateTableBuffer);\n const repairMeasurement = await measureAsync(Math.max(1, Math.min(iterations, 2)), () => engine.repair(repairableBuffer));\n const repairValidation = await validateBuffer(repairMeasurement.lastValue.buffer);\n const validateRepairMeasurement = await measureAsync(Math.max(1, Math.min(iterations, 2)), () => (\n engine.validateAndRepair(repairableBuffer)\n ));\n const duplicateRepair = await measureAsync(iterations, () => engine.repair(duplicateTableBuffer));\n const duplicateValidation = await validateBuffer(duplicateRepair.lastValue.buffer);\n\n return [\n {\n id: \"B1\",\n tier: context.mode,\n bucket: \"pro-only\",\n group: \"B\",\n name: \"Repairable corruption corpus is detected\",\n target: \"Validation surfaces the seeded repairable workbook defects\",\n status: repairableOriginal.verdict === \"errors\" ? \"pass\" : \"fail\",\n observed: `verdict ${repairableOriginal.verdict}; findings ${repairableOriginal.findings.map((finding) => finding.code).join(\", \") || \"none\"}`,\n },\n {\n id: \"B2\",\n tier: context.mode,\n bucket: \"pro-only\",\n group: \"B\",\n name: \"Repair repairable corruption corpus\",\n target: \"Repair returns a clean or warnings-only workbook and p95 < 1,800ms\",\n status: repairValidation.verdict === \"errors\"\n ? \"fail\"\n : latencyStatus(repairMeasurement.measurement, 1_800, 3_000),\n observed: `repaired verdict ${repairValidation.verdict}; p95 ${formatMs(repairMeasurement.measurement.durationMs.p95)}; actions ${repairMeasurement.lastValue.actions.length}`,\n notes: repairValidation.findings.length > 0\n ? `post-repair findings: ${repairValidation.findings.map((finding) => finding.code).join(\", \")}`\n : undefined,\n measurement: repairMeasurement.measurement,\n },\n {\n id: \"B3\",\n tier: context.mode,\n bucket: \"pro-only\",\n group: \"B\",\n name: \"Validate-and-repair repairable corruption corpus\",\n target: \"validateAndRepair converges to clean or warnings-only and p95 < 2,500ms\",\n status: validateRepairMeasurement.lastValue.repaired.verdict === \"errors\"\n ? \"fail\"\n : latencyStatus(validateRepairMeasurement.measurement, 2_500, 4_000),\n observed: `original ${validateRepairMeasurement.lastValue.original.verdict} -> repaired ${validateRepairMeasurement.lastValue.repaired.verdict}; p95 ${formatMs(validateRepairMeasurement.measurement.durationMs.p95)}`,\n notes: validateRepairMeasurement.lastValue.repair.actions.length > 0\n ? `actions: ${validateRepairMeasurement.lastValue.repair.actions.map((action) => action.code).join(\", \")}`\n : undefined,\n measurement: validateRepairMeasurement.measurement,\n },\n {\n id: \"B4\",\n tier: context.mode,\n bucket: \"pro-only\",\n group: \"B\",\n name: \"Duplicate table recovery\",\n target: \"Duplicate table names and invalid table refs repair cleanly\",\n status: duplicateOriginal.findings.some((finding) => finding.code === \"DUPLICATE_TABLE_NAME\")\n && duplicateValidation.verdict !== \"errors\"\n ? latencyStatus(duplicateRepair.measurement, 1_200, 2_000)\n : \"fail\",\n observed: `original findings ${duplicateOriginal.findings.map((finding) => finding.code).join(\", \") || \"none\"}; repaired verdict ${duplicateValidation.verdict}; p95 ${formatMs(duplicateRepair.measurement.durationMs.p95)}`,\n notes: duplicateValidation.findings.length > 0\n ? `post-repair findings: ${duplicateValidation.findings.map((finding) => finding.code).join(\", \")}`\n : undefined,\n measurement: duplicateRepair.measurement,\n },\n ];\n}\n\nfunction createTemplateAssemblyInput(): SpreadsheetTemplateAssemblyInputLike {\n return {\n namedRanges: {\n InvoiceHeader: \"Globex Corp\",\n },\n cells: {\n Invoice: {\n B2: new Date(Date.UTC(2026, 3, 1)),\n },\n },\n };\n}\n\nfunction createTemplateRowExpansionInput(): SpreadsheetTemplateAssemblyInputLike {\n return {\n namedRanges: {\n InvoiceHeader: \"Globex Corp\",\n },\n rowExpansions: {\n LineItems: {\n rows: [\n [\"Starter\", 1, 10, undefined],\n [\"Growth\", 2, 25, undefined],\n [\"Enterprise\", 1, 80, undefined],\n ],\n },\n },\n };\n}\n\nasync function runTemplateBenchmarks(\n context: XlsxRigorousBenchmarkContext,\n iterations: number,\n): Promise<XlsxRigorousBenchmarkResult[]> {\n const { engine, mode } = context;\n if (mode === \"free\") {\n return [\n blockedBenchmark(context, \"C1\", \"C\", \"Template inventory parse\", \"Template parsing inventories the workbook and p95 < 150ms\", \"Skipped on free surface because template parsing is a Pro capability.\"),\n blockedBenchmark(context, \"C2\", \"C\", \"Template direct assembly\", \"Named-range/cell injection stays structurally valid and p95 < 250ms\", \"Skipped on free surface because template assembly is a Pro capability.\"),\n blockedBenchmark(context, \"C3\", \"C\", \"Template row expansion\", \"Row expansion keeps formulas/tables structurally valid and p95 < 400ms\", \"Skipped on free surface because template assembly is a Pro capability.\"),\n ];\n }\n const templateDocument: SpreadsheetDocument = createTemplateBenchmarkDocument();\n const templateBuffer = await engine.render(templateDocument);\n const parseMeasurement = await measureAsync(iterations, () => engine.parseTemplate(templateBuffer));\n const directAssembly = await measureAsync(iterations, async () => {\n const index = await engine.parseTemplate(templateBuffer);\n return engine.assembleFromTemplate(index, createTemplateAssemblyInput());\n });\n const rowExpansionAssembly = await measureAsync(iterations, async () => {\n const index = await engine.parseTemplate(templateBuffer);\n return engine.assembleFromTemplate(index, createTemplateRowExpansionInput());\n });\n const directStructure = await validateXlsxStructure(directAssembly.lastValue);\n const directValidation = await validateBuffer(directAssembly.lastValue);\n const rowExpansionStructure = await validateXlsxStructure(rowExpansionAssembly.lastValue);\n const rowExpansionValidation = await validateBuffer(rowExpansionAssembly.lastValue);\n\n return [\n {\n id: \"C1\",\n tier: context.mode,\n bucket: \"pro-only\",\n group: \"C\",\n name: \"Template inventory parse\",\n target: \"Template parsing inventories the workbook and p95 < 150ms\",\n status: parseMeasurement.lastValue.namedRanges.length >= 2\n && parseMeasurement.lastValue.tables.length >= 1\n ? latencyStatus(parseMeasurement.measurement, 150, 300)\n : \"fail\",\n observed: `named ranges ${parseMeasurement.lastValue.namedRanges.length}; tables ${parseMeasurement.lastValue.tables.length}; p95 ${formatMs(parseMeasurement.measurement.durationMs.p95)}`,\n measurement: parseMeasurement.measurement,\n },\n {\n id: \"C2\",\n tier: context.mode,\n bucket: \"pro-only\",\n group: \"C\",\n name: \"Template direct assembly\",\n target: \"Named-range/cell injection stays structurally valid and p95 < 250ms\",\n status: directStructure.passed && directValidation.verdict !== \"errors\"\n ? latencyStatus(directAssembly.measurement, 250, 500)\n : \"fail\",\n observed: `structural ${directStructure.passed ? \"pass\" : \"fail\"}; verdict ${directValidation.verdict}; p95 ${formatMs(directAssembly.measurement.durationMs.p95)}`,\n notes: directValidation.findings.length > 0\n ? `findings: ${directValidation.findings.map((finding) => finding.code).join(\", \")}`\n : undefined,\n measurement: directAssembly.measurement,\n },\n {\n id: \"C3\",\n tier: context.mode,\n bucket: \"pro-only\",\n group: \"C\",\n name: \"Template row expansion\",\n target: \"Row expansion keeps formulas/tables structurally valid and p95 < 400ms\",\n status: rowExpansionStructure.passed && rowExpansionValidation.verdict !== \"errors\"\n ? latencyStatus(rowExpansionAssembly.measurement, 400, 700)\n : \"fail\",\n observed: `structural ${rowExpansionStructure.passed ? \"pass\" : \"fail\"}; verdict ${rowExpansionValidation.verdict}; p95 ${formatMs(rowExpansionAssembly.measurement.durationMs.p95)}`,\n notes: rowExpansionValidation.findings.length > 0\n ? `findings: ${rowExpansionValidation.findings.map((finding) => finding.code).join(\", \")}`\n : undefined,\n measurement: rowExpansionAssembly.measurement,\n },\n ];\n}\n\nfunction createCompatibilityBenchmarks(\n context: XlsxRigorousBenchmarkContext,\n): XlsxRigorousBenchmarkResult[] {\n return [\n {\n id: \"X1\",\n tier: context.mode,\n bucket: \"shared\",\n group: \"X\",\n name: \"Cross-app import and round-trip matrix\",\n target: \"Open, edit, save, and re-open in Excel Win/Mac, Sheets, Numbers, and LibreOffice\",\n status: \"blocked\",\n observed: \"Requires target spreadsheet apps and manual captures\",\n notes: \"Needs Excel on Windows or macOS, a scripted Google Sheets account, Apple Numbers on macOS, and LibreOffice desktop automation to run a truthful open/edit/save/reopen matrix.\",\n },\n {\n id: \"X2\",\n tier: context.mode,\n bucket: \"shared\",\n group: \"X\",\n name: \"Repaired workbook compatibility matrix\",\n target: \"Repaired third-party workbooks open without repair prompts across target apps\",\n status: \"blocked\",\n observed: \"Requires repaired-workbook validation in Excel-family apps\",\n notes: \"Use the chaos-lab repair corpus outputs once Excel on Windows or macOS, Google Sheets automation, Apple Numbers on macOS, and LibreOffice desktop automation are available.\",\n },\n ];\n}\n\nexport async function runRigorousBenchmarkSuite(\n options: number | XlsxRigorousBenchmarkOptions = 2,\n): Promise<XlsxRigorousBenchmarkReport> {\n const normalizedOptions = typeof options === \"number\" ? { iterations: options } : options;\n const context = createBenchmarkContext(normalizedOptions);\n const iterations = normalizedOptions.iterations ?? 2;\n maybeGc();\n const phase2 = await runPhase2BenchmarkSuite(iterations);\n maybeGc();\n const renderBaselines = [\n await runRenderBenchmark(\"large-10k\", iterations),\n await runRenderBenchmark(\"large-50k\", Math.max(1, Math.min(iterations, 2))),\n await runRenderBenchmark(\"large-100k\", Math.max(1, Math.min(iterations, 2))),\n ];\n maybeGc();\n const core = await runCoreBenchmarks(context, iterations);\n maybeGc();\n const quality = await runQualityBenchmarks(context, iterations);\n maybeGc();\n const template = await runTemplateBenchmarks(context, iterations);\n\n const results = [\n ...core,\n ...quality,\n ...template,\n ...phase2.results.map((result) => mapPhase2Result(context, result)),\n ...createCompatibilityBenchmarks(context),\n ];\n\n return {\n generatedAt: new Date().toISOString(),\n iterations,\n environment: {\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n },\n metadata: context.metadata,\n summary: reduceSummary(results),\n renderBaselines,\n results,\n };\n}\n\nfunction renderBaselineTable(baselines: Phase1BenchmarkResult[]): string[] {\n const lines = [\n \"| Fixture | p50 | p95 | max | rows/sec | cells/sec | file size | RSS delta |\",\n \"| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |\",\n ];\n for (const baseline of baselines) {\n lines.push(\n `| ${baseline.name} | ${baseline.stats.p50.toFixed(1)}ms | ${baseline.stats.p95.toFixed(1)}ms | ${baseline.stats.max.toFixed(1)}ms | ${baseline.rowsPerSecond.toFixed(0)} | ${baseline.cellsPerSecond.toFixed(0)} | ${formatBytes(baseline.fileSizeBytes)} | ${formatBytes(baseline.rssDeltaBytes)} |`,\n );\n }\n return lines;\n}\n\nfunction renderGroup(results: XlsxRigorousBenchmarkResult[], group: string, label: string): string[] {\n const groupResults = results.filter((result) => result.group === group);\n if (groupResults.length === 0) {\n return [];\n }\n\n const lines = [`## ${label}`, \"\"];\n for (const result of groupResults) {\n const marker = result.status === \"pass\"\n ? \"PASS\"\n : (result.status === \"warn\" ? \"WARN\" : (result.status === \"fail\" ? \"FAIL\" : \"BLOCKED\"));\n lines.push(`- \\`${result.id}\\` ${marker} ${result.name}`);\n lines.push(` tier: ${result.tier}; bucket: ${result.bucket}`);\n lines.push(` target: ${result.target}`);\n lines.push(` observed: ${result.observed}`);\n if (result.notes) {\n lines.push(` notes: ${result.notes}`);\n }\n }\n lines.push(\"\");\n return lines;\n}\n\nexport function formatRigorousBenchmarkReport(report: XlsxRigorousBenchmarkReport): string {\n const lines: string[] = [\n \"# XLSX Rigorous Benchmark Report\",\n \"\",\n `Generated: ${report.generatedAt}`,\n \"\",\n `Environment: Node ${report.environment.node} on ${report.environment.platform} ${report.environment.arch}`,\n \"\",\n `Mode: ${report.metadata.mode}`,\n \"\",\n `Build: ${report.metadata.buildType}`,\n \"\",\n `Package: ${report.metadata.packageName}`,\n \"\",\n `License Key Present: ${report.metadata.keyPresent ? \"yes\" : \"no\"}`,\n \"\",\n `Git SHA: ${report.metadata.gitSha ?? \"unknown\"}`,\n \"\",\n `Summary: ${report.summary.passed} pass / ${report.summary.warned} warn / ${report.summary.failed} fail / ${report.summary.blocked} blocked / ${report.summary.total} total`,\n \"\",\n \"## Large Render Baselines\",\n \"\",\n ...renderBaselineTable(report.renderBaselines),\n \"\",\n ...renderGroup(report.results, \"A\", \"Core\"),\n ...renderGroup(report.results, \"B\", \"Quality Lifecycle\"),\n ...renderGroup(report.results, \"C\", \"Template Lifecycle\"),\n ...renderGroup(report.results, \"P2-E\", \"Phase 2 Correctness\"),\n ...renderGroup(report.results, \"P2-F\", \"Phase 2 Style Performance\"),\n ...renderGroup(report.results, \"P2-G\", \"Phase 2 Size Efficiency\"),\n ...renderGroup(report.results, \"P2-H\", \"Phase 2 Layout Sizing\"),\n ...renderGroup(report.results, \"X\", \"Compatibility\"),\n ];\n\n return lines.join(\"\\n\");\n}\n\nexport async function renderRigorousBenchmarkReport(\n options: number | XlsxRigorousBenchmarkOptions = 2,\n): Promise<string> {\n return formatRigorousBenchmarkReport(await runRigorousBenchmarkSuite(options));\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }