@bilig/xlsx 0.164.0

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 (83) hide show
  1. package/README.md +25 -0
  2. package/dist/address.d.ts +15 -0
  3. package/dist/address.js +82 -0
  4. package/dist/address.js.map +1 -0
  5. package/dist/external-workbook-types.d.ts +44 -0
  6. package/dist/external-workbook-types.js +12 -0
  7. package/dist/external-workbook-types.js.map +1 -0
  8. package/dist/file-source.d.ts +10 -0
  9. package/dist/file-source.js +76 -0
  10. package/dist/file-source.js.map +1 -0
  11. package/dist/formula-cache-reader.d.ts +30 -0
  12. package/dist/formula-cache-reader.js +350 -0
  13. package/dist/formula-cache-reader.js.map +1 -0
  14. package/dist/index.d.ts +17 -0
  15. package/dist/index.js +18 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/simple-workbook-writer.d.ts +114 -0
  18. package/dist/simple-workbook-writer.js +621 -0
  19. package/dist/simple-workbook-writer.js.map +1 -0
  20. package/dist/source-preserving-literal-patches.d.ts +43 -0
  21. package/dist/source-preserving-literal-patches.js +615 -0
  22. package/dist/source-preserving-literal-patches.js.map +1 -0
  23. package/dist/source-preserving-zip.d.ts +25 -0
  24. package/dist/source-preserving-zip.js +341 -0
  25. package/dist/source-preserving-zip.js.map +1 -0
  26. package/dist/streaming-native-cell-arena.d.ts +57 -0
  27. package/dist/streaming-native-cell-arena.js +233 -0
  28. package/dist/streaming-native-cell-arena.js.map +1 -0
  29. package/dist/streaming-native-external-cache.d.ts +13 -0
  30. package/dist/streaming-native-external-cache.js +753 -0
  31. package/dist/streaming-native-external-cache.js.map +1 -0
  32. package/dist/streaming-native-inspect.d.ts +42 -0
  33. package/dist/streaming-native-inspect.js +297 -0
  34. package/dist/streaming-native-inspect.js.map +1 -0
  35. package/dist/streaming-native-lookup-wasm.d.ts +13 -0
  36. package/dist/streaming-native-lookup-wasm.js +250 -0
  37. package/dist/streaming-native-lookup-wasm.js.map +1 -0
  38. package/dist/streaming-native-recalc-evaluator.d.ts +17 -0
  39. package/dist/streaming-native-recalc-evaluator.js +743 -0
  40. package/dist/streaming-native-recalc-evaluator.js.map +1 -0
  41. package/dist/streaming-native-recalc.d.ts +97 -0
  42. package/dist/streaming-native-recalc.js +652 -0
  43. package/dist/streaming-native-recalc.js.map +1 -0
  44. package/dist/streaming-native-row-chain-conditionals.d.ts +8 -0
  45. package/dist/streaming-native-row-chain-conditionals.js +385 -0
  46. package/dist/streaming-native-row-chain-conditionals.js.map +1 -0
  47. package/dist/streaming-native-row-chain-dependencies.d.ts +17 -0
  48. package/dist/streaming-native-row-chain-dependencies.js +365 -0
  49. package/dist/streaming-native-row-chain-dependencies.js.map +1 -0
  50. package/dist/streaming-native-row-chain-references.d.ts +3 -0
  51. package/dist/streaming-native-row-chain-references.js +36 -0
  52. package/dist/streaming-native-row-chain-references.js.map +1 -0
  53. package/dist/streaming-native-row-chain-wasm.d.ts +56 -0
  54. package/dist/streaming-native-row-chain-wasm.js +546 -0
  55. package/dist/streaming-native-row-chain-wasm.js.map +1 -0
  56. package/dist/streaming-native-text.d.ts +2 -0
  57. package/dist/streaming-native-text.js +14 -0
  58. package/dist/streaming-native-text.js.map +1 -0
  59. package/dist/streaming-native-workbook-core.d.ts +47 -0
  60. package/dist/streaming-native-workbook-core.js +110 -0
  61. package/dist/streaming-native-workbook-core.js.map +1 -0
  62. package/dist/targeted-cell-reader.d.ts +11 -0
  63. package/dist/targeted-cell-reader.js +92 -0
  64. package/dist/targeted-cell-reader.js.map +1 -0
  65. package/dist/workbook-cell-reader.d.ts +29 -0
  66. package/dist/workbook-cell-reader.js +200 -0
  67. package/dist/workbook-cell-reader.js.map +1 -0
  68. package/dist/workbook-compatibility-report.d.ts +101 -0
  69. package/dist/workbook-compatibility-report.js +654 -0
  70. package/dist/workbook-compatibility-report.js.map +1 -0
  71. package/dist/workbook-sheet-paths.d.ts +8 -0
  72. package/dist/workbook-sheet-paths.js +79 -0
  73. package/dist/workbook-sheet-paths.js.map +1 -0
  74. package/dist/xml-part-patch.d.ts +12 -0
  75. package/dist/xml-part-patch.js +45 -0
  76. package/dist/xml-part-patch.js.map +1 -0
  77. package/dist/xml.d.ts +9 -0
  78. package/dist/xml.js +42 -0
  79. package/dist/xml.js.map +1 -0
  80. package/dist/zip-reader.d.ts +51 -0
  81. package/dist/zip-reader.js +448 -0
  82. package/dist/zip-reader.js.map +1 -0
  83. package/package.json +113 -0
