@bilig/excel-import 0.14.14

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 (198) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +165 -0
  3. package/dist/index.d.ts +31 -0
  4. package/dist/index.js +748 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/workbook-import-content-types.d.ts +10 -0
  7. package/dist/workbook-import-content-types.js +30 -0
  8. package/dist/workbook-import-content-types.js.map +1 -0
  9. package/dist/workbook-import-helpers.d.ts +21 -0
  10. package/dist/workbook-import-helpers.js +77 -0
  11. package/dist/workbook-import-helpers.js.map +1 -0
  12. package/dist/workbook-import-preview.d.ts +19 -0
  13. package/dist/workbook-import-preview.js +12 -0
  14. package/dist/workbook-import-preview.js.map +1 -0
  15. package/dist/xlsx-array-formulas.d.ts +6 -0
  16. package/dist/xlsx-array-formulas.js +186 -0
  17. package/dist/xlsx-array-formulas.js.map +1 -0
  18. package/dist/xlsx-axis-entries.d.ts +3 -0
  19. package/dist/xlsx-axis-entries.js +90 -0
  20. package/dist/xlsx-axis-entries.js.map +1 -0
  21. package/dist/xlsx-calculation-settings.d.ts +9 -0
  22. package/dist/xlsx-calculation-settings.js +198 -0
  23. package/dist/xlsx-calculation-settings.js.map +1 -0
  24. package/dist/xlsx-cell-insertion.d.ts +11 -0
  25. package/dist/xlsx-cell-insertion.js +164 -0
  26. package/dist/xlsx-cell-insertion.js.map +1 -0
  27. package/dist/xlsx-cell-metadata.d.ts +15 -0
  28. package/dist/xlsx-cell-metadata.js +380 -0
  29. package/dist/xlsx-cell-metadata.js.map +1 -0
  30. package/dist/xlsx-chart-artifacts.d.ts +7 -0
  31. package/dist/xlsx-chart-artifacts.js +327 -0
  32. package/dist/xlsx-chart-artifacts.js.map +1 -0
  33. package/dist/xlsx-charts.d.ts +4 -0
  34. package/dist/xlsx-charts.js +671 -0
  35. package/dist/xlsx-charts.js.map +1 -0
  36. package/dist/xlsx-comment-vml.d.ts +11 -0
  37. package/dist/xlsx-comment-vml.js +292 -0
  38. package/dist/xlsx-comment-vml.js.map +1 -0
  39. package/dist/xlsx-comments.d.ts +7 -0
  40. package/dist/xlsx-comments.js +120 -0
  41. package/dist/xlsx-comments.js.map +1 -0
  42. package/dist/xlsx-conditional-formats.d.ts +5 -0
  43. package/dist/xlsx-conditional-formats.js +513 -0
  44. package/dist/xlsx-conditional-formats.js.map +1 -0
  45. package/dist/xlsx-control-artifacts.d.ts +7 -0
  46. package/dist/xlsx-control-artifacts.js +404 -0
  47. package/dist/xlsx-control-artifacts.js.map +1 -0
  48. package/dist/xlsx-data-model-artifacts.d.ts +4 -0
  49. package/dist/xlsx-data-model-artifacts.js +240 -0
  50. package/dist/xlsx-data-model-artifacts.js.map +1 -0
  51. package/dist/xlsx-data-table-formulas.d.ts +4 -0
  52. package/dist/xlsx-data-table-formulas.js +138 -0
  53. package/dist/xlsx-data-table-formulas.js.map +1 -0
  54. package/dist/xlsx-defined-names.d.ts +7 -0
  55. package/dist/xlsx-defined-names.js +292 -0
  56. package/dist/xlsx-defined-names.js.map +1 -0
  57. package/dist/xlsx-dimensions.d.ts +4 -0
  58. package/dist/xlsx-dimensions.js +495 -0
  59. package/dist/xlsx-dimensions.js.map +1 -0
  60. package/dist/xlsx-drawing-artifacts.d.ts +7 -0
  61. package/dist/xlsx-drawing-artifacts.js +477 -0
  62. package/dist/xlsx-drawing-artifacts.js.map +1 -0
  63. package/dist/xlsx-escaped-text.d.ts +2 -0
  64. package/dist/xlsx-escaped-text.js +22 -0
  65. package/dist/xlsx-escaped-text.js.map +1 -0
  66. package/dist/xlsx-export-xml.d.ts +8 -0
  67. package/dist/xlsx-export-xml.js +99 -0
  68. package/dist/xlsx-export-xml.js.map +1 -0
  69. package/dist/xlsx-export.d.ts +2 -0
  70. package/dist/xlsx-export.js +800 -0
  71. package/dist/xlsx-export.js.map +1 -0
  72. package/dist/xlsx-external-link-artifacts.d.ts +4 -0
  73. package/dist/xlsx-external-link-artifacts.js +317 -0
  74. package/dist/xlsx-external-link-artifacts.js.map +1 -0
  75. package/dist/xlsx-external-references.d.ts +29 -0
  76. package/dist/xlsx-external-references.js +356 -0
  77. package/dist/xlsx-external-references.js.map +1 -0
  78. package/dist/xlsx-filters.d.ts +4 -0
  79. package/dist/xlsx-filters.js +273 -0
  80. package/dist/xlsx-filters.js.map +1 -0
  81. package/dist/xlsx-formula-translation.d.ts +10 -0
  82. package/dist/xlsx-formula-translation.js +391 -0
  83. package/dist/xlsx-formula-translation.js.map +1 -0
  84. package/dist/xlsx-formulas.d.ts +2 -0
  85. package/dist/xlsx-formulas.js +136 -0
  86. package/dist/xlsx-formulas.js.map +1 -0
  87. package/dist/xlsx-freeze-panes.d.ts +4 -0
  88. package/dist/xlsx-freeze-panes.js +206 -0
  89. package/dist/xlsx-freeze-panes.js.map +1 -0
  90. package/dist/xlsx-hyperlinks.d.ts +5 -0
  91. package/dist/xlsx-hyperlinks.js +64 -0
  92. package/dist/xlsx-hyperlinks.js.map +1 -0
  93. package/dist/xlsx-ignored-errors.d.ts +4 -0
  94. package/dist/xlsx-ignored-errors.js +106 -0
  95. package/dist/xlsx-ignored-errors.js.map +1 -0
  96. package/dist/xlsx-import-cell-styles.d.ts +8 -0
  97. package/dist/xlsx-import-cell-styles.js +255 -0
  98. package/dist/xlsx-import-cell-styles.js.map +1 -0
  99. package/dist/xlsx-import-sheet-metadata.d.ts +40 -0
  100. package/dist/xlsx-import-sheet-metadata.js +41 -0
  101. package/dist/xlsx-import-sheet-metadata.js.map +1 -0
  102. package/dist/xlsx-import-warnings.d.ts +8 -0
  103. package/dist/xlsx-import-warnings.js +44 -0
  104. package/dist/xlsx-import-warnings.js.map +1 -0
  105. package/dist/xlsx-import-workbook-metadata.d.ts +28 -0
  106. package/dist/xlsx-import-workbook-metadata.js +29 -0
  107. package/dist/xlsx-import-workbook-metadata.js.map +1 -0
  108. package/dist/xlsx-macros.d.ts +10 -0
  109. package/dist/xlsx-macros.js +63 -0
  110. package/dist/xlsx-macros.js.map +1 -0
  111. package/dist/xlsx-merge-entries.d.ts +3 -0
  112. package/dist/xlsx-merge-entries.js +17 -0
  113. package/dist/xlsx-merge-entries.js.map +1 -0
  114. package/dist/xlsx-number-formats.d.ts +7 -0
  115. package/dist/xlsx-number-formats.js +222 -0
  116. package/dist/xlsx-number-formats.js.map +1 -0
  117. package/dist/xlsx-pivot-artifacts.d.ts +29 -0
  118. package/dist/xlsx-pivot-artifacts.js +292 -0
  119. package/dist/xlsx-pivot-artifacts.js.map +1 -0
  120. package/dist/xlsx-pivots.d.ts +10 -0
  121. package/dist/xlsx-pivots.js +589 -0
  122. package/dist/xlsx-pivots.js.map +1 -0
  123. package/dist/xlsx-print-page-setup.d.ts +6 -0
  124. package/dist/xlsx-print-page-setup.js +224 -0
  125. package/dist/xlsx-print-page-setup.js.map +1 -0
  126. package/dist/xlsx-printer-settings.d.ts +4 -0
  127. package/dist/xlsx-printer-settings.js +279 -0
  128. package/dist/xlsx-printer-settings.js.map +1 -0
  129. package/dist/xlsx-protected-ranges.d.ts +4 -0
  130. package/dist/xlsx-protected-ranges.js +183 -0
  131. package/dist/xlsx-protected-ranges.js.map +1 -0
  132. package/dist/xlsx-rich-text-artifacts.d.ts +4 -0
  133. package/dist/xlsx-rich-text-artifacts.js +303 -0
  134. package/dist/xlsx-rich-text-artifacts.js.map +1 -0
  135. package/dist/xlsx-sheet-properties.d.ts +4 -0
  136. package/dist/xlsx-sheet-properties.js +89 -0
  137. package/dist/xlsx-sheet-properties.js.map +1 -0
  138. package/dist/xlsx-sheet-protection.d.ts +4 -0
  139. package/dist/xlsx-sheet-protection.js +153 -0
  140. package/dist/xlsx-sheet-protection.js.map +1 -0
  141. package/dist/xlsx-sheet-visibility.d.ts +4 -0
  142. package/dist/xlsx-sheet-visibility.js +53 -0
  143. package/dist/xlsx-sheet-visibility.js.map +1 -0
  144. package/dist/xlsx-slicer-connection-artifacts.d.ts +4 -0
  145. package/dist/xlsx-slicer-connection-artifacts.js +426 -0
  146. package/dist/xlsx-slicer-connection-artifacts.js.map +1 -0
  147. package/dist/xlsx-sorts.d.ts +5 -0
  148. package/dist/xlsx-sorts.js +216 -0
  149. package/dist/xlsx-sorts.js.map +1 -0
  150. package/dist/xlsx-sparklines.d.ts +4 -0
  151. package/dist/xlsx-sparklines.js +115 -0
  152. package/dist/xlsx-sparklines.js.map +1 -0
  153. package/dist/xlsx-style-only-blank-cells.d.ts +3 -0
  154. package/dist/xlsx-style-only-blank-cells.js +96 -0
  155. package/dist/xlsx-style-only-blank-cells.js.map +1 -0
  156. package/dist/xlsx-style-runs.d.ts +12 -0
  157. package/dist/xlsx-style-runs.js +35 -0
  158. package/dist/xlsx-style-runs.js.map +1 -0
  159. package/dist/xlsx-styles.d.ts +25 -0
  160. package/dist/xlsx-styles.js +857 -0
  161. package/dist/xlsx-styles.js.map +1 -0
  162. package/dist/xlsx-tab-colors.d.ts +4 -0
  163. package/dist/xlsx-tab-colors.js +166 -0
  164. package/dist/xlsx-tab-colors.js.map +1 -0
  165. package/dist/xlsx-tables.d.ts +4 -0
  166. package/dist/xlsx-tables.js +371 -0
  167. package/dist/xlsx-tables.js.map +1 -0
  168. package/dist/xlsx-theme-artifacts.d.ts +6 -0
  169. package/dist/xlsx-theme-artifacts.js +126 -0
  170. package/dist/xlsx-theme-artifacts.js.map +1 -0
  171. package/dist/xlsx-threaded-comment-artifacts.d.ts +8 -0
  172. package/dist/xlsx-threaded-comment-artifacts.js +329 -0
  173. package/dist/xlsx-threaded-comment-artifacts.js.map +1 -0
  174. package/dist/xlsx-validations.d.ts +4 -0
  175. package/dist/xlsx-validations.js +542 -0
  176. package/dist/xlsx-validations.js.map +1 -0
  177. package/dist/xlsx-view-state.d.ts +8 -0
  178. package/dist/xlsx-view-state.js +144 -0
  179. package/dist/xlsx-view-state.js.map +1 -0
  180. package/dist/xlsx-workbook-properties.d.ts +5 -0
  181. package/dist/xlsx-workbook-properties.js +388 -0
  182. package/dist/xlsx-workbook-properties.js.map +1 -0
  183. package/dist/xlsx-workbook-protection.d.ts +4 -0
  184. package/dist/xlsx-workbook-protection.js +147 -0
  185. package/dist/xlsx-workbook-protection.js.map +1 -0
  186. package/dist/xlsx-workbook-sheet-paths.d.ts +4 -0
  187. package/dist/xlsx-workbook-sheet-paths.js +96 -0
  188. package/dist/xlsx-workbook-sheet-paths.js.map +1 -0
  189. package/dist/xlsx-worksheet-cells.d.ts +16 -0
  190. package/dist/xlsx-worksheet-cells.js +104 -0
  191. package/dist/xlsx-worksheet-cells.js.map +1 -0
  192. package/dist/xlsx-worksheet-text-values.d.ts +2 -0
  193. package/dist/xlsx-worksheet-text-values.js +136 -0
  194. package/dist/xlsx-worksheet-text-values.js.map +1 -0
  195. package/dist/xlsx-zip.d.ts +6 -0
  196. package/dist/xlsx-zip.js +12 -0
  197. package/dist/xlsx-zip.js.map +1 -0
  198. package/package.json +56 -0
