11import { build } from 'esbuild' ;
22import { minify } from 'terser' ;
33import { format } from 'prettier' ;
4+ import { ESLint } from 'eslint' ;
45
56export const bundleCode = async ( options : {
67 entry : string ;
78 inject : Record < string , string > ;
89 minify : boolean ;
910} ) : Promise < string > => {
1011 const shouldMinify = options . minify ;
12+
13+ // bundle with esbuild
1114 const esbuildResult = await build ( {
1215 entryPoints : [ options . entry ] ,
1316 bundle : true ,
@@ -21,7 +24,26 @@ export const bundleCode = async (options: {
2124 } ) ;
2225 const codeFromEsBuild = esbuildResult . outputFiles [ 0 ] . text ;
2326
24- const terserOutput = await minify ( codeFromEsBuild , {
27+ // convert var to let/const
28+ const eslint = new ESLint ( {
29+ fix : true ,
30+ overrideConfigFile : true ,
31+ overrideConfig : {
32+ languageOptions : {
33+ ecmaVersion : 'latest' ,
34+ sourceType : 'module' ,
35+ } ,
36+ rules : {
37+ 'prefer-const' : 'error' ,
38+ 'no-var' : 'error' ,
39+ } ,
40+ } ,
41+ } ) ;
42+ const results = await eslint . lintText ( codeFromEsBuild ) ;
43+ const codeFromEsLint = results [ 0 ] ! . output ! ;
44+
45+ // trim dead code and minify with terser
46+ const terserOutput = await minify ( codeFromEsLint , {
2547 compress : {
2648 passes : 3 ,
2749 dead_code : true ,
@@ -35,10 +57,12 @@ export const bundleCode = async (options: {
3557 } ) ;
3658 const codeFromTerser = terserOutput . code ! ;
3759
60+ // return minified code for production
3861 if ( shouldMinify ) {
3962 return codeFromTerser ;
4063 }
4164
65+ // format with prettier
4266 const formatedCode = await format ( codeFromEsBuild , { parser : 'babel' } ) ;
4367 return formatedCode ;
4468} ;
0 commit comments