@nx/angular 18.1.0 → 18.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/migrations.json CHANGED
@@ -371,6 +371,12 @@
371
371
  },
372
372
  "description": "Update the @angular/cli package version to ~17.2.0.",
373
373
  "factory": "./src/migrations/update-18-1-0/update-angular-cli"
374
+ },
375
+ "fix-target-defaults-for-webpack-browser": {
376
+ "cli": "nx",
377
+ "version": "18.1.1-beta.0",
378
+ "description": "Ensure targetDefaults inputs for task hashing when '@nx/angular:webpack-browser' is used are correct for Module Federation.",
379
+ "factory": "./src/migrations/update-18-1-1/fix-target-defaults-inputs"
374
380
  }
375
381
  },
376
382
  "packageJsonUpdates": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/angular",
3
- "version": "18.1.0",
3
+ "version": "18.1.2",
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, 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": {
@@ -78,24 +78,22 @@
78
78
  "tslib": "^2.3.0",
79
79
  "webpack": "^5.80.0",
80
80
  "webpack-merge": "^5.8.0",
81
- "@nx/devkit": "18.1.0",
82
- "@nx/cypress": "18.1.0",
83
- "@nx/jest": "18.1.0",
84
- "@nx/js": "18.1.0",
85
- "@nx/eslint": "18.1.0",
86
- "@nx/webpack": "18.1.0",
87
- "@nx/web": "18.1.0",
88
- "@nx/workspace": "18.1.0",
81
+ "@nx/devkit": "18.1.2",
82
+ "@nx/js": "18.1.2",
83
+ "@nx/eslint": "18.1.2",
84
+ "@nx/webpack": "18.1.2",
85
+ "@nx/web": "18.1.2",
86
+ "@nx/workspace": "18.1.2",
89
87
  "piscina": "^4.2.1",
90
- "@nrwl/angular": "18.1.0"
88
+ "@nrwl/angular": "18.1.2"
91
89
  },
92
90
  "peerDependencies": {
93
91
  "@angular-devkit/build-angular": ">= 15.0.0 < 18.0.0",
92
+ "@angular-devkit/core": ">= 15.0.0 < 18.0.0",
94
93
  "@angular-devkit/schematics": ">= 15.0.0 < 18.0.0",
95
94
  "@schematics/angular": ">= 15.0.0 < 18.0.0",
96
- "@angular-devkit/core": ">= 15.0.0 < 18.0.0",
97
- "rxjs": "^6.5.3 || ^7.5.0",
98
- "esbuild": "^0.19.2"
95
+ "esbuild": "^0.19.2",
96
+ "rxjs": "^6.5.3 || ^7.5.0"
99
97
  },