@@ -0,0 +1,356 @@
1
+ import { XMLParser } from 'fast-xml-parser';
2
+ import { getZipText, readXlsxZipEntries } from './xlsx-zip.js';
3
+ const xmlParser = new XMLParser({
4
+ ignoreAttributes: false,
5
+ attributeNamePrefix: '',
6
+ parseAttributeValue: false,
7
+ parseTagValue: false,
8
+ removeNSPrefix: true,
9
+ });
10
+ const externalLinkRelationshipType = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink';
11
+ function isRecord(value) {
12
+ return typeof value === 'object' && value !== null;
13
+ }
14
+ function asArray(value) {
15
+ if (value === undefined || value === null) {
16
+ return [];
17
+ }
18
+ return Array.isArray(value) ? value : [value];
19
+ }
20
+ function recordChild(value, key) {
21
+ if (!isRecord(value)) {
22
+ return null;
23
+ }
24
+ const child = value[key];
25
+ return isRecord(child) ? child : null;
26
+ }
27
+ function stringValue(value) {
28
+ if (typeof value === 'string') {
29
+ return value;
30
+ }
31
+ if (typeof value === 'number' || typeof value === 'boolean') {
32
+ return String(value);
33
+ }
34
+ return null;
35
+ }
36
+ function integerValue(value) {
37
+ const raw = stringValue(value);
38
+ if (raw === null || raw.trim().length === 0) {
39
+ return null;
40
+ }
41
+ const parsed = Number(raw);
42
+ return Number.isInteger(parsed) ? parsed : null;
43
+ }
44
+ function normalizeSheetName(sheetName) {
45
+ return sheetName.toLocaleLowerCase('en-US');
46
+ }
47
+ function normalizeCellAddress(address) {
48
+ return address.replaceAll('$', '').toUpperCase();
49
+ }
50
+ function resolveTargetPath(basePartPath, target) {
51
+ if (target.startsWith('/')) {
52
+ return target.replace(/^\/+/, '');
53
+ }
54
+ const parts = basePartPath.split('/');
55
+ parts.pop();
56
+ for (const segment of target.split('/')) {
57
+ if (segment === '..') {
58
+ parts.pop();
59
+ }
60
+ else if (segment !== '.' && segment.length > 0) {
61
+ parts.push(segment);
62
+ }
63
+ }
64
+ return parts.join('/');
65
+ }
66
+ function parseRelationships(xml) {
67
+ if (!xml) {
68
+ return [];
69
+ }
70
+ const parsed = xmlParser.parse(xml);
71
+ return asArray(recordChild(parsed, 'Relationships')?.['Relationship']).flatMap((entry) => {
72
+ if (!isRecord(entry) || typeof entry['Id'] !== 'string' || typeof entry['Target'] !== 'string' || typeof entry['Type'] !== 'string') {
73
+ return [];
74
+ }
75
+ return [{ id: entry['Id'], target: entry['Target'], type: entry['Type'] }];
76
+ });
77
+ }
78
+ function readSheetNames(externalBook) {
79
+ return asArray(recordChild(externalBook, 'sheetNames')?.['sheetName']).flatMap((entry) => {
80
+ if (!isRecord(entry)) {
81
+ return [];
82
+ }
83
+ const name = stringValue(entry['val']);
84
+ return name === null || name.trim().length === 0 ? [] : [name];
85
+ });
86
+ }
87
+ function readExternalCachedValue(cell) {
88
+ const rawValue = stringValue(cell['v']);
89
+ if (rawValue === null) {
90
+ return null;
91
+ }
92
+ const type = stringValue(cell['t'])?.trim().toLowerCase();
93
+ if (type === 'b') {
94
+ return { kind: 'boolean', value: rawValue === '1' || rawValue.toLowerCase() === 'true' };
95
+ }
96
+ if (type === 'e') {
97
+ return { kind: 'error', value: rawValue };
98
+ }
99
+ if (type === 'str' || type === 's' || type === 'inlineStr') {
100
+ return { kind: 'string', value: rawValue };
101
+ }
102
+ const numberValue = Number(rawValue);
103
+ if (Number.isFinite(numberValue)) {
104
+ return { kind: 'number', value: numberValue };
105
+ }
106
+ return { kind: 'string', value: rawValue };
107
+ }
108
+ function readExternalLinkCache(xml) {
109
+ const parsed = xmlParser.parse(xml);
110
+ const externalBook = recordChild(recordChild(parsed, 'externalLink'), 'externalBook');
111
+ if (!externalBook) {
112
+ return new Map();
113
+ }
114
+ const sheetNames = readSheetNames(externalBook);
115
+ const sheetCaches = new Map();
116
+ for (const sheetData of asArray(recordChild(externalBook, 'sheetDataSet')?.['sheetData'])) {
117
+ if (!isRecord(sheetData)) {
118
+ continue;
119
+ }
120
+ const sheetId = integerValue(sheetData['sheetId']);
121
+ if (sheetId === null) {
122
+ continue;
123
+ }
124
+ const sheetName = sheetNames[sheetId];
125
+ if (!sheetName) {
126
+ continue;
127
+ }
128
+ const cells = new Map();
129
+ for (const row of asArray(sheetData['row'])) {
130
+ if (!isRecord(row)) {
131
+ continue;
132
+ }
133
+ for (const cell of asArray(row['cell'])) {
134
+ if (!isRecord(cell)) {
135
+ continue;
136
+ }
137
+ const address = stringValue(cell['r']);
138
+ const value = readExternalCachedValue(cell);
139
+ if (address && value) {
140
+ cells.set(normalizeCellAddress(address), value);
141
+ }
142
+ }
143
+ }
144
+ if (cells.size > 0) {
145
+ sheetCaches.set(normalizeSheetName(sheetName), cells);
146
+ }
147
+ }
148
+ return sheetCaches;
149
+ }
150
+ function readWorkbookExternalLinkTargets(zip) {
151
+ const workbookXml = getZipText(zip, 'xl/workbook.xml');
152
+ if (!workbookXml) {
153
+ return new Map();
154
+ }
155
+ const relationships = parseRelationships(getZipText(zip, 'xl/_rels/workbook.xml.rels'));
156
+ const parsed = xmlParser.parse(workbookXml);
157
+ const targets = new Map();
158
+ let bookIndex = 1;
159
+ for (const entry of asArray(recordChild(recordChild(parsed, 'workbook'), 'externalReferences')?.['externalReference'])) {
160
+ if (isRecord(entry) && typeof entry['id'] === 'string') {
161
+ const relationship = relationships.find((candidate) => candidate.id === entry['id'] && candidate.type === externalLinkRelationshipType);
162
+ if (relationship) {
163
+ targets.set(bookIndex, resolveTargetPath('xl/workbook.xml', relationship.target));
164
+ }
165
+ }
166
+ bookIndex += 1;
167
+ }
168
+ return targets;
169
+ }
170
+ function readFallbackExternalLinkTargets(zip) {
171
+ const targets = new Map();
172
+ for (const path of Object.keys(zip)) {
173
+ const match = /^xl\/externalLinks\/externalLink([1-9][0-9]*)\.xml$/u.exec(path);
174
+ if (match) {
175
+ targets.set(Number(match[1]), path);
176
+ }
177
+ }
178
+ return targets;
179
+ }
180
+ export function readImportedExternalLinkCaches(source) {
181
+ const zip = readXlsxZipEntries(source);
182
+ const caches = new Map();
183
+ const workbookTargets = readWorkbookExternalLinkTargets(zip);
184
+ const linkTargets = workbookTargets.size > 0 ? workbookTargets : readFallbackExternalLinkTargets(zip);
185
+ for (const [bookIndex, path] of [...linkTargets.entries()].toSorted((left, right) => left[0] - right[0])) {
186
+ const xml = getZipText(zip, path);
187
+ if (!xml) {
188
+ continue;
189
+ }
190
+ const cache = readExternalLinkCache(xml);
191
+ if (cache.size > 0) {
192
+ caches.set(bookIndex, cache);
193
+ }
194
+ }
195
+ return caches;
196
+ }
197
+ function skipDoubleQuotedString(source, startIndex) {
198
+ let index = startIndex + 1;
199
+ while (index < source.length) {
200
+ if (source[index] === '"') {
201
+ if (source[index + 1] === '"') {
202
+ index += 2;
203
+ continue;
204
+ }
205
+ return index + 1;
206
+ }
207
+ index += 1;
208
+ }
209
+ return source.length;
210
+ }
211
+ function readSingleQuotedIdentifier(source, startIndex) {
212
+ let index = startIndex + 1;
213
+ let value = '';
214
+ while (index < source.length) {
215
+ const current = source[index];
216
+ if (current === "'") {
217
+ if (source[index + 1] === "'") {
218
+ value += "'";
219
+ index += 2;
220
+ continue;
221
+ }
222
+ return { value, endIndex: index + 1 };
223
+ }
224
+ value += current ?? '';
225
+ index += 1;
226
+ }
227
+ return null;
228
+ }
229
+ function readCellAddress(source, startIndex) {
230
+ const match = /^\$?[A-Za-z]{1,3}\$?[1-9][0-9]{0,6}/u.exec(source.slice(startIndex));
231
+ if (!match) {
232
+ return null;
233
+ }
234
+ const address = match[0];
235
+ const endIndex = startIndex + address.length;
236
+ if (/^[A-Za-z0-9_.$]/u.test(source[endIndex] ?? '')) {
237
+ return null;
238
+ }
239
+ return { address, endIndex };
240
+ }
241
+ function readExternalSheetName(value) {
242
+ const match = /^\[([1-9][0-9]*)\](.+)$/u.exec(value);
243
+ if (!match) {
244
+ return null;
245
+ }
246
+ return { bookIndex: Number(match[1]), sheetName: match[2] ?? '' };
247
+ }
248
+ function readUnquotedExternalSheetReference(source, startIndex) {
249
+ const prefix = /^\[([1-9][0-9]*)\]/u.exec(source.slice(startIndex));
250
+ if (!prefix) {
251
+ return null;
252
+ }
253
+ const bookIndex = Number(prefix[1]);
254
+ let index = startIndex + prefix[0].length;
255
+ const sheetStart = index;
256
+ while (index < source.length && /[A-Za-z0-9_.-]/u.test(source[index] ?? '')) {
257
+ index += 1;
258
+ }
259
+ if (index === sheetStart || source[index] !== '!') {
260
+ return null;
261
+ }
262
+ return { bookIndex, sheetName: source.slice(sheetStart, index), endIndex: index };
263
+ }
264
+ function isRangeOrSpillReference(source, addressStartIndex, addressEndIndex) {
265
+ return source[addressStartIndex - 1] === ':' || source[addressEndIndex] === ':' || source[addressEndIndex] === '#';
266
+ }
267
+ function formatFormulaLiteral(value) {
268
+ switch (value.kind) {
269
+ case 'number':
270
+ return String(value.value);
271
+ case 'boolean':
272
+ return value.value ? 'TRUE' : 'FALSE';
273
+ case 'error':
274
+ return value.value;
275
+ case 'string':
276
+ return `"${value.value.replaceAll('"', '""')}"`;
277
+ }
278
+ }
279
+ function cachedExternalValue(caches, bookIndex, sheetName, address) {
280
+ return caches.get(bookIndex)?.get(normalizeSheetName(sheetName))?.get(normalizeCellAddress(address)) ?? null;
281
+ }
282
+ function formulaNeedsPivotReferenceContext(formula) {
283
+ return /\bGETPIVOTDATA\s*\(/iu.test(formula);
284
+ }
285
+ export function translateImportedFormulaExternalReferences(formula, caches) {
286
+ if (caches.size === 0 || !formula.includes('[')) {
287
+ return { formula, resolvedCount: 0, unresolvedCount: 0 };
288
+ }
289
+ if (formulaNeedsPivotReferenceContext(formula)) {
290
+ return { formula, resolvedCount: 0, unresolvedCount: 0 };
291
+ }
292
+ let output = '';
293
+ let index = 0;
294
+ let resolvedCount = 0;
295
+ let unresolvedCount = 0;
296
+ while (index < formula.length) {
297
+ const character = formula[index];
298
+ if (character === '"') {
299
+ const endIndex = skipDoubleQuotedString(formula, index);
300
+ output += formula.slice(index, endIndex);
301
+ index = endIndex;
302
+ continue;
303
+ }
304
+ if (character === "'") {
305
+ const quoted = readSingleQuotedIdentifier(formula, index);
306
+ if (!quoted || formula[quoted.endIndex] !== '!') {
307
+ const endIndex = quoted?.endIndex ?? index + 1;
308
+ output += formula.slice(index, endIndex);
309
+ index = endIndex;
310
+ continue;
311
+ }
312
+ const externalSheet = readExternalSheetName(quoted.value);
313
+ const address = readCellAddress(formula, quoted.endIndex + 1);
314
+ if (!externalSheet || !address || isRangeOrSpillReference(formula, quoted.endIndex + 1, address.endIndex)) {
315
+ output += formula.slice(index, address?.endIndex ?? quoted.endIndex + 1);
316
+ index = address?.endIndex ?? quoted.endIndex + 1;
317
+ continue;
318
+ }
319
+ const value = cachedExternalValue(caches, externalSheet.bookIndex, externalSheet.sheetName, address.address);
320
+ if (value) {
321
+ output += formatFormulaLiteral(value);
322
+ resolvedCount += 1;
323
+ }
324
+ else {
325
+ output += formula.slice(index, address.endIndex);
326
+ unresolvedCount += 1;
327
+ }
328
+ index = address.endIndex;
329
+ continue;
330
+ }
331
+ if (character === '[') {
332
+ const externalSheet = readUnquotedExternalSheetReference(formula, index);
333
+ const address = externalSheet ? readCellAddress(formula, externalSheet.endIndex + 1) : null;
334
+ if (!externalSheet || !address || isRangeOrSpillReference(formula, externalSheet.endIndex + 1, address.endIndex)) {
335
+ output += character;
336
+ index += 1;
337
+ continue;
338
+ }
339
+ const value = cachedExternalValue(caches, externalSheet.bookIndex, externalSheet.sheetName, address.address);
340
+ if (value) {
341
+ output += formatFormulaLiteral(value);
342
+ resolvedCount += 1;
343
+ }
344
+ else {
345
+ output += formula.slice(index, address.endIndex);
346
+ unresolvedCount += 1;
347
+ }
348
+ index = address.endIndex;
349
+ continue;
350
+ }
351
+ output += character;
352
+ index += 1;
353
+ }
354
+ return { formula: output, resolvedCount, unresolvedCount };
355
+ }
356
+ //# sourceMappingURL=xlsx-external-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xlsx-external-references.js","sourceRoot":"","sources":["../src/xlsx-external-references.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WorkbookAutoFilterSnapshot, WorkbookSnapshot } from '@bilig/protocol';
2
+ import { type XlsxZipSource } from './xlsx-zip.js';
3
+ export declare function addExportFiltersToXlsxBytes(bytes: Uint8Array, snapshot: WorkbookSnapshot): Uint8Array;
4
+ export declare function readImportedWorkbookFilters(source: XlsxZipSource, sheetNames: readonly string[]): Map<string, WorkbookAutoFilterSnapshot[]>;
@@ -0,0 +1,273 @@
1
+ import { strFromU8, strToU8, unzipSync, zipSync } from 'fflate';
2
+ import { XMLParser } from 'fast-xml-parser';
3
+ import * as XLSX from 'xlsx';
4
+ import { readXlsxZipEntries } from './xlsx-zip.js';
5
+ const xmlParser = new XMLParser({
6
+ ignoreAttributes: false,
7
+ attributeNamePrefix: '',
8
+ parseAttributeValue: false,
9
+ removeNSPrefix: true,
10
+ });
11
+ const worksheetAutoFilterTailElements = [
12
+ 'sortState',
13
+ 'dataConsolidate',
14
+ 'customSheetViews',
15
+ 'mergeCells',
16
+ 'phoneticPr',
17
+ 'conditionalFormatting',
18
+ 'dataValidations',
19
+ 'hyperlinks',
20
+ 'printOptions',
21
+ 'pageMargins',
22
+ 'pageSetup',
23
+ 'headerFooter',
24
+ 'drawing',
25
+ 'legacyDrawing',
26
+ 'tableParts',
27
+ 'pivotTableDefinition',
28
+ ];
29
+ function isRecord(value) {
30
+ return typeof value === 'object' && value !== null;
31
+ }
32
+ function asArray(value) {
33
+ if (value === undefined || value === null) {
34
+ return [];
35
+ }
36
+ return Array.isArray(value) ? value : [value];
37
+ }
38
+ function recordChild(value, key) {
39
+ if (!isRecord(value)) {
40
+ return null;
41
+ }
42
+ const child = value[key];
43
+ return isRecord(child) ? child : null;
44
+ }
45
+ function escapeXml(value) {
46
+ return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&apos;');
47
+ }
48
+ function parseBooleanAttribute(value) {
49
+ if (value === true || value === '1' || value === 'true') {
50
+ return true;
51
+ }
52
+ if (value === false || value === '0' || value === 'false') {
53
+ return false;
54
+ }
55
+ return undefined;
56
+ }
57
+ function booleanAttribute(value) {
58
+ return value ? '1' : '0';
59
+ }
60
+ function normalizeZipPath(path) {
61
+ return path.replace(/^\/+/, '');
62
+ }
63
+ function getZipText(zip, path) {
64
+ const file = zip[normalizeZipPath(path)];
65
+ return file ? strFromU8(file) : null;
66
+ }
67
+ function setZipText(zip, path, text) {
68
+ zip[normalizeZipPath(path)] = strToU8(text);
69
+ }
70
+ function rangeRefA1(range) {
71
+ try {
72
+ const decoded = XLSX.utils.decode_range(`${range.startAddress}:${range.endAddress}`.replaceAll('$', ''));
73
+ return XLSX.utils.encode_range(decoded);
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
79
+ function parseRangeRef(sheetName, ref) {
80
+ try {
81
+ const decoded = XLSX.utils.decode_range(ref.replaceAll('$', ''));
82
+ return {
83
+ sheetName,
84
+ startAddress: XLSX.utils.encode_cell(decoded.s),
85
+ endAddress: XLSX.utils.encode_cell(decoded.e),
86
+ };
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ }
92
+ function parseAutoFilterCustomOperator(value) {
93
+ switch (value) {
94
+ case 'equal':
95
+ case 'lessThan':
96
+ case 'lessThanOrEqual':
97
+ case 'notEqual':
98
+ case 'greaterThanOrEqual':
99
+ case 'greaterThan':
100
+ return value;
101
+ default:
102
+ return undefined;
103
+ }
104
+ }
105
+ function parseValueFilterCriteria(filters) {
106
+ const values = asArray(filters['filter']).flatMap((entry) => {
107
+ if (!isRecord(entry) || typeof entry['val'] !== 'string') {
108
+ return [];
109
+ }
110
+ return [entry['val']];
111
+ });
112
+ const blank = parseBooleanAttribute(filters['blank']);
113
+ if (values.length === 0 && blank === undefined) {
114
+ return null;
115
+ }
116
+ return {
117
+ ...(blank !== undefined ? { blank } : {}),
118
+ values,
119
+ };
120
+ }
121
+ function parseCustomFilterCriteria(customFilters) {
122
+ const filters = asArray(customFilters['customFilter']).flatMap((entry) => {
123
+ if (!isRecord(entry) || typeof entry['val'] !== 'string') {
124
+ return [];
125
+ }
126
+ const operator = parseAutoFilterCustomOperator(entry['operator']);
127
+ return [
128
+ {
129
+ ...(operator ? { operator } : {}),
130
+ value: entry['val'],
131
+ },
132
+ ];
133
+ });
134
+ if (filters.length === 0) {
135
+ return null;
136
+ }
137
+ const and = parseBooleanAttribute(customFilters['and']);
138
+ return {
139
+ ...(and !== undefined ? { and } : {}),
140
+ filters,
141
+ };
142
+ }
143
+ function parseAutoFilterColumn(entry) {
144
+ if (!isRecord(entry)) {
145
+ return null;
146
+ }
147
+ const colId = Number(entry['colId']);
148
+ if (!Number.isInteger(colId) || colId < 0) {
149
+ return null;
150
+ }
151
+ const filters = recordChild(entry, 'filters');
152
+ const parsedFilters = filters ? parseValueFilterCriteria(filters) : null;
153
+ const customFilters = recordChild(entry, 'customFilters');
154
+ const parsedCustomFilters = customFilters ? parseCustomFilterCriteria(customFilters) : null;
155
+ const hiddenButton = parseBooleanAttribute(entry['hiddenButton']);
156
+ const showButton = parseBooleanAttribute(entry['showButton']);
157
+ return {
158
+ colId,
159
+ ...(hiddenButton !== undefined ? { hiddenButton } : {}),
160
+ ...(showButton !== undefined ? { showButton } : {}),
161
+ ...(parsedFilters ? { filters: parsedFilters } : {}),
162
+ ...(parsedCustomFilters ? { customFilters: parsedCustomFilters } : {}),
163
+ };
164
+ }
165
+ function parseAutoFilter(sheetName, entry) {
166
+ if (!isRecord(entry) || typeof entry['ref'] !== 'string') {
167
+ return null;
168
+ }
169
+ const range = parseRangeRef(sheetName, entry['ref']);
170
+ if (!range) {
171
+ return null;
172
+ }
173
+ const criteria = asArray(entry['filterColumn']).flatMap((filterColumn) => {
174
+ const parsed = parseAutoFilterColumn(filterColumn);
175
+ return parsed ? [parsed] : [];
176
+ });
177
+ return criteria.length > 0 ? { ...range, criteria } : range;
178
+ }
179
+ function valueFilterCriteriaXml(criteria) {
180
+ const attributes = criteria.blank !== undefined ? ` blank="${booleanAttribute(criteria.blank)}"` : '';
181
+ const filters = criteria.values.map((value) => `<filter val="${escapeXml(value)}"/>`).join('');
182
+ return filters ? `<filters${attributes}>${filters}</filters>` : `<filters${attributes}/>`;
183
+ }
184
+ function customFilterCriteriaXml(criteria) {
185
+ const attributes = criteria.and !== undefined ? ` and="${booleanAttribute(criteria.and)}"` : '';
186
+ const filters = criteria.filters
187
+ .map((filter) => {
188
+ const operator = filter.operator ? ` operator="${escapeXml(filter.operator)}"` : '';
189
+ return `<customFilter${operator} val="${escapeXml(filter.value)}"/>`;
190
+ })
191
+ .join('');
192
+ return filters ? `<customFilters${attributes}>${filters}</customFilters>` : `<customFilters${attributes}/>`;
193
+ }
194
+ function autoFilterColumnXml(criteria) {
195
+ const attributes = [
196
+ `colId="${String(criteria.colId)}"`,
197
+ ...(criteria.hiddenButton !== undefined ? [`hiddenButton="${booleanAttribute(criteria.hiddenButton)}"`] : []),
198
+ ...(criteria.showButton !== undefined ? [`showButton="${booleanAttribute(criteria.showButton)}"`] : []),
199
+ ].join(' ');
200
+ const children = [
201
+ ...(criteria.filters ? [valueFilterCriteriaXml(criteria.filters)] : []),
202
+ ...(criteria.customFilters ? [customFilterCriteriaXml(criteria.customFilters)] : []),
203
+ ].join('');
204
+ return children ? `<filterColumn ${attributes}>${children}</filterColumn>` : `<filterColumn ${attributes}/>`;
205
+ }
206
+ function autoFilterXml(filter, ref) {
207
+ const criteria = filter.criteria?.map(autoFilterColumnXml).join('') ?? '';
208
+ return criteria ? `<autoFilter ref="${escapeXml(ref)}">${criteria}</autoFilter>` : `<autoFilter ref="${escapeXml(ref)}"/>`;
209
+ }
210
+ function insertWorksheetAutoFilter(sheetXml, filter, ref) {
211
+ const autoFilter = autoFilterXml(filter, ref);
212
+ if (/<autoFilter\b/u.test(sheetXml)) {
213
+ return sheetXml.replace(/<autoFilter\b[^>]*(?:\/>|>[\s\S]*?<\/autoFilter>)/u, autoFilter);
214
+ }
215
+ let insertIndex = sheetXml.indexOf('</worksheet>');
216
+ for (const elementName of worksheetAutoFilterTailElements) {
217
+ const elementIndex = sheetXml.search(new RegExp(`<${elementName}\\b`, 'u'));
218
+ if (elementIndex >= 0 && (insertIndex < 0 || elementIndex < insertIndex)) {
219
+ insertIndex = elementIndex;
220
+ }
221
+ }
222
+ if (insertIndex < 0) {
223
+ return sheetXml;
224
+ }
225
+ return `${sheetXml.slice(0, insertIndex)}${autoFilter}${sheetXml.slice(insertIndex)}`;
226
+ }
227
+ export function addExportFiltersToXlsxBytes(bytes, snapshot) {
228
+ if (!snapshot.sheets.some((sheet) => (sheet.metadata?.filters ?? []).length > 0)) {
229
+ return bytes;
230
+ }
231
+ const zip = unzipSync(bytes);
232
+ let changed = false;
233
+ snapshot.sheets
234
+ .toSorted((left, right) => left.order - right.order)
235
+ .forEach((sheet, sheetIndex) => {
236
+ const filter = (sheet.metadata?.filters ?? []).find((candidate) => candidate.sheetName === sheet.name);
237
+ if (!filter) {
238
+ return;
239
+ }
240
+ const ref = rangeRefA1(filter);
241
+ if (!ref) {
242
+ return;
243
+ }
244
+ const sheetPath = `xl/worksheets/sheet${String(sheetIndex + 1)}.xml`;
245
+ const sheetXml = getZipText(zip, sheetPath);
246
+ if (!sheetXml) {
247
+ return;
248
+ }
249
+ setZipText(zip, sheetPath, insertWorksheetAutoFilter(sheetXml, filter, ref));
250
+ changed = true;
251
+ });
252
+ return changed ? zipSync(zip) : bytes;
253
+ }
254
+ export function readImportedWorkbookFilters(source, sheetNames) {
255
+ const zip = readXlsxZipEntries(source);
256
+ const filtersBySheet = new Map();
257
+ sheetNames.forEach((sheetName, sheetIndex) => {
258
+ const sheetXml = getZipText(zip, `xl/worksheets/sheet${String(sheetIndex + 1)}.xml`);
259
+ if (!sheetXml || !/<autoFilter\b/u.test(sheetXml)) {
260
+ return;
261
+ }
262
+ const parsed = xmlParser.parse(sheetXml);
263
+ const autoFilters = asArray(recordChild(recordChild(parsed, 'worksheet'), 'autoFilter')).flatMap((entry) => {
264
+ const filter = parseAutoFilter(sheetName, entry);
265
+ return filter ? [filter] : [];
266
+ });
267
+ if (autoFilters.length > 0) {
268
+ filtersBySheet.set(sheetName, autoFilters);
269
+ }
270
+ });
271
+ return filtersBySheet;
272
+ }
273
+ //# sourceMappingURL=xlsx-filters.js.map