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