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