import esbuild from 'esbuild'; import { builtinModules } from 'module'; import path from 'path'; import pkg from './package.json'; interface Options { mode?: 'development' | 'production'; } export default async function build(options: Options) { const mode = options.mode || 'production'; // The list of packages that will be included in the node_modules folder of the packaged app. // Exclude all package.json dependencies except from the ones in the packedDependencies list const unpackedDependencies = [ ...Object.keys(pkg.dependencies).filter( name => !pkg.packedDependencies.includes(name) ), ]; const __DEV__ = mode !== 'production'; const PORT = pkg.dev['dev-server-port']; const outdir = __DEV__ ? path.join(__dirname, 'app') : path.join(__dirname, 'build'); const env: Record = __DEV__ ? { 'process.env.APP_RENDER_URL': JSON.stringify( `http://localhost:${PORT}/index.html` ), 'process.env.NODE_ENV': JSON.stringify('development'), 'process.env.INSOMNIA_ENV': JSON.stringify('development'), 'process.env.BUILD_DATE': JSON.stringify(new Date()), } : { 'process.env.NODE_ENV': JSON.stringify('production'), 'process.env.INSOMNIA_ENV': JSON.stringify('production'), 'process.env.BUILD_DATE': JSON.stringify(new Date()), }; return esbuild.build({ entryPoints: ['./app/main.development.ts'], outfile: path.join(outdir, 'main.min.js'), bundle: true, platform: 'node', sourcemap: true, format: 'cjs', define: env, external: [ 'electron', '@getinsomnia/node-libcurl', ...Object.keys(unpackedDependencies), ...Object.keys(builtinModules), ], }); } // Build if ran as a cli script const isMain = require.main === module; if (isMain) { const mode = process.env.NODE_ENV === 'development' ? 'development' : 'production'; build({ mode }); }