@nx/angular 23.0.0-beta.18 → 23.0.0-beta.19

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/angular",
3
- "version": "23.0.0-beta.18",
3
+ "version": "23.0.0-beta.19",
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, 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": {
@@ -61,13 +61,13 @@
61
61
  "migrations": "./migrations.json"
62
62
  },
63
63
  "dependencies": {
64
- "@nx/devkit": "23.0.0-beta.18",
65
- "@nx/eslint": "23.0.0-beta.18",
66
- "@nx/js": "23.0.0-beta.18",
67
- "@nx/module-federation": "23.0.0-beta.18",
68
- "@nx/rspack": "23.0.0-beta.18",
69
- "@nx/web": "23.0.0-beta.18",
70
- "@nx/webpack": "23.0.0-beta.18",
64
+ "@nx/devkit": "23.0.0-beta.19",
65
+ "@nx/eslint": "23.0.0-beta.19",
66
+ "@nx/js": "23.0.0-beta.19",
67
+ "@nx/module-federation": "23.0.0-beta.19",
68
+ "@nx/rspack": "23.0.0-beta.19",
69
+ "@nx/web": "23.0.0-beta.19",
70
+ "@nx/webpack": "23.0.0-beta.19",
71
71
  "@phenomnomnominal/tsquery": "~6.2.0",
72
72
  "@typescript-eslint/type-utils": "^8.0.0",
73
73
  "enquirer": "~2.3.6",
@@ -2,9 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.nxComponentTestingPreset = nxComponentTestingPreset;
4
4
  const cypress_preset_1 = require("@nx/cypress/plugins/cypress-preset");
5
- const ct_helpers_1 = require("@nx/cypress/src/utils/ct-helpers");
5
+ const internal_1 = require("@nx/cypress/internal");
6
6
  const devkit_1 = require("@nx/devkit");
7
- const internal_1 = require("@nx/js/internal");
7
+ const internal_2 = require("@nx/js/internal");
8
8
  const fs_1 = require("fs");
9
9
  const path_1 = require("path");
10
10
  const semver_1 = require("semver");
@@ -46,9 +46,9 @@ This is likely due to not running via nx. i.e. 'nx component-test my-project'.
46
46
  Please open an issue if this error persists.
47
47
  ${e.stack ? e.stack : e}`);
48
48
  }
49
- const ctProjectConfig = (0, ct_helpers_1.getProjectConfigByPath)(graph, pathToConfig);
49
+ const ctProjectConfig = (0, internal_1.getProjectConfigByPath)(graph, pathToConfig);
50
50
  const ctConfigurationName = process.env.NX_CYPRESS_TARGET_CONFIGURATION;
51
- const ctContext = (0, ct_helpers_1.createExecutorContext)(graph, ctProjectConfig.targets, ctProjectConfig.name, options?.ctTargetName || 'component-test', ctConfigurationName);
51
+ const ctContext = (0, internal_1.createExecutorContext)(graph, ctProjectConfig.targets, ctProjectConfig.name, options?.ctTargetName || 'component-test', ctConfigurationName);
52
52
  const buildTarget = options?.buildTarget
53
53
  ? (0, devkit_1.parseTargetString)(options.buildTarget, graph)
54
54
  : // for backwards compat, if no buildTargetin the preset options, get it from the target options
@@ -65,7 +65,7 @@ ${e.stack ? e.stack : e}`);
65
65
  const offset = isOffsetNeeded(ctContext, ctProjectConfig)
66
66
  ? (0, devkit_1.offsetFromRoot)(normalizedFromWorkspaceRootPath)
67
67
  : undefined;
68
- const buildContext = (0, ct_helpers_1.createExecutorContext)(graph, graph.nodes[buildTarget.project]?.data.targets, buildTarget.project, buildTarget.target, buildTarget.configuration);
68
+ const buildContext = (0, internal_1.createExecutorContext)(graph, graph.nodes[buildTarget.project]?.data.targets, buildTarget.project, buildTarget.target, buildTarget.configuration);
69
69
  const buildableProjectConfig = normalizeBuildTargetOptions(buildContext, ctContext, offset);
70
70
  return {
71
71
  ...(0, cypress_preset_1.nxBaseCypressPreset)(pathToConfig, { testingType: 'component' }),
@@ -116,7 +116,7 @@ function normalizeBuildTargetOptions(buildContext, ctContext, offset) {
116
116
  configuration: buildContext.configurationName,
117
117
  }, buildContext);
118
118
  const project = buildContext.projectsConfigurations.projects[buildContext.projectName];
119
- const sourceRoot = (0, internal_1.getProjectSourceRoot)(project);
119
+ const sourceRoot = (0, internal_2.getProjectSourceRoot)(project);
120
120
  const buildOptions = withSchemaDefaults(options, sourceRoot, buildContext.root);
121
121
  // cypress creates a tsconfig if one isn't preset
122
122
  // that contains all the support required for angular and component tests
