@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.
- package/LICENSE +7 -0
- package/README.md +61 -0
- package/dist/assembly/xlsx-assembler.d.ts +53 -0
- package/dist/assembly/xlsx-assembler.d.ts.map +1 -0
- package/dist/benchmarks/phase2.d.ts +72 -0
- package/dist/benchmarks/phase2.d.ts.map +1 -0
- package/dist/benchmarks/phase2.js +14 -0
- package/dist/benchmarks/phase2.js.map +7 -0
- package/dist/benchmarks/report.d.ts +21 -0
- package/dist/benchmarks/report.d.ts.map +1 -0
- package/dist/benchmarks/report.js +13 -0
- package/dist/benchmarks/report.js.map +7 -0
- package/dist/benchmarks/rigorous.d.ts +85 -0
- package/dist/benchmarks/rigorous.d.ts.map +1 -0
- package/dist/benchmarks/rigorous.js +534 -0
- package/dist/benchmarks/rigorous.js.map +7 -0
- package/dist/chaos-lab/index.d.ts +69 -0
- package/dist/chaos-lab/index.d.ts.map +1 -0
- package/dist/chaos-lab/index.js +1696 -0
- package/dist/chaos-lab/index.js.map +7 -0
- package/dist/chunk-2IVXCH6I.js +1002 -0
- package/dist/chunk-2IVXCH6I.js.map +7 -0
- package/dist/chunk-IYMS2CLX.js +478 -0
- package/dist/chunk-IYMS2CLX.js.map +7 -0
- package/dist/chunk-PQSLPEN5.js +290 -0
- package/dist/chunk-PQSLPEN5.js.map +7 -0
- package/dist/chunk-QDWDSM74.js +142 -0
- package/dist/chunk-QDWDSM74.js.map +7 -0
- package/dist/chunk-S5RMAWLC.js +25347 -0
- package/dist/chunk-S5RMAWLC.js.map +7 -0
- package/dist/chunk-Z2JSZFNG.js +308 -0
- package/dist/chunk-Z2JSZFNG.js.map +7 -0
- package/dist/diagnostics/corruption.d.ts +9 -0
- package/dist/diagnostics/corruption.d.ts.map +1 -0
- package/dist/diagnostics/workloads.d.ts +6 -0
- package/dist/diagnostics/workloads.d.ts.map +1 -0
- package/dist/diff/document-diff.d.ts +5 -0
- package/dist/diff/document-diff.d.ts.map +1 -0
- package/dist/document-diff/src/index.d.ts +50 -0
- package/dist/document-diff/src/index.d.ts.map +1 -0
- package/dist/errors.d.ts +35 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/fixtures/phase1.d.ts +14 -0
- package/dist/fixtures/phase1.d.ts.map +1 -0
- package/dist/fixtures/phase2.d.ts +9 -0
- package/dist/fixtures/phase2.d.ts.map +1 -0
- package/dist/fixtures/phase3.d.ts +9 -0
- package/dist/fixtures/phase3.d.ts.map +1 -0
- package/dist/fixtures/phase4.d.ts +10 -0
- package/dist/fixtures/phase4.d.ts.map +1 -0
- package/dist/fixtures/phase5.d.ts +9 -0
- package/dist/fixtures/phase5.d.ts.map +1 -0
- package/dist/formulas/builder.d.ts +91 -0
- package/dist/formulas/builder.d.ts.map +1 -0
- package/dist/formulas/evaluator.d.ts +25 -0
- package/dist/formulas/evaluator.d.ts.map +1 -0
- package/dist/formulas/shift.d.ts +14 -0
- package/dist/formulas/shift.d.ts.map +1 -0
- package/dist/index-pro.d.ts +12 -0
- package/dist/index-pro.d.ts.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2167 -0
- package/dist/index.js.map +7 -0
- package/dist/layout/column-width.d.ts +32 -0
- package/dist/layout/column-width.d.ts.map +1 -0
- package/dist/layout/row-height.d.ts +3 -0
- package/dist/layout/row-height.d.ts.map +1 -0
- package/dist/preflight.d.ts +31 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/public-quality-types.d.ts +44 -0
- package/dist/public-quality-types.d.ts.map +1 -0
- package/dist/quality/accessibility-contract.d.ts +38 -0
- package/dist/quality/accessibility-contract.d.ts.map +1 -0
- package/dist/quality/accessibility.d.ts +33 -0
- package/dist/quality/accessibility.d.ts.map +1 -0
- package/dist/quality/shared-quality.d.ts +4 -0
- package/dist/quality/shared-quality.d.ts.map +1 -0
- package/dist/quality/structural-validation.d.ts +11 -0
- package/dist/quality/structural-validation.d.ts.map +1 -0
- package/dist/quality/workbook-quality.d.ts +63 -0
- package/dist/quality/workbook-quality.d.ts.map +1 -0
- package/dist/render-metrics.d.ts +67 -0
- package/dist/render-metrics.d.ts.map +1 -0
- package/dist/render-plan.d.ts +40 -0
- package/dist/render-plan.d.ts.map +1 -0
- package/dist/serializers/chart-serializer.d.ts +3 -0
- package/dist/serializers/chart-serializer.d.ts.map +1 -0
- package/dist/serializers/comment-serializer.d.ts +12 -0
- package/dist/serializers/comment-serializer.d.ts.map +1 -0
- package/dist/serializers/doc-props-serializer.d.ts +5 -0
- package/dist/serializers/doc-props-serializer.d.ts.map +1 -0
- package/dist/serializers/drawing-serializer.d.ts +24 -0
- package/dist/serializers/drawing-serializer.d.ts.map +1 -0
- package/dist/serializers/package-serializer.d.ts +13 -0
- package/dist/serializers/package-serializer.d.ts.map +1 -0
- package/dist/serializers/pivot-serializer.d.ts +37 -0
- package/dist/serializers/pivot-serializer.d.ts.map +1 -0
- package/dist/serializers/shared-strings.d.ts +11 -0
- package/dist/serializers/shared-strings.d.ts.map +1 -0
- package/dist/serializers/sheet-serializer.d.ts +58 -0
- package/dist/serializers/sheet-serializer.d.ts.map +1 -0
- package/dist/serializers/sheet-xml-builder.d.ts +33 -0
- package/dist/serializers/sheet-xml-builder.d.ts.map +1 -0
- package/dist/serializers/style-registry.d.ts +2 -0
- package/dist/serializers/style-registry.d.ts.map +1 -0
- package/dist/serializers/table-serializer.d.ts +20 -0
- package/dist/serializers/table-serializer.d.ts.map +1 -0
- package/dist/serializers/theme-serializer.d.ts +3 -0
- package/dist/serializers/theme-serializer.d.ts.map +1 -0
- package/dist/serializers/workbook-serializer.d.ts +16 -0
- package/dist/serializers/workbook-serializer.d.ts.map +1 -0
- package/dist/serializers/worksheet-rels-serializer.d.ts +7 -0
- package/dist/serializers/worksheet-rels-serializer.d.ts.map +1 -0
- package/dist/source-js-extension-loader.mjs +44 -0
- package/dist/spreadsheet-engine.d.ts +50 -0
- package/dist/spreadsheet-engine.d.ts.map +1 -0
- package/dist/styles/border-serializer.d.ts +6 -0
- package/dist/styles/border-serializer.d.ts.map +1 -0
- package/dist/styles/color.d.ts +5 -0
- package/dist/styles/color.d.ts.map +1 -0
- package/dist/styles/component-registry.d.ts +13 -0
- package/dist/styles/component-registry.d.ts.map +1 -0
- package/dist/styles/conditional-formatting.d.ts +8 -0
- package/dist/styles/conditional-formatting.d.ts.map +1 -0
- package/dist/styles/fill-serializer.d.ts +9 -0
- package/dist/styles/fill-serializer.d.ts.map +1 -0
- package/dist/styles/font-serializer.d.ts +11 -0
- package/dist/styles/font-serializer.d.ts.map +1 -0
- package/dist/styles/numfmt-registry.d.ts +7 -0
- package/dist/styles/numfmt-registry.d.ts.map +1 -0
- package/dist/styles/presets.d.ts +190 -0
- package/dist/styles/presets.d.ts.map +1 -0
- package/dist/styles/style-registry.d.ts +24 -0
- package/dist/styles/style-registry.d.ts.map +1 -0
- package/dist/styles/style-utils.d.ts +11 -0
- package/dist/styles/style-utils.d.ts.map +1 -0
- package/dist/template-assembler.d.ts +26 -0
- package/dist/template-assembler.d.ts.map +1 -0
- package/dist/template-parser.d.ts +96 -0
- package/dist/template-parser.d.ts.map +1 -0
- package/dist/types/spreadsheet-ast.d.ts +470 -0
- package/dist/types/spreadsheet-ast.d.ts.map +1 -0
- package/dist/utils/cell-ref.d.ts +21 -0
- package/dist/utils/cell-ref.d.ts.map +1 -0
- package/dist/utils/date.d.ts +32 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/hyperlinks.d.ts +16 -0
- package/dist/utils/hyperlinks.d.ts.map +1 -0
- package/dist/utils/xml.d.ts +7 -0
- package/dist/utils/xml.d.ts.map +1 -0
- package/dist/validation/spreadsheet-schema.d.ts +1513 -0
- package/dist/validation/spreadsheet-schema.d.ts.map +1 -0
- package/dist/workers/sheet-serialization-worker-pool.d.ts +32 -0
- package/dist/workers/sheet-serialization-worker-pool.d.ts.map +1 -0
- package/dist/workers/sheet-serializer-worker.d.ts +2 -0
- package/dist/workers/sheet-serializer-worker.d.ts.map +1 -0
- package/dist/workers/sheet-serializer-worker.js +2565 -0
- package/dist/workers/sheet-serializer-worker.js.map +7 -0
- package/dist/worksheet/structure.d.ts +33 -0
- package/dist/worksheet/structure.d.ts.map +1 -0
- package/dist-pro/benchmarks/phase2.js +1 -0
- package/dist-pro/benchmarks/report.js +1 -0
- package/dist-pro/benchmarks/rigorous.js +2 -0
- package/dist-pro/chaos-lab/index.js +2 -0
- package/dist-pro/chunk-FFIHITWB.js +1 -0
- package/dist-pro/chunk-INDNGGXB.js +2 -0
- package/dist-pro/chunk-K2MQYNU6.js +1 -0
- package/dist-pro/chunk-MEZHQFH3.js +2 -0
- package/dist-pro/chunk-RB42Q36L.js +1 -0
- package/dist-pro/chunk-WYTH4W4N.js +48 -0
- package/dist-pro/index.js +3 -0
- package/dist-pro/source-js-extension-loader.mjs +44 -0
- package/dist-pro/workers/sheet-serializer-worker.js +3 -0
- package/package.json +62 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/benchmarks/phase2.ts"],
|
|
4
|
+
"sourcesContent": ["import { performance } from \"node:perf_hooks\";\nimport process from \"node:process\";\nimport { Buffer } from \"node:buffer\";\nimport { createRequire } from \"node:module\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { XMLParser } from \"fast-xml-parser\";\nimport JSZip from \"jszip\";\nimport { getPhase1Fixture } from \"../fixtures/phase1.js\";\nimport { computeColumnLayout } from \"../layout/column-width.js\";\nimport { SpreadsheetEngine } from \"../spreadsheet-engine.js\";\nimport { PRESET_NAMES } from \"../styles/presets.js\";\nimport { serializeConditionalFormatting } from \"../styles/conditional-formatting.js\";\nimport { StyleRegistry } from \"../styles/style-registry.js\";\nimport type {\n SpreadsheetRenderKeyPartBytes,\n SpreadsheetRenderStageMetrics,\n} from \"../render-metrics.js\";\nimport type {\n CellValue,\n SpreadsheetCellStyle,\n SpreadsheetCellStyleInput,\n SpreadsheetConditionalFormatting,\n SpreadsheetConditionalFormattingRule,\n SpreadsheetDocument,\n SpreadsheetSheet,\n} from \"../types/spreadsheet-ast.js\";\nimport { isRichTextValue } from \"../types/spreadsheet-ast.js\";\nimport { resolveCellStyle } from \"../styles/style-utils.js\";\n\nconst xmlParser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@_\",\n parseTagValue: false,\n});\n\nconst BORDER_STYLES = [\n \"thin\",\n \"medium\",\n \"thick\",\n \"double\",\n \"dotted\",\n \"dashed\",\n \"dashDot\",\n \"dashDotDot\",\n \"hair\",\n \"mediumDashed\",\n \"mediumDashDot\",\n \"mediumDashDotDot\",\n \"slantDashDot\",\n] as const;\n\nconst H_ALIGNMENTS = [\n \"left\",\n \"center\",\n \"right\",\n \"justify\",\n \"distributed\",\n \"general\",\n] as const;\n\nconst V_ALIGNMENTS = [\"top\", \"center\", \"bottom\"] as const;\nconst FORMAT_ALIASES = [\n \"currency\",\n \"currency:KRW\",\n \"currency:EUR\",\n \"percentage\",\n \"percentage:2\",\n \"date\",\n \"datetime\",\n \"accounting\",\n \"number:0\",\n \"number:2\",\n] as const;\n\nexport type Phase2BenchmarkStatus = \"pass\" | \"warn\" | \"fail\" | \"blocked\";\n\nexport interface BenchmarkStats {\n p50: number;\n p95: number;\n max: number;\n}\n\nexport interface Phase2BenchmarkResult {\n id: string;\n group: \"E\" | \"F\" | \"G\" | \"H\";\n name: string;\n target: string;\n status: Phase2BenchmarkStatus;\n observed: string;\n notes?: string;\n diagnostics?: Phase2BenchmarkDiagnostics;\n}\n\nexport interface Phase2BenchmarkDiagnostics {\n bottleneck?: \"serializer-bound\" | \"archive-bound\" | \"mixed\";\n classification?: \"active-performance-debt\" | \"benchmark-target-mismatch-candidate\";\n payloadDominantPart?: \"worksheet\" | \"styles\" | \"sharedStrings\" | \"other\";\n practicalFloorGapBytes?: number;\n keyPartBytes?: SpreadsheetRenderKeyPartBytes;\n stageMetrics?: SpreadsheetRenderStageMetrics;\n stylePart?: {\n bytes: number;\n componentCounts: {\n numFmts: number;\n fonts: number;\n fills: number;\n borders: number;\n cellXfs: number;\n dxfs: number;\n };\n bytesPerCellXf: number;\n bytesPerStyleComponent: number;\n };\n}\n\nexport interface Phase2BenchmarkSummary {\n total: number;\n passed: number;\n warned: number;\n failed: number;\n blocked: number;\n}\n\nexport interface Phase2BenchmarkReport {\n generatedAt: string;\n environment: {\n node: string;\n platform: string;\n arch: string;\n };\n summary: Phase2BenchmarkSummary;\n results: Phase2BenchmarkResult[];\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];\n}\n\nfunction summarize(durations: number[]): BenchmarkStats {\n const sorted = [...durations].sort((left, right) => left - right);\n return {\n p50: percentile(sorted, 50),\n p95: percentile(sorted, 95),\n max: sorted[sorted.length - 1] ?? 0,\n };\n}\n\nfunction maybeGc(): void {\n if (typeof global.gc === \"function\") {\n global.gc();\n }\n}\n\nasync function readZipEntry(buffer: Buffer, entryPath: string): Promise<string> {\n const zip = await JSZip.loadAsync(buffer);\n const file = zip.file(entryPath);\n if (!file) {\n throw new Error(`Missing ZIP entry: ${entryPath}`);\n }\n return file.async(\"string\");\n}\n\nfunction formatMs(value: number): string {\n return `${value.toFixed(1)}ms`;\n}\n\nfunction formatKb(value: number): string {\n return `${(value / 1024).toFixed(1)} KB`;\n}\n\nfunction formatRatio(value: number): string {\n return `${(value * 100).toFixed(1)}%`;\n}\n\nfunction formatNullableRatio(value: number): string {\n return Number.isFinite(value) ? value.toFixed(1) : \"n/a\";\n}\n\nfunction formatRenderDecomposition(stageMetrics: SpreadsheetRenderStageMetrics): string {\n return [\n `worksheet ${formatMs(stageMetrics.worksheetSerializationTimeMs)}`,\n `styles ${formatMs(stageMetrics.stylesSerializationTimeMs)}`,\n `sharedStrings ${formatMs(stageMetrics.sharedStringsSerializationTimeMs)}`,\n `package ${formatMs(stageMetrics.packageSerializationTimeMs)}`,\n `archive ${formatMs(stageMetrics.archiveFinalizationTimeMs)}`,\n ].join(\"; \");\n}\n\nfunction formatKeyPartBytes(keyPartBytes: SpreadsheetRenderKeyPartBytes): string {\n const hasZipContribution = (\n keyPartBytes.sheet1XmlZipContributionBytes !== undefined\n || keyPartBytes.stylesXmlZipContributionBytes !== undefined\n || keyPartBytes.sharedStringsXmlZipContributionBytes !== undefined\n || keyPartBytes.otherZipContributionBytes !== undefined\n );\n if (hasZipContribution) {\n return [\n `sheet1.xml raw ${formatKb(keyPartBytes.sheet1XmlBytes)} / zip ${formatKb(keyPartBytes.sheet1XmlZipContributionBytes ?? 0)}`,\n `styles.xml raw ${formatKb(keyPartBytes.stylesXmlBytes)} / zip ${formatKb(keyPartBytes.stylesXmlZipContributionBytes ?? 0)}`,\n `sharedStrings.xml raw ${formatKb(keyPartBytes.sharedStringsXmlBytes)} / zip ${formatKb(keyPartBytes.sharedStringsXmlZipContributionBytes ?? 0)}`,\n `other zip ${formatKb(keyPartBytes.otherZipContributionBytes ?? 0)}`,\n `total zip ${formatKb(keyPartBytes.zipBytes)}`,\n ].join(\"; \");\n }\n return [\n `sheet1.xml ${formatKb(keyPartBytes.sheet1XmlBytes)}`,\n `styles.xml ${formatKb(keyPartBytes.stylesXmlBytes)}`,\n `sharedStrings.xml ${formatKb(keyPartBytes.sharedStringsXmlBytes)}`,\n `zip ${formatKb(keyPartBytes.zipBytes)}`,\n ].join(\"; \");\n}\n\nfunction inferPayloadDominantPart(\n keyPartBytes: SpreadsheetRenderKeyPartBytes,\n): NonNullable<Phase2BenchmarkDiagnostics[\"payloadDominantPart\"]> {\n const candidates = [\n { part: \"worksheet\", bytes: keyPartBytes.sheet1XmlZipContributionBytes ?? keyPartBytes.sheet1XmlCompressedBytes ?? keyPartBytes.sheet1XmlBytes },\n { part: \"styles\", bytes: keyPartBytes.stylesXmlZipContributionBytes ?? keyPartBytes.stylesXmlCompressedBytes ?? keyPartBytes.stylesXmlBytes },\n { part: \"sharedStrings\", bytes: keyPartBytes.sharedStringsXmlZipContributionBytes ?? keyPartBytes.sharedStringsXmlCompressedBytes ?? keyPartBytes.sharedStringsXmlBytes },\n { part: \"other\", bytes: keyPartBytes.otherZipContributionBytes ?? 0 },\n ] as const;\n\n return candidates.reduce((best, candidate) => (\n candidate.bytes > best.bytes ? candidate : best\n )).part;\n}\n\nfunction classifyWorkbookSizeDiagnostics(\n keyPartBytes: SpreadsheetRenderKeyPartBytes,\n targetBytes: number,\n): Phase2BenchmarkDiagnostics {\n const dominantPart = inferPayloadDominantPart(keyPartBytes);\n const dominantBytes = dominantPart === \"worksheet\"\n ? (keyPartBytes.sheet1XmlZipContributionBytes ?? keyPartBytes.sheet1XmlCompressedBytes ?? keyPartBytes.sheet1XmlBytes)\n : dominantPart === \"styles\"\n ? (keyPartBytes.stylesXmlZipContributionBytes ?? keyPartBytes.stylesXmlCompressedBytes ?? keyPartBytes.stylesXmlBytes)\n : dominantPart === \"sharedStrings\"\n ? (keyPartBytes.sharedStringsXmlZipContributionBytes ?? keyPartBytes.sharedStringsXmlCompressedBytes ?? keyPartBytes.sharedStringsXmlBytes)\n : (keyPartBytes.otherZipContributionBytes ?? 0);\n const remainderBytes = Math.max(0, keyPartBytes.zipBytes - dominantBytes);\n const practicalFloorGapBytes = Math.max(0, dominantBytes - targetBytes);\n const classification = dominantPart === \"worksheet\"\n && dominantBytes > targetBytes * 1.2\n && remainderBytes <= targetBytes * 0.1\n ? \"benchmark-target-mismatch-candidate\"\n : \"active-performance-debt\";\n\n return {\n classification,\n payloadDominantPart: dominantPart,\n practicalFloorGapBytes,\n keyPartBytes,\n };\n}\n\nfunction inferBottleneck(stageMetrics: SpreadsheetRenderStageMetrics): Phase2BenchmarkDiagnostics[\"bottleneck\"] {\n const serializerTime = stageMetrics.worksheetSerializationTimeMs\n + stageMetrics.stylesSerializationTimeMs\n + stageMetrics.sharedStringsSerializationTimeMs\n + stageMetrics.packageSerializationTimeMs;\n if (stageMetrics.archiveFinalizationTimeMs >= serializerTime * 0.85) {\n return \"archive-bound\";\n }\n if (serializerTime >= stageMetrics.archiveFinalizationTimeMs * 1.5) {\n return \"serializer-bound\";\n }\n return \"mixed\";\n}\n\nfunction benchmarkResult(\n id: string,\n group: Phase2BenchmarkResult[\"group\"],\n name: string,\n target: string,\n status: Phase2BenchmarkStatus,\n observed: string,\n notes?: string,\n diagnostics?: Phase2BenchmarkDiagnostics,\n): Phase2BenchmarkResult {\n return { id, group, name, target, status, observed, notes, diagnostics };\n}\n\nfunction passFailFromUpperBound(value: number, max: number): Phase2BenchmarkStatus {\n return value <= max ? \"pass\" : \"fail\";\n}\n\nexport function classifySizeEfficiencyStatus(\n value: number,\n max: number,\n diagnostics?: Phase2BenchmarkDiagnostics,\n): Phase2BenchmarkStatus {\n if (value <= max) {\n return \"pass\";\n }\n return diagnostics?.classification === \"benchmark-target-mismatch-candidate\" ? \"warn\" : \"fail\";\n}\n\nfunction passFailFromLowerBound(value: number, min: number): Phase2BenchmarkStatus {\n return value >= min ? \"pass\" : \"fail\";\n}\n\nfunction createStyle(index: number): SpreadsheetCellStyle {\n const primary = (index * 2654435761) % 0xFFFFFF;\n const secondary = (index * 40503) % 0xFFFFFF;\n const tertiary = (index * 811) % 0xFFFFFF;\n return {\n font: {\n family: index % 3 === 0 ? \"Calibri\" : (index % 3 === 1 ? \"Arial\" : \"Courier New\"),\n size: 10 + (index % 4),\n bold: index % 2 === 0,\n italic: index % 5 === 0,\n underline: index % 7 === 0 ? \"single\" : undefined,\n color: `#${primary.toString(16).padStart(6, \"0\")}`,\n },\n fill: {\n color: `#${secondary.toString(16).padStart(6, \"0\")}`,\n },\n border: {\n bottom: {\n style: BORDER_STYLES[index % BORDER_STYLES.length],\n color: `#${tertiary.toString(16).padStart(6, \"0\")}`,\n },\n },\n alignment: {\n horizontal: H_ALIGNMENTS[index % H_ALIGNMENTS.length],\n vertical: V_ALIGNMENTS[index % V_ALIGNMENTS.length],\n wrapText: index % 4 === 0,\n },\n numberFormat: FORMAT_ALIASES[index % FORMAT_ALIASES.length],\n };\n}\n\nfunction createStylePalette(size: number): SpreadsheetCellStyle[] {\n return Array.from({ length: size }, (_unused, index) => createStyle(index));\n}\n\nfunction createStyledWorkbook(\n rowCount: number,\n colCount: number,\n paletteSize: number,\n sheetName: string,\n): SpreadsheetDocument {\n const palette = createStylePalette(paletteSize);\n const rows = Array.from({ length: rowCount }, (_rowUnused, rowIndex) => ({\n cells: Array.from({ length: colCount }, (_colUnused, colIndex) => {\n const ordinal = rowIndex * colCount + colIndex;\n const style = palette[ordinal % palette.length];\n\n if (colIndex % 5 === 0) {\n return { value: `Row ${rowIndex + 1}`, style };\n }\n if (colIndex % 5 === 1) {\n return { value: ordinal, style };\n }\n if (colIndex % 5 === 2) {\n return { value: (rowIndex + 1) / (colIndex + 1), style };\n }\n if (colIndex % 5 === 3) {\n return { value: rowIndex % 2 === 0, style };\n }\n return { value: new Date(Date.UTC(2026, 0, (rowIndex % 28) + 1)), style };\n }),\n }));\n\n return {\n meta: {\n title: `${sheetName} ${rowCount}x${colCount}`,\n creator: \"PaperJSX\",\n },\n sheets: [\n {\n name: sheetName,\n rows,\n },\n ],\n };\n}\n\nfunction createPresetBenchmarkDocument(): SpreadsheetDocument {\n return {\n sheets: [\n {\n name: \"Presets\",\n rows: PRESET_NAMES.map((presetName, index) => ({\n cells: [\n { value: presetName },\n { value: `Preview ${index + 1}`, style: presetName },\n ],\n })),\n },\n ],\n };\n}\n\nfunction createUniqueStyleDocument(uniqueCount: number): SpreadsheetDocument {\n return {\n sheets: [\n {\n name: \"UniqueStyles\",\n rows: Array.from({ length: uniqueCount }, (_unused, index) => ({\n cells: [\n { value: `Style ${index + 1}`, style: createStyle(index) },\n ],\n })),\n },\n ],\n };\n}\n\nfunction createColumnCollapseSheet(): SpreadsheetSheet {\n return {\n name: \"Widths\",\n columns: Array.from({ length: 50 }, (_unused, groupIndex) => {\n const width = 8 + groupIndex;\n return Array.from({ length: 4 }, () => ({ width }));\n }).flat(),\n rows: [\n {\n cells: Array.from({ length: 200 }, (_unused, index) => ({ value: `Column ${index + 1}` })),\n },\n ],\n };\n}\n\nfunction createNumberFormatProbe(): SpreadsheetDocument {\n return {\n sheets: [\n {\n name: \"Formats\",\n rows: [\n {\n cells: [\n { value: 420000.5, style: { numberFormat: \"currency\" } },\n { value: 0.214, style: { numberFormat: \"percentage:2\" } },\n { value: new Date(\"2026-03-27T00:00:00.000Z\"), style: { numberFormat: \"date\" } },\n { value: new Date(\"2026-03-27T13:45:00.000Z\"), style: { numberFormat: \"datetime\" } },\n { value: 420000.5, style: { numberFormat: \"accounting\" } },\n ],\n },\n ],\n },\n ],\n };\n}\n\nfunction createDateProbe(): SpreadsheetDocument {\n return {\n sheets: [\n {\n name: \"Dates\",\n rows: [\n {\n cells: [\n { value: new Date(\"2026-03-27T00:00:00.000Z\") },\n { value: new Date(\"2026-03-27T13:45:00.000Z\"), style: { numberFormat: \"datetime\" } },\n ],\n },\n ],\n },\n ],\n };\n}\n\nfunction createPartialStyleProbe(): SpreadsheetDocument {\n return {\n sheets: [\n {\n name: \"Partial\",\n rows: [\n {\n cells: [\n { value: \"Bold only\", style: { font: { bold: true } } },\n { value: null, style: { fill: { color: \"#FFC7CE\" } } },\n ],\n },\n ],\n },\n ],\n };\n}\n\nfunction createConditionalFormattingProbe(): SpreadsheetConditionalFormatting[] {\n const rules: SpreadsheetConditionalFormattingRule[] = [\n {\n type: \"cellIs\",\n operator: \"greaterThan\",\n formula: \"100000\",\n style: \"success\",\n },\n {\n type: \"colorScale\",\n scale: {\n min: { type: \"min\", color: \"#F8696B\" },\n mid: { type: \"percentile\", value: 50, color: \"#FFEB84\" },\n max: { type: \"max\", color: \"#63BE7B\" },\n },\n },\n {\n type: \"dataBar\",\n color: \"#4472C4\",\n min: { type: \"min\" },\n max: { type: \"max\" },\n },\n {\n type: \"top10\",\n rank: 5,\n style: \"warning\",\n },\n {\n type: \"duplicateValues\",\n style: \"error\",\n },\n ];\n\n return [\n {\n ref: \"A1:T5000\",\n rules,\n },\n ];\n}\n\nasync function measureAsync<T>(\n iterations: number,\n task: () => Promise<T>,\n warmupIterations = 1,\n): Promise<{ stats: BenchmarkStats; lastValue: T }> {\n const durations: number[] = [];\n let lastValue!: T;\n for (let index = 0; index < warmupIterations; index += 1) {\n maybeGc();\n lastValue = await task();\n }\n for (let index = 0; index < iterations; index += 1) {\n maybeGc();\n const started = performance.now();\n lastValue = await task();\n durations.push(performance.now() - started);\n }\n return {\n stats: summarize(durations),\n lastValue,\n };\n}\n\nfunction measureSync<T>(\n iterations: number,\n task: () => T,\n warmupIterations = 1,\n): { stats: BenchmarkStats; lastValue: T } {\n const durations: number[] = [];\n let lastValue!: T;\n for (let index = 0; index < warmupIterations; index += 1) {\n maybeGc();\n lastValue = task();\n }\n for (let index = 0; index < iterations; index += 1) {\n maybeGc();\n const started = performance.now();\n lastValue = task();\n durations.push(performance.now() - started);\n }\n return {\n stats: summarize(durations),\n lastValue,\n };\n}\n\nasync function inspectStyles(buffer: Buffer) {\n const xml = await readZipEntry(buffer, \"xl/styles.xml\");\n return {\n xml,\n sizeBytes: Buffer.byteLength(xml, \"utf8\"),\n parsed: xmlParser.parse(xml),\n };\n}\n\nasync function inspectSheet(buffer: Buffer, index = 1) {\n const xml = await readZipEntry(buffer, `xl/worksheets/sheet${index}.xml`);\n return {\n xml,\n sizeBytes: Buffer.byteLength(xml, \"utf8\"),\n parsed: xmlParser.parse(xml),\n };\n}\n\nfunction countCellXfs(stylesParsed: any): number {\n return Number(stylesParsed.styleSheet.cellXfs?.[\"@_count\"] ?? 0);\n}\n\nfunction countNumFmts(stylesParsed: any): number {\n return Number(stylesParsed.styleSheet.numFmts?.[\"@_count\"] ?? 0);\n}\n\nfunction countStyleCollection(stylesParsed: any, key: \"numFmts\" | \"fonts\" | \"fills\" | \"borders\" | \"cellXfs\" | \"dxfs\"): number {\n const container = stylesParsed.styleSheet[key];\n if (!container) {\n return 0;\n }\n const declaredCount = Number(container[\"@_count\"]);\n if (Number.isFinite(declaredCount)) {\n return declaredCount;\n }\n const childKey = key === \"numFmts\"\n ? \"numFmt\"\n : (key === \"cellXfs\" ? \"xf\" : key.slice(0, -1));\n const child = container[childKey];\n if (!child) {\n return 0;\n }\n return Array.isArray(child) ? child.length : 1;\n}\n\nfunction createStylePartDiagnostics(\n styles: Awaited<ReturnType<typeof inspectStyles>>,\n classification: NonNullable<Phase2BenchmarkDiagnostics[\"classification\"]>,\n): Phase2BenchmarkDiagnostics {\n const componentCounts = {\n numFmts: countStyleCollection(styles.parsed, \"numFmts\"),\n fonts: countStyleCollection(styles.parsed, \"fonts\"),\n fills: countStyleCollection(styles.parsed, \"fills\"),\n borders: countStyleCollection(styles.parsed, \"borders\"),\n cellXfs: countStyleCollection(styles.parsed, \"cellXfs\"),\n dxfs: countStyleCollection(styles.parsed, \"dxfs\"),\n };\n const styleComponentCount = componentCounts.numFmts\n + componentCounts.fonts\n + componentCounts.fills\n + componentCounts.borders\n + componentCounts.cellXfs\n + componentCounts.dxfs;\n return {\n classification,\n keyPartBytes: {\n sheet1XmlBytes: 0,\n stylesXmlBytes: styles.sizeBytes,\n sharedStringsXmlBytes: 0,\n zipBytes: 0,\n },\n stylePart: {\n bytes: styles.sizeBytes,\n componentCounts,\n bytesPerCellXf: componentCounts.cellXfs > 0 ? styles.sizeBytes / componentCounts.cellXfs : Number.NaN,\n bytesPerStyleComponent: styleComponentCount > 0 ? styles.sizeBytes / styleComponentCount : Number.NaN,\n },\n };\n}\n\nfunction formatStylePartDiagnostics(diagnostics: Phase2BenchmarkDiagnostics): string {\n const stylePart = diagnostics.stylePart;\n if (!stylePart) {\n return \"\";\n }\n const counts = stylePart.componentCounts;\n return ` styles diagnostics: ${formatKb(stylePart.bytes)} styles.xml; components numFmts=${counts.numFmts}, fonts=${counts.fonts}, fills=${counts.fills}, borders=${counts.borders}, cellXfs=${counts.cellXfs}, dxfs=${counts.dxfs}; bytes/cellXf=${formatNullableRatio(stylePart.bytesPerCellXf)}; bytes/component=${formatNullableRatio(stylePart.bytesPerStyleComponent)}.`;\n}\n\nfunction countCols(sheetParsed: any): number {\n const cols = sheetParsed.worksheet.cols?.col;\n if (!cols) {\n return 0;\n }\n return Array.isArray(cols) ? cols.length : 1;\n}\n\ninterface ExcelJsBenchmarkLoaderOptions {\n envModulePath?: string;\n packageRequireBase?: string | URL | false;\n tempRequireBase?: string | false;\n}\n\ninterface ExcelJsBenchmarkModuleResult {\n status: \"loaded\" | \"missing\";\n module?: any;\n source?: string;\n message?: string;\n}\n\nconst defaultTempExcelJsRequireBase = \"/tmp/paperjsx-xlsx-bench-deps/package.json\";\n\nfunction getDefaultPackageRequireBase(): string {\n return resolve(process.cwd(), \"package.json\");\n}\n\nfunction normalizeExcelJsModule(moduleValue: any): any {\n return moduleValue?.default ?? moduleValue;\n}\n\nasync function importExcelJsFromPath(modulePath: string): Promise<any> {\n const resolvedPath = resolve(modulePath);\n return normalizeExcelJsModule(await import(pathToFileURL(resolvedPath).href));\n}\n\nfunction requireExcelJsFromBase(requireBase: string | URL): any {\n const requireFromBase = createRequire(requireBase);\n return normalizeExcelJsModule(requireFromBase(\"exceljs\"));\n}\n\nexport async function loadExcelJsBenchmarkModule(\n options: ExcelJsBenchmarkLoaderOptions = {},\n): Promise<ExcelJsBenchmarkModuleResult> {\n const failures: string[] = [];\n const envModulePath = options.envModulePath ?? process.env.PAPERJSX_XLSX_EXCELJS_MODULE_PATH;\n if (envModulePath) {\n try {\n return {\n status: \"loaded\",\n module: await importExcelJsFromPath(envModulePath),\n source: `PAPERJSX_XLSX_EXCELJS_MODULE_PATH=${envModulePath}`,\n };\n } catch (error) {\n failures.push(`configured path ${envModulePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n const packageRequireBase = options.packageRequireBase ?? getDefaultPackageRequireBase();\n if (packageRequireBase !== false) {\n try {\n return {\n status: \"loaded\",\n module: requireExcelJsFromBase(packageRequireBase),\n source: \"package-local exceljs dependency\",\n };\n } catch (error) {\n failures.push(`package-local exceljs: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n failures.push(\"package-local exceljs: skipped by loader options\");\n }\n\n const tempRequireBase = options.tempRequireBase ?? defaultTempExcelJsRequireBase;\n if (tempRequireBase !== false) {\n try {\n return {\n status: \"loaded\",\n module: requireExcelJsFromBase(tempRequireBase),\n source: tempRequireBase,\n };\n } catch (error) {\n failures.push(`temp benchmark exceljs: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n failures.push(\"temp benchmark exceljs: skipped by loader options\");\n }\n\n return {\n status: \"missing\",\n message: `ExcelJS competitor baseline unavailable. Install exceljs as a package-local devDependency or set PAPERJSX_XLSX_EXCELJS_MODULE_PATH to an ExcelJS module file. Loader failures: ${failures.join(\" | \")}`,\n };\n}\n\nfunction argbColor(color: string | undefined): { argb: string } | undefined {\n if (!color) {\n return undefined;\n }\n if (color.startsWith(\"#\")) {\n return { argb: `FF${color.slice(1).toUpperCase()}` };\n }\n return undefined;\n}\n\nfunction excelJsCellValue(value: CellValue | undefined): any {\n if (isRichTextValue(value)) {\n return { richText: value.map((run) => ({ text: run.text })) };\n }\n if (value && typeof value === \"object\" && \"error\" in value) {\n return { error: value.error };\n }\n return value ?? null;\n}\n\nfunction applyExcelJsCellStyle(cell: any, styleInput: SpreadsheetCellStyleInput | undefined, value: CellValue | undefined): void {\n const style = resolveCellStyle(styleInput, value);\n if (!style) {\n return;\n }\n if (style.numberFormat) {\n cell.numFmt = style.numberFormat;\n }\n if (style.font) {\n const fontColor = argbColor(style.font.color);\n cell.font = {\n name: style.font.family,\n size: style.font.size,\n bold: style.font.bold,\n italic: style.font.italic,\n underline: style.font.underline,\n strike: style.font.strikethrough,\n color: fontColor,\n };\n }\n if (style.fill?.color) {\n cell.fill = {\n type: \"pattern\",\n pattern: \"solid\",\n fgColor: argbColor(style.fill.color),\n };\n }\n if (style.border) {\n const edge = (edgeStyle: typeof style.border.bottom) => edgeStyle\n ? { style: edgeStyle.style, color: argbColor(edgeStyle.color) }\n : undefined;\n cell.border = {\n top: edge(style.border.top),\n left: edge(style.border.left),\n bottom: edge(style.border.bottom),\n right: edge(style.border.right),\n };\n }\n if (style.alignment) {\n cell.alignment = {\n horizontal: style.alignment.horizontal,\n vertical: style.alignment.vertical,\n wrapText: style.alignment.wrapText,\n textRotation: style.alignment.textRotation,\n indent: style.alignment.indent,\n shrinkToFit: style.alignment.shrinkToFit,\n readingOrder: style.alignment.readingOrder,\n };\n }\n}\n\nasync function renderExcelJsStyledWorkbook(document: SpreadsheetDocument, ExcelJS: any): Promise<Buffer> {\n const workbook = new ExcelJS.Workbook();\n for (const sheet of document.sheets) {\n const worksheet = workbook.addWorksheet(sheet.name);\n sheet.rows.forEach((row, rowIndex) => {\n const excelRow = worksheet.getRow(rowIndex + 1);\n row.cells.forEach((cell, columnIndex) => {\n const excelCell = excelRow.getCell(columnIndex + 1);\n excelCell.value = excelJsCellValue(cell.value);\n applyExcelJsCellStyle(excelCell, cell.style, cell.value);\n });\n excelRow.commit?.();\n });\n }\n return Buffer.from(await workbook.xlsx.writeBuffer());\n}\n\nasync function runStyleRegistryBenchmarks(iterations: number): Promise<Phase2BenchmarkResult[]> {\n const styles1k = Array.from({ length: 1_000 }, (_unused, index) => createStyle(index));\n const styles10k = Array.from({ length: 10_000 }, (_unused, index) => createStyle(index));\n const styles100kDuplicateHeavy = Array.from({ length: 100_000 }, (_unused, index) => styles10k[index % styles10k.length]);\n const styles100kUnique = Array.from({ length: 100_000 }, (_unused, index) => createStyle(index));\n\n const oneThousand = measureSync(iterations, () => {\n const registry = new StyleRegistry();\n for (const style of styles1k) {\n registry.registerStyle(style);\n }\n return registry;\n });\n\n const tenThousand = measureSync(iterations, () => {\n const registry = new StyleRegistry();\n for (const style of styles10k) {\n registry.registerStyle(style);\n }\n return registry;\n });\n\n const hundredThousandDuplicateHeavy = measureSync(iterations, () => {\n const registry = new StyleRegistry();\n for (const style of styles100kDuplicateHeavy) {\n registry.registerStyle(style);\n }\n return registry;\n });\n\n const hundredThousandUnique = measureSync(iterations, () => {\n const registry = new StyleRegistry();\n for (const style of styles100kUnique) {\n registry.registerStyle(style);\n }\n return registry;\n });\n\n return [\n benchmarkResult(\"F1\", \"F\", \"StyleRegistry \u2014 1K unique styles\", \"< 5ms\", passFailFromUpperBound(oneThousand.stats.p95, 5), `p95 ${formatMs(oneThousand.stats.p95)}`),\n benchmarkResult(\"F2\", \"F\", \"StyleRegistry \u2014 10K unique styles\", \"< 50ms\", passFailFromUpperBound(tenThousand.stats.p95, 50), `p95 ${formatMs(tenThousand.stats.p95)}`),\n benchmarkResult(\"F3\", \"F\", \"StyleRegistry \u2014 100K styles, 90% duplication\", \"< 150ms\", passFailFromUpperBound(hundredThousandDuplicateHeavy.stats.p95, 150), `p95 ${formatMs(hundredThousandDuplicateHeavy.stats.p95)}`),\n benchmarkResult(\"F4\", \"F\", \"StyleRegistry \u2014 100K styles, 0% duplication\", \"< 400ms\", passFailFromUpperBound(hundredThousandUnique.stats.p95, 400), `p95 ${formatMs(hundredThousandUnique.stats.p95)}`),\n ];\n}\n\nasync function runRenderBenchmarks(iterations: number): Promise<Phase2BenchmarkResult[]> {\n const styled10kDocument = createStyledWorkbook(10_000, 20, 500, \"Styled10K\");\n const styled50kDocument = createStyledWorkbook(50_000, 20, 500, \"Styled50K\");\n const unstyled10kDocument = SpreadsheetEngine.validate(getPhase1Fixture(\"large-10k\").document);\n const validatedStyled10kDocument = SpreadsheetEngine.validate(styled10kDocument);\n const validatedStyled50kDocument = SpreadsheetEngine.validate(styled50kDocument);\n\n const styled10k = await measureAsync(iterations, () => SpreadsheetEngine.renderValidated(validatedStyled10kDocument));\n const styled50k = await measureAsync(Math.max(1, Math.min(iterations, 2)), () => SpreadsheetEngine.renderValidated(validatedStyled50kDocument));\n const unstyled10k = await measureAsync(iterations, () => SpreadsheetEngine.renderValidated(unstyled10kDocument));\n const styled10kSnapshot = await SpreadsheetEngine.renderWithMetrics(styled10kDocument);\n const styled50kSnapshot = await SpreadsheetEngine.renderWithMetrics(styled50kDocument);\n const styleOverheadRatio = styled10k.stats.p95 / Math.max(unstyled10k.stats.p95, 1);\n const styled10kPerformanceDiagnostics: Phase2BenchmarkDiagnostics = {\n bottleneck: inferBottleneck(styled10kSnapshot.metrics.stageMetrics),\n classification: \"active-performance-debt\",\n keyPartBytes: styled10kSnapshot.metrics.keyPartBytes,\n stageMetrics: styled10kSnapshot.metrics.stageMetrics,\n };\n const styled50kDiagnostics: Phase2BenchmarkDiagnostics = {\n bottleneck: inferBottleneck(styled50kSnapshot.metrics.stageMetrics),\n classification: \"active-performance-debt\",\n keyPartBytes: styled50kSnapshot.metrics.keyPartBytes,\n stageMetrics: styled50kSnapshot.metrics.stageMetrics,\n };\n\n const registry = new StyleRegistry();\n const conditionalFormatting = createConditionalFormattingProbe();\n const conditionalFormattingStats = measureSync(iterations, () => serializeConditionalFormatting(conditionalFormatting, registry));\n\n return [\n benchmarkResult(\n \"F5\",\n \"F\",\n \"Styled 10K\u00D720 generation\",\n \"< 600ms\",\n passFailFromUpperBound(styled10k.stats.p95, 600),\n `p95 ${formatMs(styled10k.stats.p95)}`,\n `breakdown (${styled10kPerformanceDiagnostics.bottleneck}): ${formatRenderDecomposition(styled10kSnapshot.metrics.stageMetrics)}`,\n styled10kPerformanceDiagnostics,\n ),\n benchmarkResult(\n \"F6\",\n \"F\",\n \"Styled 50K\u00D720 generation\",\n \"< 3,000ms\",\n passFailFromUpperBound(styled50k.stats.p95, 3000),\n `p95 ${formatMs(styled50k.stats.p95)}`,\n `breakdown (${styled50kDiagnostics.bottleneck}): ${formatRenderDecomposition(styled50kSnapshot.metrics.stageMetrics)}`,\n styled50kDiagnostics,\n ),\n benchmarkResult(\n \"F7\",\n \"F\",\n \"Style overhead ratio\",\n \"< 1.5\u00D7\",\n passFailFromUpperBound(styleOverheadRatio, 1.5),\n `ratio ${styleOverheadRatio.toFixed(2)}\u00D7`,\n `styled10k breakdown (${styled10kPerformanceDiagnostics.bottleneck}): ${formatRenderDecomposition(styled10kSnapshot.metrics.stageMetrics)}`,\n styled10kPerformanceDiagnostics,\n ),\n benchmarkResult(\"F8\", \"F\", \"Conditional formatting on 100K cells\", \"< 200ms\", passFailFromUpperBound(conditionalFormattingStats.stats.p95, 200), `p95 ${formatMs(conditionalFormattingStats.stats.p95)}`),\n ];\n}\n\nasync function runEfficiencyBenchmarks(): Promise<Phase2BenchmarkResult[]> {\n const presetBuffer = await SpreadsheetEngine.render(createPresetBenchmarkDocument());\n const presetStyles = await inspectStyles(presetBuffer);\n const presetDiagnostics = createStylePartDiagnostics(presetStyles, \"benchmark-target-mismatch-candidate\");\n\n const hundredUniqueBuffer = await SpreadsheetEngine.render(createUniqueStyleDocument(100));\n const hundredUniqueStyles = await inspectStyles(hundredUniqueBuffer);\n const hundredUniqueDiagnostics = createStylePartDiagnostics(hundredUniqueStyles, \"benchmark-target-mismatch-candidate\");\n\n const tenThousandUniqueBuffer = await SpreadsheetEngine.render(createUniqueStyleDocument(10_000));\n const tenThousandUniqueStyles = await inspectStyles(tenThousandUniqueBuffer);\n const tenThousandUniqueDiagnostics = createStylePartDiagnostics(tenThousandUniqueStyles, \"benchmark-target-mismatch-candidate\");\n\n const styled10kDocument = createStyledWorkbook(10_000, 20, 500, \"Styled10K\");\n const styled10kRender = await SpreadsheetEngine.renderWithMetrics(styled10kDocument);\n const styled10kBuffer = styled10kRender.buffer;\n const styled10kStyles = await inspectStyles(styled10kBuffer);\n const styledCellCount = 10_000 * 20;\n const uniqueCellXfs = Math.max(0, countCellXfs(styled10kStyles.parsed) - 1);\n const dedupRatio = uniqueCellXfs === 0 ? 1 : 1 - (uniqueCellXfs / styledCellCount);\n const styled10kPerformanceDiagnostics: Phase2BenchmarkDiagnostics = {\n bottleneck: inferBottleneck(styled10kRender.metrics.stageMetrics),\n classification: \"active-performance-debt\",\n keyPartBytes: styled10kRender.metrics.keyPartBytes,\n stageMetrics: styled10kRender.metrics.stageMetrics,\n };\n const styled10kSizeDiagnostics: Phase2BenchmarkDiagnostics = {\n ...classifyWorkbookSizeDiagnostics(styled10kRender.metrics.keyPartBytes, 500 * 1024),\n bottleneck: styled10kPerformanceDiagnostics.bottleneck,\n stageMetrics: styled10kRender.metrics.stageMetrics,\n stylePart: createStylePartDiagnostics(styled10kStyles, \"active-performance-debt\").stylePart,\n };\n const practicalFloorNote = styled10kSizeDiagnostics.classification === \"benchmark-target-mismatch-candidate\"\n ? ` practical floor signal: dominant ${styled10kSizeDiagnostics.payloadDominantPart} payload still exceeds target by ${formatKb(styled10kSizeDiagnostics.practicalFloorGapBytes ?? 0)}.`\n : \"\";\n const excelJsLoad = await loadExcelJsBenchmarkModule();\n let excelJsResult: Phase2BenchmarkResult;\n if (excelJsLoad.status === \"loaded\") {\n try {\n const excelJsBuffer = await renderExcelJsStyledWorkbook(styled10kDocument, excelJsLoad.module);\n const ratio = styled10kBuffer.length / Math.max(1, excelJsBuffer.length);\n excelJsResult = benchmarkResult(\n \"G6\",\n \"G\",\n \"Styled file size vs ExcelJS\",\n \"\u2264 110% of ExcelJS\",\n passFailFromUpperBound(ratio, 1.10),\n `PaperJSX ${formatKb(styled10kBuffer.length)}; ExcelJS ${formatKb(excelJsBuffer.length)}; ratio ${ratio.toFixed(2)}\u00D7`,\n `ExcelJS loaded from ${excelJsLoad.source ?? \"unknown source\"}.`,\n );\n } catch (error) {\n excelJsResult = benchmarkResult(\n \"G6\",\n \"G\",\n \"Styled file size vs ExcelJS\",\n \"\u2264 110% of ExcelJS\",\n \"blocked\",\n `ExcelJS baseline render failed: ${error instanceof Error ? error.message : String(error)}`,\n `ExcelJS loaded from ${excelJsLoad.source ?? \"unknown source\"}, but the competitor render could not complete.`,\n );\n }\n } else {\n excelJsResult = benchmarkResult(\n \"G6\",\n \"G\",\n \"Styled file size vs ExcelJS\",\n \"\u2264 110% of ExcelJS\",\n \"blocked\",\n excelJsLoad.message ?? \"ExcelJS competitor baseline unavailable.\",\n \"Install `exceljs` as a package-local devDependency or set PAPERJSX_XLSX_EXCELJS_MODULE_PATH.\",\n );\n }\n\n return [\n benchmarkResult(\n \"G1\",\n \"G\",\n \"styles.xml size \u2014 presets catalog\",\n \"calibrated warning when raw styles.xml exceeds legacy < 3 KB budget\",\n classifySizeEfficiencyStatus(presetStyles.sizeBytes, 3 * 1024, presetDiagnostics),\n formatKb(presetStyles.sizeBytes),\n `Measured with ${PRESET_NAMES.length} current presets. Raw OOXML styles part benchmark; no archive contribution remains at this stage.${formatStylePartDiagnostics(presetDiagnostics)}`,\n presetDiagnostics,\n ),\n benchmarkResult(\n \"G2\",\n \"G\",\n \"styles.xml size \u2014 100 unique styles\",\n \"calibrated warning when raw styles.xml exceeds legacy < 15 KB budget\",\n classifySizeEfficiencyStatus(hundredUniqueStyles.sizeBytes, 15 * 1024, hundredUniqueDiagnostics),\n formatKb(hundredUniqueStyles.sizeBytes),\n `Raw OOXML styles part benchmark; no archive contribution remains at this stage.${formatStylePartDiagnostics(hundredUniqueDiagnostics)}`,\n hundredUniqueDiagnostics,\n ),\n benchmarkResult(\n \"G3\",\n \"G\",\n \"styles.xml size \u2014 10K unique styles\",\n \"calibrated warning when raw styles.xml exceeds legacy < 200 KB budget\",\n classifySizeEfficiencyStatus(tenThousandUniqueStyles.sizeBytes, 200 * 1024, tenThousandUniqueDiagnostics),\n formatKb(tenThousandUniqueStyles.sizeBytes),\n `Raw OOXML styles part benchmark; no archive contribution remains at this stage.${formatStylePartDiagnostics(tenThousandUniqueDiagnostics)}`,\n tenThousandUniqueDiagnostics,\n ),\n benchmarkResult(\"G4\", \"G\", \"Deduplication ratio\", \"> 95%\", passFailFromLowerBound(dedupRatio, 0.95), formatRatio(dedupRatio), `${uniqueCellXfs} unique cellXfs across ${styledCellCount} styled cells.`),\n benchmarkResult(\n \"G5\",\n \"G\",\n \"Styled file size \u2014 10K\u00D720\",\n \"calibrated warning when workbook exceeds legacy < 500 KB budget\",\n classifySizeEfficiencyStatus(styled10kBuffer.length, 500 * 1024, styled10kSizeDiagnostics),\n formatKb(styled10kBuffer.length),\n `payload (${styled10kPerformanceDiagnostics.bottleneck}; dominant ${styled10kSizeDiagnostics.payloadDominantPart}): ${formatKeyPartBytes(styled10kRender.metrics.keyPartBytes)}; ${formatRenderDecomposition(styled10kRender.metrics.stageMetrics)}.${practicalFloorNote}${formatStylePartDiagnostics(styled10kSizeDiagnostics)}`,\n styled10kSizeDiagnostics,\n ),\n excelJsResult,\n ];\n}\n\nasync function runSizingBenchmarks(iterations: number): Promise<Phase2BenchmarkResult[]> {\n const collapseBuffer = await SpreadsheetEngine.render({ sheets: [createColumnCollapseSheet()] });\n const collapseSheet = await inspectSheet(collapseBuffer);\n const columnCount = countCols(collapseSheet.parsed);\n\n const largeSheet = getPhase1Fixture(\"large-50k\").document.sheets[0];\n const sizingStats = measureSync(iterations, () => computeColumnLayout(largeSheet));\n\n return [\n benchmarkResult(\"H1\", \"H\", \"Column width accuracy\", \"Within \u00B120% of Excel AutoFit\", \"blocked\", \"Requires Excel AutoFit comparison\", \"Use the generated fixtures in the manual validation pack.\"),\n benchmarkResult(\"H2\", \"H\", \"Row height accuracy \u2014 wrapText\", \"Within \u00B11 line of Excel\", \"blocked\", \"Requires Excel visual comparison\", \"Use the generated fixtures in the manual validation pack.\"),\n benchmarkResult(\"H3\", \"H\", \"Column collapse optimization\", \"\u2264 50 <col> elements\", passFailFromUpperBound(columnCount, 50), `${columnCount} <col> elements`),\n benchmarkResult(\"H4\", \"H\", \"Column width computation \u2014 50K rows\", \"< 100ms\", passFailFromUpperBound(sizingStats.stats.p95, 100), `p95 ${formatMs(sizingStats.stats.p95)}`),\n ];\n}\n\nasync function runCorrectnessBenchmarks(): Promise<Phase2BenchmarkResult[]> {\n const numberFormatBuffer = await SpreadsheetEngine.render(createNumberFormatProbe());\n const numberFormatStyles = await inspectStyles(numberFormatBuffer);\n\n const dateBuffer = await SpreadsheetEngine.render(createDateProbe());\n const dateStyles = await inspectStyles(dateBuffer);\n const dateSheet = await inspectSheet(dateBuffer);\n\n const partialBuffer = await SpreadsheetEngine.render(createPartialStyleProbe());\n const partialStyles = await inspectStyles(partialBuffer);\n const partialSheet = await inspectSheet(partialBuffer);\n\n const partialXfs = partialStyles.parsed.styleSheet.cellXfs.xf;\n const partialCellXf = Array.isArray(partialXfs) ? partialXfs[1] : partialXfs;\n const partialReferencesOnlyFont = partialCellXf?.[\"@_fontId\"] === \"1\"\n && partialCellXf?.[\"@_fillId\"] === \"0\"\n && partialCellXf?.[\"@_borderId\"] === \"0\"\n && partialCellXf?.[\"@_numFmtId\"] === \"0\"\n && partialCellXf?.alignment === undefined;\n\n const cfRegistry = new StyleRegistry();\n const cfOutput = serializeConditionalFormatting(createConditionalFormattingProbe(), cfRegistry);\n const cfXml = cfOutput.xml;\n\n return [\n benchmarkResult(\"E1\", \"E\", \"Font rendering fidelity\", \"Visual match across 5 target apps\", \"blocked\", \"Manual app validation required\", \"Use `phase2-font-fill-border.xlsx` and compare in Excel, Sheets, Numbers, and LibreOffice.\"),\n benchmarkResult(\"E2\", \"E\", \"Fill rendering fidelity\", \"20 fills render correctly\", \"blocked\", \"Manual app validation required\", \"Use `phase2-font-fill-border.xlsx` for color verification.\"),\n benchmarkResult(\"E3\", \"E\", \"Border rendering fidelity\", \"13 border styles render correctly\", \"blocked\", \"Manual app validation required\", \"Add screenshots from Excel and LibreOffice to close this benchmark.\"),\n benchmarkResult(\n \"E4\",\n \"E\",\n \"Number format correctness\",\n \"Built-in/custom formats display correctly\",\n \"blocked\",\n `${countNumFmts(numberFormatStyles.parsed)} custom numFmts emitted; alias XML looks correct`,\n \"Structural proxy passed locally, but display correctness still needs Excel-family apps.\",\n ),\n benchmarkResult(\n \"E5\",\n \"E\",\n \"Date formatting round-trip\",\n \"Dates display as dates, not serials\",\n \"blocked\",\n dateStyles.xml.includes('formatCode=\"yyyy-mm-dd\"') && dateSheet.xml.includes('s=\"1\"')\n ? \"Auto date style emitted structurally\"\n : \"Date style emission failed structurally\",\n \"Structural proxy passed locally, but round-trip editing still needs Excel.\",\n ),\n benchmarkResult(\"E6\", \"E\", \"Alignment correctness\", \"All alignment modes render correctly\", \"blocked\", \"Manual app validation required\", \"Use `phase2-alignment-richtext.xlsx` for wrap, alignment, and rotation checks.\"),\n benchmarkResult(\"E7\", \"E\", \"Preset visual match\", \"Presets match reference screenshots\", \"blocked\", \"Reference screenshots not captured yet\", \"Use `phase2-presets.xlsx` as the capture source.\"),\n benchmarkResult(\"E8\", \"E\", \"Rich text rendering\", \"Per-run formatting preserved\", \"blocked\", \"Manual app validation required\", \"Use `phase2-alignment-richtext.xlsx` to verify there is no fallback font.\"),\n benchmarkResult(\"E9\", \"E\", \"Conditional formatting \u2014 cellIs\", \"Differential format applies correctly\", \"blocked\", cfXml.includes('type=\"cellIs\"') ? \"Structural XML emitted\" : \"Missing cellIs XML\", \"Visual app validation still required.\"),\n benchmarkResult(\"E10\", \"E\", \"Conditional formatting \u2014 colorScale\", \"Visible gradient across range\", \"blocked\", cfXml.includes('type=\"colorScale\"') ? \"Structural XML emitted\" : \"Missing colorScale XML\", \"Visual app validation still required.\"),\n benchmarkResult(\"E11\", \"E\", \"Conditional formatting \u2014 dataBar\", \"Bars render proportionally\", \"blocked\", cfXml.includes('type=\"dataBar\"') ? \"Structural XML emitted\" : \"Missing dataBar XML\", \"Visual app validation still required.\"),\n benchmarkResult(\n \"E12\",\n \"E\",\n \"Style inheritance\",\n \"Partial styles do not leak garbage defaults\",\n partialReferencesOnlyFont ? \"pass\" : \"fail\",\n partialReferencesOnlyFont ? \"Partial xf only references font overrides\" : \"Unexpected style component references\",\n ),\n benchmarkResult(\n \"E13\",\n \"E\",\n \"Empty styled cells\",\n \"Style renders on empty cells\",\n partialSheet.xml.includes('<c r=\"B1\" s=\"2\"/>') ? \"pass\" : \"fail\",\n partialSheet.xml.includes('<c r=\"B1\" s=\"2\"/>') ? \"Styled empty cell emitted\" : \"Styled empty cell missing\",\n ),\n ];\n}\n\nexport async function runPhase2BenchmarkSuite(iterations = 3): Promise<Phase2BenchmarkReport> {\n maybeGc();\n const correctness = await runCorrectnessBenchmarks();\n maybeGc();\n const styleRegistry = await runStyleRegistryBenchmarks(iterations);\n maybeGc();\n const render = await runRenderBenchmarks(iterations);\n maybeGc();\n const efficiency = await runEfficiencyBenchmarks();\n maybeGc();\n const sizing = await runSizingBenchmarks(iterations);\n\n const results = [\n ...correctness,\n ...styleRegistry,\n ...render,\n ...efficiency,\n ...sizing,\n ];\n\n const summary = results.reduce<Phase2BenchmarkSummary>((accumulator, result) => {\n accumulator.total += 1;\n if (result.status === \"pass\") accumulator.passed += 1;\n if (result.status === \"warn\") accumulator.warned += 1;\n if (result.status === \"fail\") accumulator.failed += 1;\n if (result.status === \"blocked\") accumulator.blocked += 1;\n return accumulator;\n }, {\n total: 0,\n passed: 0,\n warned: 0,\n failed: 0,\n blocked: 0,\n });\n\n return {\n generatedAt: new Date().toISOString(),\n environment: {\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n },\n summary,\n results,\n };\n}\n\nexport async function renderPhase2BenchmarkReport(iterations = 3): Promise<string> {\n const report = await runPhase2BenchmarkSuite(iterations);\n const lines: string[] = [\n \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\",\n \" PaperJSX XLSX Engine \u2014 Phase 2 Local Benchmark Report\",\n ` Node.js ${report.environment.node} | ${report.environment.platform} ${report.environment.arch}`,\n \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\",\n \"\",\n ` SUMMARY pass=${report.summary.passed} warn=${report.summary.warned} fail=${report.summary.failed} blocked=${report.summary.blocked} total=${report.summary.total}`,\n \"\",\n ];\n\n for (const group of [\"E\", \"F\", \"G\", \"H\"] as const) {\n lines.push(` GROUP ${group}`);\n for (const result of report.results.filter((entry) => entry.group === group)) {\n const marker = result.status === \"pass\" ? \"\u2713\" : (result.status === \"warn\" ? \"!\" : (result.status === \"fail\" ? \"\u2717\" : \"\u2022\"));\n lines.push(` ${marker} ${result.id.padEnd(3)} ${result.name}`);\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 }\n\n lines.push(\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\");\n return lines.join(\"\\n\");\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DETERMINISTIC_ZIP_DATE,
|
|
3
|
+
SpreadsheetEngine,
|
|
4
|
+
XML_DECLARATION
|
|
5
|
+
} from "./chunk-S5RMAWLC.js";
|
|
6
|
+
|
|
7
|
+
// src/diagnostics/workloads.ts
|
|
8
|
+
function createRepairCorpusDocument() {
|
|
9
|
+
return {
|
|
10
|
+
namedRanges: [
|
|
11
|
+
{ name: "LedgerWindow", ref: "Ledger!$A$2:$D$5" }
|
|
12
|
+
],
|
|
13
|
+
sheets: [
|
|
14
|
+
{
|
|
15
|
+
name: "Ledger",
|
|
16
|
+
dataValidations: [
|
|
17
|
+
{
|
|
18
|
+
ref: "C3:C20",
|
|
19
|
+
type: "list",
|
|
20
|
+
formula1: '"Open,Closed,Pending"',
|
|
21
|
+
allowBlank: true
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
rows: [
|
|
25
|
+
{
|
|
26
|
+
cells: [
|
|
27
|
+
{
|
|
28
|
+
value: "Ledger Overview",
|
|
29
|
+
colSpan: 4,
|
|
30
|
+
style: {
|
|
31
|
+
fill: { color: "#D9E2F3" },
|
|
32
|
+
alignment: { horizontal: "center", vertical: "center" },
|
|
33
|
+
border: {
|
|
34
|
+
top: { style: "thin", color: "#5B9BD5" },
|
|
35
|
+
bottom: { style: "thin", color: "#5B9BD5" },
|
|
36
|
+
left: { style: "thin", color: "#5B9BD5" },
|
|
37
|
+
right: { style: "thin", color: "#5B9BD5" }
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
cells: [
|
|
45
|
+
{ value: "Account", style: "header" },
|
|
46
|
+
{ value: "Amount", style: "header" },
|
|
47
|
+
{ value: "Status", style: "header" },
|
|
48
|
+
{ value: "Docs", style: "header" }
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
cells: [
|
|
53
|
+
{ value: "Northwind" },
|
|
54
|
+
{ value: 12e4, style: "currency" },
|
|
55
|
+
{ value: "Open" },
|
|
56
|
+
{
|
|
57
|
+
value: "Policy",
|
|
58
|
+
hyperlink: {
|
|
59
|
+
target: "https://example.com/policy",
|
|
60
|
+
tooltip: "Open the policy document"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
cells: [
|
|
67
|
+
{ value: "Contoso" },
|
|
68
|
+
{ value: 85500, style: "currency" },
|
|
69
|
+
{ value: "Closed" },
|
|
70
|
+
{
|
|
71
|
+
value: "Guide",
|
|
72
|
+
hyperlink: {
|
|
73
|
+
location: "Lookups!A1",
|
|
74
|
+
display: "Jump to lookup sheet"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
cells: [
|
|
81
|
+
{ value: "Fabrikam" },
|
|
82
|
+
{ value: 61250, style: "currency" },
|
|
83
|
+
{ value: "Pending" },
|
|
84
|
+
{ value: "Escalated" }
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
],
|
|
88
|
+
tables: [
|
|
89
|
+
{
|
|
90
|
+
name: "LedgerTable",
|
|
91
|
+
ref: "A2:D5",
|
|
92
|
+
columns: [{}, {}, {}, {}],
|
|
93
|
+
style: {
|
|
94
|
+
name: "TableStyleMedium2"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: "Lookups",
|
|
101
|
+
rows: [
|
|
102
|
+
{ cells: [{ value: "Open" }] },
|
|
103
|
+
{ cells: [{ value: "Closed" }] },
|
|
104
|
+
{ cells: [{ value: "Pending" }] }
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function createDuplicateTablesDocument() {
|
|
111
|
+
return {
|
|
112
|
+
sheets: [
|
|
113
|
+
{
|
|
114
|
+
name: "North",
|
|
115
|
+
rows: [
|
|
116
|
+
{
|
|
117
|
+
cells: [
|
|
118
|
+
{ value: "Region" },
|
|
119
|
+
{ value: "Revenue" }
|
|
120
|
+
]
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
cells: [
|
|
124
|
+
{ value: "NA" },
|
|
125
|
+
{ value: 120 }
|
|
126
|
+
]
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
cells: [
|
|
130
|
+
{ value: "EMEA" },
|
|
131
|
+
{ value: 180 }
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
],
|
|
135
|
+
tables: [
|
|
136
|
+
{
|
|
137
|
+
name: "NorthTable",
|
|
138
|
+
ref: "A1:B3",
|
|
139
|
+
columns: [{}, {}]
|
|
140
|
+
}
|
|
141
|
+
]
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: "South",
|
|
145
|
+
rows: [
|
|
146
|
+
{
|
|
147
|
+
cells: [
|
|
148
|
+
{ value: "Region" },
|
|
149
|
+
{ value: "Revenue" }
|
|
150
|
+
]
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
cells: [
|
|
154
|
+
{ value: "APAC" },
|
|
155
|
+
{ value: 90 }
|
|
156
|
+
]
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
cells: [
|
|
160
|
+
{ value: "LATAM" },
|
|
161
|
+
{ value: 75 }
|
|
162
|
+
]
|
|
163
|
+
}
|
|
164
|
+
],
|
|
165
|
+
tables: [
|
|
166
|
+
{
|
|
167
|
+
name: "SouthTable",
|
|
168
|
+
ref: "A1:B3",
|
|
169
|
+
columns: [{}, {}]
|
|
170
|
+
}
|
|
171
|
+
]
|
|
172
|
+
}
|
|
173
|
+
]
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function createTemplateBenchmarkDocument() {
|
|
177
|
+
return {
|
|
178
|
+
namedRanges: [
|
|
179
|
+
{ name: "InvoiceHeader", ref: "Invoice!$B$1" },
|
|
180
|
+
{ name: "LineItems", ref: "Invoice!$A$4:$D$4" }
|
|
181
|
+
],
|
|
182
|
+
sheets: [
|
|
183
|
+
{
|
|
184
|
+
name: "Invoice",
|
|
185
|
+
rows: [
|
|
186
|
+
{
|
|
187
|
+
cells: [
|
|
188
|
+
{ value: "Customer" },
|
|
189
|
+
{ value: "Acme Co" }
|
|
190
|
+
]
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
cells: [
|
|
194
|
+
{ value: "Prepared" },
|
|
195
|
+
{ value: new Date(Date.UTC(2026, 2, 28)) }
|
|
196
|
+
]
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
cells: [
|
|
200
|
+
{ value: "Item", style: "header" },
|
|
201
|
+
{ value: "Qty", style: "header" },
|
|
202
|
+
{ value: "Price", style: "header" },
|
|
203
|
+
{ value: "Total", style: "header" }
|
|
204
|
+
]
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
cells: [
|
|
208
|
+
{ value: "Starter" },
|
|
209
|
+
{ value: 1 },
|
|
210
|
+
{ value: 10 },
|
|
211
|
+
{ formula: "B4*C4", style: "currency" }
|
|
212
|
+
]
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
cells: [
|
|
216
|
+
{ value: "Grand Total" },
|
|
217
|
+
{ value: null },
|
|
218
|
+
{ value: null },
|
|
219
|
+
{ formula: "SUM(D4:D4)", style: "currency" }
|
|
220
|
+
]
|
|
221
|
+
}
|
|
222
|
+
],
|
|
223
|
+
tables: [
|
|
224
|
+
{
|
|
225
|
+
name: "InvoiceTable",
|
|
226
|
+
ref: "A3:D4",
|
|
227
|
+
columns: [{}, {}, {}, {}],
|
|
228
|
+
style: {
|
|
229
|
+
name: "TableStyleMedium9"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
]
|
|
233
|
+
}
|
|
234
|
+
]
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// src/diagnostics/corruption.ts
|
|
239
|
+
import { XMLBuilder, XMLParser } from "fast-xml-parser";
|
|
240
|
+
import JSZip from "jszip";
|
|
241
|
+
var xmlParser = new XMLParser({
|
|
242
|
+
ignoreAttributes: false,
|
|
243
|
+
attributeNamePrefix: "@_",
|
|
244
|
+
parseTagValue: false
|
|
245
|
+
});
|
|
246
|
+
var xmlBuilder = new XMLBuilder({
|
|
247
|
+
ignoreAttributes: false,
|
|
248
|
+
attributeNamePrefix: "@_",
|
|
249
|
+
format: false,
|
|
250
|
+
suppressEmptyNode: false
|
|
251
|
+
});
|
|
252
|
+
function asArray(value) {
|
|
253
|
+
if (value === void 0) {
|
|
254
|
+
return [];
|
|
255
|
+
}
|
|
256
|
+
return Array.isArray(value) ? value : [value];
|
|
257
|
+
}
|
|
258
|
+
async function loadZip(buffer) {
|
|
259
|
+
return JSZip.loadAsync(buffer);
|
|
260
|
+
}
|
|
261
|
+
async function readXml(zip, path) {
|
|
262
|
+
const file = zip.file(path);
|
|
263
|
+
if (!file) {
|
|
264
|
+
throw new Error(`Missing ZIP entry: ${path}`);
|
|
265
|
+
}
|
|
266
|
+
return xmlParser.parse(await file.async("string"));
|
|
267
|
+
}
|
|
268
|
+
function writeXml(zip, path, tree) {
|
|
269
|
+
zip.file(path, XML_DECLARATION + xmlBuilder.build(tree), { date: DETERMINISTIC_ZIP_DATE });
|
|
270
|
+
}
|
|
271
|
+
async function generateZip(zip) {
|
|
272
|
+
return zip.generateAsync({
|
|
273
|
+
type: "nodebuffer",
|
|
274
|
+
compression: "DEFLATE",
|
|
275
|
+
compressionOptions: { level: 6 },
|
|
276
|
+
mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
function removeContentTypeOverride(tree, partName) {
|
|
280
|
+
const overrides = asArray(tree?.Types?.Override);
|
|
281
|
+
const kept = overrides.filter((entry) => String(entry["@_PartName"] ?? "") !== `/${partName}`);
|
|
282
|
+
if (kept.length === overrides.length) {
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
tree.Types.Override = kept;
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
function firstSheetRelationshipPath(sheetNumber = 1) {
|
|
289
|
+
return `xl/worksheets/_rels/sheet${sheetNumber}.xml.rels`;
|
|
290
|
+
}
|
|
291
|
+
async function createRepairableCorruptionBuffer() {
|
|
292
|
+
const base = await SpreadsheetEngine.render(createRepairCorpusDocument());
|
|
293
|
+
const zip = await loadZip(base);
|
|
294
|
+
const contentTypes = await readXml(zip, "[Content_Types].xml");
|
|
295
|
+
removeContentTypeOverride(contentTypes, "xl/tables/table1.xml");
|
|
296
|
+
writeXml(zip, "[Content_Types].xml", contentTypes);
|
|
297
|
+
const workbook = await readXml(zip, "xl/workbook.xml");
|
|
298
|
+
const definedNames = asArray(workbook?.workbook?.definedNames?.definedName);
|
|
299
|
+
definedNames.push({
|
|
300
|
+
"@_name": "BrokenLedgerRef",
|
|
301
|
+
"#text": "Ghost!$A$1"
|
|
302
|
+
});
|
|
303
|
+
workbook.workbook.definedNames = { definedName: definedNames };
|
|
304
|
+
writeXml(zip, "xl/workbook.xml", workbook);
|
|
305
|
+
const sheet = await readXml(zip, "xl/worksheets/sheet1.xml");
|
|
306
|
+
const rows = asArray(sheet?.worksheet?.sheetData?.row);
|
|
307
|
+
const firstDataRow = rows.find((row) => Number(row["@_r"]) === 3) ?? rows[0];
|
|
308
|
+
const firstCell = asArray(firstDataRow?.c)[0];
|
|
309
|
+
if (firstCell) {
|
|
310
|
+
firstCell["@_s"] = "9999";
|
|
311
|
+
}
|
|
312
|
+
sheet.worksheet.hyperlinks = {
|
|
313
|
+
hyperlink: [
|
|
314
|
+
{
|
|
315
|
+
"@_ref": "XFE1",
|
|
316
|
+
"@_r:id": "rId2"
|
|
317
|
+
}
|
|
318
|
+
]
|
|
319
|
+
};
|
|
320
|
+
sheet.worksheet.dataValidations = {
|
|
321
|
+
"@_count": "1",
|
|
322
|
+
dataValidation: [
|
|
323
|
+
{
|
|
324
|
+
"@_type": "list",
|
|
325
|
+
"@_sqref": "A1048577",
|
|
326
|
+
formula1: '"Open,Closed,Pending"'
|
|
327
|
+
}
|
|
328
|
+
]
|
|
329
|
+
};
|
|
330
|
+
sheet.worksheet.mergeCells = {
|
|
331
|
+
"@_count": "3",
|
|
332
|
+
mergeCell: [
|
|
333
|
+
{ "@_ref": "A1:D1" },
|
|
334
|
+
{ "@_ref": "B1:E1" },
|
|
335
|
+
{ "@_ref": "XFE0:XFE1" }
|
|
336
|
+
]
|
|
337
|
+
};
|
|
338
|
+
sheet.worksheet.dimension = { "@_ref": "A1:A1" };
|
|
339
|
+
writeXml(zip, "xl/worksheets/sheet1.xml", sheet);
|
|
340
|
+
const sheetRels = await readXml(zip, firstSheetRelationshipPath(1));
|
|
341
|
+
const relationships = asArray(sheetRels?.Relationships?.Relationship);
|
|
342
|
+
const tableRelationship = relationships.find((relationship) => String(relationship["@_Type"] ?? "").includes("/table"));
|
|
343
|
+
if (tableRelationship) {
|
|
344
|
+
tableRelationship["@_Target"] = "../tables/missing-table.xml";
|
|
345
|
+
}
|
|
346
|
+
writeXml(zip, firstSheetRelationshipPath(1), sheetRels);
|
|
347
|
+
const table = await readXml(zip, "xl/tables/table1.xml");
|
|
348
|
+
if (table?.table) {
|
|
349
|
+
table.table["@_ref"] = "A2:XFE1048578";
|
|
350
|
+
if (table.table.autoFilter) {
|
|
351
|
+
table.table.autoFilter["@_ref"] = "A2:XFE1048578";
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
writeXml(zip, "xl/tables/table1.xml", table);
|
|
355
|
+
return generateZip(zip);
|
|
356
|
+
}
|
|
357
|
+
async function createDuplicateTableCorruptionBuffer() {
|
|
358
|
+
const base = await SpreadsheetEngine.render(createDuplicateTablesDocument());
|
|
359
|
+
const zip = await loadZip(base);
|
|
360
|
+
const secondTable = await readXml(zip, "xl/tables/table2.xml");
|
|
361
|
+
if (secondTable?.table) {
|
|
362
|
+
secondTable.table["@_name"] = "NorthTable";
|
|
363
|
+
secondTable.table["@_displayName"] = "NorthTable";
|
|
364
|
+
secondTable.table["@_ref"] = "A1:XFE1048578";
|
|
365
|
+
if (secondTable.table.autoFilter) {
|
|
366
|
+
secondTable.table.autoFilter["@_ref"] = "A1:XFE1048578";
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
writeXml(zip, "xl/tables/table2.xml", secondTable);
|
|
370
|
+
return generateZip(zip);
|
|
371
|
+
}
|
|
372
|
+
async function createMissingContentTypeBuffer() {
|
|
373
|
+
const base = await SpreadsheetEngine.render(createRepairCorpusDocument());
|
|
374
|
+
const zip = await loadZip(base);
|
|
375
|
+
const contentTypes = await readXml(zip, "[Content_Types].xml");
|
|
376
|
+
removeContentTypeOverride(contentTypes, "xl/tables/table1.xml");
|
|
377
|
+
writeXml(zip, "[Content_Types].xml", contentTypes);
|
|
378
|
+
return generateZip(zip);
|
|
379
|
+
}
|
|
380
|
+
async function createOrphanRelationshipBuffer() {
|
|
381
|
+
const base = await SpreadsheetEngine.render(createRepairCorpusDocument());
|
|
382
|
+
const zip = await loadZip(base);
|
|
383
|
+
const sheetRels = await readXml(zip, firstSheetRelationshipPath(1));
|
|
384
|
+
const relationships = asArray(sheetRels?.Relationships?.Relationship);
|
|
385
|
+
const tableRelationship = relationships.find((relationship) => String(relationship["@_Type"] ?? "").includes("/table"));
|
|
386
|
+
if (tableRelationship) {
|
|
387
|
+
tableRelationship["@_Target"] = "../tables/missing-table.xml";
|
|
388
|
+
}
|
|
389
|
+
writeXml(zip, firstSheetRelationshipPath(1), sheetRels);
|
|
390
|
+
return generateZip(zip);
|
|
391
|
+
}
|
|
392
|
+
async function createStyleIndexOobBuffer() {
|
|
393
|
+
const base = await SpreadsheetEngine.render(createRepairCorpusDocument());
|
|
394
|
+
const zip = await loadZip(base);
|
|
395
|
+
const sheet = await readXml(zip, "xl/worksheets/sheet1.xml");
|
|
396
|
+
const rows = asArray(sheet?.worksheet?.sheetData?.row);
|
|
397
|
+
const firstDataRow = rows.find((row) => Number(row["@_r"]) === 3) ?? rows[0];
|
|
398
|
+
const firstCell = asArray(firstDataRow?.c)[0];
|
|
399
|
+
if (firstCell) {
|
|
400
|
+
firstCell["@_s"] = "9999";
|
|
401
|
+
}
|
|
402
|
+
writeXml(zip, "xl/worksheets/sheet1.xml", sheet);
|
|
403
|
+
return generateZip(zip);
|
|
404
|
+
}
|
|
405
|
+
async function createHyperlinkValidationCorruptionBuffer() {
|
|
406
|
+
const base = await SpreadsheetEngine.render(createRepairCorpusDocument());
|
|
407
|
+
const zip = await loadZip(base);
|
|
408
|
+
const sheet = await readXml(zip, "xl/worksheets/sheet1.xml");
|
|
409
|
+
sheet.worksheet.hyperlinks = {
|
|
410
|
+
hyperlink: [
|
|
411
|
+
{
|
|
412
|
+
"@_ref": "XFE1",
|
|
413
|
+
"@_r:id": "rId2"
|
|
414
|
+
}
|
|
415
|
+
]
|
|
416
|
+
};
|
|
417
|
+
sheet.worksheet.dataValidations = {
|
|
418
|
+
"@_count": "1",
|
|
419
|
+
dataValidation: [
|
|
420
|
+
{
|
|
421
|
+
"@_type": "list",
|
|
422
|
+
"@_sqref": "A1048577",
|
|
423
|
+
formula1: '"Open,Closed,Pending"'
|
|
424
|
+
}
|
|
425
|
+
]
|
|
426
|
+
};
|
|
427
|
+
writeXml(zip, "xl/worksheets/sheet1.xml", sheet);
|
|
428
|
+
return generateZip(zip);
|
|
429
|
+
}
|
|
430
|
+
async function createMergeDefinedNameCorruptionBuffer() {
|
|
431
|
+
const base = await SpreadsheetEngine.render(createRepairCorpusDocument());
|
|
432
|
+
const zip = await loadZip(base);
|
|
433
|
+
const workbook = await readXml(zip, "xl/workbook.xml");
|
|
434
|
+
const definedNames = asArray(workbook?.workbook?.definedNames?.definedName);
|
|
435
|
+
definedNames.push({
|
|
436
|
+
"@_name": "BrokenLedgerRef",
|
|
437
|
+
"#text": "Ghost!$A$1"
|
|
438
|
+
});
|
|
439
|
+
workbook.workbook.definedNames = { definedName: definedNames };
|
|
440
|
+
writeXml(zip, "xl/workbook.xml", workbook);
|
|
441
|
+
const sheet = await readXml(zip, "xl/worksheets/sheet1.xml");
|
|
442
|
+
sheet.worksheet.mergeCells = {
|
|
443
|
+
"@_count": "3",
|
|
444
|
+
mergeCell: [
|
|
445
|
+
{ "@_ref": "A1:D1" },
|
|
446
|
+
{ "@_ref": "B1:E1" },
|
|
447
|
+
{ "@_ref": "XFE0:XFE1" }
|
|
448
|
+
]
|
|
449
|
+
};
|
|
450
|
+
writeXml(zip, "xl/worksheets/sheet1.xml", sheet);
|
|
451
|
+
return generateZip(zip);
|
|
452
|
+
}
|
|
453
|
+
async function createSharedStringIndexCorruptionBuffer(baseBuffer) {
|
|
454
|
+
const zip = await loadZip(baseBuffer);
|
|
455
|
+
const sheet = await readXml(zip, "xl/worksheets/sheet1.xml");
|
|
456
|
+
const rows = asArray(sheet?.worksheet?.sheetData?.row);
|
|
457
|
+
const firstCell = asArray(rows[0]?.c)[0];
|
|
458
|
+
if (firstCell) {
|
|
459
|
+
firstCell["@_t"] = "s";
|
|
460
|
+
firstCell.v = "999999";
|
|
461
|
+
delete firstCell.is;
|
|
462
|
+
}
|
|
463
|
+
writeXml(zip, "xl/worksheets/sheet1.xml", sheet);
|
|
464
|
+
return generateZip(zip);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
export {
|
|
468
|
+
createTemplateBenchmarkDocument,
|
|
469
|
+
createRepairableCorruptionBuffer,
|
|
470
|
+
createDuplicateTableCorruptionBuffer,
|
|
471
|
+
createMissingContentTypeBuffer,
|
|
472
|
+
createOrphanRelationshipBuffer,
|
|
473
|
+
createStyleIndexOobBuffer,
|
|
474
|
+
createHyperlinkValidationCorruptionBuffer,
|
|
475
|
+
createMergeDefinedNameCorruptionBuffer,
|
|
476
|
+
createSharedStringIndexCorruptionBuffer
|
|
477
|
+
};
|
|
478
|
+
//# sourceMappingURL=chunk-IYMS2CLX.js.map
|