@justybase/spreadsheet-tasks 1.2.0 → 1.3.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/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.XlsxWriter = exports.XlsbWriter = exports.ReaderFactory = exports.XlsxReader = exports.XlsbReader = exports.BiffReaderWriter = exports.ExcelReaderAbstract = exports.BigBuffer = void 0;
3
+ exports.getFormat = exports.unwrapCell = exports.isFormattedCell = exports.F = exports.XlsxWriter = exports.XlsbWriter = exports.ReaderFactory = exports.XlsxReader = exports.XlsbReader = exports.BiffReaderWriter = exports.ExcelReaderAbstract = exports.BigBuffer = void 0;
4
4
  // Core classes
5
5
  var BigBuffer_1 = require("./BigBuffer");
6
6
  Object.defineProperty(exports, "BigBuffer", { enumerable: true, get: function () { return BigBuffer_1.BigBuffer; } });
@@ -20,4 +20,10 @@ var XlsbWriter_1 = require("./XlsbWriter");
20
20
  Object.defineProperty(exports, "XlsbWriter", { enumerable: true, get: function () { return XlsbWriter_1.XlsbWriter; } });
21
21
  var XlsxWriter_1 = require("./XlsxWriter");
22
22
  Object.defineProperty(exports, "XlsxWriter", { enumerable: true, get: function () { return XlsxWriter_1.XlsxWriter; } });