@@ -158,7 +158,7 @@ function normalizeBuildTargetOptions(buildContext, ctContext, offset) {
158
158
  // then we don't want to have the assets/scripts/styles be included to
159
159
  // prevent inclusion of unintended stuff like tailwind
160
160
  if (buildContext.projectName === ctContext.projectName ||
161
- (0, ct_helpers_1.isCtProjectUsingBuildProject)(ctContext.projectGraph, buildContext.projectName, ctContext.projectName)) {
161
+ (0, internal_1.isCtProjectUsingBuildProject)(ctContext.projectGraph, buildContext.projectName, ctContext.projectName)) {
162
162
  if (offset) {
163
163
  buildOptions.assets = buildOptions.assets.map((asset) => {
164
164
  return typeof asset === 'string'
@@ -248,7 +248,7 @@ function getTempStylesForTailwind(ctExecutorContext) {
248
248
  const rootTailwindPath = (0, path_1.join)(ctExecutorContext.root, 'tailwind.config');
249
249
  const isTailWindInRoot = exts.some((ext) => (0, fs_1.existsSync)(`${rootTailwindPath}.${ext}`));
250
250
  if (isTailWindInRoot || isTailWindInCtProject) {
251
- const pathToStyle = (0, ct_helpers_1.getTempTailwindPath)(ctExecutorContext);
251
+ const pathToStyle = (0, internal_1.getTempTailwindPath)(ctExecutorContext);
252
252
  try {
253
253
  (0, fs_1.mkdirSync)((0, path_1.dirname)(pathToStyle), { recursive: true });
254
254
  (0, fs_1.writeFileSync)(pathToStyle, `
@@ -1 +1 @@
1
- {"version":3,"file":"cypress-component-configuration.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/cypress-component-configuration/cypress-component-configuration.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,iBAAiB,EAMjB,IAAI,EAEL,MAAM,YAAY,CAAC;AAapB,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAiBxD;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,iBAAiB,CAAC,CAuD5B;AAkJD,eAAe,6BAA6B,CAAC"}
1
+ {"version":3,"file":"cypress-component-configuration.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/cypress-component-configuration/cypress-component-configuration.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,iBAAiB,EAMjB,IAAI,EAEL,MAAM,YAAY,CAAC;AAapB,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAiBxD;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,iBAAiB,CAAC,CAqD5B;AAkJD,eAAe,6BAA6B,CAAC"}
@@ -75,7 +75,7 @@ async function cypressComponentConfiguration(tree, options) {
75
75
  isZoneless = (0, devkit_1.getDependencyVersionFromPackageJson)(tree, 'zone.js') === null;
76
76
  }
77
77
  if (isZoneless) {
78
- const { getInstalledCypressVersion } = await Promise.resolve().then(() => __importStar(require('@nx/cypress/src/utils/versions')));
78
+ const { getInstalledCypressVersion } = await Promise.resolve().then(() => __importStar(require('@nx/cypress/internal')));
79
79
  const installedCypressVersion = getInstalledCypressVersion(tree);
80
80
  // Zoneless support was introduced in Cypress 15.8.0
81
81
  // If Cypress is not yet installed, we'll install the latest version, which will have zoneless support
@@ -105,7 +105,7 @@ async function cypressComponentConfiguration(tree, options) {
105
105
  }
106
106
  async function addFiles(tree, projectConfig, options, isZoneless) {
107
107
  const componentFile = (0, devkit_1.joinPathFragments)(projectConfig.root, 'cypress', 'support', 'component.ts');
108
- const { addMountDefinition } = require('@nx/cypress/src/utils/config');
108
+ const { addMountDefinition } = (require('@nx/cypress/internal'));
109
109
  const updatedCmpContents = await addMountDefinition(tree.read(componentFile, 'utf-8'));
110
110
  tree.write(componentFile, `import { mount } from '${isZoneless ? 'cypress/angular-zoneless' : 'cypress/angular'}';\n${updatedCmpContents}`);
111
111
  if (!options.generateTests) {
@@ -143,7 +143,7 @@ async function addFiles(tree, projectConfig, options, isZoneless) {
143
143
  async function configureCypressCT(tree, options) {
144
144
  let found = { target: options.buildTarget, config: undefined };
145
145
  if (!options.buildTarget) {
146
- const { findBuildConfig } = require('@nx/cypress/src/utils/find-target-options');
146
+ const { findBuildConfig } = (require('@nx/cypress/internal'));
147
147
  found = await findBuildConfig(tree, {
148
148
  project: options.project,
149
149
  buildTarget: options.buildTarget,
@@ -181,7 +181,7 @@ async function configureCypressCT(tree, options) {
181
181
  else {
182
182
  ctConfigOptions.buildTarget = found.target;
183
183
  }
184
- const { addDefaultCTConfig, getProjectCypressConfigPath } = require('@nx/cypress/src/utils/config');
184
+ const { addDefaultCTConfig, getProjectCypressConfigPath } = require('@nx/cypress/internal');
185
185
  const cypressConfigPath = getProjectCypressConfigPath(tree, projectConfig.root);
186
186
  const updatedCyConfig = await addDefaultCTConfig(tree.read(cypressConfigPath, 'utf-8'), ctConfigOptions, '@nx/angular/plugins/component-testing');
187
187
  tree.write(cypressConfigPath, updatedCyConfig);
@@ -26,7 +26,7 @@ function addCypressOnErrorWorkaround(tree, schema) {
26
26
  if (e2eProject.targets?.e2e?.executor !== '@nx/cypress:cypress') {
27
27
  try {
28
28
  // don't ensure package is installed, if it's not installed, we don't need to add the workaround
29
- const { CYPRESS_CONFIG_FILE_NAME_PATTERN, } = require('@nx/cypress/src/utils/config');
29
+ const { CYPRESS_CONFIG_FILE_NAME_PATTERN, } = require('@nx/cypress/internal');
30
30
  if (!(0, devkit_1.glob)(tree, [`${e2eProject.root}/${CYPRESS_CONFIG_FILE_NAME_PATTERN}`])
31
31
  .length) {
32
32
  // Not a cypress e2e project, skip
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../../packages/angular/src/plugins/plugin.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,aAAa,EAOnB,MAAM,YAAY,CAAC;AAUpB,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAOD,KAAK,0BAA0B,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AACF,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;CACtD,CAAC;AAqCF,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,oBAAoB,CA+B7D,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../../packages/angular/src/plugins/plugin.ts"],"names":[],"mappings":"AAKA,OAAO,EAML,KAAK,aAAa,EAOnB,MAAM,YAAY,CAAC;AAUpB,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAOD,KAAK,0BAA0B,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AACF,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;CACtD,CAAC;AAqCF,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,oBAAoB,CA6D7D,CAAC"}
@@ -55,21 +55,35 @@ exports.createNodesV2 = [
55
55
  const pmc = (0, devkit_1.getPackageManagerCommand)(packageManager);
56
56
  const lockFileName = (0, js_1.getLockFileName)(packageManager);
57
57
  try {
58
- return await (0, devkit_1.createNodesFromFiles)((configFile, options, context) => createNodesInternal(configFile, options, context, projectsCache, pmc, lockFileName), configFiles, options, context);
58
+ const { entries, preErrors } = await filterAngularConfigs(configFiles, context);
59
+ const projectHashes = await (0, internal_1.calculateHashesForCreateNodes)(entries.map((e) => e.angularWorkspaceRoot), options ?? {}, context, entries.map(() => [lockFileName]));
60
+ let results = [];
61
+ let nodeErrors = [];
62
+ try {
63
+ results = await (0, devkit_1.createNodesFromFiles)((configFile, opts, ctx, idx) => createNodesInternal(configFile, opts, ctx, projectsCache, pmc, projectHashes[idx]), entries.map((e) => e.configFile), options, context);
64
+ }
65
+ catch (e) {
66
+ if (e instanceof devkit_1.AggregateCreateNodesError) {
67
+ results = e.partialResults ?? [];
68
+ nodeErrors = e.errors;
69
+ }
70
+ else {
71
+ throw e;
72
+ }
73
+ }
74
+ const allErrors = [...preErrors, ...nodeErrors];
75
+ if (allErrors.length > 0) {
76
+ throw new devkit_1.AggregateCreateNodesError(allErrors, results);
77
+ }
78
+ return results;
59
79
  }
60
80
  finally {
61
81
  projectsCache.writeToDisk();
62
82
  }
63
83
  },
64
84
  ];
65
- async function createNodesInternal(configFilePath, options, context, projectsCache, pmc, lockFileName) {
85
+ async function createNodesInternal(configFilePath, options, context, projectsCache, pmc, hash) {
66
86
  const angularWorkspaceRoot = (0, node_path_1.dirname)(configFilePath);
67
- // Do not create a project if package.json isn't there
68
- const siblingFiles = (0, node_fs_1.readdirSync)((0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot));
69
- if (!siblingFiles.includes('package.json')) {
70
- return {};
71
- }
72
- const hash = await (0, internal_1.calculateHashForCreateNodes)(angularWorkspaceRoot, options, context, [lockFileName]);
73
87
  if (!projectsCache.has(hash)) {
74
88
  projectsCache.set(hash, await buildAngularProjects(configFilePath, options, angularWorkspaceRoot, context, pmc));
75
89
  }
@@ -522,3 +536,24 @@ function getOutput(path, workspaceRoot, angularWorkspaceRoot, projectRoot) {
522
536
  function getAngularJsonProjectTargets(project) {
523
537
  return project.architect ?? project.targets;
524
538
  }
539
+ async function filterAngularConfigs(configFiles, context) {
540
+ const preErrors = [];
541
+ const candidates = await Promise.all(configFiles.map(async (configFile) => {
542
+ try {
543
+ const angularWorkspaceRoot = (0, node_path_1.dirname)(configFile);
544
+ const siblingFiles = (0, node_fs_1.readdirSync)((0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot));
545
+ if (!siblingFiles.includes('package.json')) {
546
+ return null;
547
+ }
548
+ return { configFile, angularWorkspaceRoot };
549
+ }
550
+ catch (e) {
551
+ preErrors.push([configFile, e]);
552
+ return null;
553
+ }
554
+ }));
555
+ return {
556
+ entries: candidates.filter((c) => c !== null),
557
+ preErrors,
558
+ };
559
+ }