@nx/angular 20.1.0-canary.20241022-e57b851 → 20.1.0-canary.20241024-0bea5b2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. package/package.json +7 -7
  2. package/src/migrations/update-14-2-0/remove-show-circular-dependencies-option.d.ts +0 -2
  3. package/src/migrations/update-14-2-0/remove-show-circular-dependencies-option.js +0 -23
  4. package/src/migrations/update-14-2-0/update-angular-cli.d.ts +0 -2
  5. package/src/migrations/update-14-2-0/update-angular-cli.js +0 -22
  6. package/src/migrations/update-14-2-0/update-libraries-secondary-entrypoints.d.ts +0 -2
  7. package/src/migrations/update-14-2-0/update-libraries-secondary-entrypoints.js +0 -34
  8. package/src/migrations/update-14-2-0/update-ngcc-target.d.ts +0 -2
  9. package/src/migrations/update-14-2-0/update-ngcc-target.js +0 -17
  10. package/src/migrations/update-14-2-0/update-router-initial-navigation.d.ts +0 -2
  11. package/src/migrations/update-14-2-0/update-router-initial-navigation.js +0 -73
  12. package/src/migrations/update-14-2-0/update-tsconfig-target.d.ts +0 -2
  13. package/src/migrations/update-14-2-0/update-tsconfig-target.js +0 -155
  14. package/src/migrations/update-14-5-0/migrate-mfe-to-mf.d.ts +0 -5
  15. package/src/migrations/update-14-5-0/migrate-mfe-to-mf.js +0 -90
  16. package/src/migrations/update-14-5-2/update-angular-cli.d.ts +0 -2
  17. package/src/migrations/update-14-5-2/update-angular-cli.js +0 -22
  18. package/src/migrations/update-14-6-0/update-angular-cli.d.ts +0 -2
  19. package/src/migrations/update-14-6-0/update-angular-cli.js +0 -22
  20. package/src/migrations/update-14-8-0/rename-webpack-server.d.ts +0 -2
  21. package/src/migrations/update-14-8-0/rename-webpack-server.js +0 -21
  22. package/src/migrations/update-15-0-0/add-karma-inputs.d.ts +0 -2
  23. package/src/migrations/update-15-0-0/add-karma-inputs.js +0 -41
  24. package/src/migrations/update-15-0-0/switch-to-jasmine-marbles.d.ts +0 -2
  25. package/src/migrations/update-15-0-0/switch-to-jasmine-marbles.js +0 -102
  26. package/src/migrations/update-15-2-0/remove-browserlist-config.d.ts +0 -4
  27. package/src/migrations/update-15-2-0/remove-browserlist-config.js +0 -59
  28. package/src/migrations/update-15-2-0/remove-platform-server-exports.d.ts +0 -2
  29. package/src/migrations/update-15-2-0/remove-platform-server-exports.js +0 -62
  30. package/src/migrations/update-15-2-0/update-angular-cli.d.ts +0 -2
  31. package/src/migrations/update-15-2-0/update-angular-cli.js +0 -22
  32. package/src/migrations/update-15-2-0/update-karma-main-file.d.ts +0 -2
  33. package/src/migrations/update-15-2-0/update-karma-main-file.js +0 -72
  34. package/src/migrations/update-15-2-0/update-typescript-target.d.ts +0 -2
  35. package/src/migrations/update-15-2-0/update-typescript-target.js +0 -52
  36. package/src/migrations/update-15-2-0/update-workspace-config.d.ts +0 -2
  37. package/src/migrations/update-15-2-0/update-workspace-config.js +0 -24
  38. package/src/migrations/update-15-5-0/update-angular-cli.d.ts +0 -2
  39. package/src/migrations/update-15-5-0/update-angular-cli.js +0 -22
  40. package/src/migrations/update-15-7-0/install-required-packages.d.ts +0 -2
  41. package/src/migrations/update-15-7-0/install-required-packages.js +0 -36
  42. package/src/migrations/update-15-8-0/update-angular-cli.d.ts +0 -2
  43. package/src/migrations/update-15-8-0/update-angular-cli.js +0 -22
  44. package/src/migrations/update-15-9-0/update-file-server-executor.d.ts +0 -2
  45. package/src/migrations/update-15-9-0/update-file-server-executor.js +0 -42
  46. package/src/migrations/update-15-9-0/update-testing-tsconfig.d.ts +0 -3
  47. package/src/migrations/update-15-9-0/update-testing-tsconfig.js +0 -32
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/angular",
3
- "version": "20.1.0-canary.20241022-e57b851",
3
+ "version": "20.1.0-canary.20241024-0bea5b2",
4
4
  "private": false,
5
5
  "description": "The Nx Plugin for Angular contains executors, generators, and utilities for managing Angular applications and libraries within an Nx workspace. It provides: \n\n- Integration with libraries such as Storybook, Jest, ESLint, Tailwind CSS, Playwright and Cypress. \n\n- Generators to help scaffold code quickly (like: Micro Frontends, Libraries, both internal to your codebase and publishable to npm) \n\n- Single Component Application Modules (SCAMs) \n\n- NgRx helpers. \n\n- Utilities for automatic workspace refactoring.",
6
6
  "repository": {
@@ -80,12 +80,12 @@
80
80
  "webpack-merge": "^5.8.0",
81
81
  "webpack": "^5.88.0",
82
82
  "@module-federation/enhanced": "0.6.9",
83
- "@nx/devkit": "20.1.0-canary.20241022-e57b851",
84
- "@nx/js": "20.1.0-canary.20241022-e57b851",
85
- "@nx/eslint": "20.1.0-canary.20241022-e57b851",
86
- "@nx/webpack": "20.1.0-canary.20241022-e57b851",
87
- "@nx/web": "20.1.0-canary.20241022-e57b851",
88
- "@nx/workspace": "20.1.0-canary.20241022-e57b851",
83
+ "@nx/devkit": "20.1.0-canary.20241024-0bea5b2",
84
+ "@nx/js": "20.1.0-canary.20241024-0bea5b2",
85
+ "@nx/eslint": "20.1.0-canary.20241024-0bea5b2",
86
+ "@nx/webpack": "20.1.0-canary.20241024-0bea5b2",
87
+ "@nx/web": "20.1.0-canary.20241024-0bea5b2",
88
+ "@nx/workspace": "20.1.0-canary.20241024-0bea5b2",
89
89
  "piscina": "^4.4.0"
90
90
  },
