forked from sheetjs/docs.sheetjs.com
		
	
		
			
				
	
	
		
			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],
 | 
						|
});
 |