Skip to content

Commit b076f03

Browse files
fix(angular): ngrx attaching to route and non-standalone apis for 14 (#14489)
Co-authored-by: Leosvel Pérez Espinosa <[email protected]>
1 parent 6330d9e commit b076f03

File tree

20 files changed

+105
-22
lines changed

20 files changed

+105
-22
lines changed

packages/angular/src/generators/add-linting/add-linting.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { Linter, lintProjectGenerator } from '@nrwl/linter';
88
import { mapLintPattern } from '@nrwl/linter/src/generators/lint-project/lint-project';
99
import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial';
1010
import { join } from 'path';
11-
import { getGeneratorDirectoryForInstalledAngularVersion } from '../utils/angular-version-utils';
11+
import { getGeneratorDirectoryForInstalledAngularVersion } from '../utils/version-utils';
1212
import { addAngularEsLintDependencies } from './lib/add-angular-eslint-dependencies';
1313
import { extendAngularEslintJson } from './lib/create-eslint-configuration';
1414
import type { AddLintingGeneratorSchema } from './schema';

packages/angular/src/generators/application/application.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { setupTailwindGenerator } from '../setup-tailwind/setup-tailwind';
1616
import {
1717
getGeneratorDirectoryForInstalledAngularVersion,
1818
getInstalledAngularVersionInfo,
19-
} from '../utils/angular-version-utils';
19+
} from '../utils/version-utils';
2020
import {
2121
addE2e,
2222
addLinting,

packages/angular/src/generators/component/component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { pathStartsWith } from '../utils/path';
1111
import { exportComponentInEntryPoint } from './lib/component';
1212
import { normalizeOptions } from './lib/normalize-options';
1313
import type { NormalizedSchema, Schema } from './schema';
14-
import { getInstalledAngularVersionInfo } from '../utils/angular-version-utils';
14+
import { getInstalledAngularVersionInfo } from '../utils/version-utils';
1515
import { lt } from 'semver';
1616

1717
export async function componentGenerator(tree: Tree, rawOptions: Schema) {

packages/angular/src/generators/host/host.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { setupMf } from '../setup-mf/setup-mf';
77
import { E2eTestRunner } from '../../utils/test-runners';
88
import { addSsr } from './lib';
99
import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial';
10-
import { getInstalledAngularVersionInfo } from '../utils/angular-version-utils';
10+
import { getInstalledAngularVersionInfo } from '../utils/version-utils';
1111
import { lt } from 'semver';
1212

1313
export async function host(tree: Tree, options: Schema) {

packages/angular/src/generators/init/init.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
zoneJsVersion,
2929
} from '../../utils/versions';
3030
import { karmaGenerator } from '../karma/karma';
31-
import { getGeneratorDirectoryForInstalledAngularVersion } from '../utils/angular-version-utils';
31+
import { getGeneratorDirectoryForInstalledAngularVersion } from '../utils/version-utils';
3232
import { Schema } from './schema';
3333

3434
export async function angularInitGenerator(

packages/angular/src/generators/karma/karma.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
typesJasmineVersion,
2020
typesNodeVersion,
2121
} from '../../utils/versions';
22-
import { getGeneratorDirectoryForInstalledAngularVersion } from '../utils/angular-version-utils';
22+
import { getGeneratorDirectoryForInstalledAngularVersion } from '../utils/version-utils';
2323
import { GeneratorOptions } from './schema';
2424

2525
function addTestInputs(tree: Tree) {

packages/angular/src/generators/library/library.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { getPkgVersionForAngularMajorVersion } from '../../utils/version-utils';
1717
import addLintingGenerator from '../add-linting/add-linting';
1818
import karmaProjectGenerator from '../karma-project/karma-project';
1919
import setupTailwindGenerator from '../setup-tailwind/setup-tailwind';
20-
import { getInstalledAngularVersionInfo } from '../utils/angular-version-utils';
20+
import { getInstalledAngularVersionInfo } from '../utils/version-utils';
2121
import { addBuildableLibrariesPostCssDependencies } from '../utils/dependencies';
2222
import { addModule } from './lib/add-module';
2323
import { addStandaloneComponent } from './lib/add-standalone-component';

packages/angular/src/generators/ngrx/lib/add-ngrx-to-package-json.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { checkAndCleanWithSemver } from '@nrwl/workspace/src/utilities/version-u
44
import { gte } from 'semver';
55
import { getPkgVersionForAngularMajorVersion } from '../../../utils/version-utils';
66
import { rxjsVersion as defaultRxjsVersion } from '../../../utils/versions';
7-
import { getInstalledAngularMajorVersion } from '../../utils/angular-version-utils';
7+
import { getInstalledAngularMajorVersion } from '../../utils/version-utils';
88

99
export function addNgRxToPackageJson(tree: Tree): GeneratorCallback {
1010
let rxjsVersion: string;

packages/angular/src/generators/ngrx/lib/generate-files.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Tree } from '@nrwl/devkit';
22
import { generateFiles, joinPathFragments, names } from '@nrwl/devkit';
33
import { lt } from 'semver';
4-
import { getInstalledAngularVersion } from '../../utils/angular-version-utils';
4+
import { getInstalledAngularVersion } from '../../utils/version-utils';
55
import { NormalizedNgRxGeneratorOptions } from './normalize-options';
66

77
/**

packages/angular/src/generators/ngrx/lib/normalize-options.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export function normalizeOptions(
1616
: options.parent
1717
? dirname(options.parent)
1818
: undefined,
19-
route: options.route ?? "''",
19+
route: options.route ?? '',
2020
directory: names(options.directory).fileName,
2121
};
2222
}

packages/angular/src/generators/ngrx/lib/validate-options.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import type { Tree } from '@nrwl/devkit';
22
import { tsquery } from '@phenomnomnominal/tsquery';
3-
import { lt } from 'semver';
4-
import { getInstalledAngularVersion } from '../../utils/angular-version-utils';
3+
import { coerce, lt, major } from 'semver';
4+
import {
5+
getInstalledAngularVersionInfo,
6+
getInstalledPackageVersionInfo,
7+
} from '../../utils/version-utils';
58
import type { NgRxGeneratorOptions } from '../schema';
9+
import { getPkgVersionForAngularMajorVersion } from '../../../utils/version-utils';
610

711
export function validateOptions(
812
tree: Tree,
@@ -18,9 +22,19 @@ export function validateOptions(
1822
throw new Error(`Parent does not exist: ${options.parent}.`);
1923
}
2024

21-
const angularVersion = getInstalledAngularVersion(tree);
22-
const parentPath = options.parent ?? options.module;
23-
if (parentPath && lt(angularVersion, '14.1.0')) {
25+
const angularVersionInfo = getInstalledAngularVersionInfo(tree);
26+
const intendedNgRxVersionForAngularMajor =
27+
getPkgVersionForAngularMajorVersion(
28+
'ngrxVersion',
29+
angularVersionInfo.major
30+
);
31+
32+
const ngrxMajorVersion =
33+
getInstalledPackageVersionInfo(tree, '@ngrx/store')?.major ??
34+
major(coerce(intendedNgRxVersionForAngularMajor));
35+
36+
if (lt(angularVersionInfo.version, '14.1.0') || ngrxMajorVersion < 15) {
37+
const parentPath = options.parent ?? options.module;
2438
const parentContent = tree.read(parentPath, 'utf-8');
2539
const ast = tsquery.ast(parentContent);
2640

packages/angular/src/generators/ngrx/ngrx.spec.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,63 @@ describe('ngrx', () => {
680680
).toMatchSnapshot();
681681
});
682682

683+
it('should throw when Angular version < 14.1 and NgRx < 15 but path to routes file is provided', async () => {
684+
const parentPath = 'apps/myapp/src/app/app.routes.ts';
685+
tree.write(
686+
parentPath,
687+
`import { Routes } from '@angular/router';
688+
import { NxWelcomeComponent } from './nx-welcome.component';
689+
export const appRoutes: Routes = [{ path: '', component: NxWelcomeComponent }];`
690+
);
691+
692+
devkit.updateJson(tree, 'package.json', (json) => ({
693+
...json,
694+
dependencies: {
695+
...json.dependencies,
696+
'@angular/core': '14.1.0',
697+
'@ngrx/store': '14.1.0',
698+
},
699+
}));
700+
701+
// ACT & ASSERT
702+
await expect(
703+
ngrxGenerator(tree, {
704+
...defaultStandaloneOptions,
705+
parent: parentPath,
706+
})
707+
).rejects.toThrowError(
708+
`The provided parent path "${parentPath}" does not contain an "NgModule".`
709+
);
710+
});
711+
712+
it('should throw when Angular version < 15 and NgRx is not currently installed but path to routes file is provided', async () => {
713+
const parentPath = 'apps/myapp/src/app/app.routes.ts';
714+
tree.write(
715+
parentPath,
716+
`import { Routes } from '@angular/router';
717+
import { NxWelcomeComponent } from './nx-welcome.component';
718+
export const appRoutes: Routes = [{ path: '', component: NxWelcomeComponent }];`
719+
);
720+
721+
devkit.updateJson(tree, 'package.json', (json) => ({
722+
...json,
723+
dependencies: {
724+
...json.dependencies,
725+
'@angular/core': '14.2.0',
726+
},
727+
}));
728+
729+
// ACT & ASSERT
730+
await expect(
731+
ngrxGenerator(tree, {
732+
...defaultStandaloneOptions,
733+
parent: parentPath,
734+
})
735+
).rejects.toThrowError(
736+
`The provided parent path "${parentPath}" does not contain an "NgModule".`
737+
);
738+
});
739+
683740
it('should throw when the provided parent does not have an NgModule', async () => {
684741
const parentPath = 'apps/myapp/src/app/app.routes.ts';
685742
tree.write(

packages/angular/src/generators/remote/remote.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { setupMf } from '../setup-mf/setup-mf';
66
import { E2eTestRunner } from '../../utils/test-runners';
77
import { addSsr, findNextAvailablePort } from './lib';
88
import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial';
9-
import { getInstalledAngularVersionInfo } from '../utils/angular-version-utils';
9+
import { getInstalledAngularVersionInfo } from '../utils/version-utils';
1010
import { lt } from 'semver';
1111

1212
export async function remote(tree: Tree, options: Schema) {

packages/angular/src/generators/scam-to-standalone/scam-to-standalone.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
verifyIsInlineScam,
1616
verifyModuleIsScam,
1717
} from './lib';
18-
import { getInstalledAngularVersionInfo } from '../utils/angular-version-utils';
18+
import { getInstalledAngularVersionInfo } from '../utils/version-utils';
1919
import { lt } from 'semver';
2020

2121
export async function scamToStandalone(

packages/angular/src/generators/setup-mf/setup-mf.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
updateHostAppRoutes,
1717
updateTsConfigTarget,
1818
} from './lib';
19-
import { getInstalledAngularVersionInfo } from '../utils/angular-version-utils';
19+
import { getInstalledAngularVersionInfo } from '../utils/version-utils';
2020
import { lt } from 'semver';
2121

2222
export async function setupMf(tree: Tree, options: Schema) {

packages/angular/src/generators/setup-ssr/setup-ssr.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
installPackagesTask,
66
} from '@nrwl/devkit';
77
import { getPkgVersionsForAngularMajorVersion } from '../../utils/version-utils';
8-
import { getInstalledAngularVersionInfo } from '../utils/angular-version-utils';
8+
import { getInstalledAngularVersionInfo } from '../utils/version-utils';
99
import {
1010
generateSSRFiles,
1111
normalizeOptions,

packages/angular/src/generators/utils/create-ts-config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Tree } from '@nrwl/devkit';
22
import { writeJson } from '@nrwl/devkit';
33
import { tsConfigBaseOptions } from '@nrwl/workspace/src/utils/create-ts-config';
4-
import { getInstalledAngularMajorVersion } from './angular-version-utils';
4+
import { getInstalledAngularMajorVersion } from './version-utils';
55

66
export { extractTsConfigBase } from '@nrwl/workspace/src/utils/create-ts-config';
77

packages/angular/src/generators/utils/angular-version-utils.spec.ts renamed to packages/angular/src/generators/utils/version-utils.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
getGeneratorDirectoryForInstalledAngularVersion,
55
getInstalledAngularMajorVersion,
66
getInstalledAngularVersion,
7-
} from './angular-version-utils';
7+
} from './version-utils';
88

99
describe('angularVersionUtils', () => {
1010
test.each(['14.0.0', '~14.1.0', '^14.2.0', '~14.3.0-beta.0'])(

packages/angular/src/generators/utils/angular-version-utils.ts renamed to packages/angular/src/generators/utils/version-utils.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,15 @@ export function getInstalledAngularVersionInfo(tree: Tree) {
4545
major: major(installedVersion),
4646
};
4747
}
48+
49+
export function getInstalledPackageVersionInfo(tree: Tree, pkgName: string) {
50+
try {
51+
const version =
52+
readJson(tree, 'package.json').dependencies?.[pkgName] ??
53+
readJson(tree, 'package.json').devDependencies?.[pkgName];
54+
55+
return { major: major(coerce(version)), version };
56+
} catch {
57+
return null;
58+
}
59+
}

packages/angular/src/utils/nx-devkit/route-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ export function addProviderToRoute(
109109
);
110110
}
111111

112-
const ROUTE_SELECTOR = `ObjectLiteralExpression:has(PropertyAssignment:has(Identifier[name=path]) > StringLiteral[value=${routeToAddProviderTo}]):last-child`;
112+
const ROUTE_SELECTOR = `ObjectLiteralExpression:has(PropertyAssignment:has(Identifier[name=path]) > StringLiteral[value='${routeToAddProviderTo}']):last-child`;
113113
const ROUTE_PATH_PROVIDERS_SELECTOR =
114114
'ObjectLiteralExpression > PropertyAssignment:has(Identifier[name=providers])';
115115

0 commit comments

Comments
 (0)