@schematics/angular
Version:
Schematics specific to Angular
78 lines (77 loc) • 3.71 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
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = default_1;
const workspace_1 = require("../../utility/workspace");
const workspace_models_1 = require("../../utility/workspace-models");
/**
* Main entry point for the migration rule.
*
* This schematic migration performs updates to the Angular workspace configuration
* to ensure that application projects are properly configured with polyfills
* required for internationalization (`localize`).
*
* It specifically targets application projects that use either the `application`
* or `browser-esbuild` builders.
*
* The migration process involves:
*
* 1. Iterating over all projects in the workspace.
* 2. Checking each project to determine if it is an application-type project.
* 3. For each application project, examining the associated build targets.
* 4. If a build target's `localize` option is enabled but the polyfill
* `@angular/localize/init` is missing from the `polyfills` array, the polyfill
* is automatically added to ensure proper internationalization support.
*
* Additionally, this migration updates projects that use the `dev-server` or `extract-i18n`
* builders to ensure that deprecated `browserTarget` options are migrated to the
* newer `buildTarget` field.
*
*/
function default_1() {
return (0, workspace_1.updateWorkspace)((workspace) => {
for (const project of workspace.projects.values()) {
if (project.extensions.projectType !== workspace_models_1.ProjectType.Application) {
continue;
}
for (const target of project.targets.values()) {
if (target.builder === workspace_models_1.Builders.DevServer || target.builder === workspace_models_1.Builders.ExtractI18n) {
// Migrate `browserTarget` to `buildTarget`
for (const [, options] of (0, workspace_1.allTargetOptions)(target, false)) {
if (options['browserTarget'] && !options['buildTarget']) {
options['buildTarget'] = options['browserTarget'];
}
delete options['browserTarget'];
}
}
// Check if the target uses application-related builders
if (target.builder !== workspace_models_1.Builders.BuildApplication &&
target.builder !== workspace_models_1.Builders.Application &&
target.builder !== workspace_models_1.Builders.BrowserEsbuild) {
continue;
}
// Check if polyfills include '@angular/localize/init'
const polyfills = target.options?.['polyfills'];
if (Array.isArray(polyfills) &&
polyfills.some((polyfill) => typeof polyfill === 'string' && polyfill.startsWith('@angular/localize'))) {
// Skip if the polyfill is already present
continue;
}
// Add '@angular/localize/init' polyfill if localize option is enabled
for (const [, options] of (0, workspace_1.allTargetOptions)(target, false)) {
if (options['localize']) {
target.options ??= {};
(target.options['polyfills'] ??= []).push('@angular/localize/init');
break;
}
}
}
}
});
}