100
98
  "peerDependenciesMeta": {
101
99
  "esbuild": {
@@ -1,4 +1,4 @@
1
- import { GeneratorCallback, Tree } from '@nx/devkit';
1
+ import { type GeneratorCallback, type Tree } from '@nx/devkit';
2
2
  import type { AddLintingGeneratorSchema } from './schema';
3
3
  export declare function addLintingGenerator(tree: Tree, options: AddLintingGeneratorSchema): Promise<GeneratorCallback>;
4
4
  export default addLintingGenerator;
@@ -2,11 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addLintingGenerator = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
- const eslint_1 = require("@nx/eslint");
6
- const add_angular_eslint_dependencies_1 = require("./lib/add-angular-eslint-dependencies");
7
- const eslint_file_1 = require("@nx/eslint/src/generators/utils/eslint-file");
8
5
  const string_utils_1 = require("@nx/devkit/src/utils/string-utils");
6
+ const eslint_1 = require("@nx/eslint");
9
7
  const global_eslint_config_1 = require("@nx/eslint/src/generators/init/global-eslint-config");
8
+ const eslint_file_1 = require("@nx/eslint/src/generators/utils/eslint-file");
9
+ const add_angular_eslint_dependencies_1 = require("./lib/add-angular-eslint-dependencies");
10
+ const buildable_project_1 = require("./lib/buildable-project");
10
11
  async function addLintingGenerator(tree, options) {
11
12
  const tasks = [];
12
13
  const rootProject = options.projectRoot === '.' || options.projectRoot === '';
@@ -73,7 +74,7 @@ async function addLintingGenerator(tree, options) {
73
74
  */
74
75
  rules: {},
75
76
  },
76
- ...(isBuildableLibraryProject(tree, options.projectName)
77
+ ...((0, buildable_project_1.isBuildableLibraryProject)(tree, options.projectName)
77
78
  ? [
78
79
  {
79
80
  files: ['*.json'],
@@ -87,7 +88,7 @@ async function addLintingGenerator(tree, options) {
87
88
  ]);
88
89
  }
89
90
  if (!options.skipPackageJson) {
90
- const installTask = (0, add_angular_eslint_dependencies_1.addAngularEsLintDependencies)(tree);
91
+ const installTask = (0, add_angular_eslint_dependencies_1.addAngularEsLintDependencies)(tree, options.projectName);
91
92
  tasks.push(installTask);
92
93
  }
93
94
  if (!options.skipFormat) {
@@ -96,10 +97,4 @@ async function addLintingGenerator(tree, options) {
96
97
  return (0, devkit_1.runTasksInSerial)(...tasks);
97
98
  }
98
99
  exports.addLintingGenerator = addLintingGenerator;
99
- function isBuildableLibraryProject(tree, projectName) {
100
- const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, projectName);
101
- return (projectConfig.projectType === 'library' &&
102
- projectConfig.targets?.build &&
103
- !!projectConfig.targets.build);
104
- }
105
100
  exports.default = addLintingGenerator;
@@ -1,2 +1,2 @@
1
- import type { GeneratorCallback, Tree } from '@nx/devkit';
2
- export declare function addAngularEsLintDependencies(tree: Tree): GeneratorCallback;
1
+ import { type GeneratorCallback, type Tree } from '@nx/devkit';
2
+ export declare function addAngularEsLintDependencies(tree: Tree, projectName: string): GeneratorCallback;
@@ -3,14 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addAngularEsLintDependencies = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const version_utils_1 = require("../../utils/version-utils");
6
- function addAngularEsLintDependencies(tree) {
6
+ const buildable_project_1 = require("./buildable-project");
7
+ function addAngularEsLintDependencies(tree, projectName) {
7
8
  const angularEslintVersionToInstall = (0, version_utils_1.versions)(tree).angularEslintVersion;
8
- const jsoncEslintParserVersionToInstall = (0, version_utils_1.versions)(tree).jsoncEslintParserVersion;
9
- return (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
9
+ const devDependencies = {
10
10
  '@angular-eslint/eslint-plugin': angularEslintVersionToInstall,
11
11
  '@angular-eslint/eslint-plugin-template': angularEslintVersionToInstall,
12
12
  '@angular-eslint/template-parser': angularEslintVersionToInstall,
13
- 'jsonc-eslint-parser': jsoncEslintParserVersionToInstall,
14
- });
13
+ };
14
+ if ((0, buildable_project_1.isBuildableLibraryProject)(tree, projectName)) {
15
+ const jsoncEslintParserVersionToInstall = (0, version_utils_1.versions)(tree).jsoncEslintParserVersion;
16
+ devDependencies['jsonc-eslint-parser'] = jsoncEslintParserVersionToInstall;
17
+ }
18
+ return (0, devkit_1.addDependenciesToPackageJson)(tree, {}, devDependencies);
15
19
  }
16
20
  exports.addAngularEsLintDependencies = addAngularEsLintDependencies;
@@ -0,0 +1,2 @@
1
+ import { type Tree } from '@nx/devkit';
2
+ export declare function isBuildableLibraryProject(tree: Tree, projectName: string): boolean;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isBuildableLibraryProject = void 0;
4
+ const devkit_1 = require("@nx/devkit");
5
+ function isBuildableLibraryProject(tree, projectName) {
6
+ const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, projectName);
7
+ return (projectConfig.projectType === 'library' && !!projectConfig.targets?.build);
8
+ }
9
+ exports.isBuildableLibraryProject = isBuildableLibraryProject;
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addE2e = void 0;
4
- const cypress_1 = require("@nx/cypress");
5
4
  const devkit_1 = require("@nx/devkit");
6
5
  const versions_1 = require("../../../utils/versions");
7
6
  const version_utils_1 = require("../../utils/version-utils");
@@ -11,6 +10,7 @@ async function addE2e(tree, options) {
11
10
  const addPlugin = process.env.NX_ADD_PLUGINS !== 'false' &&
12
11
  nxJson.useInferencePlugins !== false;
13
12
  if (options.e2eTestRunner === 'cypress') {
13
+ const { configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/cypress', versions_1.nxVersion);
14
14
  // TODO: This can call `@nx/web:static-config` generator when ready
15
15
  addFileServerTarget(tree, options, 'serve-static');
16
16
  (0, devkit_1.addProjectConfiguration)(tree, options.e2eProjectName, {
@@ -21,7 +21,7 @@ async function addE2e(tree, options) {
21
21
  tags: [],
22
22
  implicitDependencies: [options.name],
23
23
  });
24
- await (0, cypress_1.configurationGenerator)(tree, {
24
+ await configurationGenerator(tree, {
25
25
  project: options.e2eProjectName,
26
26
  directory: 'src',
27
27
  linter: options.linter,
@@ -34,7 +34,7 @@ async function addE2e(tree, options) {
34
34
  });
35
35
  }
36
36
  else if (options.e2eTestRunner === 'playwright') {
37
- const { configurationGenerator: playwrightConfigurationGenerator } = (0, devkit_1.ensurePackage)('@nx/playwright', versions_1.nxVersion);
37
+ const { configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/playwright', versions_1.nxVersion);
38
38
  (0, devkit_1.addProjectConfiguration)(tree, options.e2eProjectName, {
39
39
  projectType: 'application',
40
40
  root: options.e2eProjectRoot,
@@ -42,7 +42,7 @@ async function addE2e(tree, options) {
42
42
  targets: {},
43
43
  implicitDependencies: [options.name],
44
44
  });
45
- await playwrightConfigurationGenerator(tree, {
45
+ await configurationGenerator(tree, {
46
46
  project: options.e2eProjectName,
47
47
  skipFormat: true,
48
48
  skipPackageJson: options.skipPackageJson,
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.componentTestGenerator = void 0;
4
- const cypress_version_1 = require("@nx/cypress/src/utils/cypress-version");
5
4
  const devkit_1 = require("@nx/devkit");
5
+ const versions_1 = require("../../utils/versions");
6
6
  const storybook_inputs_1 = require("../utils/storybook-ast/storybook-inputs");
7
7
  async function componentTestGenerator(tree, options) {
8
- (0, cypress_version_1.assertMinimumCypressVersion)(10);
8
+ (0, devkit_1.ensurePackage)('@nx/cypress', versions_1.nxVersion);
9
+ const { assertMinimumCypressVersion } = await Promise.resolve().then(() => require('@nx/cypress/src/utils/cypress-version'));
10
+ assertMinimumCypressVersion(10);
9
11
  const { root } = (0, devkit_1.readProjectConfiguration)(tree, options.project);
10
12
  const componentDirPath = (0, devkit_1.joinPathFragments)(root, options.componentDir);
11
13
  const componentFilePath = (0, devkit_1.joinPathFragments)(componentDirPath, `${options.componentFileName}.ts`);
@@ -1,11 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.cypressComponentConfigurationInternal = exports.cypressComponentConfiguration = void 0;
4
- const cypress_1 = require("@nx/cypress");
5
- const config_1 = require("@nx/cypress/src/utils/config");
6
- const find_target_options_1 = require("@nx/cypress/src/utils/find-target-options");
7
4
  const devkit_1 = require("@nx/devkit");
8
5
  const path_1 = require("path");
6
+ const versions_1 = require("../../utils/versions");
9
7
  const component_test_1 = require("../component-test/component-test");
10
8
  const component_info_1 = require("../utils/storybook-ast/component-info");
11
9
  const entry_point_1 = require("../utils/storybook-ast/entry-point");
@@ -23,7 +21,8 @@ exports.cypressComponentConfiguration = cypressComponentConfiguration;
23
21
  */
24
22
  async function cypressComponentConfigurationInternal(tree, options) {
25
23
  const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.project);
26
- const installTask = await (0, cypress_1.componentConfigurationGenerator)(tree, {
24
+ const { componentConfigurationGenerator: baseCyCTConfig } = (0, devkit_1.ensurePackage)('@nx/cypress', versions_1.nxVersion);
25
+ const installTask = await baseCyCTConfig(tree, {
27
26
  project: options.project,
28
27
  skipFormat: true,
29
28
  addPlugin: false,
@@ -42,7 +41,8 @@ async function cypressComponentConfigurationInternal(tree, options) {
42
41
  exports.cypressComponentConfigurationInternal = cypressComponentConfigurationInternal;
43
42
  async function addFiles(tree, projectConfig, options) {
44
43
  const componentFile = (0, devkit_1.joinPathFragments)(projectConfig.root, 'cypress', 'support', 'component.ts');
45
- const updatedCmpContents = await (0, config_1.addMountDefinition)(tree.read(componentFile, 'utf-8'));
44
+ const { addMountDefinition } = await Promise.resolve().then(() => require('@nx/cypress/src/utils/config'));
45
+ const updatedCmpContents = await addMountDefinition(tree.read(componentFile, 'utf-8'));
46
46
  tree.write(componentFile, `import { mount } from 'cypress/angular';\n${updatedCmpContents}`);
47
47
  if (options.generateTests) {
48
48
  const entryPoints = (0, entry_point_1.getProjectEntryPoints)(tree, options.project);
@@ -69,7 +69,8 @@ async function addFiles(tree, projectConfig, options) {
69
69
  async function configureCypressCT(tree, options) {
70
70
  let found = { target: options.buildTarget, config: undefined };
71
71
  if (!options.buildTarget) {
72
- found = await (0, find_target_options_1.findBuildConfig)(tree, {
72
+ const { findBuildConfig } = await Promise.resolve().then(() => require('@nx/cypress/src/utils/find-target-options'));
73
+ found = await findBuildConfig(tree, {
73
74
  project: options.project,
74
75
  buildTarget: options.buildTarget,
75
76
  validExecutorNames: new Set([
@@ -94,8 +95,9 @@ async function configureCypressCT(tree, options) {
94
95
  else {
95
96
  ctConfigOptions.buildTarget = found.target;
96
97
  }
97
- const cypressConfigPath = (0, config_1.getProjectCypressConfigPath)(tree, projectConfig.root);
98
- const updatedCyConfig = await (0, config_1.addDefaultCTConfig)(tree.read(cypressConfigPath, 'utf-8'), ctConfigOptions);
98
+ const { addDefaultCTConfig, getProjectCypressConfigPath } = await Promise.resolve().then(() => require('@nx/cypress/src/utils/config'));
99
+ const cypressConfigPath = getProjectCypressConfigPath(tree, projectConfig.root);
100
+ const updatedCyConfig = await addDefaultCTConfig(tree.read(cypressConfigPath, 'utf-8'), ctConfigOptions);
99
101
  tree.write(cypressConfigPath, `import { nxComponentTestingPreset } from '@nx/angular/plugins/component-testing';\n${updatedCyConfig}`);
100
102
  }
101
103
  function assertValidConfig(config) {
@@ -1,17 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.E2eMigrator = void 0;
4
- const cypress_1 = require("@nx/cypress");
5
- const cypress_preset_1 = require("@nx/cypress/plugins/cypress-preset");
6
- const cypress_version_1 = require("@nx/cypress/src/utils/cypress-version");
7
4
  const devkit_1 = require("@nx/devkit");
8
5
  const eslint_1 = require("@nx/eslint");
9
6
  const js_1 = require("@nx/js");
7
+ const ensure_typescript_1 = require("@nx/js/src/utils/typescript/ensure-typescript");
10
8
  const path_1 = require("path");
11
- const typescript_1 = require("typescript");
12
9
  const file_change_recorder_1 = require("../../../../utils/file-change-recorder");
10
+ const versions_1 = require("../../../../utils/versions");
13
11
  const project_migrator_1 = require("./project.migrator");
14
- const ensure_typescript_1 = require("@nx/js/src/utils/typescript/ensure-typescript");
15
12
  const supportedTargets = {
16
13
  e2e: {
17
14
  acceptMultipleDefinitions: true,
@@ -175,7 +172,9 @@ class E2eMigrator extends project_migrator_1.ProjectMigrator {
175
172
  };
176
173
  }
177
174
  else if (this.isCypressE2eProject()) {
178
- this.cypressInstalledVersion = (0, cypress_version_1.installedCypressVersion)();
175
+ (0, devkit_1.ensurePackage)('@nx/cypress', versions_1.nxVersion);
176
+ const { installedCypressVersion, } = require('@nx/cypress/src/utils/cypress-version');
177
+ this.cypressInstalledVersion = installedCypressVersion();
179
178
  this.project = {
180
179
  ...this.project,
181
180
  name,
@@ -238,7 +237,8 @@ class E2eMigrator extends project_migrator_1.ProjectMigrator {
238
237
  const nxJson = (0, devkit_1.readNxJson)(this.tree) ?? {};
239
238
  const addPlugin = process.env.NX_ADD_PLUGINS !== 'false' &&
240
239
  nxJson.useInferencePlugins !== false;
241
- await (0, cypress_1.configurationGenerator)(this.tree, {
240
+ const { configurationGenerator } = await Promise.resolve().then(() => require('@nx/cypress'));
241
+ await configurationGenerator(this.tree, {
242
242
  project: this.project.name,
243
243
  linter: this.isProjectUsingEsLint ? eslint_1.Linter.EsLint : eslint_1.Linter.None,
244
244
  skipFormat: true,
@@ -366,9 +366,10 @@ class E2eMigrator extends project_migrator_1.ProjectMigrator {
366
366
  : undefined;
367
367
  }
368
368
  updateCypress10ConfigFile(configFilePath) {
369
- (0, ensure_typescript_1.ensureTypescript)();
369
+ const { isPropertyAssignment } = (0, ensure_typescript_1.ensureTypescript)();
370
370
  const { tsquery } = require('@phenomnomnominal/tsquery');
371
- this.cypressPreset = (0, cypress_preset_1.nxE2EPreset)(configFilePath);
371
+ const { nxE2EPreset } = require('@nx/cypress/plugins/cypress-preset');
372
+ this.cypressPreset = nxE2EPreset(configFilePath);
372
373
  const fileContent = this.tree.read(configFilePath, 'utf-8');
373
374
  let sourceFile = tsquery.ast(fileContent);
374
375
  const recorder = new file_change_recorder_1.FileChangeRecorder(this.tree, configFilePath);
@@ -381,15 +382,15 @@ class E2eMigrator extends project_migrator_1.ProjectMigrator {
381
382
  let componentNode;
382
383
  const globalConfig = {};
383
384
  defineConfigExpression.forEachChild((node) => {
384
- if ((0, typescript_1.isPropertyAssignment)(node) && node.name.getText() === 'component') {
385
+ if (isPropertyAssignment(node) && node.name.getText() === 'component') {
385
386
  componentNode = node;
386
387
  return;
387
388
  }
388
- if ((0, typescript_1.isPropertyAssignment)(node) && node.name.getText() === 'e2e') {
389
+ if (isPropertyAssignment(node) && node.name.getText() === 'e2e') {
389
390
  e2eNode = node;
390
391
  return;
391
392
  }
392
- if ((0, typescript_1.isPropertyAssignment)(node)) {
393
+ if (isPropertyAssignment(node)) {
393
394
  this.updateCypressConfigNodeValue(recorder, node, globalConfig);
394
395
  }
395
396
  });
@@ -401,14 +402,15 @@ class E2eMigrator extends project_migrator_1.ProjectMigrator {
401
402
  if (!componentNode) {
402
403
  return;
403
404
  }
404
- if (!(0, typescript_1.isObjectLiteralExpression)(componentNode.initializer)) {
405
+ const { isObjectLiteralExpression, isPropertyAssignment } = (0, ensure_typescript_1.ensureTypescript)();
406
+ if (!isObjectLiteralExpression(componentNode.initializer)) {
405
407
  this.logger.warn('The automatic migration only supports having an object literal in the "component" option of the Cypress configuration. ' +
406
408
  `The configuration won't be updated. Please make sure to update any paths you may have in the "component" option ` +
407
409
  'manually to point to the new location.');
408
410
  return;
409
411
  }
410
412
  componentNode.initializer.properties.forEach((node) => {
411
- if ((0, typescript_1.isPropertyAssignment)(node)) {
413
+ if (isPropertyAssignment(node)) {
412
414
  this.updateCypressConfigNodeValue(recorder, node);
413
415
  }
414
416
  });
@@ -431,7 +433,8 @@ class E2eMigrator extends project_migrator_1.ProjectMigrator {
431
433
  recorder.insertRight(defineConfigNode.getStart() + 1, e2eAssignment);
432
434
  }
433
435
  else {
434
- if (!(0, typescript_1.isObjectLiteralExpression)(e2eNode.initializer)) {
436
+ const { isObjectLiteralExpression, isPropertyAssignment } = (0, ensure_typescript_1.ensureTypescript)();
437
+ if (!isObjectLiteralExpression(e2eNode.initializer)) {
435
438
  this.logger.warn('The automatic migration only supports having an object literal in the "e2e" option of the Cypress configuration. ' +
436
439
  `The configuration won't be updated. Please make sure to update any paths you might have in the "e2e" option ` +
437
440
  'manually to point to the new location.');
@@ -439,7 +442,7 @@ class E2eMigrator extends project_migrator_1.ProjectMigrator {
439
442
  }
440
443
  recorder.insertRight(e2eNode.initializer.getStart() + 1, presetSpreadAssignment);
441
444
  e2eNode.initializer.properties.forEach((node) => {
442
- if (!(0, typescript_1.isPropertyAssignment)(node)) {
445
+ if (!isPropertyAssignment(node)) {
443
446
  return;
444
447
  }
445
448
  let change = { type: 'ignore' };
@@ -518,7 +521,8 @@ class E2eMigrator extends project_migrator_1.ProjectMigrator {
518
521
  }
519
522
  }
520
523
  isValidPathLikePropertyWithStringLiteralValue(node, properties) {
521
- if (!(0, typescript_1.isPropertyAssignment)(node)) {
524
+ const { isPropertyAssignment, isStringLiteralLike, isTemplateExpression, SyntaxKind, } = (0, ensure_typescript_1.ensureTypescript)();
525
+ if (!isPropertyAssignment(node)) {
522
526
  // TODO(leo): handle more scenarios (spread assignments, etc)
523
527
  return false;
524
528
  }
@@ -526,13 +530,13 @@ class E2eMigrator extends project_migrator_1.ProjectMigrator {
526
530
  if (!property) {
527
531
  return false;
528
532
  }
529
- if (node.initializer.kind === typescript_1.SyntaxKind.UndefinedKeyword ||
530
- node.initializer.kind === typescript_1.SyntaxKind.NullKeyword ||
531
- node.initializer.kind === typescript_1.SyntaxKind.FalseKeyword) {
533
+ if (node.initializer.kind === SyntaxKind.UndefinedKeyword ||
534
+ node.initializer.kind === SyntaxKind.NullKeyword ||
535
+ node.initializer.kind === SyntaxKind.FalseKeyword) {
532
536
  return false;
533
537
  }
534
- if (!(0, typescript_1.isStringLiteralLike)(node.initializer)) {
535
- if ((0, typescript_1.isTemplateExpression)(node.initializer)) {
538
+ if (!isStringLiteralLike(node.initializer)) {
539
+ if (isTemplateExpression(node.initializer)) {
536
540
  this.logger.warn(`The "${node.name.getText()}" in the Cypress configuration file is set to a template expression ("${node.initializer.getText()}"). ` +
537
541
  `This is not supported by the automatic migration and its value won't be automatically migrated. ` +
538
542
  `Please make sure to update its value to match the new location if needed.`);
@@ -4,7 +4,6 @@
4
4
  // is attached to the index.html with type=module
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.addCypressOnErrorWorkaround = void 0;
7
- const config_1 = require("@nx/cypress/src/utils/config");
8
7
  const devkit_1 = require("@nx/devkit");
9
8
  function addCypressOnErrorWorkaround(tree, schema) {
10
9
  if (!schema.e2eProjectName) {
@@ -23,11 +22,20 @@ function addCypressOnErrorWorkaround(tree, schema) {
23
22
  `);
24
23
  return;
25
24
  }
26
- if (e2eProject.targets?.e2e?.executor !== '@nx/cypress:cypress' &&
27
- !(0, devkit_1.glob)(tree, [`${e2eProject.root}/${config_1.CYPRESS_CONFIG_FILE_NAME_PATTERN}`])
28
- .length) {
29
- // Not a cypress e2e project, skip
30
- return;
25
+ if (e2eProject.targets?.e2e?.executor !== '@nx/cypress:cypress') {
26
+ try {
27
+ // don't ensure package is installed, if it's not installed, we don't need to add the workaround
28
+ const { CYPRESS_CONFIG_FILE_NAME_PATTERN, } = require('@nx/cypress/src/utils/config');
29
+ if (!(0, devkit_1.glob)(tree, [`${e2eProject.root}/${CYPRESS_CONFIG_FILE_NAME_PATTERN}`])
30
+ .length) {
31
+ // Not a cypress e2e project, skip
32
+ return;
33
+ }
34
+ }
35
+ catch {
36
+ // assume cypress is not installed
37
+ return;
38
+ }
31
39
  }
32
40
  const commandToAdd = `Cypress.on('uncaught:exception', err => {
33
41
  if (err.message.includes(\`Cannot use 'import.meta' outside a module\`)) {
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateStories = void 0;
4
- const project_name_1 = require("@nx/cypress/src/utils/project-name");
5
4
  const devkit_1 = require("@nx/devkit");
5
+ const versions_1 = require("../../../utils/versions");
6
6
  const stories_1 = require("../../stories/stories");
7
7
  async function generateStories(tree, options) {
8
8
  const project = (0, devkit_1.readProjectConfiguration)(tree, options.project);
9
- const e2eProjectName = (0, project_name_1.getE2eProjectName)(options.project, project.root, options.cypressDirectory);
9
+ (0, devkit_1.ensurePackage)('@nx/cypress', versions_1.nxVersion);
10
+ const { getE2eProjectName } = await Promise.resolve().then(() => require('@nx/cypress/src/utils/project-name'));
11
+ const e2eProjectName = getE2eProjectName(options.project, project.root, options.cypressDirectory);
10
12
  await (0, stories_1.angularStoriesGenerator)(tree, {
11
13
  name: options.project,
12
14
  generateCypressSpecs: options.configureCypress && options.generateCypressSpecs,
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addJest = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
- const jest_1 = require("@nx/jest");
6
5
  const versions_1 = require("../../utils/versions");
7
6
  const version_utils_1 = require("./version-utils");
8
7
  async function addJest(tree, options) {
@@ -10,7 +9,8 @@ async function addJest(tree, options) {
10
9
  process.env.npm_config_legacy_peer_deps ??= 'true';
11
10
  (0, version_utils_1.addDependenciesToPackageJsonIfDontExist)(tree, {}, { 'jest-preset-angular': versions_1.jestPresetAngularVersion });
12
11
  }
13
- await (0, jest_1.configurationGenerator)(tree, {
12
+ const { configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/jest', versions_1.nxVersion);
13
+ await configurationGenerator(tree, {
14
14
  project: options.name,
15
15
  setupFile: 'angular',
16
16
  supportTsx: false,
@@ -8,7 +8,10 @@ function addMfEnvToTargetDefaultInputs(tree) {
8
8
  const mfEnvVar = 'NX_MF_DEV_SERVER_STATIC_REMOTES';
9
9
  nxJson.targetDefaults ??= {};
10
10
  nxJson.targetDefaults[webpackExecutor] ??= {};
11
- nxJson.targetDefaults[webpackExecutor].inputs ??= [];
11
+ nxJson.targetDefaults[webpackExecutor].inputs ??= [
12
+ 'production',
13
+ '^production',
14
+ ];
12
15
  let mfEnvVarExists = false;
13
16
  for (const input of nxJson.targetDefaults[webpackExecutor].inputs) {
14
17
  if (typeof input === 'object' && input['env'] === mfEnvVar) {
@@ -0,0 +1,2 @@
1
+ import { type Tree } from '@nx/devkit';
2
+ export default function (tree: Tree): Promise<void>;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const devkit_1 = require("@nx/devkit");
4
+ async function default_1(tree) {
5
+ if (!isWebpackBrowserUsed(tree)) {
6
+ return;
7
+ }
8
+ ensureTargetDefaultsContainProductionInputs(tree);
9
+ await (0, devkit_1.formatFiles)(tree);
10
+ }
11
+ exports.default = default_1;
12
+ function ensureTargetDefaultsContainProductionInputs(tree) {
13
+ const nxJson = (0, devkit_1.readNxJson)(tree);
14
+ const webpackExecutor = '@nx/angular:webpack-browser';
15
+ const mfEnvVar = 'NX_MF_DEV_SERVER_STATIC_REMOTES';
16
+ nxJson.targetDefaults[webpackExecutor] ??= {};
17
+ nxJson.targetDefaults[webpackExecutor].inputs ??= [
18
+ 'production',
19
+ '^production',
20
+ { env: mfEnvVar },
21
+ ];
22
+ if (!nxJson.targetDefaults[webpackExecutor].inputs.includes('production')) {
23
+ nxJson.targetDefaults[webpackExecutor].inputs.push('production');
24
+ }
25
+ if (!nxJson.targetDefaults[webpackExecutor].inputs.includes('^production')) {
26
+ nxJson.targetDefaults[webpackExecutor].inputs.push('^production');
27
+ }
28
+ let mfEnvVarExists = false;
29
+ for (const input of nxJson.targetDefaults[webpackExecutor].inputs) {
30
+ if (typeof input === 'object' && input['env'] === mfEnvVar) {
31
+ mfEnvVarExists = true;
32
+ break;
33
+ }
34
+ }
35
+ if (!mfEnvVarExists) {
36
+ nxJson.targetDefaults[webpackExecutor].inputs.push({ env: mfEnvVar });
37
+ }
38
+ (0, devkit_1.updateNxJson)(tree, nxJson);
39
+ }
40
+ function isWebpackBrowserUsed(tree) {
41
+ const projects = (0, devkit_1.getProjects)(tree);
42
+ for (const project of projects.values()) {
43
+ const targets = project.targets || {};
44
+ for (const [_, target] of Object.entries(targets)) {
45
+ if (target.executor === '@nx/angular:webpack-browser' &&
46
+ (tree.exists((0, devkit_1.joinPathFragments)(project.root, 'module-federation.config.ts')) ||
47
+ tree.exists((0, devkit_1.joinPathFragments)(project.root, 'module-federation.config.js')))) {
48
+ return true;
49
+ }
50
+ }
51
+ }
52
+ return false;
53
+ }
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.withModuleFederationForSSR = void 0;
4
4
  const utils_1 = require("./utils");
5
5
  async function withModuleFederationForSSR(options) {
6
+ if (global.NX_GRAPH_CREATION) {
7
+ return (config) => config;
8
+ }
6
9
  const { sharedLibraries, sharedDependencies, mappedRemotes } = await (0, utils_1.getModuleFederationConfig)(options, {
7
10
  isServer: true,
8
11
  });
@@ -4,6 +4,9 @@ exports.withModuleFederation = void 0;
4
4
  const utils_1 = require("./utils");
5
5
  const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");
6
6
  async function withModuleFederation(options) {
7
+ if (global.NX_GRAPH_CREATION) {
8
+ return (config) => config;
9
+ }
7
10
  const { sharedLibraries, sharedDependencies, mappedRemotes } = await (0, utils_1.getModuleFederationConfig)(options);
8
11
  return (config) => ({
9
12
  ...(config ?? {}),