scripts/bundle.config.js (71 lines of code) (raw):
const {resolve} = require('path');
const webpack = require('webpack');
const ALIASES = require('ocular-dev-tools/config/ocular.config')({
aliasMode: 'src',
root: resolve(__dirname, '..')
}).aliases;
const PACKAGE_ROOT = resolve('.');
const PACKAGE_INFO = require(resolve(PACKAGE_ROOT, 'package.json'));
/**
* peerDependencies are excluded using `externals`
* https://webpack.js.org/configuration/externals/
* e.g. @deck.gl/core is not bundled with @deck.gl/geo-layers
*/
function getExternals(packageInfo) {
let externals = {
// Hard coded externals
'h3-js': 'h3'
};
const {peerDependencies = {}} = packageInfo;
for (const depName in peerDependencies) {
if (depName.startsWith('@deck.gl')) {
// Instead of bundling the dependency, import from the global `deck` object
externals[depName] = 'deck';
}
}
if (externals['@deck.gl/core']) {
// Do not bundle luma.gl if `core` is peer dependency
externals['@luma.gl/core'] = 'luma';
}
return externals;
}
const config = {
mode: 'production',
entry: {
main: resolve('./bundle')
},
output: {
libraryTarget: 'umd',
path: PACKAGE_ROOT,
filename: 'dist.min.js',
library: 'deck'
},
resolve: {
alias: ALIASES
},
module: {
rules: [
{
// Compile ES2015 using babel
test: /\.js$/,
loader: 'babel-loader',
include: [/src/, /bundle/],
options: {
presets: [['@babel/preset-env', {forceAllTransforms: true}]],
// all of the helpers will reference the module @babel/runtime to avoid duplication
// across the compiled output.
plugins: [
'@babel/transform-runtime',
'inline-webgl-constants',
['remove-glsl-comments', {patterns: ['**/*.glsl.js']}]
]
}
}
]
},
externals: getExternals(PACKAGE_INFO),
plugins: [
// This is used to define the __VERSION__ constant in core/lib/init.js
// babel-plugin-version-inline uses the package version from the working directory
// Therefore we need to manually import the correct version from the core
// This is called in prepublishOnly, after lerna bumps the package versions
new webpack.DefinePlugin({
__VERSION__: JSON.stringify(PACKAGE_INFO.version)
})
// Uncomment for bundle size debug
// ,new (require('webpack-bundle-analyzer').BundleAnalyzerPlugin)()
],
node: false,
devtool: false
};
module.exports = (env = {}) => {
// console.log(JSON.stringify(env, null, 2));
if (env.dev) {
// Set development mode (no minification)
config.mode = 'development';
// Remove .min from the name
config.output.filename = 'dist/dist.dev.js';
// Disable transpilation
config.module.rules = [];
}
// NOTE uncomment to display config
// console.log('webpack config', JSON.stringify(config, null, 2));
return config;
};