const childProcess = require('child_process'); const ip = require('ip'); const path = require('path'); const webpack = require('webpack'); // The common js bundle (not this one) is built using tsc. // The umd bundle (this one) has a different entrypoint. const ACCEPTABLE_ENV_NAMES = ['production_standalone', 'production_cdn', 'staging', 'dogfood', 'development']; const getEnvironmentName = env => { if (!env) { throw new Error('Please specify env via --env to webpack'); } const foundName = ACCEPTABLE_ENV_NAMES.find(e => (env[e] ? e : false)); if (!foundName) { throw new Error( `Couldn't find env name, please specify via one of the following CLI arguments: ${acceptableEnvNames.map( i => `--env.${i}`, )}`, ); } return foundName; }; const getConfigForEnv = environmentName => { switch (environmentName) { case 'production_standalone': case 'production_cdn': return { heapAnalyticsIdEnvName: 'INSTANT_HEAP_ANALYTICS_ID_PRODUCTION', heapAnalyticsIdRequired: environmentName !== 'production_standalone', }; case 'staging': case 'dogfood': case 'development': return { heapAnalyticsIdEnvName: 'INSTANT_HEAP_ANALYTICS_ID_DEVELOPMENT', heapAnalyticsIdRequired: environmentName !== 'development', }; } }; const GIT_SHA = childProcess .execSync('git rev-parse HEAD') .toString() .trim(); const generateConfig = (environmentName, configOptions) => { const outputPath = process.env.WEBPACK_OUTPUT_PATH || 'umd'; const { heapAnalyticsIdEnvName, heapAnalyticsIdRequired } = configOptions; const heapAnalyticsId = process.env[heapAnalyticsIdEnvName]; if (heapAnalyticsIdRequired && !heapAnalyticsId) { throw new Error( `Must define heap analytics id in ENV var ${heapAnalyticsIdEnvName} when building for ${environmentName}`, ); } const envVars = { GIT_SHA: JSON.stringify(GIT_SHA), INSTANT_ENVIRONMENT: JSON.stringify(environmentName), NPM_PACKAGE_VERSION: JSON.stringify(process.env.npm_package_version), }; if (heapAnalyticsId) { envVars.HEAP_ANALYTICS_ID = JSON.stringify(heapAnalyticsId); } const config = { entry: { instant: './src/index.umd.ts', }, output: { filename: '[name].js', path: path.resolve(__dirname, outputPath), library: 'zeroExInstant', libraryTarget: 'umd', }, plugins: [ new webpack.DefinePlugin({ 'process.env': envVars, }), ], devtool: 'source-map', resolve: { extensions: ['.js', '.json', '.ts', '.tsx'], }, module: { rules: [ { test: /\.(ts|tsx)$/, loader: 'awesome-typescript-loader', }, { test: /\.svg$/, loader: 'svg-react-loader', }, ], }, devServer: { contentBase: path.join(__dirname, 'public'), port: 5000, host: '0.0.0.0', after: () => { if (config.devServer.host === '0.0.0.0') { console.log( `webpack-dev-server can be accessed externally at: http://${ip.address()}:${ config.devServer.port }`, ); } }, }, }; return config; }; module.exports = (env, _argv) => { const environmentName = getEnvironmentName(env); const configOptions = getConfigForEnv(environmentName); return generateConfig(environmentName, configOptions); };