UNPKG

varan

Version:

A webpack starter kit for offline-first bring-your-own-code apps with server side rendering

88 lines 4.61 kB
"use strict"; 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