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';