diff --git a/packages/nx/migrations.json b/packages/nx/migrations.json index 08cf044c79dfe7..1f1690252e3275 100644 --- a/packages/nx/migrations.json +++ b/packages/nx/migrations.json @@ -83,6 +83,12 @@ "version": "19.2.2-beta.0", "description": "Updates the nx wrapper.", "implementation": "./src/migrations/update-17-3-0/update-nxw" + }, + "19-2-3-set-project-name": { + "version": "19.2.3-beta.0", + "description": "Set project name in nx.json explicitly", + "implementation": "./src/migrations/update-19-2-1/set-project-name", + "x-repair-skip": true } } } diff --git a/packages/nx/src/migrations/update-19-2-1/set-project-name.ts b/packages/nx/src/migrations/update-19-2-1/set-project-name.ts new file mode 100644 index 00000000000000..eae588fac99e93 --- /dev/null +++ b/packages/nx/src/migrations/update-19-2-1/set-project-name.ts @@ -0,0 +1,28 @@ +import { toProjectName } from '../../config/to-project-name'; +import { ProjectConfiguration } from '../../config/workspace-json-project-json'; +import { Tree } from '../../generators/tree'; +import { readJson, writeJson } from '../../generators/utils/json'; +import { getProjects } from '../../generators/utils/project-configuration'; + +export default function setProjectName(tree: Tree) { + // We are explicitly looking for project.json files here, so getProjects is fine. + const projects = getProjects(tree); + + for (const { root } of projects.values()) { + if (!tree.exists(`${root}/project.json`)) { + continue; + } + const projectJson: ProjectConfiguration = readJson( + tree, + `${root}/project.json` + ); + // In Nx 19.1+, the way the project name is inferred is different. + // For existing projects, if the name is not set, we can inline it + // based on the existing logic. This makes sure folks aren't caught + // off guard by the new behavior. + if (!projectJson.name) { + projectJson.name = toProjectName(root); + writeJson(tree, `${root}/project.json`, projectJson); + } + } +} diff --git a/packages/nx/src/plugins/project-json/build-nodes/project-json.ts b/packages/nx/src/plugins/project-json/build-nodes/project-json.ts index 21198e136bc5b1..e99530e2416b61 100644 --- a/packages/nx/src/plugins/project-json/build-nodes/project-json.ts +++ b/packages/nx/src/plugins/project-json/build-nodes/project-json.ts @@ -4,6 +4,7 @@ import { ProjectConfiguration } from '../../../config/workspace-json-project-jso import { toProjectName } from '../../../config/to-project-name'; import { readJsonFile } from '../../../utils/fileutils'; import { NxPluginV2 } from '../../../project-graph/plugins'; +import { PackageJson } from '../../../utils/package-json'; export const ProjectJsonProjectsPlugin: NxPluginV2 = { name: 'nx/core/project-json', @@ -15,6 +16,7 @@ export const ProjectJsonProjectsPlugin: NxPluginV2 = { ); const project = buildProjectFromProjectJson(json, file); + return { projects: { [project.root]: project, @@ -30,9 +32,21 @@ export function buildProjectFromProjectJson( json: Partial, path: string ): ProjectConfiguration { + const packageJsonPath = join(dirname(path), 'package.json'); + const { name, root, ...rest } = json; return { - name: toProjectName(path), - root: dirname(path), - ...json, + name: + name ?? readNameFromPackageJson(packageJsonPath) ?? toProjectName(path), + root: root ?? dirname(path), + ...rest, }; } + +export function readNameFromPackageJson(path: string): string { + try { + const json = readJsonFile(path); + return json.nx?.name ?? json.name; + } catch { + return undefined; + } +} diff --git a/packages/nx/src/utils/package-json.ts b/packages/nx/src/utils/package-json.ts index 4d9a80314e8093..d6996dfd11f82c 100644 --- a/packages/nx/src/utils/package-json.ts +++ b/packages/nx/src/utils/package-json.ts @@ -14,6 +14,7 @@ import { } from './package-manager'; export interface NxProjectPackageJsonConfiguration { + name?: string; implicitDependencies?: string[]; tags?: string[]; namedInputs?: { [inputName: string]: (string | InputDefinition)[] };