91
91
  "peerDependencies": {
@@ -1,2 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,23 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
6
- const executors = [
7
- '@angular-devkit/build-angular:browser',
8
- '@angular-devkit/build-angular:server',
9
- '@nrwl/angular:webpack-browser',
10
- ];
11
- async function default_1(tree) {
12
- executors.forEach((executor) => {
13
- (0, executor_options_utils_1.forEachExecutorOptions)(tree, executor, (_options, projectName, targetName, configurationName) => {
14
- const projectConfiguration = (0, devkit_1.readProjectConfiguration)(tree, projectName);
15
- const config = configurationName
16
- ? projectConfiguration.targets[targetName].configurations[configurationName]
17
- : projectConfiguration.targets[targetName].options;
18
- delete config.showCircularDependencies;
19
- (0, devkit_1.updateProjectConfiguration)(tree, projectName, projectConfiguration);
20
- });
21
- });
22
- await (0, devkit_1.formatFiles)(tree);
23
- }
@@ -1,2 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- const angularCliVersion = '~14.0.0';
6
- async function default_1(tree) {
7
- let shouldFormat = false;
8
- (0, devkit_1.updateJson)(tree, 'package.json', (json) => {
9
- if (json.devDependencies?.['@angular/cli']) {
10
- json.devDependencies['@angular/cli'] = angularCliVersion;
11
- shouldFormat = true;
12
- }
13
- else if (json.dependencies?.['@angular/cli']) {
14
- json.dependencies['@angular/cli'] = angularCliVersion;
15
- shouldFormat = true;
16
- }
17
- return json;
18
- });
19
- if (shouldFormat) {
20
- await (0, devkit_1.formatFiles)(tree);
21
- }
22
- }
@@ -1,2 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,34 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- const path_1 = require("path");
6
- const libraryExecutors = [
7
- '@angular-devkit/build-angular:ng-packagr',
8
- '@nrwl/angular:ng-packagr-lite',
9
- '@nrwl/angular:package',
10
- ];
11
- async function default_1(tree) {
12
- const projects = (0, devkit_1.getProjects)(tree);
13
- for (const [, project] of projects) {
14
- if (!Object.values(project.targets ?? {}).some((target) => libraryExecutors.includes(target.executor))) {
15
- continue;
16
- }
17
- (0, devkit_1.visitNotIgnoredFiles)(tree, project.root, (filePath) => {
18
- if ((0, path_1.basename)(filePath) !== 'package.json' ||
19
- (0, devkit_1.normalizePath)(filePath) ===
20
- (0, devkit_1.joinPathFragments)(project.root, 'package.json')) {
21
- return;
22
- }
23
- const json = (0, devkit_1.readJson)(tree, filePath);
24
- if (json.ngPackage) {
25
- // Migrate ng-packagr config to an ng-packagr config file.
26
- const configFilePath = (0, devkit_1.joinPathFragments)((0, path_1.dirname)(filePath), 'ng-package.json');
27
- (0, devkit_1.writeJson)(tree, configFilePath, json.ngPackage);
28
- }
29
- // Delete package.json as it is no longer needed in APF 14.
30
- tree.delete(filePath);
31
- });
32
- }
33
- await (0, devkit_1.formatFiles)(tree);
34
- }
@@ -1,2 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- async function default_1(tree) {
6
- let shouldFormat = false;
7
- (0, devkit_1.updateJson)(tree, 'package.json', (json) => {
8
- if (json.scripts?.postinstall?.includes('ngcc ')) {
9
- json.scripts.postinstall = json.scripts.postinstall.replace(/(.*)(ngcc --properties es2015 )(.*)/, '$1ngcc --properties es2020 $3');
10
- shouldFormat = true;
11
- }
12
- return json;
13
- });
14
- if (shouldFormat) {
15
- await (0, devkit_1.formatFiles)(tree);
16
- }
17
- }
@@ -1,2 +0,0 @@
1
- import type { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,73 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- const tsquery_1 = require("@phenomnomnominal/tsquery");
6
- const typescript_1 = require("typescript");
7
- async function default_1(tree) {
8
- const printer = (0, typescript_1.createPrinter)();
9
- const projects = await getProjectsWithAngularRouter(tree);
10
- for (const project of projects) {
11
- (0, devkit_1.visitNotIgnoredFiles)(tree, project.root, (filePath) => {
12
- // we are only interested in .ts files
13
- if (!filePath.endsWith('.ts')) {
14
- return;
15
- }
16
- const content = tree.read(filePath, 'utf-8');
17
- const ast = tsquery_1.tsquery.ast(content);
18
- const routerModuleForRootCall = getRouterModuleForRootCall(ast);
19
- if (!routerModuleForRootCall) {
20
- return;
21
- }
22
- const initialNavigationAssignment = getInitialNavigationAssignment(routerModuleForRootCall.arguments[1]);
23
- if (!initialNavigationAssignment) {
24
- return;
25
- }
26
- const updatedInitialNavigationAssignment = printer.printNode(typescript_1.EmitHint.Unspecified, typescript_1.factory.updatePropertyAssignment(initialNavigationAssignment, initialNavigationAssignment.name, typescript_1.factory.createIdentifier(`'enabledBlocking'`)), initialNavigationAssignment.getSourceFile());
27
- const updatedContent = `${content.slice(0, initialNavigationAssignment.getStart())}${updatedInitialNavigationAssignment}${content.slice(initialNavigationAssignment.getEnd())}`;
28
- tree.write(filePath, updatedContent);
29
- });
30
- }
31
- await (0, devkit_1.formatFiles)(tree);
32
- }
33
- function getInitialNavigationAssignment(extraOptionsLiteral) {
34
- for (const prop of extraOptionsLiteral.properties) {
35
- if ((0, typescript_1.isPropertyAssignment)(prop) &&
36
- ((0, typescript_1.isIdentifier)(prop.name) || (0, typescript_1.isStringLiteralLike)(prop.name)) &&
37
- prop.name.text === 'initialNavigation' &&
38
- needsMigration(prop)) {
39
- return prop;
40
- }
41
- }
42
- return null;
43
- }
44
- async function getProjectsWithAngularRouter(tree) {
45
- const projectGraph = await (0, devkit_1.createProjectGraphAsync)();
46
- return Object.entries(projectGraph.dependencies)
47
- .filter(([node, dep]) => dep.some(({ target }) => target === 'npm:@angular/router' &&
48
- !projectGraph.externalNodes?.[node]))
49
- .map(([projectName]) => (0, devkit_1.readProjectConfiguration)(tree, projectName));
50
- }
51
- function getRouterModuleForRootCall(sourceFile) {
52
- // narrow down call expressions
53
- const routerModuleForRootCalls = (0, tsquery_1.tsquery)(sourceFile, 'CallExpression:has(PropertyAccessExpression:has(Identifier[name=RouterModule]):has(Identifier[name=forRoot]))', { visitAllChildren: true });
54
- for (const node of routerModuleForRootCalls) {
55
- if (isRouterModuleForRoot(node) &&
56
- node.arguments.length >= 2 &&
57
- (0, typescript_1.isObjectLiteralExpression)(node.arguments[1])) {
58
- return node;
59
- }
60
- }
61
- return null;
62
- }
63
- function isRouterModuleForRoot(node) {
64
- // make sure is not an outer call expression (NgModule call)
65
- return ((0, typescript_1.isPropertyAccessExpression)(node.expression) &&
66
- (0, typescript_1.isIdentifier)(node.expression.expression) &&
67
- node.expression.expression.text === 'RouterModule' &&
68
- (0, typescript_1.isIdentifier)(node.expression.name) &&
69
- node.expression.name.text === 'forRoot');
70
- }
71
- function needsMigration(node) {
72
- return ((0, typescript_1.isStringLiteralLike)(node.initializer) && node.initializer.text === 'enabled');
73
- }
@@ -1,2 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,155 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- const devkit_2 = require("@nx/devkit");
6
- const tsquery_1 = require("@phenomnomnominal/tsquery");
7
- const path_1 = require("path");
8
- const jestExecutor = '@nrwl/jest:jest';
9
- const executors = [
10
- '@angular-devkit/build-angular:browser',
11
- '@angular-devkit/build-angular:karma',
12
- '@angular-devkit/build-angular:ng-packagr',
13
- '@nrwl/angular:webpack-browser',
14
- '@nrwl/angular:delegate-build',
15
- '@nrwl/angular:ng-packagr-lite',
16
- '@nrwl/angular:package',
17
- ];
18
- const skipTargets = ['es2020', 'es2021', 'es2022', 'esnext'];
19
- async function default_1(tree) {
20
- const tsConfigPaths = await collectTsConfigPaths(tree);
21
- for (const tsConfigPath of tsConfigPaths) {
22
- (0, devkit_2.updateJson)(tree, tsConfigPath, (json) => {
23
- if (!json.compilerOptions?.target ||
24
- (json.compilerOptions?.target &&
25
- !skipTargets.includes(json.compilerOptions.target.toLowerCase()))) {
26
- json.compilerOptions ??= {};
27
- json.compilerOptions.target = 'es2020';
28
- }
29
- return json;
30
- }, {
31
- allowTrailingComma: true,
32
- disallowComments: false,
33
- });
34
- }
35
- await (0, devkit_2.formatFiles)(tree);
36
- }
37
- async function collectTsConfigPaths(tree) {
38
- const uniqueTsConfigs = new Set([]);
39
- const projectGraph = await (0, devkit_2.createProjectGraphAsync)();
40
- const angularProjects = Object.entries(projectGraph.dependencies)
41
- .filter(([node, dep]) => dep.some(({ target }) => target === 'npm:@angular/core' && !projectGraph.externalNodes?.[node]))
42
- .map(([projectName]) => ({
43
- projectName,
44
- project: (0, devkit_2.readProjectConfiguration)(tree, projectName),
45
- }));
46
- for (const { projectName, project } of angularProjects) {
47
- const tsConfigPath = (0, devkit_2.joinPathFragments)(project.root, 'tsconfig.json');
48
- if (tree.exists(tsConfigPath)) {
49
- uniqueTsConfigs.add(tsConfigPath);
50
- const targetTsConfigPaths = getProjectTsConfigPaths(tree, project, projectName, false);
51
- targetTsConfigPaths.forEach((tsConfigPath) => {
52
- const tsConfig = (0, devkit_1.readJson)(tree, tsConfigPath, {
53
- allowTrailingComma: true,
54
- disallowComments: false,
55
- });
56
- if (tsConfig.compilerOptions?.target) {
57
- uniqueTsConfigs.add(tsConfigPath);
58
- }
59
- });
60
- continue;
61
- }
62
- const tsConfigPaths = getProjectTsConfigPaths(tree, project, projectName);
63
- for (const tsConfigPath of tsConfigPaths) {
64
- uniqueTsConfigs.add(tsConfigPath);
65
- }
66
- }
67
- return Array.from(uniqueTsConfigs);
68
- }
69
- function getProjectTsConfigPaths(tree, project, projectName, shouldWarn = true) {
70
- const tsConfigPaths = new Set();
71
- for (const [targetName, target] of Object.entries(project.targets || {})) {
72
- if (executors.includes(target.executor)) {
73
- const tsConfigPathsFromTarget = getPathValuesFromTarget(target, 'tsConfig');
74
- tsConfigPathsFromTarget.forEach((tsConfigPath) => {
75
- if (tree.exists(tsConfigPath)) {
76
- tsConfigPaths.add(tsConfigPath);
77
- }
78
- else if (shouldWarn) {
79
- devkit_2.logger.warn(`The "${tsConfigPath}" file specified in the "${targetName}" target of the "${projectName}" project could not be found. ` +
80
- 'Skipping setting the target to ES2020.');
81
- }
82
- });
83
- }
84
- else if (target.executor === jestExecutor) {
85
- const tsConfigPathsFromJestTarget = getTsConfigPathsFromJestTarget(tree, target, targetName, projectName, shouldWarn);
86
- tsConfigPathsFromJestTarget.forEach((tsConfigPath) => {
87
- tsConfigPaths.add(tsConfigPath);
88
- });
89
- }
90
- else if (shouldWarn) {
91
- devkit_2.logger.warn(`The "${targetName}" target of the "${projectName}" project is using an executor not supported by the migration. ` +
92
- 'Skipping setting the TS target to ES2020 for the project.');
93
- }
94
- }
95
- return Array.from(tsConfigPaths);
96
- }
97
- function getTsConfigPathsFromJestTarget(tree, target, targetName, projectName, shouldWarn) {
98
- const tsConfigPaths = [];
99
- const jestConfigPaths = getPathValuesFromTarget(target, 'jestConfig');
100
- if (!jestConfigPaths.length && shouldWarn) {
101
- devkit_2.logger.warn(`The "${targetName}" target of the "${projectName}" project is using the "${jestExecutor}" executor but no "jestConfig" property was specified. ` +
102
- 'Skipping setting the TS compilation target to ES2020 for the project.');
103
- }
104
- for (const jestConfigPath of jestConfigPaths) {
105
- const tsConfigPath = getTsConfigFromJestConfig(tree, jestConfigPath, targetName, projectName, shouldWarn);
106
- if (tsConfigPath) {
107
- tsConfigPaths.push(tsConfigPath);
108
- }
109
- }
110
- return tsConfigPaths;
111
- }
112
- function getTsConfigFromJestConfig(tree, jestConfigPath, targetName, projectName, shouldWarn) {
113
- if (!tree.exists(jestConfigPath)) {
114
- if (shouldWarn) {
115
- devkit_2.logger.warn(`The "${jestConfigPath}" file specified in the "${targetName}" target of the "${projectName}" project could not be found. ` +
116
- `The TS config file used by the target can't be determined. Skipping setting the target to ES2020.`);
117
- }
118
- return undefined;
119
- }
120
- const jestConfig = tree.read(jestConfigPath, 'utf-8');
121
- const jestConfigAst = tsquery_1.tsquery.ast(jestConfig);
122
- const tsJestTsConfigStringLiteral = (0, tsquery_1.tsquery)(jestConfigAst, 'PropertyAssignment:has(Identifier[name=globals]) PropertyAssignment:has(StringLiteral[value=ts-jest]) PropertyAssignment:has(Identifier[name=tsconfig]) > StringLiteral', { visitAllChildren: true })[0];
123
- if (!tsJestTsConfigStringLiteral) {
124
- if (shouldWarn) {
125
- devkit_2.logger.warn(`Couldn't find the "tsconfig" property for "ts-jest" in the Jest configuration file "${jestConfigPath}" specified in the ` +
126
- `"${targetName}" target of the "${projectName}" project. The TS config file used by the target can't be determined. ` +
127
- 'Skipping setting the target to ES2020.');
128
- }
129
- return undefined;
130
- }
131
- const tsJestTsConfigValue = tsJestTsConfigStringLiteral
132
- .getText()
133
- .replace(/['"]/g, '');
134
- const tsConfigPath = tsJestTsConfigValue.replace('<rootDir>', (0, path_1.dirname)(jestConfigPath));
135
- if (!tree.exists(tsConfigPath)) {
136
- if (shouldWarn) {
137
- devkit_2.logger.warn(`The "${tsJestTsConfigValue}" file specified in the Jest configuration file "${jestConfigPath}" of the "${targetName}" target ` +
138
- `of the "${projectName}" project could not be found. Skipping setting the target to ES2020.`);
139
- }
140
- return undefined;
141
- }
142
- return tsConfigPath;
143
- }
144
- function getPathValuesFromTarget(target, option) {
145
- const values = [];
146
- if (target.options?.[option]) {
147
- values.push(target.options[option]);
148
- }
149
- Object.values(target.configurations ?? {}).forEach((options) => {
150
- if (options[option]) {
151
- values.push(options[option]);
152
- }
153
- });
154
- return values;
155
- }
@@ -1,5 +0,0 @@
1
- import type { Tree } from '@nx/devkit';
2
- export declare function replaceNrwlAngularMfImport(fileContents: string): string;
3
- export declare function replaceExportedMFETypes(fileContents: string): string;
4
- export declare function renameSetupMfeGeneratorUsages(fileContents: string): string;
5
- export default function (tree: Tree): Promise<void>;
@@ -1,90 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.replaceNrwlAngularMfImport = replaceNrwlAngularMfImport;
4
- exports.replaceExportedMFETypes = replaceExportedMFETypes;
5
- exports.renameSetupMfeGeneratorUsages = renameSetupMfeGeneratorUsages;
6
- exports.default = default_1;
7
- const devkit_1 = require("@nx/devkit");
8
- const path_1 = require("path");
9
- const tsquery_1 = require("@phenomnomnominal/tsquery");
10
- const NRWL_ANGULAR_MFE_STATIC_IMPORT_SELECTOR = 'ImportDeclaration > StringLiteral[value="@nrwl/angular/mfe"]';
11
- const NRWL_ANGULAR_MFE_DYNAMIC_IMPORT_SELECTOR = 'CallExpression:has(ImportKeyword) > StringLiteral[value="@nrwl/angular/mfe"]';
12
- const NRWL_ANGULAR_MFE_TYPES_SELECTOR = 'ImportDeclaration:has(StringLiteral[value=@nrwl/angular/module-federation]) > ImportClause > NamedImports';
13
- function replaceNrwlAngularMfImport(fileContents) {
14
- let fileAst = tsquery_1.tsquery.ast(fileContents);
15
- if (fileContents.includes('@nrwl/angular/mfe')) {
16
- // This file definitely contains the string, however, we're interested in whether it is an import
17
- const staticQueryResult = (0, tsquery_1.tsquery)(fileAst, NRWL_ANGULAR_MFE_STATIC_IMPORT_SELECTOR, {
18
- visitAllChildren: true,
19
- });
20
- if (staticQueryResult && staticQueryResult.length > 0) {
21
- fileContents = `${fileContents.slice(0, staticQueryResult[0].getStart())}'@nrwl/angular/mf'${fileContents.slice(staticQueryResult[0].getEnd())}`;
22
- }
23
- fileAst = tsquery_1.tsquery.ast(fileContents);
24
- const dynamicQueryResult = (0, tsquery_1.tsquery)(fileAst, NRWL_ANGULAR_MFE_DYNAMIC_IMPORT_SELECTOR, {
25
- visitAllChildren: true,
26
- });
27
- if (dynamicQueryResult && dynamicQueryResult.length > 0) {
28
- fileContents = `${fileContents.slice(0, dynamicQueryResult[0].getStart())}'@nrwl/angular/mf'${fileContents.slice(dynamicQueryResult[0].getEnd())}`;
29
- }
30
- }
31
- return fileContents;
32
- }
33
- function replaceExportedMFETypes(fileContents) {
34
- const ast = tsquery_1.tsquery.ast(fileContents);
35
- const queryResult = (0, tsquery_1.tsquery)(ast, NRWL_ANGULAR_MFE_TYPES_SELECTOR, {
36
- visitAllChildren: true,
37
- });
38
- if (queryResult && queryResult.length > 0) {
39
- const TYPES_IMPORTED_FROM_NRWL_REGEX = /(MFERemotes|MFEConfig)+.*from+.+(@nrwl\/angular\/module-federation)+/g;
40
- if (TYPES_IMPORTED_FROM_NRWL_REGEX.test(fileContents)) {
41
- fileContents = fileContents.replace(/MFERemotes/g, 'MFRemotes');
42
- fileContents = fileContents.replace(/MFEConfig/g, 'MFConfig');
43
- }
44
- }
45
- return fileContents;
46
- }
47
- function renameSetupMfeGeneratorUsages(fileContents) {
48
- // Attempt to update any custom generator usage of the changed generators
49
- const NRWL_SETUP_MFE_IMPORT_SELECTOR = 'ImportDeclaration:has(StringLiteral[value=@nrwl/angular/generators]) > ImportClause:has(NamedImports:has(ImportSpecifier > Identifier[name=setupMfe]))';
50
- const SETUP_MFE_IMPORTED_FROM_NRWL_REGEX = /(setupMfe)+.*from+.+(@nrwl\/angular\/generators)+/g;
51
- const SETUP_MFE_FUNCTION_CALL_MFE_TYPE_PROPERTY_ASSIGNMENT_SELECTOR = 'CallExpression:has(Identifier[name=setupMf]) ObjectLiteralExpression > PropertyAssignment > Identifier[name=mfeType]';
52
- let ast = tsquery_1.tsquery.ast(fileContents);
53
- let queryResult = (0, tsquery_1.tsquery)(ast, NRWL_SETUP_MFE_IMPORT_SELECTOR, {
54
- visitAllChildren: true,
55
- });
56
- if (queryResult &&
57
- queryResult.length > 0 &&
58
- SETUP_MFE_IMPORTED_FROM_NRWL_REGEX.test(fileContents)) {
59
- fileContents = fileContents.replace(/setupMfe/g, 'setupMf');
60
- }
61
- ast = tsquery_1.tsquery.ast(fileContents);
62
- queryResult = (0, tsquery_1.tsquery)(ast, SETUP_MFE_FUNCTION_CALL_MFE_TYPE_PROPERTY_ASSIGNMENT_SELECTOR, {
63
- visitAllChildren: true,
64
- });
65
- while (queryResult && queryResult.length > 0) {
66
- const node = queryResult[0];
67
- fileContents = `${fileContents.slice(0, node.getStart())}mfType${fileContents.slice(node.getEnd())}`;
68
- ast = tsquery_1.tsquery.ast(fileContents);
69
- queryResult = (0, tsquery_1.tsquery)(ast, SETUP_MFE_FUNCTION_CALL_MFE_TYPE_PROPERTY_ASSIGNMENT_SELECTOR, {
70
- visitAllChildren: true,
71
- });
72
- }
73
- return fileContents;
74
- }
75
- async function default_1(tree) {
76
- (0, devkit_1.visitNotIgnoredFiles)(tree, '/', (path) => {
77
- const pathExtName = (0, path_1.extname)(path);
78
- if (pathExtName !== '.ts' && pathExtName !== '.js') {
79
- return;
80
- }
81
- let fileContents = tree.read(path, 'utf-8');
82
- fileContents = replaceNrwlAngularMfImport(fileContents);
83
- if (pathExtName === '.ts') {
84
- // Only TS files can import types and interfaces
85
- fileContents = replaceExportedMFETypes(fileContents);
86
- fileContents = renameSetupMfeGeneratorUsages(fileContents);
87
- }
88
- tree.write(path, fileContents);
89
- });
90
- }
@@ -1,2 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- const angularCliVersion = '~14.1.0';
6
- async function default_1(tree) {
7
- let shouldFormat = false;
8
- (0, devkit_1.updateJson)(tree, 'package.json', (json) => {
9
- if (json.devDependencies?.['@angular/cli']) {
10
- json.devDependencies['@angular/cli'] = angularCliVersion;
11
- shouldFormat = true;
12
- }
13
- else if (json.dependencies?.['@angular/cli']) {
14
- json.dependencies['@angular/cli'] = angularCliVersion;
15
- shouldFormat = true;
16
- }
17
- return json;
18
- });
19
- if (shouldFormat) {
20
- await (0, devkit_1.formatFiles)(tree);
21
- }
22
- }
@@ -1,2 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- const angularCliVersion = '~14.2.0';
6
- async function default_1(tree) {
7
- let shouldFormat = false;
8
- (0, devkit_1.updateJson)(tree, 'package.json', (json) => {
9
- if (json.devDependencies?.['@angular/cli']) {
10
- json.devDependencies['@angular/cli'] = angularCliVersion;
11
- shouldFormat = true;
12
- }
13
- else if (json.dependencies?.['@angular/cli']) {
14
- json.dependencies['@angular/cli'] = angularCliVersion;
15
- shouldFormat = true;
16
- }
17
- return json;
18
- });
19
- if (shouldFormat) {
20
- await (0, devkit_1.formatFiles)(tree);
21
- }
22
- }
@@ -1,2 +0,0 @@
1
- import type { Tree } from '@nx/devkit';
2
- export default function renameWebpackServer(tree: Tree): void;
@@ -1,21 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = renameWebpackServer;
4
- const devkit_1 = require("@nx/devkit");
5
- function renameWebpackServer(tree) {
6
- const projects = (0, devkit_1.getProjects)(tree);
7
- const oldExecutorName = '@nrwl/angular:webpack-server';
8
- const newExecutorName = '@nrwl/angular:webpack-dev-server';
9
- for (const [projectName, project] of projects.entries()) {
10
- let stringifiedProject = JSON.stringify(project);
11
- if (!stringifiedProject.includes(oldExecutorName)) {
12
- continue;
13
- }
14
- for (const [targetName, target] of Object.entries(project.targets)) {
15
- if (target.executor === oldExecutorName) {
16
- target.executor = newExecutorName;
17
- }
18
- }
19
- (0, devkit_1.updateProjectConfiguration)(tree, projectName, project);
20
- }
21
- }
@@ -1,2 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,41 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
6
- async function default_1(tree) {
7
- const nxJson = (0, devkit_1.readNxJson)(tree);
8
- const karmaTargets = getKarmaTargetNames(tree);
9
- const hasProductionFileset = !!nxJson.namedInputs?.production;
10
- if (karmaTargets.size > 0 && hasProductionFileset) {
11
- const productionFileset = new Set(nxJson.namedInputs.production);
12
- for (const exclusion of [
13
- '!{projectRoot}/**/*.spec.[jt]s',
14
- '!{projectRoot}/tsconfig.spec.json',
15
- '!{projectRoot}/karma.conf.js',
16
- ]) {
17
- productionFileset.add(exclusion);
18
- }
19
- nxJson.namedInputs.production = Array.from(productionFileset);
20
- }
21
- for (const targetName of karmaTargets) {
22
- nxJson.targetDefaults ??= {};
23
- const jestTargetDefaults = (nxJson.targetDefaults[targetName] ??= {});
24
- jestTargetDefaults.inputs ??= [
25
- 'default',
26
- hasProductionFileset ? '^production' : '^default',
27
- ...(tree.exists('karma.conf.js')
28
- ? ['{workspaceRoot}/karma.conf.js']
29
- : []),
30
- ];
31
- }
32
- (0, devkit_1.updateNxJson)(tree, nxJson);
33
- await (0, devkit_1.formatFiles)(tree);
34
- }
35
- function getKarmaTargetNames(tree) {
36
- const karmaTargetNames = new Set();
37
- (0, executor_options_utils_1.forEachExecutorOptions)(tree, '@angular-devkit/build-angular:karma', (_, __, target) => {
38
- karmaTargetNames.add(target);
39
- });
40
- return karmaTargetNames;
41
- }
@@ -1,2 +0,0 @@
1
- import type { Tree } from '@nx/devkit';
2
- export default function switchToJasmineMarbles(tree: Tree): Promise<void>;
@@ -1,102 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = switchToJasmineMarbles;
4
- const devkit_1 = require("@nx/devkit");
5
- const path_1 = require("path");
6
- const tsquery_1 = require("@phenomnomnominal/tsquery");
7
- const versions_1 = require("../../utils/versions");
8
- const semver_1 = require("@nx/devkit/src/utils/semver");
9
- const semver_2 = require("semver");
10
- async function switchToJasmineMarbles(tree) {
11
- const usesJasmineMarbles = await replaceJasmineMarbleUsagesInFiles(tree);
12
- addJasmineMarblesDevDependencyIfUsed(tree, usesJasmineMarbles);
13
- }
14
- async function replaceJasmineMarbleUsagesInFiles(tree) {
15
- let usesJasmineMarbles = false;
16
- const projectGraph = await (() => {
17
- try {
18
- return (0, devkit_1.readCachedProjectGraph)();
19
- }
20
- catch {
21
- return (0, devkit_1.createProjectGraphAsync)();
22
- }
23
- })();
24
- const dirsToTraverse = Object.entries(projectGraph.dependencies)
25
- .filter(([node, dep]) => dep.some(({ target }) => target === 'npm:@nrwl/angular' && !projectGraph.externalNodes?.[node]))
26
- .map(([projectName]) => (0, devkit_1.readProjectConfiguration)(tree, projectName).root);
27
- for (const dir of dirsToTraverse) {
28
- (0, devkit_1.visitNotIgnoredFiles)(tree, dir, (path) => {
29
- if ((0, path_1.extname)(path) !== '.ts') {
30
- return;
31
- }
32
- const fileContents = tree.read(path, 'utf-8');
33
- if (!fileContents.includes('@nrwl/angular/testing')) {
34
- return;
35
- }
36
- const NRWL_ANGULAR_TESTING_IMPORT_SELECTOR = 'ImportDeclaration:has(StringLiteral[value="@nrwl/angular/testing"])';
37
- const ast = tsquery_1.tsquery.ast(fileContents);
38
- const nrwlAngularTestingImportNodes = (0, tsquery_1.tsquery)(ast, NRWL_ANGULAR_TESTING_IMPORT_SELECTOR, { visitAllChildren: true });
39
- if (!nrwlAngularTestingImportNodes ||
40
- nrwlAngularTestingImportNodes.length === 0) {
41
- return;
42
- }
43
- const jasmineMarblesExportsRegex = new RegExp(/(hot|cold|getTestScheduler|time)/);
44
- if (!jasmineMarblesExportsRegex.test(nrwlAngularTestingImportNodes[0].getText())) {
45
- return;
46
- }
47
- const IMPORT_SPECIFIERS_SELECTOR = 'NamedImports > ImportSpecifier';
48
- const importSpecifierNodes = (0, tsquery_1.tsquery)(nrwlAngularTestingImportNodes[0], IMPORT_SPECIFIERS_SELECTOR, { visitAllChildren: true });
49
- if (!importSpecifierNodes || importSpecifierNodes.length === 0) {
50
- return;
51
- }
52
- const validNrwlTestingImports = [];
53
- const validJasmineMarbleImports = [];
54
- for (const node of importSpecifierNodes) {
55
- const importSymbol = node.getText();
56
- if (jasmineMarblesExportsRegex.test(importSymbol)) {
57
- validJasmineMarbleImports.push(importSymbol);
58
- }
59
- else {
60
- validNrwlTestingImports.push(importSymbol);
61
- }
62
- }
63
- if (!usesJasmineMarbles && validJasmineMarbleImports.length > 0) {
64
- usesJasmineMarbles = true;
65
- }
66
- const newFileContents = `${fileContents.slice(0, nrwlAngularTestingImportNodes[0].getStart())}${validNrwlTestingImports.length > 0
67
- ? `import {${validNrwlTestingImports.join(',')}} from '@nrwl/angular/testing';`
68
- : ''}
69
- ${validJasmineMarbleImports.length > 0
70
- ? `import {${validJasmineMarbleImports.join(',')}} from 'jasmine-marbles';${fileContents.slice(nrwlAngularTestingImportNodes[0].getEnd(), -1)}`
71
- : ''}`;
72
- tree.write(path, newFileContents);
73
- });
74
- }
75
- return usesJasmineMarbles;
76
- }
77
- function addJasmineMarblesDevDependencyIfUsed(tree, usesJasmineMarbles) {
78
- if (!usesJasmineMarbles) {
79
- return;
80
- }
81
- const pkgJson = (0, devkit_1.readJson)(tree, 'package.json');
82
- const jasmineMarblesDependency = pkgJson.dependencies['jasmine-marbles'];
83
- const jasmineMarblesDevDependency = pkgJson.devDependencies['jasmine-marbles'];
84
- if (jasmineMarblesDependency || jasmineMarblesDevDependency) {
85
- return;
86
- }
87
- const jasmineMarblesVersion = getJasmineMarblesVersion(tree);
88
- (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
89
- 'jasmine-marbles': jasmineMarblesVersion,
90
- });
91
- }
92
- function getJasmineMarblesVersion(tree) {
93
- let rxjsVersion;
94
- try {
95
- const { dependencies, devDependencies } = (0, devkit_1.readJson)(tree, 'package.json');
96
- rxjsVersion = (0, semver_1.checkAndCleanWithSemver)('rxjs', dependencies?.rxjs ?? devDependencies?.rxjs);
97
- }
98
- catch {
99
- rxjsVersion = (0, semver_1.checkAndCleanWithSemver)('rxjs', versions_1.rxjsVersion);
100
- }
101
- return (0, semver_2.gte)(rxjsVersion, '7.0.0') ? versions_1.jasmineMarblesVersion : '~0.8.3';
102
- }
@@ -1,4 +0,0 @@
1
- import 'nx/src/internal-testing-utils/mock-project-graph';
2
- import type { Tree } from '@nx/devkit';
3
- export declare const DEFAULT_BROWSERS: string[];
4
- export default function removeBrowserlistConfig(tree: Tree): Promise<void>;
@@ -1,59 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_BROWSERS = void 0;
4
- exports.default = removeBrowserlistConfig;
5
- require("nx/src/internal-testing-utils/mock-project-graph");
6
- const devkit_1 = require("@nx/devkit");
7
- const path_1 = require("path");
8
- const validBrowserslistConfigFilenames = new Set([
9
- 'browserslist',
10
- '.browserslistrc',
11
- ]);
12
- exports.DEFAULT_BROWSERS = [
13
- 'last 1 Chrome version',
14
- 'last 1 Firefox version',
15
- 'last 2 Edge major versions',
16
- 'last 2 Safari major versions',
17
- 'last 2 iOS major versions',
18
- 'Firefox ESR',
19
- ];
20
- async function removeBrowserlistConfig(tree) {
21
- let browserslist;
22
- try {
23
- browserslist = await import('browserslist');
24
- }
25
- catch {
26
- devkit_1.logger.warn('Skipping migration because the "browserslist" package could not be loaded.');
27
- return;
28
- }
29
- // Set the defaults to match the defaults in build-angular.
30
- browserslist.defaults = exports.DEFAULT_BROWSERS;
31
- const defaultSupportedBrowsers = new Set(browserslist(exports.DEFAULT_BROWSERS));
32
- const es5Browsers = new Set(browserslist(['supports es6-module']));
33
- (0, devkit_1.visitNotIgnoredFiles)(tree, '/', (path) => {
34
- const fileName = (0, path_1.basename)(path);
35
- if (!validBrowserslistConfigFilenames.has(fileName) ||
36
- path.startsWith('node_modules')) {
37
- return;
38
- }
39
- const { defaults: browsersListConfig, ...otherConfigs } = browserslist.parseConfig(tree.read(path, 'utf-8'));
40
- if (Object.keys(otherConfigs).length) {
41
- // The config contains additional sections.
42
- return;
43
- }
44
- const browserslistInProject = browserslist(
45
- // Exclude from the list ES5 browsers which are not supported.
46
- browsersListConfig.map((s) => `${s} and supports es6-module`), {
47
- ignoreUnknownVersions: true,
48
- });
49
- if (defaultSupportedBrowsers.size !== browserslistInProject.length) {
50
- return;
51
- }
52
- const shouldDelete = browserslistInProject.every((browser) => defaultSupportedBrowsers.has(browser));
53
- if (shouldDelete) {
54
- // All browsers are the same as the default config.
55
- // Delete file as it's redundant.
56
- tree.delete(path);
57
- }
58
- });
59
- }
@@ -1,2 +0,0 @@
1
- import type { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,62 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const tslib_1 = require("tslib");
5
- const devkit_1 = require("@nx/devkit");
6
- const ts = tslib_1.__importStar(require("typescript"));
7
- const file_change_recorder_1 = require("../../utils/file-change-recorder");
8
- async function default_1(tree) {
9
- (0, devkit_1.visitNotIgnoredFiles)(tree, '/', (path) => {
10
- if (path.endsWith('.ts') && !path.endsWith('.d.ts')) {
11
- const content = tree.read(path, 'utf8');
12
- if (content.includes('@angular/platform-server') &&
13
- content.includes('renderModule')) {
14
- const source = ts.createSourceFile(path, content.toString().replace(/^\uFEFF/, ''), ts.ScriptTarget.Latest, true);
15
- let recorder;
16
- let printer;
17
- ts.forEachChild(source, function analyze(node) {
18
- if (!(ts.isExportDeclaration(node) &&
19
- node.moduleSpecifier &&
20
- ts.isStringLiteral(node.moduleSpecifier) &&
21
- node.moduleSpecifier.text === '@angular/platform-server' &&
22
- node.exportClause &&
23
- ts.isNamedExports(node.exportClause))) {
24
- // Not a @angular/platform-server named export.
25
- return;
26
- }
27
- const exportClause = node.exportClause;
28
- const newElements = [];
29
- for (const element of exportClause.elements) {
30
- if (element.name.text !== 'renderModule') {
31
- newElements.push(element);
32
- }
33
- }
34
- if (newElements.length === exportClause.elements.length) {
35
- // No changes
36
- return;
37
- }
38
- recorder ??= new file_change_recorder_1.FileChangeRecorder(tree, path);
39
- if (newElements.length) {
40
- // Update named exports as there are leftovers.
41
- const newExportClause = ts.factory.updateNamedExports(exportClause, newElements);
42
- printer ??= ts.createPrinter();
43
- const fix = printer.printNode(ts.EmitHint.Unspecified, newExportClause, source);
44
- const index = exportClause.getStart();
45
- const length = exportClause.getWidth();
46
- recorder.remove(index, index + length);
47
- recorder.insertLeft(index, fix);
48
- }
49
- else {
50
- // Delete export as no exports remain.
51
- recorder.remove(node.getStart(), node.getStart() + node.getWidth());
52
- }
53
- ts.forEachChild(node, analyze);
54
- });
55
- if (recorder) {
56
- recorder.applyChanges();
57
- }
58
- }
59
- }
60
- });
61
- await (0, devkit_1.formatFiles)(tree);
62
- }
@@ -1,2 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- const angularCliVersion = '~15.0.0';
6
- async function default_1(tree) {
7
- let shouldFormat = false;
8
- (0, devkit_1.updateJson)(tree, 'package.json', (json) => {
9
- if (json.devDependencies?.['@angular/cli']) {
10
- json.devDependencies['@angular/cli'] = angularCliVersion;
11
- shouldFormat = true;
12
- }
13
- else if (json.dependencies?.['@angular/cli']) {
14
- json.dependencies['@angular/cli'] = angularCliVersion;
15
- shouldFormat = true;
16
- }
17
- return json;
18
- });
19
- if (shouldFormat) {
20
- await (0, devkit_1.formatFiles)(tree);
21
- }
22
- }
@@ -1,2 +0,0 @@
1
- import type { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,72 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const tslib_1 = require("tslib");
5
- const devkit_1 = require("@nx/devkit");
6
- const ts = tslib_1.__importStar(require("typescript"));
7
- const workspace_models_1 = require("@schematics/angular/utility/workspace-models");
8
- const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
9
- const file_change_recorder_1 = require("../../utils/file-change-recorder");
10
- async function default_1(tree) {
11
- for (const file of findTestMainFiles(tree)) {
12
- updateTestFile(tree, file);
13
- }
14
- await (0, devkit_1.formatFiles)(tree);
15
- }
16
- function findTestMainFiles(tree) {
17
- const testFiles = new Set();
18
- // find all test.ts files.
19
- (0, executor_options_utils_1.forEachExecutorOptions)(tree, workspace_models_1.Builders.Karma, (options) => {
20
- if (typeof options.main === 'string' && tree.exists(options.main)) {
21
- testFiles.add(options.main);
22
- }
23
- });
24
- return testFiles;
25
- }
26
- function updateTestFile(tree, file) {
27
- const content = tree.read(file, 'utf8');
28
- if (!content.includes('require.context')) {
29
- return;
30
- }
31
- const sourceFile = ts.createSourceFile(file, content.replace(/^\uFEFF/, ''), ts.ScriptTarget.Latest, true);
32
- const usedVariableNames = new Set();
33
- const recorder = new file_change_recorder_1.FileChangeRecorder(tree, sourceFile.fileName);
34
- ts.forEachChild(sourceFile, (node) => {
35
- if (ts.isVariableStatement(node)) {
36
- const variableDeclaration = node.declarationList.declarations[0];
37
- if (ts
38
- .getModifiers(node)
39
- ?.some((m) => m.kind === ts.SyntaxKind.DeclareKeyword)) {
40
- // `declare const require`
41
- if (variableDeclaration.name.getText() !== 'require') {
42
- return;
43
- }
44
- }
45
- else {
46
- // `const context = require.context('./', true, /\.spec\.ts$/);`
47
- if (!variableDeclaration.initializer
48
- ?.getText()
49
- .startsWith('require.context')) {
50
- return;
51
- }
52
- // add variable name as used.
53
- usedVariableNames.add(variableDeclaration.name.getText());
54
- }
55
- // Delete node.
56
- recorder.remove(node.getFullStart(), node.getFullStart() + node.getFullWidth());
57
- }
58
- if (usedVariableNames.size &&
59
- ts.isExpressionStatement(node) && // context.keys().map(context);
60
- ts.isCallExpression(node.expression) && // context.keys().map(context);
61
- ts.isPropertyAccessExpression(node.expression.expression) && // context.keys().map
62
- ts.isCallExpression(node.expression.expression.expression) && // context.keys()
63
- ts.isPropertyAccessExpression(node.expression.expression.expression.expression) && // context.keys
64
- ts.isIdentifier(node.expression.expression.expression.expression.expression) && // context
65
- usedVariableNames.has(node.expression.expression.expression.expression.expression.getText())) {
66
- // `context.keys().map(context);`
67
- // `context.keys().forEach(context);`
68
- recorder.remove(node.getFullStart(), node.getFullStart() + node.getFullWidth());
69
- }
70
- });
71
- recorder.applyChanges();
72
- }
@@ -1,2 +0,0 @@
1
- import type { Tree } from '@nx/devkit';
2
- export default function updateTypescriptTarget(tree: Tree): Promise<void>;
@@ -1,52 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = updateTypescriptTarget;
4
- const devkit_1 = require("@nx/devkit");
5
- const workspace_models_1 = require("@schematics/angular/utility/workspace-models");
6
- function updateTarget(tree, tsconfigPath) {
7
- (0, devkit_1.updateJson)(tree, tsconfigPath, (json) => ({
8
- ...json,
9
- compilerOptions: {
10
- ...(json.compilerOptions ?? {}),
11
- target: 'ES2022',
12
- useDefineForClassFields: false,
13
- },
14
- }));
15
- }
16
- async function updateTypescriptTarget(tree) {
17
- const projects = (0, devkit_1.getProjects)(tree);
18
- for (const [, project] of projects) {
19
- if (!project.targets)
20
- continue;
21
- for (const [, target] of Object.entries(project.targets)) {
22
- // Update all other known CLI builders that use a tsconfig
23
- const tsConfigs = [
24
- target.options || {},
25
- ...Object.values(target.configurations || {}),
26
- ]
27
- .filter((opt) => typeof opt?.tsConfig === 'string')
28
- .map((opt) => opt.tsConfig);
29
- const uniqueTsConfigs = [...new Set(tsConfigs)];
30
- if (uniqueTsConfigs.length < 1) {
31
- continue;
32
- }
33
- const supportedExecutors = new Set([
34
- workspace_models_1.Builders.Server,
35
- workspace_models_1.Builders.Karma,
36
- workspace_models_1.Builders.Browser,
37
- workspace_models_1.Builders.NgPackagr,
38
- '@nrwl/angular:webpack-browser',
39
- '@nrwl/angular:ng-packagr-lite',
40
- '@nrwl/angular:package',
41
- '@nrwl/angular:delegate-build',
42
- '@nrwl/jest:jest',
43
- ]);
44
- if (supportedExecutors.has(target.executor)) {
45
- for (const tsConfig of uniqueTsConfigs) {
46
- updateTarget(tree, tsConfig);
47
- }
48
- }
49
- }
50
- }
51
- await (0, devkit_1.formatFiles)(tree);
52
- }
@@ -1,2 +0,0 @@
1
- import type { Tree } from '@nx/devkit';
2
- export default function updateWorkspaceConfigurations(tree: Tree): Promise<void>;
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = updateWorkspaceConfigurations;
4
- const devkit_1 = require("@nx/devkit");
5
- const workspace_models_1 = require("@schematics/angular/utility/workspace-models");
6
- async function updateWorkspaceConfigurations(tree) {
7
- const projects = (0, devkit_1.getProjects)(tree);
8
- const supportedExecutors = new Set([workspace_models_1.Builders.Server]);
9
- for (const [name, project] of projects) {
10
- for (const [targetName, target] of Object.entries(project.targets || {})) {
11
- if (!supportedExecutors.has(target.executor)) {
12
- continue;
13
- }
14
- target.options.bundleDependencies = undefined;
15
- for (const [configurationName, configuration] of Object.entries(target.configurations || {})) {
16
- configuration.bundleDependencies = undefined;
17
- target[configurationName] = configuration;
18
- }
19
- project.targets[targetName] = target;
20
- (0, devkit_1.updateProjectConfiguration)(tree, name, project);
21
- }
22
- }
23
- await (0, devkit_1.formatFiles)(tree);
24
- }
@@ -1,2 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- const angularCliVersion = '~15.1.0';
6
- async function default_1(tree) {
7
- let shouldFormat = false;
8
- (0, devkit_1.updateJson)(tree, 'package.json', (json) => {
9
- if (json.devDependencies?.['@angular/cli']) {
10
- json.devDependencies['@angular/cli'] = angularCliVersion;
11
- shouldFormat = true;
12
- }
13
- else if (json.dependencies?.['@angular/cli']) {
14
- json.dependencies['@angular/cli'] = angularCliVersion;
15
- shouldFormat = true;
16
- }
17
- return json;
18
- });
19
- if (shouldFormat) {
20
- await (0, devkit_1.formatFiles)(tree);
21
- }
22
- }
@@ -1,2 +0,0 @@
1
- import type { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- const child_process_1 = require("child_process");
6
- const path_1 = require("path");
7
- const version_utils_1 = require("../../generators/utils/version-utils");
8
- const version_utils_2 = require("../../utils/version-utils");
9
- async function default_1(tree) {
10
- const packagesToInstall = [
11
- '@angular-devkit/core',
12
- '@angular-devkit/schematics',
13
- '@schematics/angular',
14
- ];
15
- const pkgJson = (0, devkit_1.readJson)(tree, 'package.json');
16
- const angularMajorVersion = (0, version_utils_1.getInstalledAngularMajorVersion)(tree);
17
- const angularDevkitVersion = (0, version_utils_2.getPkgVersionForAngularMajorVersion)('angularDevkitVersion', angularMajorVersion);
18
- const angularCliVersion = pkgJson.devDependencies?.['@angular-devkit/build-angular'] ??
19
- pkgJson.dependencies?.['@angular-devkit/build-angular'] ??
20
- angularDevkitVersion;
21
- const filteredPackages = packagesToInstall
22
- .filter((pkg) => !pkgJson.devDependencies?.[pkg] && !pkgJson.dependencies?.[pkg])
23
- .reduce((allPkgs, pkg) => ({ ...allPkgs, [pkg]: angularCliVersion }), {});
24
- // even though we are going to install the packages directly, we still want
25
- // to add them to the tree so the migrate command knows changes were made
26
- (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { ...filteredPackages });
27
- // we need to install them immediately so the packages are available for
28
- // other migrations that might be using them
29
- pkgJson.devDependencies ??= {};
30
- Object.entries(filteredPackages).forEach(([pkg, version]) => {
31
- pkgJson.devDependencies[pkg] = version;
32
- });
33
- (0, devkit_1.writeJsonFile)((0, path_1.join)(tree.root, 'package.json'), pkgJson);
34
- const pmc = (0, devkit_1.getPackageManagerCommand)();
35
- (0, child_process_1.execSync)(pmc.install, { stdio: [0, 1, 2] });
36
- }
@@ -1,2 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export default function (tree: Tree): Promise<void>;
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = default_1;
4
- const devkit_1 = require("@nx/devkit");
5
- const angularCliVersion = '~15.2.0';
6
- async function default_1(tree) {
7
- let shouldFormat = false;
8
- (0, devkit_1.updateJson)(tree, 'package.json', (json) => {
9
- if (json.devDependencies?.['@angular/cli']) {
10
- json.devDependencies['@angular/cli'] = angularCliVersion;
11
- shouldFormat = true;
12
- }
13
- else if (json.dependencies?.['@angular/cli']) {
14
- json.dependencies['@angular/cli'] = angularCliVersion;
15
- shouldFormat = true;
16
- }
17
- return json;
18
- });
19
- if (shouldFormat) {
20
- await (0, devkit_1.formatFiles)(tree);
21
- }
22
- }
@@ -1,2 +0,0 @@
1
- import type { Tree } from '@nx/devkit';
2
- export default function updateFileServerExecutor(tree: Tree): Promise<void>;
@@ -1,42 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = updateFileServerExecutor;
4
- const devkit_1 = require("@nx/devkit");
5
- const versions_1 = require("../../utils/versions");
6
- async function updateFileServerExecutor(tree) {
7
- const oldExecutor = '@nrwl/angular:file-server';
8
- const newExecutor = '@nrwl/web:file-server';
9
- let needsNrwlWeb = false;
10
- const nxJson = (0, devkit_1.readNxJson)(tree);
11
- if (nxJson.targetDefaults) {
12
- let nxJsonChanged = false;
13
- for (const [targetName, target] of Object.entries(nxJson.targetDefaults)) {
14
- if (target.executor === oldExecutor) {
15
- nxJson.targetDefaults[targetName].executor = newExecutor;
16
- nxJsonChanged = true;
17
- needsNrwlWeb = true;
18
- }
19
- }
20
- if (nxJsonChanged) {
21
- (0, devkit_1.updateNxJson)(tree, nxJson);
22
- }
23
- }
24
- const projects = (0, devkit_1.getProjects)(tree);
25
- for (const [projectName, project] of projects.entries()) {
26
- let projectChanged = false;
27
- for (const [targetName, target] of Object.entries(project.targets ?? {})) {
28
- if (target.executor === oldExecutor) {
29
- project.targets[targetName].executor = newExecutor;
30
- projectChanged = true;
31
- needsNrwlWeb = true;
32
- }
33
- }
34
- if (projectChanged) {
35
- (0, devkit_1.updateProjectConfiguration)(tree, projectName, project);
36
- }
37
- }
38
- if (needsNrwlWeb) {
39
- (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@nrwl/web': versions_1.nxVersion });
40
- }
41
- await (0, devkit_1.formatFiles)(tree);
42
- }
@@ -1,3 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export declare function updateTestingTsconfigForJest(tree: Tree): Promise<void>;
3
- export default updateTestingTsconfigForJest;
@@ -1,32 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.updateTestingTsconfigForJest = updateTestingTsconfigForJest;
4
- const devkit_1 = require("@nx/devkit");
5
- const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
6
- async function updateTestingTsconfigForJest(tree) {
7
- const graph = await (0, devkit_1.createProjectGraphAsync)();
8
- const projects = (0, devkit_1.getProjects)(tree);
9
- (0, executor_options_utils_1.forEachExecutorOptionsInGraph)(graph, '@nrwl/jest:jest', (options, projectName) => {
10
- const projectConfig = projects.get(projectName);
11
- if (!isJestPresetAngular(tree, options.jestConfig)) {
12
- return;
13
- }
14
- const tsconfigPath = (0, devkit_1.joinPathFragments)(projectConfig.root, 'tsconfig.spec.json');
15
- if (tree.exists(tsconfigPath)) {
16
- (0, devkit_1.updateJson)(tree, tsconfigPath, (json) => {
17
- json.compilerOptions ??= {};
18
- json.compilerOptions.target ??= 'es2016';
19
- return json;
20
- }, { expectComments: true, allowTrailingComma: true });
21
- }
22
- });
23
- await (0, devkit_1.formatFiles)(tree);
24
- }
25
- function isJestPresetAngular(tree, jestConfigPath) {
26
- if (jestConfigPath && tree.exists(jestConfigPath)) {
27
- const contents = tree.read(jestConfigPath, 'utf-8');
28
- return contents.includes('jest-preset-angular');
29
- }
30
- return false;
31
- }
32
- exports.default = updateTestingTsconfigForJest;