@nx/angular 23.3.0-pr.37068.f95e11e → 23.3.0-pr.37224.268062c

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/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  [![Semantic Release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg?style=flat-square)](<>)
13
13
  [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)
14
14
  [![Join us on the Official Nx Discord Server](https://img.shields.io/discord/1143497901675401286?label=discord)](https://go.nx.dev/community)
15
- [![Nx Sandboxing](https://staging.nx.app/workspaces/62d013ea0852fe0a2df74438/sandbox-badge.svg)](https://nx.dev/docs/features/ci-features/sandboxing)
15
+ [![Hours saved](https://img.shields.io/endpoint?url=https%3A%2F%2Fstaging.nx.app%2Fnx-cloud%2Fbadge%2F62d013ea0852fe0a2df74438%2Fhours-saved.json)](https://nx.dev/nx-cloud)
16
16
 
17
17
  </div>
18
18
 
@@ -0,0 +1,2 @@
1
+ # Nested package.json's are only needed for development.
2
+ mf/package.json
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/nx-angular-mf.mjs",
3
+ "typings": "../types/nx-angular-mf.d.ts"
4
+ }
@@ -8,6 +8,7 @@ const assert_supported_angular_version_1 = require("../../utils/assert-supported
8
8
  const convert_to_rspack_1 = require("../convert-to-rspack/convert-to-rspack");
9
9
  const init_1 = require("../init/init");
10
10
  const setup_ssr_1 = require("../setup-ssr/setup-ssr");
11
+ const acknowledge_build_scripts_1 = require("../utils/acknowledge-build-scripts");
11
12
  const ensure_angular_dependencies_1 = require("../utils/ensure-angular-dependencies");
12
13
  const validations_1 = require("../utils/validations");
13
14
  const version_utils_1 = require("../utils/version-utils");
@@ -84,8 +85,14 @@ async function applicationGenerator(tree, schema) {
84
85
  }
85
86
  if (options.style === 'less') {
86
87
  devDependencies['less'] = packageVersions.lessVersion;
88
+ // less's postinstall only installs Playwright browsers, which nothing
89
+ // that consumes less needs.
90
+ (0, internal_1.acknowledgeBuildScripts)(tree, (0, devkit_1.detectPackageManager)(tree.root), {
91
+ less: false,
92
+ });
87
93
  }
88
94
  if (Object.keys(devDependencies).length) {
95
+ (0, acknowledge_build_scripts_1.acknowledgeAngularBuildScripts)(tree);
89
96
  (0, devkit_1.addDependenciesToPackageJson)(tree, {}, devDependencies, undefined, true);
90
97
  }
91
98
  }
@@ -27,8 +27,7 @@ async function componentTestGenerator(tree, options) {
27
27
  });
28
28
  }
29
29
  const tasks = [];
30
- if (!options.skipPackageJson) {
31
- // Cypress CT still requires @angular/platform-browser-dynamic
30
+ if (!options.skipPackageJson && usesPlatformBrowserDynamic(tree)) {
32
31
  tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
33
32
  '@angular/platform-browser-dynamic': (0, version_utils_1.versions)(tree).angularVersion,
34
33
  }, undefined, true));
@@ -38,4 +37,11 @@ async function componentTestGenerator(tree, options) {
38
37
  }
39
38
  return (0, devkit_1.runTasksInSerial)(...tasks);
40
39
  }
40
+ // The Cypress 16 harness bootstraps through @angular/platform-browser/testing;
41
+ // earlier harnesses need @angular/platform-browser-dynamic/testing.
42
+ function usesPlatformBrowserDynamic(tree) {
43
+ const { getInstalledCypressMajorVersion, } = require('@nx/cypress/internal');
44
+ const cypressMajorVersion = getInstalledCypressMajorVersion(tree);
45
+ return cypressMajorVersion !== null && cypressMajorVersion < 16;
46
+ }
41
47
  exports.default = componentTestGenerator;
@@ -7,6 +7,7 @@ const path_1 = require("path");
7
7
  const posix_1 = require("path/posix");
8
8
  const assert_supported_angular_version_1 = require("../../utils/assert-supported-angular-version");
9
9
  const versions_1 = require("../../utils/versions");
10
+ const acknowledge_build_scripts_1 = require("../utils/acknowledge-build-scripts");
10
11
  const version_utils_1 = require("../utils/version-utils");
11
12
  const create_config_1 = require("./lib/create-config");
12
13
  const get_custom_webpack_config_1 = require("./lib/get-custom-webpack-config");
@@ -524,6 +525,14 @@ async function convertToRspack(tree, schema) {
524
525
  }
525
526
  if (!schema.skipInstall) {
526
527
  const { webpackMergeVersion, tsNodeVersion } = (0, version_utils_1.versions)(tree);
528
+ (0, acknowledge_build_scripts_1.acknowledgeAngularBuildScripts)(tree);
529
+ // @nx/angular-rspack-compiler's install script patches `@angular/build`
530
+ // versions below 20.2.0, so it has to run. core-js only prints a funding
531
+ // message.
532
+ (0, internal_1.acknowledgeBuildScripts)(tree, (0, devkit_1.detectPackageManager)(tree.root), {
533
+ '@nx/angular-rspack-compiler': true,
534
+ 'core-js': false,
535
+ });
527
536
  const installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
528
537
  '@nx/angular-rspack': versions_1.nxVersion,
529
538
  'webpack-merge': webpackMergeVersion,
@@ -43,15 +43,21 @@ async function cypressComponentConfiguration(tree, options) {
43
43
  // For libraries, check if zone.js is installed in the workspace
44
44
  isZoneless = (0, devkit_1.getDependencyVersionFromPackageJson)(tree, 'zone.js') === null;
45
45
  }
46
+ // Cypress 16 dropped `cypress/angular-zoneless`; `cypress/angular` is zoneless there.
47
+ let mountModule = 'cypress/angular';
46
48
  if (isZoneless) {
47
49
  const { getInstalledCypressVersion, } = require('@nx/cypress/internal');
48
50
  const installedCypressVersion = getInstalledCypressVersion(tree);
49
- // Zoneless support was introduced in Cypress 15.8.0
50
51
  // If Cypress is not yet installed, we'll install the latest version, which will have zoneless support
51
- if (installedCypressVersion && (0, semver_1.lt)(installedCypressVersion, '15.8.0')) {
52
- throw new Error(`Cypress Component Testing doesn't support Zoneless Angular projects for your installed Cypress version (${installedCypressVersion}). ` +
53
- `The project "${options.project}" is configured without Zone.js. ` +
54
- `Please upgrade Cypress to version 15.8.0 or higher.`);
52
+ if (installedCypressVersion && (0, semver_1.major)(installedCypressVersion) < 16) {
53
+ // Zoneless support was introduced in Cypress 15.8.0
54
+ const unsupportedCypressVersion = (0, assert_cypress_component_testing_support_1.findCypressBelow)(tree, '15.8.0');
55
+ if (unsupportedCypressVersion) {
56
+ throw new Error(`Cypress Component Testing doesn't support Zoneless Angular projects for your Cypress version (${unsupportedCypressVersion}). ` +
57
+ `The project "${options.project}" is configured without Zone.js. ` +
58
+ `Please upgrade Cypress to version 15.8.0 or higher.`);
59
+ }
60
+ mountModule = 'cypress/angular-zoneless';
55
61
  }
56
62
  }
57
63
  const tasks = [];
@@ -63,7 +69,7 @@ async function cypressComponentConfiguration(tree, options) {
63
69
  skipPackageJson: options.skipPackageJson,
64
70
  }));
65
71
  await configureCypressCT(tree, options);
66
- tasks.push(await addFiles(tree, projectConfig, options, isZoneless));
72
+ tasks.push(await addFiles(tree, projectConfig, options, mountModule));
67
73
  if (projectConfig.projectType === 'application') {
68
74
  (0, update_app_editor_tsconfig_excluded_files_1.updateAppEditorTsConfigExcludedFiles)(tree, projectConfig);
69
75
  }
@@ -72,11 +78,11 @@ async function cypressComponentConfiguration(tree, options) {
72
78
  }
73
79
  return (0, devkit_1.runTasksInSerial)(...tasks);
74
80
  }
