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],
 | |
| });
 |