import * as esbuild from 'esbuild' import * as XLSX from 'xlsx'; import * as fs from 'fs'; XLSX.set_fs(fs); /* plugin */ let sheetjsPlugin = { name: 'sheetjs', setup(build) { /* match NUMBERS, XLSX, XLS, and XLSB files */ const EXTS = /.(numbers|xlsx|xls|xlsb)$/; /* this method will be called once for each referenced file */ build.onLoad({ filter: EXTS }, (args) => { /* parse file from filesystem */ const wb = XLSX.readFile(args.path); /* get first worksheet */ const ws = wb.Sheets[wb.SheetNames[0]]; /* workaround for JSON limitation */ Date.prototype.toJSON2 = Date.prototype.toJSON; Date.prototype.toJSON = function() { return {d:this.toISOString()}; }; /* generate row objects */ const data = XLSX.utils.sheet_to_json(ws); /* generate final module code */ const res = JSON.stringify(data); Date.prototype.toJSON = Date.prototype.toJSON2; const contents = `const data = ${res}; data.forEach(row => { Object.keys(row).forEach(k => { if(row[k]?.d) row[k] = new Date(row[k].d); }) }); export default data;` return { contents, loader: 'js' }; }); }, }; await esbuild.build({ entryPoints: ['app.js'], bundle: true, outfile: 'out.js', plugins: [sheetjsPlugin], });