48 lines
1.3 KiB
JavaScript
48 lines
1.3 KiB
JavaScript
|
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],
|
||
|
});
|