75
- async function addFiles(tree, projectConfig, options, isZoneless) {
81
+ async function addFiles(tree, projectConfig, options, mountModule) {
76
82
  const componentFile = (0, devkit_1.joinPathFragments)(projectConfig.root, 'cypress', 'support', 'component.ts');
77
83
  const { addMountDefinition } = (require('@nx/cypress/internal'));
78
84
  const updatedCmpContents = await addMountDefinition(tree.read(componentFile, 'utf-8'));
79
- tree.write(componentFile, `import { mount } from '${isZoneless ? 'cypress/angular-zoneless' : 'cypress/angular'}';\n${updatedCmpContents}`);
85
+ tree.write(componentFile, `import { mount } from '${mountModule}';\n${updatedCmpContents}`);
80
86
  if (!options.generateTests) {
81
87
  return () => { };
82
88
  }
@@ -11,6 +11,7 @@ const init_1 = tslib_1.__importDefault(require("../../generators/init/init"));
11
11
  const assert_supported_angular_version_1 = require("../../utils/assert-supported-angular-version");
12
12
  const test_runners_1 = require("../../utils/test-runners");
13
13
  const add_linting_1 = tslib_1.__importDefault(require("../add-linting/add-linting"));
14
+ const acknowledge_build_scripts_1 = require("../utils/acknowledge-build-scripts");
14
15
  const add_jest_1 = require("../utils/add-jest");
15
16
  const add_vitest_1 = require("../utils/add-vitest");
16
17
  const dependencies_1 = require("../utils/dependencies");
@@ -59,6 +60,7 @@ async function libraryGenerator(tree, schema) {
59
60
  await addLinting(tree, libraryOptions);
60
61
  if ((libraryOptions.buildable || libraryOptions.publishable) &&
61
62
  !libraryOptions.skipPackageJson) {
63
+ (0, acknowledge_build_scripts_1.acknowledgeAngularBuildScripts)(tree);
62
64
  (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
63
65
  'ng-packagr': pkgVersions.ngPackagrVersion,
64
66
  }, undefined, true);
@@ -0,0 +1,2 @@
1
+ import { type Tree } from '@nx/devkit';
2
+ export declare function acknowledgeAngularBuildScripts(tree: Tree): void;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.acknowledgeAngularBuildScripts = acknowledgeAngularBuildScripts;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const internal_1 = require("@nx/devkit/internal");
6
+ // The Angular build tooling (`@angular/build`, `@angular-devkit/build-angular`,
7
+ // `ng-packagr`) pulls in esbuild, lmdb (-> msgpackr-extract) and sass
8
+ // (-> @parcel/watcher). All of them ship prebuilt binaries as optional
9
+ // dependencies, so their install scripts have nothing to do.
10
+ const angularBuildAllowBuilds = {
11
+ esbuild: false,
12
+ lmdb: false,
13
+ 'msgpackr-extract': false,
14
+ '@parcel/watcher': false,
15
+ };
16
+ function acknowledgeAngularBuildScripts(tree) {
17
+ (0, internal_1.acknowledgeBuildScripts)(tree, (0, devkit_1.detectPackageManager)(tree.root), angularBuildAllowBuilds);
18
+ }
@@ -6,6 +6,7 @@ const devkit_1 = require("@nx/devkit");
6
6
  const internal_1 = require("@nx/devkit/internal");
7
7
  const semver_1 = require("semver");
8
8
  const versions_1 = require("../../utils/versions");
9
+ const acknowledge_build_scripts_1 = require("./acknowledge-build-scripts");
9
10
  const version_utils_1 = require("./version-utils");
10
11
  async function addVitestAngular(tree, options) {
11
12
  validateVitestVersion(tree);
@@ -35,6 +36,7 @@ async function addVitestAngular(tree, options) {
35
36
  }
36
37
  const pkgVersions = (0, version_utils_1.versions)(tree, { minAngularMajorVersion: 21 });
37
38
  const angularDevkitVersion = (0, version_utils_1.getInstalledAngularDevkitVersion)(tree) ?? pkgVersions.angularDevkitVersion;
39
+ (0, acknowledge_build_scripts_1.acknowledgeAngularBuildScripts)(tree);
38
40
  return (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
39
41
  '@angular/build': angularDevkitVersion,
40
42
  jsdom: pkgVersions.jsdomVersion,
@@ -69,6 +71,7 @@ async function addVitestAnalog(tree, options) {
69
71
  devDependencies['vitest'] = pkgVersions.vitestVersion;
70
72
  devDependencies['jsdom'] = pkgVersions.jsdomVersion;
71
73
  }
74
+ (0, acknowledge_build_scripts_1.acknowledgeAngularBuildScripts)(tree);
72
75
  tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {}, devDependencies, undefined, true));
73
76
  }
74
77
  (0, devkit_1.ensurePackage)('@nx/vitest', versions_1.nxVersion);
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = default_1;
4
4
  const devkit_1 = require("@nx/devkit");
5
+ const acknowledge_build_scripts_1 = require("../../generators/utils/acknowledge-build-scripts");
5
6
  const versions_1 = require("../../utils/versions");
6
7
  // The `@nx/angular:application` and `@nx/angular:unit-test` executors import
7
8
  // `@angular/build` directly to run the Angular builders, and any
@@ -49,5 +50,6 @@ async function default_1(tree) {
49
50
  if (!needsAngularBuild) {
50
51
  return;
51
52
  }
53
+ (0, acknowledge_build_scripts_1.acknowledgeAngularBuildScripts)(tree);
52
54
  return (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@angular/build': versions_1.angularDevkitVersion }, undefined, true);
53
55
  }
@@ -4,6 +4,8 @@ The `@nx/angular:application` and `@nx/angular:unit-test` executors load the Ang
4
4
 
5
5
  Executor usage is detected on any target using `@nx/angular:application`, `@nx/angular:unit-test`, or an `@angular/build:*` executor. Targets that inherit their executor from an `nx.json` `targetDefaults` entry are detected too.
6
6
 
7
+ On pnpm 11 and above, the migration also writes `pnpm-workspace.yaml`. `@angular/build` reaches four packages that run a build script on install (`esbuild`, `lmdb`, `msgpackr-extract` and `@parcel/watcher`), and pnpm 11 refuses to install a package whose script is neither allowed nor denied, so the migration records an `allowBuilds` decision for each. A decision already in the file is left untouched.
8
+
7
9
  #### Examples
8
10
 
9
11
  ##### `project.json`
@@ -28,7 +30,7 @@ After (`package.json`):
28
30
  // package.json
29
31
  {
30
32
  "devDependencies": {
31
- "@angular/build": "~22.0.4",
33
+ "@angular/build": "~22.1.0",
32
34
  },
33
35
  }
34
36
  ```
@@ -88,6 +88,14 @@ async function addOptionalWebpackPackages(tree) {
88
88
  if (!needsWebpack && !needsModuleFederation && !needsRspack) {
89
89
  return;
90
90
  }
91
+ if (needsWebpack || needsRspack) {
92
+ // @nx/webpack and @nx/rspack depend on sass, which pulls in
93
+ // @parcel/watcher. Its install script only builds from source when
94
+ // npm_config_build_from_source is set, so skip it.
95
+ (0, internal_1.acknowledgeBuildScripts)(tree, (0, devkit_1.detectPackageManager)(tree.root), {
96
+ '@parcel/watcher': false,
97
+ });
98
+ }
91
99
  return (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
92
100
  ...(needsWebpack
93
101
  ? {
@@ -12,6 +12,8 @@ A package is added only when a matching target exists:
12
12
 
13
13
  Targets that inherit their executor from an `nx.json` `targetDefaults` entry are detected too.
14
14
 
15
+ On pnpm 11 and above, adding `@nx/webpack` or `@nx/rspack` also writes `pnpm-workspace.yaml`. Both reach `@parcel/watcher` through sass, and pnpm 11 refuses to install a package whose build script is neither allowed nor denied, so the migration records an `allowBuilds` decision for it. A decision already in the file is left untouched.
16
+
15
17
  #### Examples
16
18
 
17
19
  For a workspace with an `@nx/angular:webpack-browser` build target, the migration adds the webpack packages to `devDependencies`.
@@ -527,9 +527,9 @@ function mergeInputs(...inputs) {
527
527
  ];
528
528
  }
529
529
  function getOutput(path, workspaceRoot, angularWorkspaceRoot, projectRoot) {
530
- const relativePath = (0, node_path_1.relative)((0, node_path_1.join)(workspaceRoot, angularWorkspaceRoot, projectRoot), path);
530
+ const relativePath = (0, devkit_1.normalizePath)((0, node_path_1.relative)((0, node_path_1.join)(workspaceRoot, angularWorkspaceRoot, projectRoot), path));
531
531
  if (relativePath.startsWith('..')) {
532
- return posix.join('{workspaceRoot}', (0, node_path_1.join)(angularWorkspaceRoot, projectRoot, relativePath));
532
+ return posix.join('{workspaceRoot}', angularWorkspaceRoot, projectRoot, relativePath);
533
533
  }
534
534
  else {
535
535
  return posix.join('{projectRoot}', relativePath);
@@ -4,3 +4,14 @@ import { type Tree } from '@nx/devkit';
4
4
  * Angular version. Must be called after `@nx/cypress` has been ensured.
5
5
  */
6
6
  export declare function assertCypressComponentTestingSupport(tree: Tree): void;
7
+ /**
8
+ * Returns the installed Cypress version, or the declared range when nothing
9
+ * satisfying is installed, if it cannot reach `floor`; `null` otherwise.
10
+ *
11
+ * A satisfying install decides. Without one, only a range capped below the
12
+ * floor fails: `^15.17.0` installs 15.20.1+, so its lower bound cannot be
13
+ * compared. Declarations that are not ranges (`latest`, `file:`) are not
14
+ * gated.
15
+ * When Cypress is not declared, the generators install `cypressVersion`.
16
+ */
17
+ export declare function findCypressBelow(tree: Tree, floor: string): string | null;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.assertCypressComponentTestingSupport = assertCypressComponentTestingSupport;
4
+ exports.findCypressBelow = findCypressBelow;
4
5
  const devkit_1 = require("@nx/devkit");
5
6
  const internal_1 = require("@nx/devkit/internal");
6
7
  const semver_1 = require("semver");
@@ -10,22 +11,46 @@ const minCypressVersion = '15.20.1';
10
11
  * Angular version. Must be called after `@nx/cypress` has been ensured.
11
12
  */
12
13
  function assertCypressComponentTestingSupport(tree) {
13
- const angularVersion = (0, internal_1.getDeclaredPackageVersion)(tree, '@angular/core');
14
- if (!angularVersion || (0, semver_1.lt)(angularVersion, '22.1.0')) {
14
+ const angularVersion = (0, internal_1.getResolvedPackageVersion)(tree, '@angular/core');
15
+ if (!angularVersion) {
15
16
  return;
16
17
  }
17
- const { cypressVersion, } = require('@nx/cypress/internal');
18
- // When Cypress is not installed, the generators install `cypressVersion`
19
- const declaredCypressVersion = (0, devkit_1.getDependencyVersionFromPackageJson)(tree, 'cypress') ?? cypressVersion;
20
- // Gate only ranges capped below the floor. `^15.17.0` installs 15.20.1+, so
21
- // comparing its lower bound would reject workspaces that work. Dist tags
22
- // (`latest`, `next`) aren't ranges and aren't gated.
23
- if (!(0, semver_1.validRange)(declaredCypressVersion) ||
24
- !(0, semver_1.subset)(declaredCypressVersion, `<${minCypressVersion}`)) {
18
+ // A prerelease of 22.1 counts as 22.1.
19
+ const angularRelease = (0, semver_1.coerce)(angularVersion)?.version ?? angularVersion;
20
+ if ((0, semver_1.lt)(angularRelease, '22.1.0')) {
25
21
  return;
26
22
  }
23
+ const found = findCypressBelow(tree, minCypressVersion);
24
+ if (found) {
25
+ throwForUnsupportedCypress(found);
26
+ }
27
+ }
28
+ /**
29
+ * Returns the installed Cypress version, or the declared range when nothing
30
+ * satisfying is installed, if it cannot reach `floor`; `null` otherwise.
31
+ *
32
+ * A satisfying install decides. Without one, only a range capped below the
33
+ * floor fails: `^15.17.0` installs 15.20.1+, so its lower bound cannot be
34
+ * compared. Declarations that are not ranges (`latest`, `file:`) are not
35
+ * gated.
36
+ * When Cypress is not declared, the generators install `cypressVersion`.
37
+ */
38
+ function findCypressBelow(tree, floor) {
39
+ const { cypressVersion, } = require('@nx/cypress/internal');
40
+ const declaredCypressVersion = (0, devkit_1.getDependencyVersionFromPackageJson)(tree, 'cypress');
41
+ const installedCypressVersion = declaredCypressVersion
42
+ ? (0, internal_1.getSatisfyingInstalledPackageVersion)(tree, 'cypress', declaredCypressVersion)
43
+ : null;
44
+ if (installedCypressVersion) {
45
+ const release = (0, semver_1.coerce)(installedCypressVersion)?.version ?? installedCypressVersion;
46
+ return (0, semver_1.lt)(release, floor) ? installedCypressVersion : null;
47
+ }
48
+ const range = declaredCypressVersion ?? cypressVersion;
49
+ return (0, semver_1.validRange)(range) && (0, semver_1.subset)(range, `<${floor}`) ? range : null;
50
+ }
51
+ function throwForUnsupportedCypress(found) {
27
52
  throw new Error(`Cypress Component Testing with Angular 22.1 and higher requires Cypress ${minCypressVersion} or higher. ` +
28
- `Found Cypress ${declaredCypressVersion}. Earlier Cypress versions can't load Angular's Babel 8 dependencies. ` +
53
+ `Found Cypress ${found}. Earlier Cypress versions can't load Angular's Babel 8 dependencies. ` +
29
54
  `Please upgrade Cypress. ` +
30
55
  `See https://github.com/cypress-io/cypress/issues/34461.`);
31
56
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/angular",
3
- "version": "23.3.0-pr.37068.f95e11e",
3
+ "version": "23.3.0-pr.37224.268062c",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "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, 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.",
@@ -71,6 +71,10 @@
71
71
  "supportsOptionalMigrations": true
72
72
  },
73
73
  "dependencies": {
74
+ "@nx/devkit": "23.3.0-pr.37224.268062c",
75
+ "@nx/eslint": "23.3.0-pr.37224.268062c",
76
+ "@nx/js": "23.3.0-pr.37224.268062c",
77
+ "@nx/web": "23.3.0-pr.37224.268062c",
74
78
  "@phenomnomnominal/tsquery": "~6.2.0",
75
79
  "@typescript-eslint/type-utils": "^8.0.0",
76
80
  "jsonc-parser": "^3.2.0",
@@ -78,31 +82,27 @@
78
82
  "picocolors": "^1.1.0",
79
83
  "picomatch": "4.0.4",
80
84
  "semver": "^7.6.3",
81
- "tslib": "^2.3.0",
82
- "@nx/devkit": "23.3.0-pr.37068.f95e11e",
83
- "@nx/eslint": "23.3.0-pr.37068.f95e11e",
84
- "@nx/web": "23.3.0-pr.37068.f95e11e",
85
- "@nx/js": "23.3.0-pr.37068.f95e11e"
85
+ "tslib": "^2.3.0"
86
86
  },
87
87
  "devDependencies": {
88
- "@nx/storybook": "23.3.0-pr.37068.f95e11e",
89
- "@nx/vitest": "23.3.0-pr.37068.f95e11e",
90
- "nx": "23.3.0-pr.37068.f95e11e"
88
+ "@nx/storybook": "23.3.0-pr.37224.268062c",
89
+ "@nx/vitest": "23.3.0-pr.37224.268062c",
90
+ "nx": "23.3.0-pr.37224.268062c"
91
91
  },
92
92
  "peerDependencies": {
93
93
  "@angular/build": ">= 20.0.0 < 23.0.0",
94
94
  "@angular-devkit/build-angular": ">= 20.0.0 < 23.0.0",
95
95
  "@angular-devkit/core": ">= 20.0.0 < 23.0.0",
96
96
  "@angular-devkit/schematics": ">= 20.0.0 < 23.0.0",
97
+ "@nx/cypress": "23.3.0-pr.37224.268062c",
98
+ "@nx/playwright": "23.3.0-pr.37224.268062c",
97
99
  "@schematics/angular": ">= 20.0.0 < 23.0.0",
100
+ "@nx/module-federation": "23.3.0-pr.37224.268062c",
101
+ "@nx/rspack": "23.3.0-pr.37224.268062c",
102
+ "@nx/webpack": "23.3.0-pr.37224.268062c",
98
103
  "ng-packagr": ">= 20.0.0 < 23.0.0",
99
104
  "rxjs": "^6.5.3 || ^7.5.0",
100
- "webpack-merge": "^5.8.0",
101
- "@nx/playwright": "23.3.0-pr.37068.f95e11e",
102
- "@nx/webpack": "23.3.0-pr.37068.f95e11e",
103
- "@nx/module-federation": "23.3.0-pr.37068.f95e11e",
104
- "@nx/cypress": "23.3.0-pr.37068.f95e11e",
105
- "@nx/rspack": "23.3.0-pr.37068.f95e11e"
105
+ "webpack-merge": "^5.8.0"
106
106
  },
107
107
  "peerDependenciesMeta": {
108
108
  "@angular/build": {
@@ -0,0 +1,18 @@
1
+ <p style="text-align: center;">
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/nrwl/nx/master/images/nx-dark.svg">
4
+ <img alt="Nx - Smart Monorepos · Fast Builds" src="https://raw.githubusercontent.com/nrwl/nx/master/images/nx-light.svg" width="100%">
5
+ </picture>
6
+ </p>
7
+
8
+ {{links}}
9
+
10
+ <hr>
11
+
12
+ # Nx: Smart Monorepos · Fast Builds
13
+
14
+ Get to green PRs in half the time. Nx optimizes your builds, scales your CI, and fixes failed PRs. Built for developers and AI agents.
15
+
16
+ This package is an [Angular plugin for Nx](https://nx.dev/nx-api/angular).
17
+
18
+ {{content}}