UNPKG

@nx/angular-rsbuild

Version:

Rsbuild Plugin for building Angular.

115 lines (114 loc) 5.21 kB
"use strict"; 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;