UNPKG

@nx/angular

Version:

The Nx Plugin for Angular contains executors, generators, and utilities for managing Angular applications and libraries within an Nx workspace. It provides: - Integration with libraries such as Storybook, Jest, ESLint, Tailwind CSS, Playwright and Cypre

135 lines (134 loc) 6.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateProjectConfigForApplicationBuilder = updateProjectConfigForApplicationBuilder; exports.updateProjectConfigForBrowserBuilder = updateProjectConfigForBrowserBuilder; const devkit_1 = require("@nx/devkit"); const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup"); const constants_1 = require("./constants"); function updateProjectConfigForApplicationBuilder(tree, options) { const project = (0, devkit_1.readProjectConfiguration)(tree, options.project); const buildTarget = project.targets.build; let outputPath = buildTarget.options?.outputPath; if (outputPath && typeof outputPath !== 'string' && outputPath.browser === '') { const base = outputPath.base; devkit_1.logger.warn(`The output location of the browser build has been updated from "${base}" to "${(0, devkit_1.joinPathFragments)(base, constants_1.DEFAULT_BROWSER_DIR)}". You might need to adjust your deployment pipeline.`); if ((outputPath.media && outputPath.media !== constants_1.DEFAULT_MEDIA_DIR) || (outputPath.server && outputPath.server !== constants_1.DEFAULT_SERVER_DIR)) { delete outputPath.browser; } else { outputPath = outputPath.base; if (buildTarget.outputs && buildTarget.outputs.length > 0) { buildTarget.outputs = buildTarget.outputs.map((output) => output === '{options.outputPath.base}' ? '{options.outputPath}' : output); } } } const sourceRoot = (0, ts_solution_setup_1.getProjectSourceRoot)(project, tree); buildTarget.options ??= {}; buildTarget.options.outputPath = outputPath; buildTarget.options.server = (0, devkit_1.joinPathFragments)(sourceRoot, options.main); buildTarget.options.ssr = { entry: (0, devkit_1.joinPathFragments)(sourceRoot, options.serverFileName), }; if (options.serverRouting) { buildTarget.options.outputMode = 'server'; } else { buildTarget.options.prerender = true; } (0, devkit_1.updateProjectConfiguration)(tree, options.project, project); } function updateProjectConfigForBrowserBuilder(tree, options) { const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.project); const buildTarget = projectConfig.targets.build; const baseOutputPath = buildTarget.options.outputPath; buildTarget.options.outputPath = (0, devkit_1.joinPathFragments)(baseOutputPath, 'browser'); const buildConfigurations = projectConfig.targets.build.configurations; const configurations = {}; if (buildConfigurations) { for (const [key, options] of Object.entries(buildConfigurations)) { configurations[key] = getServerOptions(options); } } const sourceRoot = (0, ts_solution_setup_1.getProjectSourceRoot)(projectConfig, tree); projectConfig.targets.server = { dependsOn: ['build'], executor: buildTarget.executor.startsWith('@angular-devkit/build-angular:') ? '@angular-devkit/build-angular:server' : '@nx/angular:webpack-server', options: { outputPath: (0, devkit_1.joinPathFragments)(baseOutputPath, 'server'), main: (0, devkit_1.joinPathFragments)(sourceRoot, options.serverFileName), tsConfig: (0, devkit_1.joinPathFragments)(projectConfig.root, 'tsconfig.server.json'), ...(buildTarget.options ? getServerOptions(buildTarget.options) : {}), }, configurations, defaultConfiguration: 'production', }; projectConfig.targets['serve-ssr'] = { continuous: true, executor: '@angular-devkit/build-angular:ssr-dev-server', configurations: { development: { browserTarget: `${options.project}:build:development`, serverTarget: `${options.project}:server:development`, }, production: { browserTarget: `${options.project}:build:production`, serverTarget: `${options.project}:server:production`, }, }, defaultConfiguration: 'development', }; projectConfig.targets.prerender = { executor: '@angular-devkit/build-angular:prerender', options: { routes: ['/'], }, configurations: { development: { browserTarget: `${options.project}:build:development`, serverTarget: `${options.project}:server:development`, }, production: { browserTarget: `${options.project}:build:production`, serverTarget: `${options.project}:server:production`, }, }, defaultConfiguration: 'production', }; (0, devkit_1.updateProjectConfiguration)(tree, options.project, projectConfig); const nxJson = (0, devkit_1.readNxJson)(tree); if (nxJson.tasksRunnerOptions?.default?.options?.cacheableOperations && !nxJson.tasksRunnerOptions.default.options.cacheableOperations.includes('server')) { nxJson.tasksRunnerOptions.default.options.cacheableOperations.push('server'); } nxJson.targetDefaults ??= {}; nxJson.targetDefaults.server ??= {}; nxJson.targetDefaults.server.cache ??= true; (0, devkit_1.updateNxJson)(tree, nxJson); } function getServerOptions(options = {}) { return { buildOptimizer: options?.buildOptimizer, outputHashing: options?.outputHashing === 'all' ? 'media' : options?.outputHashing, fileReplacements: options?.fileReplacements, optimization: options?.optimization === undefined ? undefined : !!options?.optimization, sourceMap: options?.sourceMap, stylePreprocessorOptions: options?.stylePreprocessorOptions, resourcesOutputPath: options?.resourcesOutputPath, deployUrl: options?.deployUrl, i18nMissingTranslation: options?.i18nMissingTranslation, preserveSymlinks: options?.preserveSymlinks, extractLicenses: options?.extractLicenses, inlineStyleLanguage: options?.inlineStyleLanguage, vendorChunk: options?.vendorChunk, }; }