diff --git a/e2e/next/src/__snapshots__/next.test.ts.snap b/e2e/next/src/__snapshots__/next.test.ts.snap
index 2149098288c63c..370c4337558a63 100644
--- a/e2e/next/src/__snapshots__/next.test.ts.snap
+++ b/e2e/next/src/__snapshots__/next.test.ts.snap
@@ -5,7 +5,7 @@ exports[`Next.js Applications next-env.d.ts should remain the same after a build
///
// NOTE: This file should not be edited
-// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information.
+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
"
`;
@@ -14,6 +14,6 @@ exports[`Next.js Applications next-env.d.ts should remain the same after a build
///
// NOTE: This file should not be edited
-// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information.
+// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.
"
`;
diff --git a/packages/next/package.json b/packages/next/package.json
index cb5a5f39ce979e..df6b4b16e2ebce 100644
--- a/packages/next/package.json
+++ b/packages/next/package.json
@@ -37,7 +37,7 @@
"dependencies": {
"@nx/devkit": "file:../devkit",
"@babel/plugin-proposal-decorators": "^7.22.7",
- "@svgr/webpack": "^8.0.1",
+ "@svgr/webpack": "^8.1.0",
"copy-webpack-plugin": "^10.2.4",
"file-loader": "^6.2.0",
"ignore": "^5.0.4",
diff --git a/packages/next/src/generators/application/application.ts b/packages/next/src/generators/application/application.ts
index e9b3adb33f2442..a66a4eaf0c937e 100644
--- a/packages/next/src/generators/application/application.ts
+++ b/packages/next/src/generators/application/application.ts
@@ -8,11 +8,8 @@ import {
} from '@nx/devkit';
import { initGenerator as jsInitGenerator } from '@nx/js';
import { setupTailwindGenerator } from '@nx/react';
-import {
- testingLibraryReactVersion,
- typesReactDomVersion,
- typesReactVersion,
-} from '@nx/react/src/utils/versions';
+import { testingLibraryReactVersion } from '@nx/react/src/utils/versions';
+import { getReactDependenciesVersionsToInstall } from '@nx/react/src/utils/version-utils';
import { normalizeOptions } from './lib/normalize-options';
import { Schema } from './schema';
@@ -102,9 +99,10 @@ export async function applicationGeneratorInternal(host: Tree, schema: Schema) {
}
if (!options.skipPackageJson) {
+ const reactVersions = await getReactDependenciesVersionsToInstall(host);
const devDependencies: Record = {
- '@types/react': typesReactVersion,
- '@types/react-dom': typesReactDomVersion,
+ '@types/react': reactVersions['@types/react'],
+ '@types/react-dom': reactVersions['@types/react-dom'],
};
if (options.unitTestRunner && options.unitTestRunner !== 'none') {
diff --git a/packages/next/src/generators/init/init.ts b/packages/next/src/generators/init/init.ts
index 5d0c5e1faa865a..49fa77f47e8f92 100644
--- a/packages/next/src/generators/init/init.ts
+++ b/packages/next/src/generators/init/init.ts
@@ -8,23 +8,27 @@ import {
createProjectGraphAsync,
} from '@nx/devkit';
import { addPlugin } from '@nx/devkit/src/utils/add-plugin';
-import { reactDomVersion, reactVersion } from '@nx/react/src/utils/versions';
+import { getReactDependenciesVersionsToInstall } from '@nx/react/src/utils/version-utils';
import { addGitIgnoreEntry } from '../../utils/add-gitignore-entry';
-import { nextVersion, nxVersion } from '../../utils/versions';
+import { nxVersion } from '../../utils/versions';
+import { getNextDependenciesVersionsToInstall } from '../../utils/version-utils';
import type { InitSchema } from './schema';
-function updateDependencies(host: Tree, schema: InitSchema) {
+async function updateDependencies(host: Tree, schema: InitSchema) {
const tasks: GeneratorCallback[] = [];
tasks.push(removeDependenciesFromPackageJson(host, ['@nx/next'], []));
+ const versions = await getNextDependenciesVersionsToInstall(host);
+ const reactVersions = await getReactDependenciesVersionsToInstall(host);
+
tasks.push(
addDependenciesToPackageJson(
host,
{
- next: nextVersion,
- react: reactVersion,
- 'react-dom': reactDomVersion,
+ next: versions.next,
+ react: reactVersions.react,
+ 'react-dom': reactVersions['react-dom'],
},
{
'@nx/next': nxVersion,
@@ -76,7 +80,7 @@ export async function nextInitGeneratorInternal(
let installTask: GeneratorCallback = () => {};
if (!schema.skipPackageJson) {
- installTask = updateDependencies(host, schema);
+ installTask = await updateDependencies(host, schema);
}
return installTask;
diff --git a/packages/next/src/utils/version-utils.ts b/packages/next/src/utils/version-utils.ts
new file mode 100644
index 00000000000000..36904d7bfad3e8
--- /dev/null
+++ b/packages/next/src/utils/version-utils.ts
@@ -0,0 +1,54 @@
+import { type Tree, readJson, createProjectGraphAsync } from '@nx/devkit';
+import { clean, coerce, major } from 'semver';
+import { nextVersion, next14Version } from './versions';
+
+type NextDependenciesVersions = {
+ next: string;
+};
+
+export async function getNextDependenciesVersionsToInstall(
+ tree: Tree
+): Promise {
+ if (await isNext14(tree)) {
+ return {
+ next: next14Version,
+ };
+ } else {
+ return {
+ next: nextVersion,
+ };
+ }
+}
+
+export async function isNext14(tree: Tree) {
+ let installedNextVersion = await getInstalledNextVersionFromGraph();
+ if (!installedNextVersion) {
+ installedNextVersion = getInstalledNextVersion(tree);
+ }
+ return major(installedNextVersion) === 14;
+}
+
+export function getInstalledNextVersion(tree: Tree): string {
+ const pkgJson = readJson(tree, 'package.json');
+ const installedNextVersion =
+ pkgJson.dependencies && pkgJson.dependencies['next'];
+
+ if (
+ !installedNextVersion ||
+ installedNextVersion === 'latest' ||
+ installedNextVersion === 'next'
+ ) {
+ return clean(nextVersion) ?? coerce(nextVersion).version;
+ }
+
+ return clean(installedNextVersion) ?? coerce(installedNextVersion).version;
+}
+
+export async function getInstalledNextVersionFromGraph() {
+ const graph = await createProjectGraphAsync();
+ const nextDep = graph.externalNodes?.['npm:next'];
+ if (!nextDep) {
+ return undefined;
+ }
+ return clean(nextDep.data.version) ?? coerce(nextDep.data.version).version;
+}
diff --git a/packages/next/src/utils/versions.ts b/packages/next/src/utils/versions.ts
index 6b05ebf3441005..1398b380341b86 100644
--- a/packages/next/src/utils/versions.ts
+++ b/packages/next/src/utils/versions.ts
@@ -1,6 +1,7 @@
export const nxVersion = require('../../package.json').version;
-export const nextVersion = '14.2.16';
+export const nextVersion = '~15.1.4';
+export const next14Version = '~14.2.16';
export const eslintConfigNextVersion = '14.2.16';
export const sassVersion = '1.62.1';
export const lessLoader = '11.1.0';