jsrunner-bundler
Version:
NPM Bundler (sources & types) for the JavaScript Runner
122 lines (106 loc) • 3.01 kB
JavaScript
const path = require('path');
const fs = require('fs');
const webpack = require('webpack');
const NodePolyfillPlugin = require('node-polyfill-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const entryFiles = ['./src/polyfills.js', './src/index.js'].filter(f => fs.existsSync(f));
module.exports = {
mode: 'production',
target: 'web',
entry: entryFiles,
output: {
path: path.resolve(__dirname, './dist'),
filename: 'jsrunner.js',
library: {
type: 'module',
// name: 'JsRunner', // eliminar esta línea
},
environment: {
module: true,
},
},
experiments: {
outputModule: true,
},
resolve: {
mainFields: ['browser', 'module', 'main'],
extensions: ['.js', '.json'],
alias: {
'node:tty': 'tty-browserify', // para compatibilidad con node: imports
},
fallback: {
fs: false,
net: false,
tls: false,
child_process: false,
tty: require.resolve('tty-browserify'),
path: require.resolve('path-browserify'),
stream: require.resolve('stream-browserify'),
crypto: require.resolve('crypto-browserify'),
os: require.resolve('os-browserify/browser'),
assert: require.resolve('assert/'),
url: require.resolve('url/'),
querystring: require.resolve('querystring-es3'),
buffer: require.resolve('buffer/'),
http: require.resolve('stream-http'),
https: require.resolve('https-browserify'),
zlib: require.resolve('browserify-zlib'),
},
},
plugins: [
// Reemplaza `node:fs` → `fs`, etc.
new webpack.NormalModuleReplacementPlugin(/^node:(.+)$/, resource => {
resource.request = resource.request.replace(/^node:/, '');
}),
new NodePolyfillPlugin(),
new webpack.ProvidePlugin({
process: 'process/browser',
Buffer: ['buffer', 'Buffer'],
}),
new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1,
}),
],
module: {
rules: [
{
test: /\.m?js$/,
resolve: { fullySpecified: false },
// Puedes quitar babel si no usas import() dinámico
// Si lo dejas, asegúrate de tener babel-loader instalado
/*
use: {
loader: 'babel-loader',
options: { plugins: ['dynamic-import-node'] },
},
*/
},
],
},
optimization: {
splitChunks: false,
runtimeChunk: false,
concatenateModules: false,
usedExports: true,
sideEffects: false,
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
format: { comments: false },
compress: { drop_console: true },
},
extractComments: false,
}),
],
},
stats: {
all: false,
errors: true,
warnings: true,
timings: true,
assets: true,
builtAt: true,
colors: true,
},
};