@nx/angular-rsbuild
Version:
Rsbuild Plugin for building Angular.
115 lines (114 loc) • 5.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.pluginAngular = void 0;
const angular_rspack_compiler_1 = require("@nx/angular-rspack-compiler");
const normalize_options_1 = require("../models/normalize-options");
const path_1 = require("path");
const plugin_angular_jit_1 = require("./plugin-angular-jit");
const node_child_process_1 = require("node:child_process");
const fs_1 = require("fs");
const pluginAngular = (options = {}) => ({
name: 'plugin-angular',
pre: ['plugin-hoisted-js-transformer'],
post: ['plugin-angular-jit'],
setup(api) {
const pluginOptions = (0, normalize_options_1.normalizeOptions)(options);
const { typescriptFileCache } = api.useExposed('plugin-hoisted-js-transformer');
let watchMode = false;
let serverDevServerSendReload;
let serverDevServer;
let isServer = pluginOptions.hasServer;
const styleUrlsResolver = new angular_rspack_compiler_1.StyleUrlsResolver();
const templateUrlsResolver = new angular_rspack_compiler_1.TemplateUrlsResolver();
const config = api.getRsbuildConfig();
if (!pluginOptions.aot) {
api.modifyRsbuildConfig((config) => {
config.plugins ??= [];
config.plugins.push((0, plugin_angular_jit_1.pluginAngularJit)());
});
}
api.modifyRspackConfig((config, { environment }) => {
isServer = isServer && environment.name === 'server';
return config;
});
api.modifyRsbuildConfig((config) => {
if (isServer) {
config.dev ??= {};
config.dev.setupMiddlewares ??= [];
config.dev.setupMiddlewares.push((middlewares, server) => {
serverDevServerSendReload = () => {
server.sockWrite('static-changed');
};
});
}
config.resolve ??= {};
config.resolve.alias ??= {};
for (const fileReplacement of options.fileReplacements ?? []) {
config.resolve.alias[fileReplacement.replace] = fileReplacement.with;
}
});
api.onDevCompileDone(({ environments }) => {
if (isServer) {
if (serverDevServer) {
serverDevServer.kill();
serverDevServer = undefined;
}
const pathToServerEntry = (0, path_1.resolve)(environments['server'].distPath, 'server.js');
serverDevServer = (0, node_child_process_1.fork)(pathToServerEntry);
serverDevServer.on('spawn', () => serverDevServerSendReload?.());
}
});
if (isServer) {
const regexForMainServer = new RegExp(`${pluginOptions.server.replace('./', '')}`);
api.transform({ test: regexForMainServer }, ({ code }) => {
code = `globalThis['ngServerMode'] = true;\n${code}`;
return code;
});
}
api.onBeforeStartDevServer(() => {
watchMode = true;
});
api.resolve(({ resolveData }) => {
const request = resolveData.request;
if (request.startsWith('angular:jit:')) {
const path = request.split(';')[1];
resolveData.request = `${(0, path_1.normalize)((0, path_1.resolve)((0, path_1.dirname)(resolveData.contextInfo.issuer), path))}?raw`;
}
});
api.transform({ test: angular_rspack_compiler_1.TS_ALL_EXT_REGEX }, async ({ code, resource, addDependency }) => {
if (resource.includes('.ts?')) {
// Strip the query string off the ID
// in case of a dynamically loaded file
resource = resource.replace(/\?(.*)/, '');
}
const templateUrls = templateUrlsResolver.resolve(code, resource);
const styleUrls = styleUrlsResolver.resolve(code, resource);
if (watchMode) {
for (const urlSet of [...templateUrls, ...styleUrls]) {
// `urlSet` is a string where a relative path is joined with an
// absolute path using the `|` symbol.
// For example: `./app.component.html|/home/projects/analog/src/app/app.component.html`.
const [, absoluteFileUrl] = urlSet.split('|');
addDependency(absoluteFileUrl);
}
}
const data = typescriptFileCache.get(resource);
if (data === undefined) {
return '';
}
return data;
});
api.modifyHTMLTags(({ headTags, bodyTags }) => {
bodyTags.push({
tag: 'script',
attrs: {
id: 'ng-event-dispatch-contract',
type: 'text/javascript',
},
children: (0, fs_1.readFileSync)(require.resolve('@angular/core/event-dispatch-contract.min.js'), 'utf-8'),
});
return { headTags, bodyTags };
});
},
});
exports.pluginAngular = pluginAngular;