@nx/angular-rsbuild
Version:
Rsbuild Plugin for building Angular.
167 lines (166 loc) • 7.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports._createConfig = _createConfig;
exports.createConfig = createConfig;
const core_1 = require("@rsbuild/core");
const path_1 = require("path");
const normalize_options_1 = require("../models/normalize-options");
const plugin_angular_1 = require("../plugin/plugin-angular");
const plugin_hoisted_js_transformer_1 = require("../plugin/plugin-hoisted-js-transformer");
const helpers_1 = require("./helpers");
const dev_server_config_utils_1 = require("./dev-server-config-utils");
const styles_utils_1 = require("./styles-utils");
async function _createConfig(pluginOptions, rsbuildConfigOverrides) {
const normalizedOptions = (0, normalize_options_1.normalizeOptions)(pluginOptions);
const hashFormat = (0, helpers_1.getOutputHashFormat)(normalizedOptions.outputHashing);
const browserPolyfills = [...normalizedOptions.polyfills, 'zone.js'];
const serverPolyfills = [
...normalizedOptions.polyfills,
'zone.js/node',
'@angular/platform-server/init',
];
const isRunningDevServer = process.argv.at(2) === 'dev';
const isProd = process.env.NODE_ENV === 'production';
const stylePlugins = (0, styles_utils_1.getStylePlugins)(normalizedOptions);
const { root } = normalizedOptions;
const rsbuildPluginAngularConfig = (0, core_1.defineConfig)({
root,
source: {
tsconfigPath: normalizedOptions.tsConfig,
},
plugins: [(0, plugin_hoisted_js_transformer_1.pluginHoistedJsTransformer)(normalizedOptions), ...stylePlugins],
mode:
// mode is set to production to enable optimizations
normalizedOptions.optimization === false
? 'development'
: isProd
? 'production'
: 'development',
dev: {
...(isRunningDevServer && normalizedOptions.hasServer
? {
writeToDisk: (file) => !file.includes('.hot-update.'),
client: {
port: normalizedOptions.devServer?.port ?? 4200,
host: 'localhost',
},
hmr: false,
liveReload: true,
}
: undefined),
},
server: {
host: 'localhost',
port: normalizedOptions.devServer?.port ?? 4200,
htmlFallback: false,
historyApiFallback: {
index: '/index.html',
rewrites: [{ from: /^\/$/, to: 'index.html' }],
},
https: normalizedOptions.devServer?.sslKey &&
normalizedOptions.devServer?.sslCert
? {
key: (0, path_1.resolve)(root, normalizedOptions.devServer.sslKey),
cert: (0, path_1.resolve)(root, normalizedOptions.devServer.sslCert),
}
: undefined,
proxy: await (0, dev_server_config_utils_1.getProxyConfig)(root, normalizedOptions.devServer?.proxyConfig),
},
tools: {
rspack(config) {
config.resolve ??= {};
config.resolve.extensionAlias = {};
config.resolve.symlinks = normalizedOptions.preserveSymlinks;
},
},
environments: {
browser: {
plugins: [(0, plugin_angular_1.pluginAngular)(normalizedOptions)],
source: {
preEntry: [...browserPolyfills, ...normalizedOptions.styles],
entry: {
index: normalizedOptions.browser,
},
define: {
...(isProd ? { ngDevMode: 'false' } : undefined),
ngJitMode: normalizedOptions.aot ? undefined : 'true', // @TODO: use normalizedOptions
...normalizedOptions.define,
},
},
output: {
target: 'web',
filename: {
js: `[name]${hashFormat.chunk}.js`,
css: `[name]${hashFormat.file}.css`,
},
sourceMap: {
js: normalizedOptions.sourceMap.scripts ? 'source-map' : false,
css: normalizedOptions.sourceMap.styles,
},
distPath: {
root: normalizedOptions.outputPath.browser,
js: '',
media: normalizedOptions.outputPath.media,
assets: normalizedOptions.outputPath.media,
},
cleanDistPath: normalizedOptions.deleteOutputPath,
copy: normalizedOptions.assets.map((srcPath) => ({
from: srcPath,
to: (0, path_1.dirname)(srcPath),
})),
},
html: {
template: normalizedOptions.index,
},
},
...(normalizedOptions.hasServer
? {
server: {
plugins: [(0, plugin_angular_1.pluginAngular)(normalizedOptions)],
source: {
preEntry: [...serverPolyfills],
entry: {
server: normalizedOptions.ssr.entry,
},
define: {
ngServerMode: true,
...(isProd ? { ngDevMode: 'false' } : undefined),
ngJitMode: normalizedOptions.aot ? undefined : 'true', // @TODO: use normalizedOptions
...normalizedOptions.define,
},
},
output: {
target: 'node',
polyfill: 'entry',
distPath: { root: normalizedOptions.outputPath.server },
cleanDistPath: normalizedOptions.deleteOutputPath,
externals: normalizedOptions.externalDependencies,
},
},
}
: {}),
},
});
const userDefinedConfig = (0, core_1.defineConfig)(rsbuildConfigOverrides || {});
return (0, core_1.mergeRsbuildConfig)(rsbuildPluginAngularConfig, userDefinedConfig);
}
async function createConfig(defaultOptions, configurations = {}, configEnvVar = 'NGRS_CONFIG') {
const configurationMode = process.env[configEnvVar] ?? 'production';
const isDefault = configurationMode === 'default';
const isModeConfigured = configurationMode in configurations;
const modeOverrides = (!isDefault &&
isModeConfigured &&
configurations[configurationMode]?.options) ||
{};
const mergedBuildOptionsOptions = {
...defaultOptions.options,
...modeOverrides,
};
let mergedRsbuildConfigOverrides = defaultOptions.rsbuildConfigOverrides ?? {};
if (!isDefault &&
isModeConfigured &&
configurations[configurationMode]?.rsbuildConfigOverrides) {
mergedRsbuildConfigOverrides = (0, core_1.mergeRsbuildConfig)(mergedRsbuildConfigOverrides, configurations[configurationMode]?.rsbuildConfigOverrides ?? {});
}
return await _createConfig(mergedBuildOptionsOptions, mergedRsbuildConfigOverrides);
}