@@ -0,0 +1,110 @@
1
+ import { createFileXlsxSourceReader } from './file-source.js';
2
+ import { workbookSheetPathEntriesForSource } from './workbook-sheet-paths.js';
3
+ import { forEachInflatedXlsxZipEntryChunk, getZipText, readXlsxZipEntriesLazyFromByteSource, readXlsxZipEntryMetadata, } from './zip-reader.js';
4
+ export class StreamingNativeWorkbookOpenError extends Error {
5
+ reason;
6
+ inputBytes;
7
+ constructor(message, reason, inputBytes) {
8
+ super(message);
9
+ this.name = 'StreamingNativeWorkbookOpenError';
10
+ this.reason = reason;
11
+ this.inputBytes = inputBytes;
12
+ }
13
+ }
14
+ export function openStreamingNativeWorkbookCore(inputPath, options = {}) {
15
+ const source = createFileXlsxSourceReader(inputPath);
16
+ const inputBytes = source.byteLength;
17
+ try {
18
+ const phaseInfo = { inputBytes };
19
+ options.onPhase?.('open-source', phaseInfo);
20
+ const entryMetadata = readXlsxZipEntryMetadata(source);
21
+ const zip = readXlsxZipEntriesLazyFromByteSource(source);
22
+ if (!zip) {
23
+ throw new StreamingNativeWorkbookOpenError('XLSX native streaming core requires a ZIP central directory it can read lazily', 'invalid-or-zip64-xlsx', inputBytes);
24
+ }
25
+ options.onPhase?.('zip-central-directory', phaseInfo);
26
+ const sheetEntries = workbookSheetPathEntriesForSource(zip);
27
+ options.onPhase?.('workbook-metadata', phaseInfo);
28
+ return {
29
+ inputPath,
30
+ inputBytes,
31
+ source,
32
+ zip,
33
+ sheetEntries,
34
+ sheetNames: sheetEntries.map((sheet) => sheet.name),
35
+ entryMetadata: entryMetadata ?? [],
36
+ };
37
+ }
38
+ catch (error) {
39
+ source.release?.();
40
+ throw error;
41
+ }
42
+ }
43
+ export function closeStreamingNativeWorkbookCore(core) {
44
+ core.source.release?.();
45
+ }
46
+ export function withStreamingNativeWorkbookCore(inputPath, options, callback) {
47
+ const core = openStreamingNativeWorkbookCore(inputPath, options);
48
+ try {
49
+ return callback(core);
50
+ }
51
+ finally {
52
+ closeStreamingNativeWorkbookCore(core);
53
+ }
54
+ }
55
+ const textDecoder = new TextDecoder();
56
+ const worksheetCellStartTagPattern = /<(?:[A-Za-z_][\w.-]*:)?c\b/gu;
57
+ const worksheetCellStartCarryLength = 128;
58
+ export function scanStreamingNativeWorkbookCellStats(core) {
59
+ let nonEmptyCellCount = 0;
60
+ for (const sheet of core.sheetEntries) {
61
+ nonEmptyCellCount += countStreamingNativeWorksheetCellElements(core.zip, sheet.path);
62
+ }
63
+ return {
64
+ sheetNames: core.sheetEntries.map((sheet) => sheet.name),
65
+ nonEmptyCellCount,
66
+ };
67
+ }
68
+ export function scanStreamingNativeWorkbookPackageParts(input) {
69
+ const entryMetadata = input.entryMetadata ?? [];
70
+ const paths = entryMetadata.length > 0 ? entryMetadata.map((entry) => entry.path) : Object.keys(input.zip);
71
+ const metadataByPath = new Map(entryMetadata.map((entry) => [entry.path, entry]));
72
+ const workbookXml = getZipText(input.zip, 'xl/workbook.xml') ?? '';
73
+ const externalReferenceCount = workbookXml.match(/<(?:[A-Za-z_][\w.-]*:)?externalReference\b/gu)?.length ?? 0;
74
+ const externalLinkPartCount = paths.filter((path) => /^xl\/externalLinks\/externalLink[0-9]+\.xml$/u.test(path)).length;
75
+ const macroPaths = paths.filter((path) => /(?:^|\/)vbaProject\.bin$/iu.test(path));
76
+ return {
77
+ definedNameCount: workbookXml.match(/<(?:[A-Za-z_][\w.-]*:)?definedName\b/gu)?.length ?? 0,
78
+ tableCount: paths.filter((path) => /^xl\/tables\/[^/]+\.xml$/u.test(path)).length,
79
+ pivotTableCount: paths.filter((path) => /^xl\/pivotTables\/[^/]+\.xml$/u.test(path)).length,
80
+ chartCount: paths.filter((path) => /^xl\/charts\/[^/]+\.xml$/u.test(path) || /^xl\/chartsheets\/[^/]+\.xml$/u.test(path)).length,
81
+ macroModuleCount: macroPaths.length,
82
+ macroByteLength: macroPaths.reduce((sum, path) => sum + (metadataByPath.get(path)?.uncompressedSize ?? input.zip[path]?.byteLength ?? 0), 0),
83
+ externalLinkCount: Math.max(externalReferenceCount, externalLinkPartCount),
84
+ };
85
+ }
86
+ function countStreamingNativeWorksheetCellElements(zip, sheetPath) {
87
+ let count = 0;
88
+ let buffer = '';
89
+ const processBuffer = (final) => {
90
+ const safeEnd = final ? buffer.length : Math.max(0, buffer.length - worksheetCellStartCarryLength);
91
+ if (safeEnd === 0 && !final) {
92
+ return;
93
+ }
94
+ for (const _match of buffer.slice(0, safeEnd).matchAll(worksheetCellStartTagPattern)) {
95
+ count += 1;
96
+ }
97
+ buffer = buffer.slice(safeEnd);
98
+ };
99
+ const streamed = forEachInflatedXlsxZipEntryChunk(zip, sheetPath, (chunk) => {
100
+ buffer += textDecoder.decode(chunk, { stream: true });
101
+ processBuffer(false);
102
+ }, { chunkSize: 64 * 1024, forceStreamingInflate: true });
103
+ if (!streamed) {
104
+ return 0;
105
+ }
106
+ buffer += textDecoder.decode();
107
+ processBuffer(true);
108
+ return count;
109
+ }
110
+ //# sourceMappingURL=streaming-native-workbook-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-native-workbook-core.js","sourceRoot":"","sources":["../src/streaming-native-workbook-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type XlsxZipSource } from './zip-reader.js';
2
+ export type XlsxTargetCellValue = string | number | boolean;
3
+ export interface XlsxTargetCellReadback {
4
+ readonly address: string;
5
+ readonly formula: string | null;
6
+ readonly rawValue: string | null;
7
+ readonly styleIndex: number | null;
8
+ readonly type: string | null;
9
+ readonly value: XlsxTargetCellValue | null;
10
+ }
11
+ export declare function readXlsxTargetCell(source: XlsxZipSource, sheetName: string, address: string): XlsxTargetCellReadback | null;
@@ -0,0 +1,92 @@
1
+ import { normalizeCellAddress } from './address.js';
2
+ import { workbookSheetPathEntriesFromSource } from './workbook-sheet-paths.js';
3
+ import { decodeXmlText, getXmlElementText, readXmlAttribute, worksheetCellElementPattern } from './xml.js';
4
+ import { getZipText, readXlsxZipEntries } from './zip-reader.js';
5
+ export function readXlsxTargetCell(source, sheetName, address) {
6
+ const zip = readXlsxZipEntries(source);
7
+ const sheetPath = workbookSheetPathEntriesFromSource(zip, [sheetName])[0]?.path;
8
+ if (!sheetPath) {
9
+ throw new Error(`XLSX workbook is missing sheet: ${sheetName}`);
10
+ }
11
+ const sheetXml = getZipText(zip, sheetPath);
12
+ if (!sheetXml) {
13
+ throw new Error(`XLSX workbook is missing worksheet XML for sheet: ${sheetName}`);
14
+ }
15
+ const normalizedAddress = normalizeCellAddress(address);
16
+ const cellXml = readWorksheetCellXml(sheetXml, normalizedAddress);
17
+ if (!cellXml) {
18
+ return null;
19
+ }
20
+ return readTargetCellXml(cellXml, normalizedAddress, (index) => readSharedStringAt(zip, index));
21
+ }
22
+ function readTargetCellXml(cellXml, normalizedAddress, sharedStringAt) {
23
+ const openingTag = /^<[^>]+>/u.exec(cellXml)?.[0] ?? '';
24
+ const type = readXmlAttribute(openingTag, 't');
25
+ const rawValue = getXmlElementText(cellXml, 'v');
26
+ const styleIndex = readCellStyleIndex(openingTag);
27
+ const formulaText = getXmlElementText(cellXml, 'f');
28
+ return {
29
+ address: normalizedAddress,
30
+ formula: formulaText === null ? null : decodeXmlText(formulaText),
31
+ rawValue: rawValue === null ? null : decodeXmlText(rawValue),
32
+ styleIndex,
33
+ type,
34
+ value: readTargetCellValue(cellXml, type, rawValue, sharedStringAt),
35
+ };
36
+ }
37
+ function readWorksheetCellXml(sheetXml, normalizedAddress) {
38
+ for (const match of sheetXml.matchAll(worksheetCellElementPattern)) {
39
+ const cellXml = match[0];
40
+ const openingTag = /^<[^>]+>/u.exec(cellXml)?.[0] ?? '';
41
+ if (readXmlAttribute(openingTag, 'r') === normalizedAddress) {
42
+ return cellXml;
43
+ }
44
+ }
45
+ return null;
46
+ }
47
+ function readTargetCellValue(cellXml, type, rawValue, sharedStringAt) {
48
+ if (type === 'inlineStr') {
49
+ const inlineText = readRichTextValue(cellXml);
50
+ return inlineText.length > 0 ? inlineText : null;
51
+ }
52
+ if (rawValue === null) {
53
+ return null;
54
+ }
55
+ const value = decodeXmlText(rawValue);
56
+ if (type === 's') {
57
+ const sharedStringIndex = Number(value);
58
+ return Number.isSafeInteger(sharedStringIndex) && sharedStringIndex >= 0 ? sharedStringAt(sharedStringIndex) : null;
59
+ }
60
+ if (type === 'b') {
61
+ return value === '1' || value.toLowerCase() === 'true';
62
+ }
63
+ if (type === 'str' || type === 'e') {
64
+ return value;
65
+ }
66
+ const numericValue = Number(value);
67
+ return Number.isFinite(numericValue) ? numericValue : value;
68
+ }
69
+ function readSharedStringAt(zip, index) {
70
+ const xml = getZipText(readXlsxZipEntries(zip), 'xl/sharedStrings.xml');
71
+ if (!xml) {
72
+ return null;
73
+ }
74
+ let currentIndex = 0;
75
+ for (const match of xml.matchAll(/<si\b(?:[^>"']|"[^"]*"|'[^']*')*>[\s\S]*?<\/si>/gu)) {
76
+ if (currentIndex === index) {
77
+ return readRichTextValue(match[0]);
78
+ }
79
+ currentIndex += 1;
80
+ }
81
+ return null;
82
+ }
83
+ function readRichTextValue(xml) {
84
+ return [...xml.matchAll(/<(?:[A-Za-z_][\w.-]*:)?t\b(?:[^>"']|"[^"]*"|'[^']*')*>([\s\S]*?)<\/(?:[A-Za-z_][\w.-]*:)?t>/gu)]
85
+ .map((match) => decodeXmlText(match[1] ?? ''))
86
+ .join('');
87
+ }
88
+ function readCellStyleIndex(openingTag) {
89
+ const styleIndex = Number(readXmlAttribute(openingTag, 's'));
90
+ return Number.isInteger(styleIndex) && styleIndex >= 0 ? styleIndex : null;
91
+ }
92
+ //# sourceMappingURL=targeted-cell-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targeted-cell-reader.js","sourceRoot":"","sources":["../src/targeted-cell-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type XlsxCellRange } from './address.js';
2
+ import { type XlsxZipSource } from './zip-reader.js';
3
+ export type XlsxWorkbookCellValue = string | number | boolean;
4
+ export interface XlsxWorkbookCell {
5
+ readonly address: string;
6
+ readonly row: number;
7
+ readonly col: number;
8
+ readonly formula: string | null;
9
+ readonly hasValue: boolean;
10
+ readonly rawValue: string | null;
11
+ readonly styleIndex: number | null;
12
+ readonly type: string | null;
13
+ readonly value: XlsxWorkbookCellValue | null;
14
+ }
15
+ export interface XlsxWorkbookSheetCells {
16
+ readonly name: string;
17
+ readonly index: number;
18
+ readonly path: string;
19
+ readonly cells: readonly XlsxWorkbookCell[];
20
+ readonly range: XlsxCellRange;
21
+ readonly rowCount: number;
22
+ readonly columnCount: number;
23
+ }
24
+ export interface XlsxWorkbookCells {
25
+ readonly sheets: readonly XlsxWorkbookSheetCells[];
26
+ readonly hasFormulaMarkup: boolean;
27
+ readonly hasUnresolvedFormulaMarkup: boolean;
28
+ }
29
+ export declare function readXlsxWorkbookCells(source: XlsxZipSource): XlsxWorkbookCells;
@@ -0,0 +1,200 @@
1
+ import { decodeCellAddress, decodeCellRange, encodeCellAddress, normalizeCellAddress } from './address.js';
2
+ import { workbookSheetPathEntriesForSource } from './workbook-sheet-paths.js';
3
+ import { decodeXmlText, getXmlElementText, readXmlAttribute, worksheetCellElementPattern, worksheetCellOpeningTagPattern } from './xml.js';
4
+ import { getZipText, readXlsxZipEntries, readXlsxZipEntriesLazy } from './zip-reader.js';
5
+ const worksheetRowElementPattern = /<(?:[A-Za-z_][\w.-]*:)?row\b(?:[^>"']|"[^"]*"|'[^']*')*\/>|<((?:[A-Za-z_][\w.-]*:)?row)\b(?:[^>"']|"[^"]*"|'[^']*')*>[\s\S]*?<\/\1>/gu;
6
+ const worksheetRowOpeningTagPattern = /<(?:[A-Za-z_][\w.-]*:)?row\b(?:[^>"']|"[^"]*"|'[^']*')*(?:\/>|>)/u;
7
+ export function readXlsxWorkbookCells(source) {
8
+ const zip = source instanceof Uint8Array ? readXlsxZipEntriesLazy(source) : readXlsxZipEntries(source);
9
+ let workbookHasFormulaMarkup = false;
10
+ let workbookHasUnresolvedFormulaMarkup = false;
11
+ const sharedStringAt = lazySharedStringReader(zip);
12
+ const sheets = workbookSheetPathEntriesForSource(zip).map((sheet) => {
13
+ const sheetXml = getZipText(zip, sheet.path) ?? '';
14
+ const cells = readWorksheetCells(sheetXml, sharedStringAt);
15
+ const formulaElementCount = sheetXml.match(/<f\b/gu)?.length ?? 0;
16
+ const cellFormulaCount = cells.filter((cell) => cell.formula !== null).length;
17
+ if (cellFormulaCount > 0 || formulaElementCount > 0) {
18
+ workbookHasFormulaMarkup = true;
19
+ }
20
+ if (formulaElementCount > cellFormulaCount || cells.some((cell) => cell.formula !== null && cell.formula.trim().length === 0)) {
21
+ workbookHasUnresolvedFormulaMarkup = true;
22
+ }
23
+ const observedRange = rangeFromCells(cells);
24
+ const range = readWorksheetDimension(sheetXml) ?? observedRange;
25
+ const rowCount = Math.max(observedRange.e.r + 1, 1);
26
+ const columnCount = Math.max(observedRange.e.c + 1, 1);
27
+ return {
28
+ name: sheet.name,
29
+ index: sheet.index,
30
+ path: sheet.path,
31
+ cells,
32
+ range,
33
+ rowCount,
34
+ columnCount,
35
+ };
36
+ });
37
+ return {
38
+ sheets,
39
+ hasFormulaMarkup: workbookHasFormulaMarkup,
40
+ hasUnresolvedFormulaMarkup: workbookHasUnresolvedFormulaMarkup,
41
+ };
42
+ }
43
+ function readWorksheetCells(sheetXml, sharedStringAt) {
44
+ const cells = [];
45
+ let sawRows = false;
46
+ let fallbackRow = 0;
47
+ for (const rowMatch of sheetXml.matchAll(worksheetRowElementPattern)) {
48
+ sawRows = true;
49
+ const rowXml = rowMatch[0];
50
+ const rowOpeningTag = worksheetRowOpeningTagPattern.exec(rowXml)?.[0] ?? '';
51
+ const explicitRow = decodePositiveRowIndex(readXmlAttribute(rowOpeningTag, 'r'));
52
+ const rowIndex = explicitRow ?? fallbackRow;
53
+ let fallbackCol = 0;
54
+ for (const cellMatch of rowXml.matchAll(worksheetCellElementPattern)) {
55
+ const cell = readWorkbookCellXml(cellMatch[0], rowIndex, fallbackCol, sharedStringAt);
56
+ if (cell) {
57
+ cells.push(cell);
58
+ fallbackCol = cell.col + 1;
59
+ }
60
+ else {
61
+ fallbackCol += 1;
62
+ }
63
+ }
64
+ fallbackRow = rowIndex + 1;
65
+ }
66
+ if (sawRows) {
67
+ return cells;
68
+ }
69
+ let fallbackCol = 0;
70
+ for (const cellMatch of sheetXml.matchAll(worksheetCellElementPattern)) {
71
+ const cell = readWorkbookCellXml(cellMatch[0], 0, fallbackCol, sharedStringAt);
72
+ if (cell) {
73
+ cells.push(cell);
74
+ fallbackCol = cell.col + 1;
75
+ }
76
+ else {
77
+ fallbackCol += 1;
78
+ }
79
+ }
80
+ return cells;
81
+ }
82
+ function readWorkbookCellXml(cellXml, fallbackRow, fallbackCol, sharedStringAt) {
83
+ const openingTag = worksheetCellOpeningTagPattern.exec(cellXml)?.[0] ?? '';
84
+ const explicitAddress = readXmlAttribute(openingTag, 'r');
85
+ const decodedAddress = explicitAddress ? decodeCellAddressOrNull(explicitAddress) : { r: fallbackRow, c: fallbackCol };
86
+ if (!decodedAddress) {
87
+ return null;
88
+ }
89
+ const address = explicitAddress ? normalizeCellAddress(explicitAddress) : encodeCellAddress(decodedAddress);
90
+ const type = readXmlAttribute(openingTag, 't');
91
+ const rawValueText = getXmlElementText(cellXml, 'v');
92
+ const rawValue = rawValueText === null ? null : decodeXmlText(rawValueText);
93
+ const formulaText = getXmlElementText(cellXml, 'f');
94
+ const formula = formulaText === null ? null : decodeXmlText(formulaText);
95
+ const value = readCellValue(cellXml, type, rawValue, sharedStringAt);
96
+ return {
97
+ address,
98
+ row: decodedAddress.r,
99
+ col: decodedAddress.c,
100
+ formula,
101
+ hasValue: rawValue !== null || type === 'inlineStr',
102
+ rawValue,
103
+ styleIndex: readCellStyleIndex(openingTag),
104
+ type,
105
+ value,
106
+ };
107
+ }
108
+ function readCellValue(cellXml, type, rawValue, sharedStringAt) {
109
+ if (type === 'inlineStr') {
110
+ return readRichTextValue(cellXml);
111
+ }
112
+ if (rawValue === null) {
113
+ return null;
114
+ }
115
+ if (type === 's') {
116
+ const sharedStringIndex = Number(rawValue);
117
+ return Number.isSafeInteger(sharedStringIndex) && sharedStringIndex >= 0 ? sharedStringAt(sharedStringIndex) : null;
118
+ }
119
+ if (type === 'b') {
120
+ return rawValue === '1' || rawValue.toLowerCase() === 'true';
121
+ }
122
+ if (type === 'str' || type === 'e') {
123
+ return rawValue;
124
+ }
125
+ if (rawValue.length === 0) {
126
+ return null;
127
+ }
128
+ const numericValue = Number(rawValue);
129
+ return Number.isFinite(numericValue) ? numericValue : rawValue;
130
+ }
131
+ function lazySharedStringReader(zip) {
132
+ let sharedStrings;
133
+ return (index) => {
134
+ sharedStrings ??= readSharedStrings(zip);
135
+ return sharedStrings[index] ?? null;
136
+ };
137
+ }
138
+ function readSharedStrings(zip) {
139
+ const xml = getZipText(readXlsxZipEntries(zip), 'xl/sharedStrings.xml');
140
+ if (!xml) {
141
+ return [];
142
+ }
143
+ return [...xml.matchAll(/<si\b(?:[^>"']|"[^"]*"|'[^']*')*>[\s\S]*?<\/si>/gu)].map((match) => readRichTextValue(match[0]));
144
+ }
145
+ function readRichTextValue(xml) {
146
+ return [...xml.matchAll(/<(?:[A-Za-z_][\w.-]*:)?t\b(?:[^>"']|"[^"]*"|'[^']*')*>([\s\S]*?)<\/(?:[A-Za-z_][\w.-]*:)?t>/gu)]
147
+ .map((match) => decodeXmlText(match[1] ?? ''))
148
+ .join('');
149
+ }
150
+ function readCellStyleIndex(openingTag) {
151
+ const styleIndex = Number(readXmlAttribute(openingTag, 's'));
152
+ return Number.isInteger(styleIndex) && styleIndex >= 0 ? styleIndex : null;
153
+ }
154
+ function readWorksheetDimension(sheetXml) {
155
+ const tag = /<(?:[A-Za-z_][\w.-]*:)?dimension\b(?:[^>"']|"[^"]*"|'[^']*')*\/?>/u.exec(sheetXml)?.[0] ?? '';
156
+ const ref = readXmlAttribute(tag, 'ref');
157
+ if (!ref) {
158
+ return null;
159
+ }
160
+ try {
161
+ return decodeCellRange(ref.replaceAll('$', ''));
162
+ }
163
+ catch {
164
+ return null;
165
+ }
166
+ }
167
+ function rangeFromCells(cells) {
168
+ if (cells.length === 0) {
169
+ return { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
170
+ }
171
+ return cells.reduce((range, cell) => ({
172
+ s: {
173
+ r: Math.min(range.s.r, cell.row),
174
+ c: Math.min(range.s.c, cell.col),
175
+ },
176
+ e: {
177
+ r: Math.max(range.e.r, cell.row),
178
+ c: Math.max(range.e.c, cell.col),
179
+ },
180
+ }), {
181
+ s: { r: cells[0].row, c: cells[0].col },
182
+ e: { r: cells[0].row, c: cells[0].col },
183
+ });
184
+ }
185
+ function decodePositiveRowIndex(value) {
186
+ if (!value) {
187
+ return null;
188
+ }
189
+ const row = Number.parseInt(value, 10);
190
+ return Number.isSafeInteger(row) && row > 0 ? row - 1 : null;
191
+ }
192
+ function decodeCellAddressOrNull(address) {
193
+ try {
194
+ return decodeCellAddress(address.replaceAll('$', ''));
195
+ }
196
+ catch {
197
+ return null;
198
+ }
199
+ }
200
+ //# sourceMappingURL=workbook-cell-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbook-cell-reader.js","sourceRoot":"","sources":["../src/workbook-cell-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import type { LiteralInput } from '@bilig/protocol';
2
+ import type { XlsxExternalWorkbookInput } from './external-workbook-types.js';
3
+ import type { XlsxFormulaRecalcNativeDiagnostics } from './streaming-native-recalc.js';
4
+ export declare const workbookCompatibilityReportSchemaVersion = "bilig-workbook-compatibility-report.v1";
5
+ export type XlsxCacheInspectionLimit = number | 'all';
6
+ export type WorkbookCompatibilityRiskLevel = 'low' | 'medium' | 'high';
7
+ export interface WorkbookCompatibilityNamedCount {
8
+ readonly name: string;
9
+ readonly count: number;
10
+ }
11
+ export interface WorkbookCompatibilityReportOptions {
12
+ readonly fileName?: string;
13
+ readonly externalWorkbooks?: readonly XlsxExternalWorkbookInput[];
14
+ readonly edits?: readonly WorkbookCompatibilityReportEdit[];
15
+ readonly inspectLimit?: XlsxCacheInspectionLimit;
16
+ readonly maxRssBytes?: number;
17
+ }
18
+ export interface WorkbookCompatibilityReportFileOptions extends WorkbookCompatibilityReportOptions {
19
+ readonly fileName?: string;
20
+ }
21
+ export interface WorkbookCompatibilityReportEdit {
22
+ readonly target: string;
23
+ readonly value: LiteralInput;
24
+ }
25
+ export interface WorkbookCompatibilityReport {
26
+ readonly schemaVersion: typeof workbookCompatibilityReportSchemaVersion;
27
+ readonly verified: true;
28
+ readonly input: {
29
+ readonly fileName: string;
30
+ readonly externalWorkbookCount: number;
31
+ readonly inspectLimit: XlsxCacheInspectionLimit;
32
+ };
33
+ readonly workbook: {
34
+ readonly sheetCount: number;
35
+ readonly sheetNames: readonly string[];
36
+ readonly nonEmptyCellCount: number;
37
+ readonly formulaCellCount: number;
38
+ readonly definedNameCount: number;
39
+ readonly tableCount: number;
40
+ readonly pivotTableCount: number;
41
+ readonly chartCount: number;
42
+ readonly macroModuleCount: number;
43
+ };
44
+ readonly findings: {
45
+ readonly unsupportedFunctions: readonly WorkbookCompatibilityNamedCount[];
46
+ readonly externalLinks: {
47
+ readonly count: number;
48
+ readonly unresolvedCount: number;
49
+ readonly refreshedCount: number;
50
+ };
51
+ readonly macroModules: {
52
+ readonly count: number;
53
+ readonly byteLength: number;
54
+ };
55
+ readonly volatileFunctions: readonly WorkbookCompatibilityNamedCount[];
56
+ readonly pivotTables: {
57
+ readonly count: number;
58
+ readonly unsupportedCount: number;
59
+ readonly cacheOnlyCount: number;
60
+ };
61
+ readonly staleCachedFormulas: {
62
+ readonly count: number;
63
+ };
64
+ readonly missingCachedFormulaValues: {
65
+ readonly count: number;
66
+ };
67
+ readonly unsupportedRecalculations: {
68
+ readonly count: number;
69
+ };
70
+ readonly warnings: readonly string[];
71
+ };
72
+ readonly risk: {
73
+ readonly level: WorkbookCompatibilityRiskLevel;
74
+ readonly reasons: readonly string[];
75
+ };
76
+ readonly cacheInspection: {
77
+ readonly inspectedFormulaCellCount: number;
78
+ readonly uninspectedFormulaCellCount: number;
79
+ readonly inspectionLimit: XlsxCacheInspectionLimit;
80
+ readonly suggestedReads: readonly string[];
81
+ };
82
+ readonly diagnostics: XlsxFormulaRecalcNativeDiagnostics;
83
+ readonly commandSucceeded: true;
84
+ readonly inspectionCompleted: true;
85
+ readonly recalculationCompleted: boolean;
86
+ readonly excelParity: 'not_proven';
87
+ readonly limitations: readonly string[];
88
+ readonly next: {
89
+ readonly docs: string;
90
+ readonly command: string;
91
+ };
92
+ }
93
+ export interface WorkbookCompatibilityReportCliContext {
94
+ readonly commandName?: string;
95
+ readonly stdout?: (text: string) => void;
96
+ readonly stderr?: (text: string) => void;
97
+ }
98
+ export declare function buildWorkbookCompatibilityReport(input: Uint8Array | ArrayBuffer | Buffer, options?: WorkbookCompatibilityReportOptions): WorkbookCompatibilityReport;
99
+ export declare function buildWorkbookCompatibilityReportFromFile(inputPath: string, options?: WorkbookCompatibilityReportFileOptions): WorkbookCompatibilityReport;
100
+ export declare function runWorkbookCompatibilityReportCli(args: readonly string[], context?: WorkbookCompatibilityReportCliContext): number;
101
+ export declare function buildWorkbookCompatibilityDemoBytes(): Uint8Array;