const childProcess = require('child_process'); const ip = require('ip'); const path = require('path'); const RollbarSourceMapPlugin = require('rollbar-sourcemap-webpack-plugin'); const webpack = require('webpack'); const GIT_SHA = childProcess .execSync('git rev-parse HEAD') .toString() .trim(); const DISCHARGE_TARGETS_THAT_REQUIRED_HEAP = ['production', 'staging', 'dogfood']; const getHeapConfigForDischargeTarget = dischargeTarget => { return { heapAnalyticsIdEnvName: dischargeTarget === 'production' ? 'INSTANT_HEAP_ANALYTICS_ID_PRODUCTION' : 'INSTANT_HEAP_ANALYTICS_ID_DEVELOPMENT', heapAnalyticsIdRequired: DISCHARGE_TARGETS_THAT_REQUIRED_HEAP.includes(dischargeTarget), }; }; const DISCHARGE_TARGETS_THAT_REQUIRE_ROLLBAR = ['production', 'staging', 'dogfood']; const getRollbarConfigForDischargeTarget = dischargeTarget => { if (DISCHARGE_TARGETS_THAT_REQUIRE_ROLLBAR.includes(dischargeTarget)) { const rollbarSourceMapPublicPath = dischargeTarget === 'production' ? 'https://instant.0xproject.com' : `http://0x-instant-${dischargeTarget}.s3-website-us-east-1.amazonaws.com`; return { rollbarSourceMapPublicPath, rollbarRequired: true, }; } return { rollbarRequired: false, }; }; const ROLLBAR_CLIENT_TOKEN_ENV_VAR_NAME = 'INSTANT_ROLLBAR_CLIENT_TOKEN'; const ROLLBAR_PUBLISH_TOKEN_ENV_VAR_NAME = 'INSTANT_ROLLBAR_PUBLISH_TOKEN'; const getRollbarTokens = (dischargeTarget, rollbarRequired) => { const clientToken = process.env[ROLLBAR_CLIENT_TOKEN_ENV_VAR_NAME]; const publishToken = process.env[ROLLBAR_PUBLISH_TOKEN_ENV_VAR_NAME]; if (rollbarRequired) { if (!clientToken) { throw new Error( `Rollbar client token required for ${dischargeTarget}, please set env var ${ROLLBAR_CLIENT_TOKEN_ENV_VAR_NAME}`, ); } if (!publishToken) { throw new Error( `Rollbar publish token required for ${dischargeTarget}, please set env var ${ROLLBAR_PUBLISH_TOKEN_ENV_VAR_NAME}`, ); } } return { clientToken, publishToken }; }; const generateConfig = (dischargeTarget, heapConfigOptions, rollbarConfigOptions, nodeEnv) => { const outputPath = process.env.WEBPACK_OUTPUT_PATH || 'umd'; const { heapAnalyticsIdEnvName, heapAnalyticsIdRequired } = heapConfigOptions; const heapAnalyticsId = process.env[heapAnalyticsIdEnvName]; if (heapAnalyticsIdRequired && !heapAnalyticsId) { throw new Error( `Must define heap analytics id in ENV var ${heapAnalyticsIdEnvName} when building for ${dischargeTarget}`, ); } const rollbarTokens = getRollbarTokens(dischargeTarget, rollbarConfigOptions.rollbarRequired); const rollbarEnabled = rollbarTokens.clientToken && (nodeEnv !== 'development' || process.env.INSTANT_ROLLBAR_FORCE_DEVELOPMENT); let rollbarPlugin; if (rollbarConfigOptions.rollbarRequired) { if (!rollbarEnabled || !rollbarTokens.publishToken || !rollbarConfigOptions.rollbarSourceMapPublicPath) { throw new Error(`Rollbar required for ${dischargeTarget} but not configured`); } rollbarPlugin = new RollbarSourceMapPlugin({ accessToken: rollbarTokens.publishToken, version: GIT_SHA, publicPath: rollbarConfigOptions.rollbarSourceMapPublicPath, }); } const envVars = { GIT_SHA: JSON.stringify(GIT_SHA), NPM_PACKAGE_VERSION: JSON.stringify(process.env.npm_package_version), ROLLBAR_ENABLED: rollbarEnabled, }; if (dischargeTarget) { envVars.INSTANT_DISCHARGE_TARGET = JSON.stringify(dischargeTarget); } if (heapAnalyticsId) { envVars.HEAP_ANALYTICS_ID = JSON.stringify(heapAnalyticsId); } if (rollbarTokens.clientToken) { envVars.ROLLBAR_CLIENT_TOKEN = JSON.stringify(rollbarTokens.clientToken); } const plugins = [ new webpack.DefinePlugin({ 'process.env': envVars, }), ]; if (rollbarPlugin) { plugins.push(rollbarPlugin); } const config = { entry: { instant: './src/index.umd.ts', }, output: { filename: '[name].js', path: path.resolve(__dirname, outputPath), library: 'zeroExInstant', libraryTarget: 'umd', }, plugins, devtool: 'source-map', resolve: { extensions: ['.js', '.json', '.ts', '.tsx'], }, module: { rules: [ { test: /\.(ts|tsx)$/, loader: 'awesome-typescript-loader', }, { test: /\.svg$/, loader: 'svg-react-loader', }, { test: /\.js$/, loader: 'source-map-loader', exclude: [ // instead of /\/node_modules\// path.join(process.cwd(), 'node_modules'), path.join(process.cwd(), '../..', 'node_modules'), ], }, ], }, 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 dischargeTarget = env ? env.discharge_target : undefined; const heapConfigOptions = getHeapConfigForDischargeTarget(dischargeTarget); const rollbarConfigOptions = getRollbarConfigForDischargeTarget(dischargeTarget); return generateConfig(dischargeTarget, heapConfigOptions, rollbarConfigOptions, argv.mode); };