meli-cli/webpack.config.js

90 lines
2.5 KiB
JavaScript

const path = require('path');
const webpack = require('webpack');
const TerserPlugin = require('terser-webpack-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const nodeExternals = require('webpack-node-externals');
const buildInfo = {
version: require('./package.json').version,
buildDate: new Date().toISOString(),
commitHash: require('child_process').execSync('git rev-parse HEAD').toString().trim(),
};
const definedVariables = {
BUILD_INFO: JSON.stringify(buildInfo),
};
console.log('definedVariables', definedVariables);
// https://webpack.js.org/guides/typescript/
module.exports = {
target: 'node',
node: {
__dirname: false,
},
entry: './src/index.ts',
output: {
path: path.resolve(__dirname, 'build'),
filename: 'index.js',
devtoolModuleFilenameTemplate: '../[resource-path]',
},
mode: 'production',
externals: [nodeExternals()],
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
resolve: {
extensions: ['.tsx', '.ts', '.js', '.jsx'],
},
// https://webpack.js.org/guides/typescript/#source-maps
devtool: 'source-map',
optimization: {
minimize: true,
// https://webpack.js.org/plugins/uglifyjs-webpack-plugin/
minimizer: [
// https://stackoverflow.com/questions/47439067/uglifyjs-throws-unexpected-token-keyword-const-with-node-modules
new TerserPlugin({
sourceMap: true,
// https://webpack.js.org/plugins/terser-webpack-plugin/#extractcomments
extractComments: false,
// https://github.com/webpack-contrib/terser-webpack-plugin#terseroptions
terserOptions: {
ecma: 6,
// warnings: false,
mangle: {
toplevel: true,
// https://github.com/terser/terser#mangle-properties-options
// properties: true
},
},
}),
],
},
stats: {
// https://github.com/yargs/yargs/blob/master/docs/webpack.md#webpack-configuration
warningsFilter: [
/node_modules\/yargs/,
/.*plugin-loader.ts*/,
],
},
plugins: [
new webpack.DefinePlugin(definedVariables),
...(process.env.ANALYZE_BUNDLE ? [new BundleAnalyzerPlugin({
analyzerMode: 'static',
openAnalyzer: false,
})] : []),
...(!process.env.ANALYZE_BUNDLE ? [new webpack.BannerPlugin({
banner: '#!/usr/bin/env node',
raw: true,
})] : []),
],
};