@angular/build
Version:
Official build system for Angular
118 lines • 5.36 kB
JavaScript
;
/**
* @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.normalizeOptions = normalizeOptions;
exports.injectTestingPolyfills = injectTestingPolyfills;
const architect_1 = require("@angular-devkit/architect");
const node_fs_1 = require("node:fs");
const node_path_1 = __importDefault(require("node:path"));
const normalize_cache_1 = require("../../utils/normalize-cache");
const project_metadata_1 = require("../../utils/project-metadata");
const tty_1 = require("../../utils/tty");
const schema_1 = require("./schema");
async function exists(path) {
try {
await node_fs_1.promises.access(path, node_fs_1.constants.F_OK);
return true;
}
catch {
return false;
}
}
function normalizeReporterOption(reporters) {
return reporters?.map((entry) => typeof entry === 'string'
? [entry, {}]
: entry);
}
async function normalizeOptions(context, projectName, options) {
// Setup base paths based on workspace root and project information
const workspaceRoot = context.workspaceRoot;
const projectMetadata = await context.getProjectMetadata(projectName);
const { projectRoot, projectSourceRoot } = (0, project_metadata_1.getProjectRootPaths)(workspaceRoot, projectMetadata);
// Gather persistent caching option and provide a project specific cache location
const cacheOptions = (0, normalize_cache_1.normalizeCacheOptions)(projectMetadata, workspaceRoot);
cacheOptions.path = node_path_1.default.join(cacheOptions.path, projectName);
// Target specifier defaults to the current project's build target using a development configuration
const buildTargetSpecifier = options.buildTarget ?? `::development`;
const buildTarget = (0, architect_1.targetFromTargetString)(buildTargetSpecifier, projectName, 'build');
const { runner, browsers, progress, filter, browserViewport, ui, runnerConfig } = options;
if (ui && runner !== schema_1.Runner.Vitest) {
throw new Error('The "ui" option is only available for the "vitest" runner.');
}
const [width, height] = browserViewport?.split('x').map(Number) ?? [];
let tsConfig = options.tsConfig;
if (tsConfig) {
const fullTsConfigPath = node_path_1.default.join(workspaceRoot, tsConfig);
if (!(await exists(fullTsConfigPath))) {
throw new Error(`The specified tsConfig file '${tsConfig}' does not exist.`);
}
}
else {
const tsconfigSpecPath = node_path_1.default.join(projectRoot, 'tsconfig.spec.json');
if (await exists(tsconfigSpecPath)) {
// The application builder expects a path relative to the workspace root.
tsConfig = node_path_1.default.relative(workspaceRoot, tsconfigSpecPath);
}
}
let watch = options.watch ?? (0, tty_1.isTTY)();
if (options.ui && options.watch === false) {
context.logger.warn(`The '--ui' option requires watch mode. The '--no-watch' flag will be ignored.`);
watch = true;
}
return {
// Project/workspace information
workspaceRoot,
projectRoot,
projectSourceRoot,
cacheOptions,
// Target/configuration specified options
buildTarget,
include: options.include ?? ['**/*.spec.ts'],
exclude: options.exclude,
filter,
runnerName: runner ?? schema_1.Runner.Vitest,
coverage: {
enabled: options.coverage,
exclude: options.coverageExclude,
include: options.coverageInclude,
reporters: normalizeReporterOption(options.coverageReporters),
thresholds: options.coverageThresholds,
// The schema generation tool doesn't support tuple types for items, but the schema validation
// does ensure that the array has exactly two numbers.
watermarks: options.coverageWatermarks,
},
tsConfig,
buildProgress: progress,
reporters: normalizeReporterOption(options.reporters),
outputFile: options.outputFile,
browsers,
browserViewport: width && height ? { width, height } : undefined,
watch,
debug: options.debug ?? false,
ui: process.env['CI'] ? false : ui,
providersFile: options.providersFile && node_path_1.default.join(workspaceRoot, options.providersFile),
setupFiles: options.setupFiles
? options.setupFiles.map((setupFile) => node_path_1.default.join(workspaceRoot, setupFile))
: [],
dumpVirtualFiles: options.dumpVirtualFiles,
listTests: options.listTests,
runnerConfig: typeof runnerConfig === 'string'
? runnerConfig.length === 0
? true
: node_path_1.default.resolve(workspaceRoot, runnerConfig)
: runnerConfig,
};
}
function injectTestingPolyfills(polyfills = []) {
return polyfills.includes('zone.js') ? [...polyfills, 'zone.js/testing'] : polyfills;
}
//# sourceMappingURL=options.js.map