UNPKG

@angular-devkit/build-angular

Version:
136 lines (135 loc) 5.46 kB
"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 __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.extractMessages = extractMessages; const private_1 = require("@angular/build/private"); const node_fs_1 = require("node:fs"); const node_path_1 = __importDefault(require("node:path")); const browser_esbuild_1 = require("../browser-esbuild"); async function extractMessages(options, builderName, context, extractorConstructor) { const messages = []; // Setup the build options for the application based on the buildTarget option let buildOptions; if (builderName === '@angular-devkit/build-angular:application') { buildOptions = (await context.validateOptions(await context.getTargetOptions(options.buildTarget), builderName)); } else { buildOptions = (0, browser_esbuild_1.convertBrowserOptions)((await context.validateOptions(await context.getTargetOptions(options.buildTarget), builderName))); } buildOptions.optimization = false; buildOptions.sourceMap = { scripts: true, vendor: true, styles: false }; buildOptions.localize = false; buildOptions.budgets = undefined; buildOptions.index = false; buildOptions.serviceWorker = false; buildOptions.server = undefined; buildOptions.ssr = false; buildOptions.appShell = undefined; buildOptions.prerender = undefined; buildOptions.outputMode = undefined; const builderResult = await first((0, private_1.buildApplicationInternal)(buildOptions, context)); let success = false; if (!builderResult || builderResult.kind === private_1.ResultKind.Failure) { context.logger.error('Application build failed.'); } else if (builderResult.kind !== private_1.ResultKind.Full) { context.logger.error('Application build did not provide a full output.'); } else { // Setup the localize message extractor based on the in-memory files const extractor = setupLocalizeExtractor(extractorConstructor, builderResult.files, context); // Extract messages from each output JavaScript file. // Output files are only present on a successful build. for (const filePath of Object.keys(builderResult.files)) { if (!filePath.endsWith('.js')) { continue; } const fileMessages = extractor.extractMessages(filePath); messages.push(...fileMessages); } success = true; } return { success, basePath: context.workspaceRoot, messages, // Legacy i18n identifiers are not supported with the new application builder useLegacyIds: false, }; } function setupLocalizeExtractor(extractorConstructor, files, context) { const textDecoder = new TextDecoder(); // Setup a virtual file system instance for the extractor // * MessageExtractor itself uses readFile, relative and resolve // * Internal SourceFileLoader (sourcemap support) uses dirname, exists, readFile, and resolve const filesystem = { readFile(path) { // Output files are stored as relative to the workspace root const requestedPath = node_path_1.default.relative(context.workspaceRoot, path); const file = files[requestedPath]; let content; if (file?.origin === 'memory') { content = textDecoder.decode(file.contents); } else if (file?.origin === 'disk') { content = (0, node_fs_1.readFileSync)(file.inputPath, 'utf-8'); } if (content === undefined) { throw new Error('Unknown file requested: ' + requestedPath); } return content; }, relative(from, to) { return node_path_1.default.relative(from, to); }, resolve(...paths) { return node_path_1.default.resolve(...paths); }, exists(path) { // Output files are stored as relative to the workspace root const requestedPath = node_path_1.default.relative(context.workspaceRoot, path); return files[requestedPath] !== undefined; }, dirname(path) { return node_path_1.default.dirname(path); }, }; const logger = { // level 2 is warnings level: 2, debug(...args) { // eslint-disable-next-line no-console console.debug(...args); }, info(...args) { context.logger.info(args.join('')); }, warn(...args) { context.logger.warn(args.join('')); }, error(...args) { context.logger.error(args.join('')); }, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const extractor = new extractorConstructor(filesystem, logger, { // eslint-disable-next-line @typescript-eslint/no-explicit-any basePath: context.workspaceRoot, useSourceMaps: true, }); return extractor; } async function first(iterable) { for await (const value of iterable) { return value; } }