"use strict"; /** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.dev/license */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.generateWebpackConfig = generateWebpackConfig; exports.generateI18nBrowserWebpackConfigFromContext = generateI18nBrowserWebpackConfigFromContext; exports.generateBrowserWebpackConfigFromContext = generateBrowserWebpackConfigFromContext; exports.getIndexOutputFile = getIndexOutputFile; exports.getIndexInputFile = getIndexInputFile; const path = __importStar(require("node:path")); const webpack_1 = require("webpack"); const webpack_merge_1 = require("webpack-merge"); const builder_watch_plugin_1 = require("../tools/webpack/plugins/builder-watch-plugin"); const utils_1 = require("../utils"); const read_tsconfig_1 = require("../utils/read-tsconfig"); const i18n_webpack_1 = require("./i18n-webpack"); async function generateWebpackConfig(workspaceRoot, projectRoot, sourceRoot, projectName, options, webpackPartialGenerator, logger, extraBuildOptions) { // Ensure Build Optimizer is only used with AOT. if (options.buildOptimizer && !options.aot) { throw new Error(`The 'buildOptimizer' option cannot be used without 'aot'.`); } const tsConfigPath = path.resolve(workspaceRoot, options.tsConfig); const tsConfig = await (0, read_tsconfig_1.readTsconfig)(tsConfigPath); const buildOptions = { ...options, ...extraBuildOptions }; const wco = { root: workspaceRoot, logger: logger.createChild('webpackConfigOptions'), projectRoot, sourceRoot, buildOptions, tsConfig, tsConfigPath, projectName, }; wco.buildOptions.progress = (0, utils_1.defaultProgress)(wco.buildOptions.progress); const partials = await Promise.all(webpackPartialGenerator(wco)); const webpackConfig = (0, webpack_merge_1.merge)(partials); return webpackConfig; } async function generateI18nBrowserWebpackConfigFromContext(options, context, webpackPartialGenerator, extraBuildOptions = {}) { const { buildOptions, i18n } = await (0, i18n_webpack_1.configureI18nBuild)(context, options); const result = await generateBrowserWebpackConfigFromContext(buildOptions, context, (wco) => { return webpackPartialGenerator(wco); }, extraBuildOptions); const config = result.config; if (i18n.shouldInline) { // Remove localize "polyfill" if in AOT mode if (buildOptions.aot) { if (!config.resolve) { config.resolve = {}; } if (Array.isArray(config.resolve.alias)) { config.resolve.alias.push({ name: '@angular/localize/init', alias: false, }); } else { if (!config.resolve.alias) { config.resolve.alias = {}; } config.resolve.alias['@angular/localize/init'] = false; } } // Update file hashes to include translation file content const i18nHash = Object.values(i18n.locales).reduce((data, locale) => data + locale.files.map((file) => file.integrity || '').join('|'), ''); config.plugins ??= []; config.plugins.push({ apply(compiler) { compiler.hooks.compilation.tap('build-angular', (compilation) => { webpack_1.javascript.JavascriptModulesPlugin.getCompilationHooks(compilation).chunkHash.tap('build-angular', (_, hash) => { hash.update('$localize' + i18nHash); }); }); }, }); } return { ...result, i18n }; } async function generateBrowserWebpackConfigFromContext(options, context, webpackPartialGenerator, extraBuildOptions = {}) { const projectName = context.target && context.target.project; if (!projectName) { throw new Error('The builder requires a target.'); } const workspaceRoot = context.workspaceRoot; const projectMetadata = await context.getProjectMetadata(projectName); const projectRoot = path.join(workspaceRoot, projectMetadata.root ?? ''); const sourceRoot = projectMetadata.sourceRoot; const projectSourceRoot = sourceRoot ? path.join(workspaceRoot, sourceRoot) : undefined; const normalizedOptions = (0, utils_1.normalizeBrowserSchema)(workspaceRoot, projectRoot, projectSourceRoot, options, projectMetadata, context.logger); const config = await generateWebpackConfig(workspaceRoot, projectRoot, projectSourceRoot, projectName, normalizedOptions, webpackPartialGenerator, context.logger, extraBuildOptions); // If builder watch support is present in the context, add watch plugin // This is internal only and currently only used for testing const watcherFactory = context.watcherFactory; if (watcherFactory) { if (!config.plugins) { config.plugins = []; } config.plugins.push(new builder_watch_plugin_1.BuilderWatchPlugin(watcherFactory)); } return { config, projectRoot, projectSourceRoot, }; } function getIndexOutputFile(index) { if (typeof index === 'string') { return path.basename(index); } else { return index.output || 'index.html'; } } function getIndexInputFile(index) { if (typeof index === 'string') { return index; } else { return index.input; } }