23
+ // Formatting
24
+ var Formats_1 = require("./Formats");
25
+ Object.defineProperty(exports, "F", { enumerable: true, get: function () { return Formats_1.F; } });
26
+ Object.defineProperty(exports, "isFormattedCell", { enumerable: true, get: function () { return Formats_1.isFormattedCell; } });
27
+ Object.defineProperty(exports, "unwrapCell", { enumerable: true, get: function () { return Formats_1.unwrapCell; } });
28
+ Object.defineProperty(exports, "getFormat", { enumerable: true, get: function () { return Formats_1.getFormat; } });
23
29
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,eAAe;AACf,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAC5B,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AAEzB,UAAU;AACV,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AAEtB,UAAU;AACV,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,2CAA0C;AAAjC,wGAAA,UAAU,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,eAAe;AACf,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAC5B,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AAEzB,UAAU;AACV,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AAEtB,UAAU;AACV,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AAEnB,aAAa;AACb,qCAAqF;AAA7D,4FAAA,CAAC,OAAA;AAAE,0GAAA,eAAe,OAAA;AAAE,qGAAA,UAAU,OAAA;AAAE,oGAAA,SAAS,OAAA"}
@@ -0,0 +1,225 @@
1
+ import { XlsbWriter } from '../src/XlsbWriter';
2
+ import { XlsxWriter } from '../src/XlsxWriter';
3
+ import { F, FormattedCell } from '../src/Formats';
4
+ import * as fs from 'fs';
5
+
6
+ const OUTPUT_DIR = './test-output';
7
+
8
+ if (!fs.existsSync(OUTPUT_DIR)) {
9
+ fs.mkdirSync(OUTPUT_DIR, { recursive: true });
10
+ }
11
+
12
+ const demoDate = new Date(2026, 5, 1, 14, 34, 20); // June 1, 2026 14:34:20
13
+ const demoValue = 100000;
14
+
15
+ // ========== XLSB Format Demo ==========
16
+ async function createXlsbFormatDemo() {
17
+ const wb = new XlsbWriter(`${OUTPUT_DIR}/formats_demo_xlsb.xlsb`);
18
+
19
+ // Sheet 1: Number formats
20
+ wb.addSheet('Number Formats');
21
+ wb.writeSheet([
22
+ ['Format Name', 'Value'],
23
+ ['No formatting', demoValue],
24
+ ['Thousands separator', { value: demoValue, format: F.THOUSANDS_SEP }],
25
+ ['Currency PLN', { value: demoValue, format: F.CURRENCY_PLN }],
26
+ ['Currency EUR', { value: demoValue, format: F.CURRENCY_EUR }],
27
+ ['Percentage', { value: 1000, format: F.PERCENTAGE }],
28
+ ['Scientific', { value: demoValue, format: F.SCIENTIFIC }],
29
+ ['Two decimals', { value: demoValue, format: F.TWO_DECIMALS }],
30
+ ['Text', { value: demoValue, format: F.TEXT }],
31
+ ['Leading zeros', { value: demoValue, format: F.LEADING_ZEROS }],
32
+ ], ['Format Name', 'Value']);
33
+
34
+ // Sheet 2: Date & DateTime formats
35
+ const dateRows: any[] = [
36
+ ['Format Name', 'Value'],
37
+ [],
38
+ ['--- Date Formats ---', ''],
39
+ ['No formatting (number)', demoDate.getTime()],
40
+ ['Short (dd.mm.yyyy)', { value: demoDate, format: F.DATE_SHORT }],
41
+ ['Long (d mmmm yyyy)', { value: demoDate, format: F.DATE_LONG }],
42
+ ['Day-Month-Year (dd-mm-yyyy)', { value: demoDate, format: F.DATE_DAY_MONTH_YEAR }],
43
+ ['ISO (yyyy-mm-dd)', { value: demoDate, format: F.DATE_ISO }],
44
+ ['Month Year (mmmm yyyy)', { value: demoDate, format: F.DATE_MONTH_YEAR }],
45
+ ['Weekday', { value: demoDate, format: F.DATE_WEEKDAY }],
46
+ ['Day Month (d mmmm)', { value: demoDate, format: F.DATE_DAY_MONTH }],
47
+ ['Year only (yyyy)', { value: demoDate, format: F.DATE_YEAR_ONLY }],
48
+ [],
49
+ ['--- DateTime Formats ---', ''],
50
+ ['Short DT (dd.mm.yyyy hh:mm)', { value: demoDate, format: F.DATETIME_SHORT }],
51
+ ['Long DT (d mmmm yyyy hh:mm:ss)', { value: demoDate, format: F.DATETIME_LONG }],
52
+ ['Time only (hh:mm)', { value: demoDate, format: F.TIME_HH_MM }],
53
+ ['Time only (hh:mm:ss)', { value: demoDate, format: F.TIME_HH_MM_SS }],
54
+ ['Time 12h', { value: demoDate, format: F.TIME_12H }],
55
+ ['24h DT (dd.mm.yyyy hh:mm:ss)', { value: demoDate, format: F.DATETIME_24H }],
56
+ ['ISO DT', { value: demoDate, format: F.DATETIME_ISO }],
57
+ ['Milliseconds (hh:mm:ss.000)', { value: demoDate, format: F.TIME_MS }],
58
+ ];
59
+
60
+ wb.addSheet('Date Formats');
61
+ wb.writeSheet(dateRows, ['Format Name', 'Value']);
62
+
63
+ await wb.finalize();
64
+ console.log(`✅ XLSB format demo: ${OUTPUT_DIR}/formats_demo_xlsb.xlsb`);
65
+ }
66
+
67
+ // ========== XLSX Format Demo ==========
68
+ async function createXlsxFormatDemo() {
69
+ const wb = new XlsxWriter(`${OUTPUT_DIR}/formats_demo_xlsx.xlsx`);
70
+
71
+ wb.addSheet('Number Formats');
72
+ wb.writeSheet([
73
+ ['Format Name', 'Value'],
74
+ ['No formatting', demoValue],
75
+ ['Thousands separator', { value: demoValue, format: F.THOUSANDS_SEP }],
76
+ ['Currency PLN', { value: demoValue, format: F.CURRENCY_PLN }],
77
+ ['Currency EUR', { value: demoValue, format: F.CURRENCY_EUR }],
78
+ ['Percentage', { value: 1000, format: F.PERCENTAGE }],
79
+ ['Scientific', { value: demoValue, format: F.SCIENTIFIC }],
80
+ ['Two decimals', { value: demoValue, format: F.TWO_DECIMALS }],
81
+ ['Text', { value: demoValue, format: F.TEXT }],
82
+ ['Leading zeros', { value: demoValue, format: F.LEADING_ZEROS }],
83
+ ], ['Format Name', 'Value']);
84
+
85
+ wb.addSheet('Date Formats');
86
+ wb.writeSheet([
87
+ ['Format Name', 'Value'],
88
+ [],
89
+ ['--- Date Formats ---', ''],
90
+ ['Short (dd.mm.yyyy)', { value: demoDate, format: F.DATE_SHORT }],
91
+ ['Long (d mmmm yyyy)', { value: demoDate, format: F.DATE_LONG }],
92
+ ['ISO (yyyy-mm-dd)', { value: demoDate, format: F.DATE_ISO }],
93
+ ['Month Year (mmmm yyyy)', { value: demoDate, format: F.DATE_MONTH_YEAR }],
94
+ ['Weekday', { value: demoDate, format: F.DATE_WEEKDAY }],
95
+ ['Year only (yyyy)', { value: demoDate, format: F.DATE_YEAR_ONLY }],
96
+ [],
97
+ ['--- DateTime Formats ---', ''],
98
+ ['Short DT (dd.mm.yyyy hh:mm)', { value: demoDate, format: F.DATETIME_SHORT }],
99
+ ['Long DT (d mmmm yyyy hh:mm:ss)', { value: demoDate, format: F.DATETIME_LONG }],
100
+ ['Time only (hh:mm)', { value: demoDate, format: F.TIME_HH_MM }],
101
+ ['Time only (hh:mm:ss)', { value: demoDate, format: F.TIME_HH_MM_SS }],
102
+ ['Time 12h', { value: demoDate, format: F.TIME_12H }],
103
+ ['24h DT (dd.mm.yyyy hh:mm:ss)', { value: demoDate, format: F.DATETIME_24H }],
104
+ ['ISO DT', { value: demoDate, format: F.DATETIME_ISO }],
105
+ ['Milliseconds (hh:mm:ss.000)', { value: demoDate, format: F.TIME_MS }],
106
+ ], ['Format Name', 'Value']);
107
+
108
+ await wb.finalize();
109
+ console.log(`✅ XLSX format demo: ${OUTPUT_DIR}/formats_demo_xlsx.xlsx`);
110
+ }
111
+
112
+ // ========== Streaming API Demo ==========
113
+ async function createStreamingFormatDemo() {
114
+ const wb = new XlsbWriter(`${OUTPUT_DIR}/formats_streaming_demo.xlsb`);
115
+
116
+ wb.startSheet('Number Formats', 2, ['Format', 'Value']);
117
+ wb.writeRow(['No formatting', 123456.78]);
118
+ wb.writeRow(['Thousands separator', { value: 123456.78, format: F.THOUSANDS_SEP }]);
119
+ wb.writeRow(['Currency PLN', { value: 123456.78, format: F.CURRENCY_PLN }]);
120
+ wb.writeRow(['Currency EUR', { value: 123456.78, format: F.CURRENCY_EUR }]);
121
+ wb.writeRow(['Percentage', { value: 0.25, format: F.PERCENTAGE }]);
122
+ wb.writeRow(['Scientific', { value: 123456.78, format: F.SCIENTIFIC }]);
123
+ wb.writeRow(['Two decimals', { value: 123456.78, format: F.TWO_DECIMALS }]);
124
+ wb.writeRow(['Text', { value: '123456.78', format: F.TEXT }]);
125
+ wb.writeRow(['Leading zeros', { value: 42, format: F.LEADING_ZEROS }]);
126
+ wb.endSheet();
127
+
128
+ wb.startSheet('Date Formats', 2, ['Format', 'Value']);
129
+ wb.writeRow(['Short date', { value: demoDate, format: F.DATE_SHORT }]);
130
+ wb.writeRow(['Long date', { value: demoDate, format: F.DATE_LONG }]);
131
+ wb.writeRow(['Short datetime', { value: demoDate, format: F.DATETIME_SHORT }]);
132
+ wb.writeRow(['Long datetime', { value: demoDate, format: F.DATETIME_LONG }]);
133
+ wb.writeRow(['Time only', { value: demoDate, format: F.TIME_HH_MM_SS }]);
134
+ wb.writeRow(['Time 12h', { value: demoDate, format: F.TIME_12H }]);
135
+ wb.writeRow(['ISO', { value: demoDate, format: F.DATETIME_ISO }]);
136
+ wb.writeRow(['Milliseconds', { value: demoDate, format: F.TIME_MS }]);
137
+ wb.endSheet();
138
+
139
+ await wb.finalize();
140
+ console.log(`✅ XLSB streaming format demo: ${OUTPUT_DIR}/formats_streaming_demo.xlsb`);
141
+ }
142
+
143
+ // ========== Real-world Scenario Demo ==========
144
+ async function createSalesReportDemo() {
145
+ const wb = new XlsxWriter(`${OUTPUT_DIR}/sales_report_demo.xlsx`);
146
+
147
+ wb.addSheet('Sales');
148
+ wb.writeSheet([
149
+ ['Product', 'Price', 'Cost', 'Margin', 'Sale Date', 'Qty', 'Total'],
150
+ ['Laptop Dell XPS 15', { value: 5499.99, format: F.CURRENCY_PLN }, { value: 4200.00, format: F.CURRENCY_PLN }, { value: 0.30, format: F.PERCENTAGE }, { value: new Date(2026, 5, 1), format: F.DATE_SHORT }, { value: 5, format: F.THOUSANDS_SEP }, { value: 27499.95, format: F.CURRENCY_PLN }],
151
+ ['Monitor LG 27"', { value: 1299.00, format: F.CURRENCY_PLN }, { value: 950.00, format: F.CURRENCY_PLN }, { value: 0.37, format: F.PERCENTAGE }, { value: new Date(2026, 5, 2), format: F.DATE_SHORT }, 3, { value: 3897.00, format: F.CURRENCY_PLN }],
152
+ ['Mechanical keyboard', { value: 349.99, format: F.CURRENCY_PLN }, { value: 200.00, format: F.CURRENCY_PLN }, { value: 0.75, format: F.PERCENTAGE }, { value: new Date(2026, 5, 3), format: F.DATE_SHORT }, 10, { value: 3499.90, format: F.CURRENCY_PLN }],
153
+ ['Wireless mouse', { value: 199.00, format: F.CURRENCY_PLN }, { value: 120.00, format: F.CURRENCY_PLN }, { value: 0.66, format: F.PERCENTAGE }, { value: new Date(2026, 5, 4), format: F.DATE_SHORT }, 8, { value: 1592.00, format: F.CURRENCY_PLN }],
154
+ ['SSD Drive 1TB', { value: 599.00, format: F.CURRENCY_PLN }, { value: 380.00, format: F.CURRENCY_PLN }, { value: 0.58, format: F.PERCENTAGE }, { value: new Date(2026, 5, 5), format: F.DATE_SHORT }, 2, { value: 1198.00, format: F.CURRENCY_PLN }],
155
+ ], ['Product', 'Price', 'Cost', 'Margin', 'Sale Date', 'Qty', 'Total']);
156
+
157
+ wb.addSheet('Summary');
158
+ wb.writeSheet([
159
+ ['Total Sales', { value: 37486.85, format: F.CURRENCY_PLN }],
160
+ ], ['Description', 'Value']);
161
+
162
+ await wb.finalize();
163
+ console.log(`✅ Sales report demo: ${OUTPUT_DIR}/sales_report_demo.xlsx`);
164
+ }
165
+
166
+ // ========== All-in-one comprehensive demo ==========
167
+ async function createComprehensiveDemo() {
168
+ const wb = new XlsbWriter(`${OUTPUT_DIR}/comprehensive_formats_demo.xlsb`);
169
+
170
+ wb.addSheet('All Formats');
171
+ const rows: any[] = [['Category', 'Format Name', 'Value', 'Format Code']];
172
+
173
+ // Number formats
174
+ const numVal = 1234567.89;
175
+ rows.push(['Numeric', 'No formatting', numVal, 'Raw number']);
176
+ rows.push(['Numeric', 'Thousands separator', { value: numVal, format: F.THOUSANDS_SEP }, '#,##0']);
177
+ rows.push(['Numeric', 'Currency PLN', { value: numVal, format: F.CURRENCY_PLN }, '#,##0.00 "zł"']);
178
+ rows.push(['Numeric', 'Currency EUR', { value: numVal, format: F.CURRENCY_EUR }, '#,##0.00 €']);
179
+ rows.push(['Numeric', 'Percentage', { value: 0.125, format: F.PERCENTAGE }, '0%']);
180
+ rows.push(['Numeric', 'Scientific', { value: numVal, format: F.SCIENTIFIC }, '0.00E+00']);
181
+ rows.push(['Numeric', 'Two decimals', { value: numVal, format: F.TWO_DECIMALS }, '#,##0.00']);
182
+ rows.push(['Numeric', 'Text', { value: numVal, format: F.TEXT }, '@']);
183
+ rows.push(['Numeric', 'Leading zeros', { value: 42, format: F.LEADING_ZEROS }, '000000000']);
184
+
185
+ // Date formats
186
+ const dt = new Date(2026, 11, 24, 15, 45, 30); // Dec 24, 2026 15:45:30
187
+ rows.push([]);
188
+ rows.push(['Date', 'Short date', { value: dt, format: F.DATE_SHORT }, 'dd.mm.yyyy']);
189
+ rows.push(['Date', 'Long date', { value: dt, format: F.DATE_LONG }, 'd mmmm yyyy']);
190
+ rows.push(['Date', 'Day-Month-Year', { value: dt, format: F.DATE_DAY_MONTH_YEAR }, 'dd-mm-yyyy']);
191
+ rows.push(['Date', 'ISO date', { value: dt, format: F.DATE_ISO }, 'yyyy-mm-dd']);
192
+ rows.push(['Date', 'Month Year', { value: dt, format: F.DATE_MONTH_YEAR }, 'mmmm yyyy']);
193
+ rows.push(['Date', 'Weekday', { value: dt, format: F.DATE_WEEKDAY }, 'dddd, d mmmm yyyy']);
194
+ rows.push(['Date', 'Day Month', { value: dt, format: F.DATE_DAY_MONTH }, 'd mmmm']);
195
+ rows.push(['Date', 'Year only', { value: dt, format: F.DATE_YEAR_ONLY }, 'yyyy']);
196
+
197
+ // DateTime formats
198
+ rows.push([]);
199
+ rows.push(['DateTime', 'Short DT', { value: dt, format: F.DATETIME_SHORT }, 'dd.mm.yyyy hh:mm']);
200
+ rows.push(['DateTime', 'Long DT', { value: dt, format: F.DATETIME_LONG }, 'd mmmm yyyy hh:mm:ss']);
201
+ rows.push(['DateTime', 'Time hh:mm', { value: dt, format: F.TIME_HH_MM }, 'hh:mm']);
202
+ rows.push(['DateTime', 'Time hh:mm:ss', { value: dt, format: F.TIME_HH_MM_SS }, 'hh:mm:ss']);
203
+ rows.push(['DateTime', 'Time 12h', { value: dt, format: F.TIME_12H }, 'h:mm AM/PM']);
204
+ rows.push(['DateTime', '24h DT', { value: dt, format: F.DATETIME_24H }, 'dd.mm.yyyy hh:mm:ss']);
205
+ rows.push(['DateTime', 'ISO DT', { value: dt, format: F.DATETIME_ISO }, 'yyyy-mm-dd"T"hh:mm:ss']);
206
+ rows.push(['DateTime', 'Milliseconds', { value: dt, format: F.TIME_MS }, 'hh:mm:ss.000']);
207
+
208
+ wb.writeSheet(rows);
209
+ await wb.finalize();
210
+ console.log(`✅ Comprehensive format demo: ${OUTPUT_DIR}/comprehensive_formats_demo.xlsb`);
211
+ }
212
+
213
+ async function main() {
214
+ console.log('=== SpreadSheet Tasks Format Demo ===\n');
215
+ await createXlsbFormatDemo();
216
+ await createXlsxFormatDemo();
217
+ await createStreamingFormatDemo();
218
+ await createSalesReportDemo();
219
+ await createComprehensiveDemo();
220
+ console.log('\n✅ All format demos generated!');
221
+ console.log('📁 Open these files in Excel to verify formatting:');
222
+ console.log(` ${OUTPUT_DIR}/`);
223
+ }
224
+
225
+ main().catch(console.error);
@@ -0,0 +1,74 @@
1
+ import { XlsbReader } from '../src/XlsbReader';
2
+ import { XlsxReader } from '../src/XlsxReader';
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+
6
+ const OUTPUT_DIR = './test-output';
7
+
8
+ async function verifyFile(filePath: string, label: string) {
9
+ console.log(`\n--- Verifying: ${label} ---`);
10
+ const ext = path.extname(filePath).toLowerCase();
11
+
12
+ let reader: XlsbReader | XlsxReader;
13
+ if (ext === '.xlsb') {
14
+ reader = new XlsbReader();
15
+ } else {
16
+ reader = new XlsxReader();
17
+ }
18
+
19
+ await reader.open(filePath);
20
+
21
+ const sheetNames = reader.getSheetNames();
22
+ console.log(` Sheets: ${sheetNames.join(', ')}`);
23
+ console.log(` Rows: ${reader.rowCount}, Cols: ${reader.fieldCount}`);
24
+
25
+ const allRows: any[][] = [];
26
+ const isAsync = ext !== '.xlsb';
27
+ while (isAsync ? await (reader as XlsxReader).read() : (reader as XlsbReader).read()) {
28
+ const row: any[] = [];
29
+ for (let i = 0; i < reader.fieldCount; i++) {
30
+ row.push(reader.getValue(i));
31
+ }
32
+ allRows.push(row);
33
+ }
34
+
35
+ const printCount = Math.min(allRows.length, 15);
36
+ for (let r = 0; r < printCount; r++) {
37
+ const row = allRows[r];
38
+ const vals = row.map((v: any) => {
39
+ if (v === null || v === undefined) return '';
40
+ if (v instanceof Date) return v.toISOString();
41
+ if (typeof v === 'number') return v.toString();
42
+ return String(v).substring(0, 40);
43
+ });
44
+ console.log(` [${vals.join(', ')}]`);
45
+ }
46
+ if (allRows.length > printCount) {
47
+ console.log(` ... (${allRows.length - printCount} more rows)`);
48
+ }
49
+
50
+ reader.close();
51
+ console.log(` ✅ ${label} - ${allRows.length} rows read`);
52
+ }
53
+
54
+ async function main() {
55
+ const files = [
56
+ { file: `${OUTPUT_DIR}/formats_demo_xlsb.xlsb`, label: 'XLSB Format Demo' },
57
+ { file: `${OUTPUT_DIR}/formats_demo_xlsx.xlsx`, label: 'XLSX Format Demo' },
58
+ { file: `${OUTPUT_DIR}/formats_streaming_demo.xlsb`, label: 'XLSB Streaming Demo' },
59
+ { file: `${OUTPUT_DIR}/sales_report_demo.xlsx`, label: 'Sales Report Demo' },
60
+ { file: `${OUTPUT_DIR}/comprehensive_formats_demo.xlsb`, label: 'Comprehensive Demo' },
61
+ ];
62
+
63
+ for (const f of files) {
64
+ if (fs.existsSync(f.file)) {
65
+ await verifyFile(f.file, f.label);
66
+ } else {
67
+ console.log(`\n--- Skipping: ${f.label} (file not found) ---`);
68
+ }
69
+ }
70
+
71
+ console.log('\n✅ All verifications complete!');
72
+ }
73
+
74
+ main().catch(console.error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@justybase/spreadsheet-tasks",
3
- "version": "1.2.0",
3
+ "version": "1.3.1",
4
4
  "description": "High-performance TypeScript library for reading and writing Excel files in XLSB and XLSX formats. XLSB is 3.3x faster to write and 2.1x faster to read than XLSX.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -62,9 +62,9 @@
62
62
  "@types/node": "^22.10.5",
63
63
  "@types/yauzl": "^2.10.3",
64
64
  "eslint": "^9.17.0",
65
- "exceljs": "^4.4.0",
65
+ "exceljs": "^3.4.0",
66
66
  "ts-node": "^10.9.2",
67
67
  "typescript": "^5.7.2",
68
68
  "typescript-eslint": "^8.19.1"
69
69
  }
70
- }
70
+ }