varan
Version:
A webpack starter kit for offline-first bring-your-own-code apps with server side rendering
88 lines • 4.61 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const webpack_1 = require("webpack");
const webpack_merge_1 = __importDefault(require("webpack-merge"));
const webpack_node_externals_1 = __importDefault(require("webpack-node-externals"));
const webpack_stats_plugin_1 = require("webpack-stats-plugin");
const lodash_1 = require("lodash");
const path_1 = __importDefault(require("path"));
const createCommonConfig_1 = __importDefault(require("./createCommonConfig"));
// Init
const HotReloadEntry = `${require.resolve('webpack/hot/poll')}?1000`;
const getOpts = (options) => {
const appDir = options.appDir || process.cwd();
const resolve = (relativePath) => path_1.default.resolve(appDir, relativePath);
return lodash_1.defaults({}, options, {
appDir: resolve('./'),
buildVars: {},
entry: 'bin/web',
env: process.env.NODE_ENV,
target: 'node',
name: undefined,
targetDir: resolve('dist/server'),
sourceDir: resolve('src/server'),
clientTargetDir: resolve('dist/client'),
whitelistExternals: [],
});
};
/**
* Create a webpack configuration optimized for server (node) applications
*
* @param {{ appDir: string=, buildVars: object=, entry: string=, env: 'development' | 'test' | 'production'=, target: 'web' | 'node'=, name: string=, targetDir: string=, sourceDir: string=, clientSourceDir: string=, whitelistExternals: string[]= }=} options
* @returns {webpack.Configuration}
*/
exports.default = (options = {}) => {
const opts = getOpts(options);
const isDev = opts.env !== 'production';
const outputPath = path_1.default.resolve(opts.targetDir, path_1.default.dirname(opts.entry));
return webpack_merge_1.default.smart(createCommonConfig_1.default(opts), {
name: opts.name || path_1.default.basename(opts.entry),
devtool: isDev ? 'cheap-module-source-map' : 'source-map',
entry: [isDev && HotReloadEntry, path_1.default.resolve(opts.sourceDir, opts.entry)].filter(Boolean),
output: {
path: outputPath,
filename: `${path_1.default.basename(opts.entry, path_1.default.extname(opts.entry))}.js`,
chunkFilename: 'chunks/[name].[contenthash:8].chunk.js',
pathinfo: isDev,
libraryTarget: 'commonjs2',
},
externals: [
webpack_node_externals_1.default({
modulesDir: path_1.default.resolve(process.cwd(), 'node_modules'),
whitelist: [isDev && HotReloadEntry, /\.(?!(?:jsx?|tsx?|json)$).{1,5}$/i, ...opts.whitelistExternals].filter(Boolean),
}),
webpack_node_externals_1.default({
modulesDir: path_1.default.resolve(__dirname, '..', 'node_modules'),
whitelist: [isDev && HotReloadEntry, /\.(?!(?:jsx?|tsx?|json)$).{1,5}$/i, ...opts.whitelistExternals].filter(Boolean),
}),
],
plugins: [
isDev && new webpack_1.HotModuleReplacementPlugin(),
new webpack_1.DefinePlugin(Object.assign(Object.assign({ BUILD_TARGET: JSON.stringify('server'), 'process.env.BABEL_ENV': JSON.stringify(opts.env), 'process.env.VARAN_CLIENT_ROOT': JSON.stringify(path_1.default.relative(outputPath, opts.clientTargetDir)), 'process.env.VARAN_STATS_MANIFEST': JSON.stringify(path_1.default.relative(outputPath, path_1.default.resolve(opts.clientTargetDir, 'stats-manifest.json'))), 'process.env.VARAN_ASSETS_MANIFEST': JSON.stringify(path_1.default.relative(outputPath, path_1.default.resolve(opts.clientTargetDir, 'asset-manifest.json'))) }, Object.entries(process.env)
.filter(([key]) => key.startsWith('APP_BUILD_VAR_') || key.startsWith('REACT_APP_'))
.reduce((acc, [key, value]) => {
acc[`process.env.${key}`] = JSON.stringify(value);
return acc;
}, {})), opts.buildVars)),
new webpack_1.EnvironmentPlugin({
DEBUG: false,
}),
new webpack_stats_plugin_1.StatsWriterPlugin({
filename: 'stats-manifest.json',
fields: ['assetsByChunkName', 'assets'],
}),
].filter(Boolean),
optimization: {
namedModules: true,
noEmitOnErrors: true,
},
node: {
__dirname: false,
__filename: false,
},
});
};
//# sourceMappingURL=createServerConfig.js.map