From 5e23c07077b72f9da55532b11aa40f9d19f2c596 Mon Sep 17 00:00:00 2001 From: Jason Jean Date: Thu, 28 Apr 2022 13:24:35 -0400 Subject: [PATCH] fix(core): automatically add root to the project.json projects (#9977) * fix(core): automatically add root to the project.json projects * chore(core): move project-configuration generator utils to nx package * fix(core): add migrations to remove root --- e2e/angular-core/src/ng-add.test.ts | 3 - e2e/nx-plugin/src/nx-plugin.test.ts | 2 +- e2e/workspace-core/src/aux-commands.test.ts | 3 - .../application/lib/update-config-files.ts | 3 + .../generators/library/lib/update-project.ts | 3 + packages/devkit/index.ts | 8 +- .../devkit/src/generators/format-files.ts | 10 +- .../src/generators/generate-files.spec.ts | 4 +- .../devkit/src/generators/generate-files.ts | 2 +- packages/devkit/src/generators/to-js.ts | 2 +- .../src/generators/update-ts-configs-to-js.ts | 4 +- .../visit-not-ignored-files.spec.ts | 4 +- .../src/generators/visit-not-ignored-files.ts | 2 +- .../devkit/src/tasks/install-packages-task.ts | 2 +- .../devkit/src/utils/get-workspace-layout.ts | 41 ++---- .../devkit/src/utils/invoke-nx-generator.ts | 15 ++- packages/devkit/src/utils/move-dir.ts | 2 +- .../devkit/src/utils/package-json.spec.ts | 6 +- packages/devkit/src/utils/package-json.ts | 4 +- packages/devkit/testing.ts | 4 +- .../update-base-jest-config.spec.ts | 2 +- packages/nx/migrations.json | 9 +- packages/nx/migrations.spec.ts | 12 ++ packages/nx/src/adapter/ngcli-adapter.ts | 12 +- packages/nx/src/command-line/generate.ts | 2 +- packages/nx/src/command-line/migrate.ts | 2 +- packages/nx/src/config/workspaces.ts | 17 ++- ...hanged-files-with-prettier-if-available.ts | 55 ++++++++ .../create-tree-with-empty-workspace.ts | 4 +- .../generators/testing-utils}/create-tree.ts | 4 +- .../src/{config => generators}/tree.spec.ts | 0 .../nx/src/{config => generators}/tree.ts | 0 .../src => nx/src/generators}/utils/json.ts | 6 +- .../utils}/project-configuration.spec.ts | 10 +- .../utils}/project-configuration.ts | 61 ++++++--- .../update-14-0-4/remove-roots.spec.ts | 48 +++++++ .../migrations/update-14-0-4/remove-roots.ts | 15 +++ .../set-project-build-config.spec.ts.snap | 119 +++++++++--------- .../set-project-build-config.spec.ts | 9 +- .../convert-to-nx-project.spec.ts | 2 + .../convert-to-nx-project.ts | 2 + 41 files changed, 339 insertions(+), 176 deletions(-) create mode 100644 packages/nx/migrations.spec.ts create mode 100644 packages/nx/src/generators/internal-utils/format-changed-files-with-prettier-if-available.ts rename packages/{devkit/src/tests => nx/src/generators/testing-utils}/create-tree-with-empty-workspace.ts (90%) rename packages/{devkit/src/tests => nx/src/generators/testing-utils}/create-tree.ts (54%) rename packages/nx/src/{config => generators}/tree.spec.ts (100%) rename packages/nx/src/{config => generators}/tree.ts (100%) rename packages/{devkit/src => nx/src/generators}/utils/json.ts (89%) rename packages/{devkit/src/generators => nx/src/generators/utils}/project-configuration.spec.ts (98%) rename packages/{devkit/src/generators => nx/src/generators/utils}/project-configuration.ts (89%) create mode 100644 packages/nx/src/migrations/update-14-0-4/remove-roots.spec.ts create mode 100644 packages/nx/src/migrations/update-14-0-4/remove-roots.ts diff --git a/e2e/angular-core/src/ng-add.test.ts b/e2e/angular-core/src/ng-add.test.ts index 04e37caaca9e7..db5d42e996196 100644 --- a/e2e/angular-core/src/ng-add.test.ts +++ b/e2e/angular-core/src/ng-add.test.ts @@ -182,7 +182,6 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { // check project configuration const projectConfig = readJson(`apps/${project}/project.json`); - expect(projectConfig.root).toEqual(`apps/${project}`); expect(projectConfig.sourceRoot).toEqual(`apps/${project}/src`); expect(projectConfig.targets.build).toEqual({ executor: '@angular-devkit/build-angular:browser', @@ -259,7 +258,6 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { // check e2e project config const e2eProjectConfig = readJson(`apps/${project}-e2e/project.json`); - expect(e2eProjectConfig.root).toEqual(`apps/${project}-e2e`); expect(e2eProjectConfig.targets.e2e).toEqual({ executor: '@angular-devkit/build-angular:protractor', options: { @@ -356,7 +354,6 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { // check e2e project config const e2eProjectConfig = readJson(`apps/${project}-e2e/project.json`); - expect(e2eProjectConfig.root).toEqual(`apps/${e2eProject}`); expect(e2eProjectConfig.targets['cypress-run']).toEqual({ executor: '@nrwl/cypress:cypress', options: { diff --git a/e2e/nx-plugin/src/nx-plugin.test.ts b/e2e/nx-plugin/src/nx-plugin.test.ts index e07cd6f302893..cf9545a9b9cb2 100644 --- a/e2e/nx-plugin/src/nx-plugin.test.ts +++ b/e2e/nx-plugin/src/nx-plugin.test.ts @@ -282,7 +282,7 @@ describe('Nx Plugin', () => { checkFilesExist(`libs/subdir/${plugin}/package.json`); const pluginProject = readProjectConfig(`subdir-${plugin}`); const pluginE2EProject = readProjectConfig(`subdir-${plugin}-e2e`); - expect(pluginProject.root).toBe(`libs/subdir/${plugin}`); + expect(pluginProject.targets).toBeDefined(); expect(pluginE2EProject).toBeTruthy(); }, 90000); }); diff --git a/e2e/workspace-core/src/aux-commands.test.ts b/e2e/workspace-core/src/aux-commands.test.ts index e0aa375097e48..c69a5b1e30118 100644 --- a/e2e/workspace-core/src/aux-commands.test.ts +++ b/e2e/workspace-core/src/aux-commands.test.ts @@ -318,7 +318,6 @@ describe('move project', () => { expect(workspaceJson.projects[`${lib1}-data-access`]).toBeUndefined(); const project = readProjectConfig(newName); expect(project).toBeTruthy(); - expect(project.root).toBe(newPath); expect(project.sourceRoot).toBe(`${newPath}/src`); expect(project.targets.lint.options.lintFilePatterns).toEqual([ `libs/shared/${lib1}/data-access/**/*.ts`, @@ -445,7 +444,6 @@ describe('move project', () => { expect(workspaceJson.projects[`${lib1}-data-access`]).toBeUndefined(); const project = readProjectConfig(newName); expect(project).toBeTruthy(); - expect(project.root).toBe(newPath); expect(project.sourceRoot).toBe(`${newPath}/src`); expect(project.tags).toEqual([]); const lib3Config = readProjectConfig(lib3); @@ -578,7 +576,6 @@ describe('move project', () => { expect(workspaceJson.projects[`${lib1}-data-access`]).toBeUndefined(); const project = readProjectConfig(newName); expect(project).toBeTruthy(); - expect(project.root).toBe(newPath); expect(project.sourceRoot).toBe(`${newPath}/src`); expect(project.targets.lint.options.lintFilePatterns).toEqual([ `packages/shared/${lib1}/data-access/**/*.ts`, diff --git a/packages/angular/src/generators/application/lib/update-config-files.ts b/packages/angular/src/generators/application/lib/update-config-files.ts index 24f06fd69442e..4088d8c307ffe 100644 --- a/packages/angular/src/generators/application/lib/update-config-files.ts +++ b/packages/angular/src/generators/application/lib/update-config-files.ts @@ -46,6 +46,9 @@ function updateAppAndE2EProjectConfigurations( options.ngCliSchematicAppRoot, options.appProjectRoot ); + // project already has the right root, but the above function, makes it incorrect. + // This corrects it. + project.root = options.appProjectRoot; } delete project.targets.test; diff --git a/packages/angular/src/generators/library/lib/update-project.ts b/packages/angular/src/generators/library/lib/update-project.ts index 7c87131943bc6..6afd7bb9cea34 100644 --- a/packages/angular/src/generators/library/lib/update-project.ts +++ b/packages/angular/src/generators/library/lib/update-project.ts @@ -138,6 +138,9 @@ function fixProjectWorkspaceConfig(host: Tree, options: NormalizedSchema) { options.ngCliSchematicLibRoot, options.projectRoot ); + // project already has the right root, but the above function, makes it incorrect. + // This corrects it. + project.root = options.projectRoot; } if (!options.publishable && !options.buildable) { diff --git a/packages/devkit/index.ts b/packages/devkit/index.ts index 3c0cf827bf120..ae9185e8c40c8 100644 --- a/packages/devkit/index.ts +++ b/packages/devkit/index.ts @@ -12,7 +12,7 @@ /** * @category Tree */ -export type { Tree, FileChange } from 'nx/src/config/tree'; +export type { Tree, FileChange } from 'nx/src/generators/tree'; /** * @category Workspace @@ -113,7 +113,7 @@ export { generateFiles } from './src/generators/generate-files'; /** * @category Generators */ -export type { WorkspaceConfiguration } from './src/generators/project-configuration'; +export type { WorkspaceConfiguration } from 'nx/src/generators/utils/project-configuration'; /** * @category Generators @@ -127,7 +127,7 @@ export { updateWorkspaceConfiguration, getProjects, isStandaloneProject, -} from './src/generators/project-configuration'; +} from 'nx/src/generators/utils/project-configuration'; /** * @category Generators @@ -185,7 +185,7 @@ export { ProjectGraphBuilder } from 'nx/src/project-graph/project-graph-builder' /** * @category Utils */ -export { readJson, writeJson, updateJson } from './src/utils/json'; +export { readJson, writeJson, updateJson } from 'nx/src/generators/utils/json'; /** * @category Utils diff --git a/packages/devkit/src/generators/format-files.ts b/packages/devkit/src/generators/format-files.ts index f5f3386fcd2f6..b4dda3e5a5f2f 100644 --- a/packages/devkit/src/generators/format-files.ts +++ b/packages/devkit/src/generators/format-files.ts @@ -1,14 +1,14 @@ -import type { Tree } from 'nx/src/config/tree'; +import type { Tree } from 'nx/src/generators/tree'; import * as path from 'path'; import type * as Prettier from 'prettier'; -import { getWorkspacePath } from '../utils/get-workspace-layout'; -import { readJson, updateJson, writeJson } from '../utils/json'; -import { sortObjectByKeys } from 'nx/src/utils/object-sort'; +import { readJson, updateJson, writeJson } from 'nx/src/generators/utils/json'; import { + getWorkspacePath, readWorkspaceConfiguration, updateWorkspaceConfiguration, WorkspaceConfiguration, -} from './project-configuration'; +} from 'nx/src/generators/utils/project-configuration'; +import { sortObjectByKeys } from 'nx/src/utils/object-sort'; /** * Formats all the created or updated files using Prettier diff --git a/packages/devkit/src/generators/generate-files.spec.ts b/packages/devkit/src/generators/generate-files.spec.ts index cbcc85ad35267..02cd4f0bb5182 100644 --- a/packages/devkit/src/generators/generate-files.spec.ts +++ b/packages/devkit/src/generators/generate-files.spec.ts @@ -1,5 +1,5 @@ -import type { Tree } from 'nx/src/config/tree'; -import { createTree } from '../tests/create-tree'; +import type { Tree } from 'nx/src/generators/tree'; +import { createTree } from 'nx/src/generators/testing-utils/create-tree'; import { generateFiles } from './generate-files'; import { join } from 'path'; import * as FileType from 'file-type'; diff --git a/packages/devkit/src/generators/generate-files.ts b/packages/devkit/src/generators/generate-files.ts index 1f42858c3c2eb..5aed85b770847 100644 --- a/packages/devkit/src/generators/generate-files.ts +++ b/packages/devkit/src/generators/generate-files.ts @@ -1,6 +1,6 @@ import { readFileSync, readdirSync, statSync } from 'fs'; import * as path from 'path'; -import type { Tree } from 'nx/src/config/tree'; +import type { Tree } from 'nx/src/generators/tree'; import { logger } from 'nx/src/utils/logger'; const binaryExts = new Set([ diff --git a/packages/devkit/src/generators/to-js.ts b/packages/devkit/src/generators/to-js.ts index 082f95d219207..709adc79ef586 100644 --- a/packages/devkit/src/generators/to-js.ts +++ b/packages/devkit/src/generators/to-js.ts @@ -1,4 +1,4 @@ -import type { Tree } from 'nx/src/config/tree'; +import type { Tree } from 'nx/src/generators/tree'; /** * Rename and transpile any new typescript files created to javascript files diff --git a/packages/devkit/src/generators/update-ts-configs-to-js.ts b/packages/devkit/src/generators/update-ts-configs-to-js.ts index 7b9e9a8882f03..c329329f8f695 100644 --- a/packages/devkit/src/generators/update-ts-configs-to-js.ts +++ b/packages/devkit/src/generators/update-ts-configs-to-js.ts @@ -1,5 +1,5 @@ -import type { Tree } from 'nx/src/config/tree'; -import { updateJson } from '../utils/json'; +import type { Tree } from 'nx/src/generators/tree'; +import { updateJson } from 'nx/src/generators/utils/json'; export function updateTsConfigsToJs( tree: Tree, diff --git a/packages/devkit/src/generators/visit-not-ignored-files.spec.ts b/packages/devkit/src/generators/visit-not-ignored-files.spec.ts index ec5a6e0b28da3..8c9f85310c5fd 100644 --- a/packages/devkit/src/generators/visit-not-ignored-files.spec.ts +++ b/packages/devkit/src/generators/visit-not-ignored-files.spec.ts @@ -1,5 +1,5 @@ -import { createTree } from '../tests/create-tree'; -import type { Tree } from 'nx/src/config/tree'; +import { createTree } from 'nx/src/generators/testing-utils/create-tree'; +import type { Tree } from 'nx/src/generators/tree'; import { visitNotIgnoredFiles } from './visit-not-ignored-files'; describe('visitNotIgnoredFiles', () => { diff --git a/packages/devkit/src/generators/visit-not-ignored-files.ts b/packages/devkit/src/generators/visit-not-ignored-files.ts index ccc8fc6e10976..b4571da88c654 100644 --- a/packages/devkit/src/generators/visit-not-ignored-files.ts +++ b/packages/devkit/src/generators/visit-not-ignored-files.ts @@ -1,4 +1,4 @@ -import type { Tree } from 'nx/src/config/tree'; +import type { Tree } from 'nx/src/generators/tree'; import ignore, { Ignore } from 'ignore'; import { join, relative, sep } from 'path'; diff --git a/packages/devkit/src/tasks/install-packages-task.ts b/packages/devkit/src/tasks/install-packages-task.ts index a3a55eb2d3f82..54979b7d98112 100644 --- a/packages/devkit/src/tasks/install-packages-task.ts +++ b/packages/devkit/src/tasks/install-packages-task.ts @@ -1,4 +1,4 @@ -import type { Tree } from 'nx/src/config/tree'; +import type { Tree } from 'nx/src/generators/tree'; import { execSync } from 'child_process'; import { join } from 'path'; import { diff --git a/packages/devkit/src/utils/get-workspace-layout.ts b/packages/devkit/src/utils/get-workspace-layout.ts index b21faa8bab654..2e6c9035e4709 100644 --- a/packages/devkit/src/utils/get-workspace-layout.ts +++ b/packages/devkit/src/utils/get-workspace-layout.ts @@ -1,9 +1,11 @@ -import { RawWorkspaceJsonConfiguration } from 'nx/src/config/workspace-json-project-json'; +import { + getWorkspacePath, + readNxJson, + shouldDefaultToUsingStandaloneConfigs, +} from 'nx/src/generators/utils/project-configuration'; +import type { Tree } from 'nx/src/generators/tree'; -import { readNxJson } from '../generators/project-configuration'; -import { readJson } from './json'; - -import type { Tree } from 'nx/src/config/tree'; +export { getWorkspacePath } from 'nx/src/generators/utils/project-configuration'; /** * Returns workspace defaults. It includes defaults folders for apps and libs, @@ -23,37 +25,10 @@ export function getWorkspaceLayout(tree: Tree): { npmScope: string; } { const nxJson = readNxJson(tree); - const workspacePath = getWorkspacePath(tree); - const rawWorkspace = - workspacePath && tree.exists(workspacePath) - ? readJson(tree, workspacePath) - : null; - return { appsDir: nxJson?.workspaceLayout?.appsDir ?? 'apps', libsDir: nxJson?.workspaceLayout?.libsDir ?? 'libs', npmScope: nxJson?.npmScope ?? '', - standaloneAsDefault: !rawWorkspace - ? true // if workspace.json doesn't exist, all projects **must** be standalone - : Object.values(rawWorkspace.projects).reduce( - // default for second, third... projects should be based on all projects being defined as a path - // for configuration read from ng schematics, this is determined by configFilePath's presence - (allStandalone, next) => - allStandalone && - (typeof next === 'string' || 'configFilePath' in next), - - // default for first project should be true if using Nx Schema - rawWorkspace.version > 1 - ), + standaloneAsDefault: shouldDefaultToUsingStandaloneConfigs(tree), }; } - -export function getWorkspacePath( - tree: Tree -): '/angular.json' | '/workspace.json' | null { - const possibleFiles: ('/angular.json' | '/workspace.json')[] = [ - '/angular.json', - '/workspace.json', - ]; - return possibleFiles.filter((path) => tree.exists(path))[0]; -} diff --git a/packages/devkit/src/utils/invoke-nx-generator.ts b/packages/devkit/src/utils/invoke-nx-generator.ts index fe30553ac80c8..cc7e0552db40f 100644 --- a/packages/devkit/src/utils/invoke-nx-generator.ts +++ b/packages/devkit/src/utils/invoke-nx-generator.ts @@ -1,9 +1,13 @@ import { logger, stripIndent } from 'nx/src/utils/logger'; -import type { FileChange, Tree, TreeWriteOptions } from 'nx/src/config/tree'; +import type { + FileChange, + Tree, + TreeWriteOptions, +} from 'nx/src/generators/tree'; import { toNewFormat, toOldFormatOrNull } from 'nx/src/config/workspaces'; import { Generator, GeneratorCallback } from 'nx/src/config/misc-interfaces'; import { parseJson, serializeJson } from 'nx/src/utils/json'; -import { join, relative } from 'path'; +import { join, relative, dirname } from 'path'; class RunCallbackTask { constructor(private callback: GeneratorCallback) {} @@ -192,9 +196,10 @@ class DevkitTreeFromAngularDevkitTree implements Tree { const w = parseJson(content.toString()); for (const [project, configuration] of Object.entries(w.projects)) { if (typeof configuration === 'string') { - w.projects[project] = parseJson( - this.tree.read(`${configuration}/project.json`) - ); + w.projects[project] = { + root: configuration, + ...parseJson(this.tree.read(`${configuration}/project.json`)), + }; w.projects[project].configFilePath = `${configuration}/project.json`; } } diff --git a/packages/devkit/src/utils/move-dir.ts b/packages/devkit/src/utils/move-dir.ts index 4464dd5d93786..87f0230d783f5 100644 --- a/packages/devkit/src/utils/move-dir.ts +++ b/packages/devkit/src/utils/move-dir.ts @@ -1,4 +1,4 @@ -import { Tree } from 'nx/src/config/tree'; +import { Tree } from 'nx/src/generators/tree'; import { relative } from 'path'; import { visitNotIgnoredFiles } from '../generators/visit-not-ignored-files'; import { normalizePath } from 'nx/src/utils/path'; diff --git a/packages/devkit/src/utils/package-json.spec.ts b/packages/devkit/src/utils/package-json.spec.ts index e9d99e2d36dd5..530f5ed061840 100644 --- a/packages/devkit/src/utils/package-json.spec.ts +++ b/packages/devkit/src/utils/package-json.spec.ts @@ -1,7 +1,7 @@ -import type { Tree } from 'nx/src/config/tree'; -import { readJson, writeJson } from './json'; +import type { Tree } from 'nx/src/generators/tree'; +import { readJson, writeJson } from 'nx/src/generators/utils/json'; import { addDependenciesToPackageJson } from './package-json'; -import { createTree } from '../tests/create-tree'; +import { createTree } from 'nx/src/generators/testing-utils/create-tree'; describe('addDependenciesToPackageJson', () => { let tree: Tree; diff --git a/packages/devkit/src/utils/package-json.ts b/packages/devkit/src/utils/package-json.ts index abe65a873a899..811659a710770 100644 --- a/packages/devkit/src/utils/package-json.ts +++ b/packages/devkit/src/utils/package-json.ts @@ -1,6 +1,6 @@ -import { readJson, updateJson } from './json'; +import { readJson, updateJson } from 'nx/src/generators/utils/json'; import { installPackagesTask } from '../tasks/install-packages-task'; -import type { Tree } from 'nx/src/config/tree'; +import type { Tree } from 'nx/src/generators/tree'; import { GeneratorCallback } from 'nx/src/config/misc-interfaces'; /** diff --git a/packages/devkit/testing.ts b/packages/devkit/testing.ts index f36d1c0d310e6..d251796447b5b 100644 --- a/packages/devkit/testing.ts +++ b/packages/devkit/testing.ts @@ -1,2 +1,2 @@ -export { createTreeWithEmptyWorkspace } from './src/tests/create-tree-with-empty-workspace'; -export { createTree } from './src/tests/create-tree'; +export { createTreeWithEmptyWorkspace } from 'nx/src/generators/testing-utils/create-tree-with-empty-workspace'; +export { createTree } from 'nx/src/generators/testing-utils/create-tree'; diff --git a/packages/jest/src/migrations/update-12-6-0/update-base-jest-config.spec.ts b/packages/jest/src/migrations/update-12-6-0/update-base-jest-config.spec.ts index 223f5e6562949..11ad9b17747ec 100644 --- a/packages/jest/src/migrations/update-12-6-0/update-base-jest-config.spec.ts +++ b/packages/jest/src/migrations/update-12-6-0/update-base-jest-config.spec.ts @@ -7,7 +7,7 @@ const mockResolveConfig = jest.fn(() => ); import { Tree } from '@nrwl/devkit'; -import { createTreeWithEmptyWorkspace } from 'packages/devkit/src/tests/create-tree-with-empty-workspace'; +import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing'; import update from './update-base-jest-config'; describe('update 12.6.0', () => { diff --git a/packages/nx/migrations.json b/packages/nx/migrations.json index f8258ada459bb..26a2fc578a6a7 100644 --- a/packages/nx/migrations.json +++ b/packages/nx/migrations.json @@ -1,3 +1,10 @@ { - "migrations": {} + "generators": { + "14-0-4-remove-root": { + "cli": "nx", + "version": "14.0.4", + "description": "Remove root property from project.json files", + "factory": "./src/migrations/update-14-0-4/remove-roots" + } + } } diff --git a/packages/nx/migrations.spec.ts b/packages/nx/migrations.spec.ts new file mode 100644 index 0000000000000..8a0daaa421175 --- /dev/null +++ b/packages/nx/migrations.spec.ts @@ -0,0 +1,12 @@ +import path = require('path'); +import json = require('./migrations.json'); + +describe('Node migrations', () => { + it('should have valid paths', () => { + Object.values(json.generators).forEach((m) => { + expect(() => + require.resolve(path.join(__dirname, `${m.factory}.ts`)) + ).not.toThrow(); + }); + }); +}); diff --git a/packages/nx/src/adapter/ngcli-adapter.ts b/packages/nx/src/adapter/ngcli-adapter.ts index 6d50540d208a8..89ae9fa44f156 100644 --- a/packages/nx/src/adapter/ngcli-adapter.ts +++ b/packages/nx/src/adapter/ngcli-adapter.ts @@ -15,7 +15,7 @@ import { createConsoleLogger, NodeJsSyncHost } from '@angular-devkit/core/node'; import { Stats } from 'fs'; import { detectPackageManager } from '../utils/package-manager'; import { GenerateOptions } from '../command-line/generate'; -import { FileChange, Tree } from '../config/tree'; +import { FileChange, Tree } from '../generators/tree'; import { buildWorkspaceConfigurationFromGlobs, globForProjectFiles, @@ -497,6 +497,7 @@ export class NxScopedHost extends virtualFs.ScopedHost { // project was read from a project.json file const configPath = projectConfig.configFilePath; const fileConfigObject = { ...projectConfig }; + delete fileConfigObject.root; // remove the root before writing delete fileConfigObject.configFilePath; // remove the configFilePath before writing const projectJsonWrite = super.write( configPath, @@ -539,6 +540,7 @@ export class NxScopedHost extends virtualFs.ScopedHost { map((x) => ({ project, projectConfig: { + root: dirname(configFilePath), ...parseJson(Buffer.from(x).toString()), configFilePath, }, @@ -600,9 +602,10 @@ export class NxScopeHostUsedForWrappedSchematics extends NxScopedHost { const nxJsonInTree = nxJsonChange ? parseJson(nxJsonChange.content.toString()) : parseJson(this.host.read('nx.json').toString()); - const readJsonWithHost = (file) => - parseJson(this.host.read(file).toString()); - + const readJsonWithHost = (file) => ({ + root: dirname(file), + ...parseJson(this.host.read(file).toString()), + }); const staticProjects = buildWorkspaceConfigurationFromGlobs( nxJsonInTree, globForProjectFiles(this.host.root).filter( @@ -1214,6 +1217,7 @@ function saveWorkspaceConfigurationInWrappedSchematic( ) { const path = config.configFilePath || join(config.root, 'project.json'); workspace.projects[project] = normalize(dirname(path)); + delete config.root; // remove the root before writing delete config.configFilePath; host.write(path, serializeJson(config)); } diff --git a/packages/nx/src/command-line/generate.ts b/packages/nx/src/command-line/generate.ts index f35dd883baa45..eb78956b1e520 100644 --- a/packages/nx/src/command-line/generate.ts +++ b/packages/nx/src/command-line/generate.ts @@ -5,7 +5,7 @@ import { Schema, } from '../utils/params'; import { Workspaces } from '../config/workspaces'; -import { FileChange, flushChanges, FsTree } from '../config/tree'; +import { FileChange, flushChanges, FsTree } from '../generators/tree'; import { logger } from '../utils/logger'; import * as chalk from 'chalk'; import { workspaceRoot } from '../utils/app-root'; diff --git a/packages/nx/src/command-line/migrate.ts b/packages/nx/src/command-line/migrate.ts index 7f84e83e307c1..eed5a33605238 100644 --- a/packages/nx/src/command-line/migrate.ts +++ b/packages/nx/src/command-line/migrate.ts @@ -8,7 +8,7 @@ import { PackageJsonUpdateForPackage, } from '../config/misc-interfaces'; import { NxJsonConfiguration } from '../config/nx-json'; -import { flushChanges, FsTree } from '../config/tree'; +import { flushChanges, FsTree } from '../generators/tree'; import { extractFileFromTarball, JsonReadOptions, diff --git a/packages/nx/src/config/workspaces.ts b/packages/nx/src/config/workspaces.ts index 6b70d77c3343e..58d87677c7034 100644 --- a/packages/nx/src/config/workspaces.ts +++ b/packages/nx/src/config/workspaces.ts @@ -25,6 +25,7 @@ import { CustomHasher, } from './misc-interfaces'; import { PackageJson } from '../utils/package-json'; +import { sortObjectByKeys } from 'nx/src/utils/object-sort'; export function workspaceConfigName(root: string) { if (existsSync(path.join(root, 'angular.json'))) { @@ -316,7 +317,13 @@ function findFullGeneratorName( } export function reformattedWorkspaceJsonOrNull(w: any) { - return w.version === 2 ? toNewFormatOrNull(w) : toOldFormatOrNull(w); + const workspaceJson = + w.version === 2 ? toNewFormatOrNull(w) : toOldFormatOrNull(w); + if (workspaceJson?.projects) { + workspaceJson.projects = sortObjectByKeys(workspaceJson.projects); + } + + return workspaceJson; } export function toNewFormat(w: any): WorkspaceJsonConfiguration { @@ -411,7 +418,10 @@ function inlineProjectConfigurations(w: any, root: string = workspaceRoot) { if (typeof config === 'string') { const configFilePath = path.join(root, config, 'project.json'); const fileConfig = readJsonFile(configFilePath); - w.projects[project] = fileConfig; + w.projects[project] = { + root: config, + ...fileConfig, + }; } } ); @@ -642,6 +652,9 @@ export function buildWorkspaceConfigurationFromGlobs( // directory as a package.json should overwrite the inferred package.json // project configuration. const configuration = readJson(file); + + configuration.root = directory; + let name = configuration.name; if (!configuration.name) { name = toProjectName(file, nxJson); diff --git a/packages/nx/src/generators/internal-utils/format-changed-files-with-prettier-if-available.ts b/packages/nx/src/generators/internal-utils/format-changed-files-with-prettier-if-available.ts new file mode 100644 index 0000000000000..965d3a59ff60b --- /dev/null +++ b/packages/nx/src/generators/internal-utils/format-changed-files-with-prettier-if-available.ts @@ -0,0 +1,55 @@ +import type { Tree } from '../tree'; +import * as path from 'path'; +import type * as Prettier from 'prettier'; + +/** + * Formats all the created or updated files using Prettier + * @param tree - the file system tree + */ +export async function formatChangedFilesWithPrettierIfAvailable( + tree: Tree +): Promise { + let prettier: typeof Prettier; + try { + prettier = await import('prettier'); + } catch {} + + if (!prettier) return; + + const files = new Set( + tree.listChanges().filter((file) => file.type !== 'DELETE') + ); + await Promise.all( + Array.from(files).map(async (file) => { + const systemPath = path.join(tree.root, file.path); + let options: any = { + filepath: systemPath, + }; + + const resolvedOptions = await prettier.resolveConfig(systemPath, { + editorconfig: true, + }); + if (!resolvedOptions) { + return; + } + options = { + ...options, + ...resolvedOptions, + }; + + const support = await prettier.getFileInfo(systemPath, options); + if (support.ignored || !support.inferredParser) { + return; + } + + try { + tree.write( + file.path, + prettier.format(file.content.toString('utf-8'), options) + ); + } catch (e) { + console.warn(`Could not format ${file.path}. Error: "${e.message}"`); + } + }) + ); +} diff --git a/packages/devkit/src/tests/create-tree-with-empty-workspace.ts b/packages/nx/src/generators/testing-utils/create-tree-with-empty-workspace.ts similarity index 90% rename from packages/devkit/src/tests/create-tree-with-empty-workspace.ts rename to packages/nx/src/generators/testing-utils/create-tree-with-empty-workspace.ts index c9dbd6962a9b3..464bc3685b927 100644 --- a/packages/devkit/src/tests/create-tree-with-empty-workspace.ts +++ b/packages/nx/src/generators/testing-utils/create-tree-with-empty-workspace.ts @@ -1,5 +1,5 @@ -import { FsTree } from 'nx/src/config/tree'; -import type { Tree } from 'nx/src/config/tree'; +import { FsTree } from 'nx/src/generators/tree'; +import type { Tree } from 'nx/src/generators/tree'; /** * Creates a host for testing. diff --git a/packages/devkit/src/tests/create-tree.ts b/packages/nx/src/generators/testing-utils/create-tree.ts similarity index 54% rename from packages/devkit/src/tests/create-tree.ts rename to packages/nx/src/generators/testing-utils/create-tree.ts index c467cf0ab854b..9a9d094e5876d 100644 --- a/packages/devkit/src/tests/create-tree.ts +++ b/packages/nx/src/generators/testing-utils/create-tree.ts @@ -1,5 +1,5 @@ -import { FsTree } from 'nx/src/config/tree'; -import type { Tree } from 'nx/src/config/tree'; +import { FsTree } from 'nx/src/generators/tree'; +import type { Tree } from 'nx/src/generators/tree'; /** * Creates a host for testing. diff --git a/packages/nx/src/config/tree.spec.ts b/packages/nx/src/generators/tree.spec.ts similarity index 100% rename from packages/nx/src/config/tree.spec.ts rename to packages/nx/src/generators/tree.spec.ts diff --git a/packages/nx/src/config/tree.ts b/packages/nx/src/generators/tree.ts similarity index 100% rename from packages/nx/src/config/tree.ts rename to packages/nx/src/generators/tree.ts diff --git a/packages/devkit/src/utils/json.ts b/packages/nx/src/generators/utils/json.ts similarity index 89% rename from packages/devkit/src/utils/json.ts rename to packages/nx/src/generators/utils/json.ts index 7e62a82e7d465..223a620278fe4 100644 --- a/packages/devkit/src/utils/json.ts +++ b/packages/nx/src/generators/utils/json.ts @@ -1,6 +1,6 @@ -import type { Tree } from 'nx/src/config/tree'; -import { parseJson, serializeJson } from 'nx/src/utils/json'; -import type { JsonParseOptions, JsonSerializeOptions } from 'nx/src/utils/json'; +import type { Tree } from '../tree'; +import { parseJson, serializeJson } from '../../utils/json'; +import type { JsonParseOptions, JsonSerializeOptions } from '../../utils/json'; /** * Reads a json file, removes all comments and parses JSON. diff --git a/packages/devkit/src/generators/project-configuration.spec.ts b/packages/nx/src/generators/utils/project-configuration.spec.ts similarity index 98% rename from packages/devkit/src/generators/project-configuration.spec.ts rename to packages/nx/src/generators/utils/project-configuration.spec.ts index fe5b1686eb826..378837a4ff246 100644 --- a/packages/devkit/src/generators/project-configuration.spec.ts +++ b/packages/nx/src/generators/utils/project-configuration.spec.ts @@ -1,11 +1,12 @@ -import { Tree } from 'nx/src/config/tree'; -import { ProjectConfiguration } from 'nx/src/config/workspace-json-project-json'; +import { Tree } from '../tree'; +import { ProjectConfiguration } from '../../config/workspace-json-project-json'; -import { createTreeWithEmptyWorkspace } from '../tests/create-tree-with-empty-workspace'; +import { createTreeWithEmptyWorkspace } from '../testing-utils/create-tree-with-empty-workspace'; import { readJson, updateJson } from '../utils/json'; import { addProjectConfiguration, getProjects, + getWorkspacePath, readProjectConfiguration, readWorkspaceConfiguration, removeProjectConfiguration, @@ -13,7 +14,6 @@ import { updateWorkspaceConfiguration, WorkspaceConfiguration, } from './project-configuration'; -import { getWorkspacePath } from '../utils/get-workspace-layout'; type ProjectConfigurationV1 = Pick< ProjectConfiguration, @@ -301,6 +301,7 @@ describe('project configuration', () => { addProjectConfiguration(tree, 'test', baseTestProjectConfigV2, true); const expectedProjectConfig = { ...baseTestProjectConfigV2, + root: undefined, targets: { build: { executor: '' } }, }; updateProjectConfiguration(tree, 'test', expectedProjectConfig); @@ -471,6 +472,7 @@ describe('project configuration', () => { addProjectConfiguration(tree, 'test', baseTestProjectConfigV2, true); const expectedProjectConfig = { ...baseTestProjectConfigV2, + root: undefined, targets: { build: { executor: '' } }, }; updateProjectConfiguration(tree, 'test', expectedProjectConfig); diff --git a/packages/devkit/src/generators/project-configuration.ts b/packages/nx/src/generators/utils/project-configuration.ts similarity index 89% rename from packages/devkit/src/generators/project-configuration.ts rename to packages/nx/src/generators/utils/project-configuration.ts index 19bcbafa9a306..3ed3b6d8062e5 100644 --- a/packages/devkit/src/generators/project-configuration.ts +++ b/packages/nx/src/generators/utils/project-configuration.ts @@ -4,23 +4,19 @@ import { globForProjectFiles, reformattedWorkspaceJsonOrNull, toNewFormat, -} from 'nx/src/config/workspaces'; +} from '../../config/workspaces'; import { basename, dirname, relative } from 'path'; -import { - getWorkspaceLayout, - getWorkspacePath, -} from '../utils/get-workspace-layout'; -import { readJson, updateJson, writeJson } from '../utils/json'; - -import type { Tree } from 'nx/src/config/tree'; -import type { NxJsonConfiguration } from 'nx/src/config/nx-json'; -import { joinPathFragments } from 'nx/src/utils/path'; +import { readJson, updateJson, writeJson } from './json'; + +import type { Tree } from '../tree'; +import type { NxJsonConfiguration } from '../../config/nx-json'; +import { joinPathFragments } from '../../utils/path'; import { ProjectConfiguration, RawWorkspaceJsonConfiguration, WorkspaceJsonConfiguration, -} from 'nx/src/config/workspace-json-project-json'; +} from '../../config/workspace-json-project-json'; export type WorkspaceConfiguration = Omit< WorkspaceJsonConfiguration, @@ -45,8 +41,7 @@ export function addProjectConfiguration( projectConfiguration: ProjectConfiguration, standalone?: boolean ): void { - const workspaceLayout = getWorkspaceLayout(tree); - standalone = standalone ?? workspaceLayout.standaloneAsDefault; + standalone = standalone ?? shouldDefaultToUsingStandaloneConfigs(tree); setProjectConfiguration( tree, projectName, @@ -358,7 +353,7 @@ function addProjectToWorkspaceJson( workspaceJson.projects[projectName] = project.root; } // update the project.json file - writeJson(tree, configFile, project); + writeJson(tree, configFile, { ...project, root: undefined }); } } else if (mode === 'delete') { delete workspaceJson.projects[projectName]; @@ -399,10 +394,10 @@ function inlineProjectConfigurationsWithTree( Object.entries(workspaceJson.projects || {}).forEach(([project, config]) => { if (typeof config === 'string') { const configFileLocation = joinPathFragments(config, 'project.json'); - workspaceJson.projects[project] = readJson( - tree, - configFileLocation - ); + workspaceJson.projects[project] = { + root: config, + ...readJson(tree, configFileLocation), + }; } }); return workspaceJson as WorkspaceJsonConfiguration; @@ -550,3 +545,33 @@ function validateProjectConfigurationOperationsWithoutWorkspaceJson( ); } } + +export function shouldDefaultToUsingStandaloneConfigs(tree: Tree): boolean { + const workspacePath = getWorkspacePath(tree); + const rawWorkspace = + workspacePath && tree.exists(workspacePath) + ? readJson(tree, workspacePath) + : null; + return !rawWorkspace + ? true // if workspace.json doesn't exist, all projects **must** be standalone + : Object.values(rawWorkspace.projects).reduce( + // default for second, third... projects should be based on all projects being defined as a path + // for configuration read from ng schematics, this is determined by configFilePath's presence + (allStandalone, next) => + allStandalone && + (typeof next === 'string' || 'configFilePath' in next), + + // default for first project should be true if using Nx Schema + rawWorkspace.version > 1 + ); +} + +export function getWorkspacePath( + tree: Tree +): '/angular.json' | '/workspace.json' | null { + const possibleFiles: ('/angular.json' | '/workspace.json')[] = [ + '/angular.json', + '/workspace.json', + ]; + return possibleFiles.filter((path) => tree.exists(path))[0]; +} diff --git a/packages/nx/src/migrations/update-14-0-4/remove-roots.spec.ts b/packages/nx/src/migrations/update-14-0-4/remove-roots.spec.ts new file mode 100644 index 0000000000000..b06468af31689 --- /dev/null +++ b/packages/nx/src/migrations/update-14-0-4/remove-roots.spec.ts @@ -0,0 +1,48 @@ +import { Tree } from '../../generators/tree'; +import { createTreeWithEmptyWorkspace } from '../../generators/testing-utils/create-tree-with-empty-workspace'; +import { addProjectConfiguration } from '../../generators/utils/project-configuration'; +import { readJson, updateJson } from '../../generators/utils/json'; +import removeRoots from './remove-roots'; + +describe('remove-roots >', () => { + let tree: Tree; + + describe('projects with project.json configs', () => { + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(2); + }); + + it('should remove the root property', async () => { + addProjectConfiguration(tree, 'proj1', { + root: 'proj1', + }); + + updateJson(tree, 'proj1/project.json', (config) => ({ + ...config, + root: 'proj1', + })); + + await removeRoots(tree); + + expect(readJson(tree, 'proj1/project.json').root).toBeUndefined(); + }); + }); + + describe('projects with project.json configs', () => { + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(1); + }); + + it('should remove the root property', async () => { + addProjectConfiguration(tree, 'proj1', { + root: 'proj1', + }); + + await removeRoots(tree); + + expect(readJson(tree, 'workspace.json').projects.proj1.root).toEqual( + 'proj1' + ); + }); + }); +}); diff --git a/packages/nx/src/migrations/update-14-0-4/remove-roots.ts b/packages/nx/src/migrations/update-14-0-4/remove-roots.ts new file mode 100644 index 0000000000000..279a9cd1dbf4a --- /dev/null +++ b/packages/nx/src/migrations/update-14-0-4/remove-roots.ts @@ -0,0 +1,15 @@ +import { Tree } from '../../generators/tree'; +import { + getProjects, + updateProjectConfiguration, +} from '../../generators/utils/project-configuration'; +import { formatChangedFilesWithPrettierIfAvailable } from '../../generators/internal-utils/format-changed-files-with-prettier-if-available'; + +export default async function (tree: Tree) { + // This looks like it does nothing, but this will actually effectively migrate over all the configs that need to be moved over, but won't touch configs that don't need to be moved + for (const [projName, projConfig] of getProjects(tree)) { + updateProjectConfiguration(tree, projName, projConfig); + } + + await formatChangedFilesWithPrettierIfAvailable(tree); +} diff --git a/packages/storybook/src/migrations/update-13-4-6/__snapshots__/set-project-build-config.spec.ts.snap b/packages/storybook/src/migrations/update-13-4-6/__snapshots__/set-project-build-config.spec.ts.snap index e25d901fa41dd..7e8041203206d 100644 --- a/packages/storybook/src/migrations/update-13-4-6/__snapshots__/set-project-build-config.spec.ts.snap +++ b/packages/storybook/src/migrations/update-13-4-6/__snapshots__/set-project-build-config.spec.ts.snap @@ -4,24 +4,20 @@ exports[`Set the projectBuildConfig option in the Storybook configuration for An Object { "projects": Object { "main-app": Object { - "prefix": "katst", - "projectType": "application", - "root": "apps/main-app", - "sourceRoot": "apps/main-app/src", - "targets": Object { + "architect": Object { "build": Object { - "executor": "@angular-devkit/build-angular:browser", + "builder": "@angular-devkit/build-angular:browser", "outputs": Array [ "{options.outputPath}", ], }, "build-storybook": Object { + "builder": "@nrwl/storybook:build", "configurations": Object { "ci": Object { "quiet": true, }, }, - "executor": "@nrwl/storybook:build", "options": Object { "config": Object { "configFolder": "apps/main-app/.storybook", @@ -35,12 +31,12 @@ Object { ], }, "storybook": Object { + "builder": "@nrwl/storybook:storybook", "configurations": Object { "ci": Object { "quiet": true, }, }, - "executor": "@nrwl/storybook:storybook", "options": Object { "config": Object { "configFolder": "apps/main-app/.storybook", @@ -51,19 +47,20 @@ Object { }, }, }, + "prefix": "katst", + "projectType": "application", + "root": "apps/main-app", + "sourceRoot": "apps/main-app/src", }, "ui-one": Object { - "projectType": "library", - "root": "libs/ui/one", - "sourceRoot": "libs/ui/one/src", - "targets": Object { + "architect": Object { "build-storybook": Object { + "builder": "@nrwl/storybook:build", "configurations": Object { "ci": Object { "quiet": true, }, }, - "executor": "@nrwl/storybook:build", "options": Object { "config": Object { "configFolder": "libs/ui/one/.storybook", @@ -77,7 +74,7 @@ Object { ], }, "storybook": Object { - "executor": "@nrwl/storybook:storybook", + "builder": "@nrwl/storybook:storybook", "options": Object { "config": Object { "configFolder": "libs/ui/one/.storybook", @@ -88,19 +85,19 @@ Object { }, }, }, + "projectType": "library", + "root": "libs/ui/one", + "sourceRoot": "libs/ui/one/src", }, "ui-three": Object { - "projectType": "library", - "root": "libs/ui/three", - "sourceRoot": "libs/ui/three/src", - "targets": Object { + "architect": Object { "build-storybook": Object { + "builder": "@nrwl/storybook:build", "configurations": Object { "ci": Object { "quiet": true, }, }, - "executor": "@nrwl/storybook:build", "options": Object { "config": Object { "configFolder": "libs/ui/three/.storybook", @@ -114,7 +111,7 @@ Object { ], }, "storybook": Object { - "executor": "@nrwl/storybook:storybook", + "builder": "@nrwl/storybook:storybook", "options": Object { "config": Object { "configFolder": "libs/ui/three/.storybook", @@ -125,19 +122,19 @@ Object { }, }, }, + "projectType": "library", + "root": "libs/ui/three", + "sourceRoot": "libs/ui/three/src", }, "ui-two": Object { - "projectType": "library", - "root": "libs/ui/two", - "sourceRoot": "libs/ui/two/src", - "targets": Object { + "architect": Object { "build-storybook": Object { + "builder": "@nrwl/storybook:build", "configurations": Object { "ci": Object { "quiet": true, }, }, - "executor": "@nrwl/storybook:build", "options": Object { "config": Object { "configFolder": "libs/ui/two/.storybook", @@ -151,7 +148,7 @@ Object { ], }, "storybook": Object { - "executor": "@nrwl/storybook:storybook", + "builder": "@nrwl/storybook:storybook", "options": Object { "config": Object { "configFolder": "libs/ui/two/.storybook", @@ -162,6 +159,9 @@ Object { }, }, }, + "projectType": "library", + "root": "libs/ui/two", + "sourceRoot": "libs/ui/two/src", }, }, "version": 1, @@ -172,18 +172,14 @@ exports[`Set the projectBuildConfig option in the Storybook configuration for An Object { "projects": Object { "main-app": Object { - "prefix": "katst", - "projectType": "application", - "root": "apps/main-app", - "sourceRoot": "apps/main-app/src", - "targets": Object { + "architect": Object { "lmfkcn": Object { + "builder": "@nrwl/storybook:storybook", "configurations": Object { "ci": Object { "quiet": true, }, }, - "executor": "@nrwl/storybook:storybook", "options": Object { "config": Object { "configFolder": "apps/main-app/.storybook", @@ -194,18 +190,18 @@ Object { }, }, "njdfvndfjnv": Object { - "executor": "@angular-devkit/build-angular:browser", + "builder": "@angular-devkit/build-angular:browser", "outputs": Array [ "{options.outputPath}", ], }, "odmwjbc": Object { + "builder": "@nrwl/storybook:build", "configurations": Object { "ci": Object { "quiet": true, }, }, - "executor": "@nrwl/storybook:build", "options": Object { "config": Object { "configFolder": "apps/main-app/.storybook", @@ -219,19 +215,20 @@ Object { ], }, }, + "prefix": "katst", + "projectType": "application", + "root": "apps/main-app", + "sourceRoot": "apps/main-app/src", }, "ui-one": Object { - "projectType": "library", - "root": "libs/ui/one", - "sourceRoot": "libs/ui/one/src", - "targets": Object { + "architect": Object { "asdgsdfg": Object { + "builder": "@nrwl/storybook:build", "configurations": Object { "ci": Object { "quiet": true, }, }, - "executor": "@nrwl/storybook:build", "options": Object { "config": Object { "configFolder": "libs/ui/one/.storybook", @@ -245,7 +242,7 @@ Object { ], }, "trthrngb": Object { - "executor": "@nrwl/storybook:storybook", + "builder": "@nrwl/storybook:storybook", "options": Object { "config": Object { "configFolder": "libs/ui/one/.storybook", @@ -256,19 +253,19 @@ Object { }, }, }, + "projectType": "library", + "root": "libs/ui/one", + "sourceRoot": "libs/ui/one/src", }, "ui-three": Object { - "projectType": "library", - "root": "libs/ui/three", - "sourceRoot": "libs/ui/three/src", - "targets": Object { + "architect": Object { "aaaa": Object { + "builder": "@nrwl/storybook:build", "configurations": Object { "ci": Object { "quiet": true, }, }, - "executor": "@nrwl/storybook:build", "options": Object { "config": Object { "configFolder": "libs/ui/three/.storybook", @@ -282,7 +279,7 @@ Object { ], }, "nmkgd": Object { - "executor": "@nrwl/storybook:storybook", + "builder": "@nrwl/storybook:storybook", "options": Object { "config": Object { "configFolder": "libs/ui/three/.storybook", @@ -293,14 +290,14 @@ Object { }, }, }, + "projectType": "library", + "root": "libs/ui/three", + "sourceRoot": "libs/ui/three/src", }, "ui-two": Object { - "projectType": "library", - "root": "libs/ui/two", - "sourceRoot": "libs/ui/two/src", - "targets": Object { + "architect": Object { "sdft": Object { - "executor": "@nrwl/storybook:storybook", + "builder": "@nrwl/storybook:storybook", "options": Object { "config": Object { "configFolder": "libs/ui/two/.storybook", @@ -311,12 +308,12 @@ Object { }, }, "thjkkb": Object { + "builder": "@nrwl/storybook:build", "configurations": Object { "ci": Object { "quiet": true, }, }, - "executor": "@nrwl/storybook:build", "options": Object { "config": Object { "configFolder": "libs/ui/two/.storybook", @@ -330,6 +327,9 @@ Object { ], }, }, + "projectType": "library", + "root": "libs/ui/two", + "sourceRoot": "libs/ui/two/src", }, }, "version": 1, @@ -340,18 +340,14 @@ exports[`Set the projectBuildConfig option in the Storybook configuration for An Object { "projects": Object { "main-app": Object { - "prefix": "katst", - "projectType": "application", - "root": "apps/main-app", - "sourceRoot": "apps/main-app/src", - "targets": Object { + "architect": Object { "storybook": Object { + "builder": "@nrwl/storybook:storybook", "configurations": Object { "ci": Object { "quiet": true, }, }, - "executor": "@nrwl/storybook:storybook", "options": Object { "config": Object { "configFolder": "apps/main-app/.storybook", @@ -361,6 +357,10 @@ Object { }, }, }, + "prefix": "katst", + "projectType": "application", + "root": "apps/main-app", + "sourceRoot": "apps/main-app/src", }, "ui-one": Object { "projectType": "library", @@ -386,7 +386,7 @@ Object { ], }, "storybook": Object { - "executor": "@nrwl/storybook:storybook", + "builder": "@nrwl/storybook:storybook", "options": Object { "config": Object { "configFolder": "libs/ui/one/.storybook", @@ -398,6 +398,5 @@ Object { }, }, }, - "version": undefined, } `; diff --git a/packages/storybook/src/migrations/update-13-4-6/set-project-build-config.spec.ts b/packages/storybook/src/migrations/update-13-4-6/set-project-build-config.spec.ts index 35aeeaeed1518..eedf60349f047 100644 --- a/packages/storybook/src/migrations/update-13-4-6/set-project-build-config.spec.ts +++ b/packages/storybook/src/migrations/update-13-4-6/set-project-build-config.spec.ts @@ -1,6 +1,5 @@ -import { Tree, writeJson } from '@nrwl/devkit'; +import { readJson, Tree, writeJson } from '@nrwl/devkit'; import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing'; -import { readWorkspace } from 'packages/devkit/src/generators/project-configuration'; import setProjectBuildConfig from './set-project-build-config'; import * as defaultConfig from './test-configs/default-config.json'; import * as customNames from './test-configs/custom-names-config.json'; @@ -17,13 +16,13 @@ describe('Set the projectBuildConfig option in the Storybook configuration for A it(`should set the projectBuildConfig in the Storybook config according to the type of project`, async () => { writeJson(tree, 'workspace.json', defaultConfig); await setProjectBuildConfig(tree); - expect(readWorkspace(tree)).toMatchSnapshot(); + expect(readJson(tree, 'workspace.json')).toMatchSnapshot(); }); it(`should still set the projectBuildConfig even if target names are not the default`, async () => { writeJson(tree, 'workspace.json', customNames); await setProjectBuildConfig(tree); - expect(readWorkspace(tree)).toMatchSnapshot(); + expect(readJson(tree, 'workspace.json')).toMatchSnapshot(); }); }); @@ -35,7 +34,7 @@ describe('Set the projectBuildConfig option in the Storybook configuration for A it(`should not change their Storybook configuration`, async () => { await setProjectBuildConfig(tree); - expect(readWorkspace(tree)).toMatchSnapshot(); + expect(readJson(tree, 'workspace.json')).toMatchSnapshot(); }); }); }); diff --git a/packages/workspace/src/generators/convert-to-nx-project/convert-to-nx-project.spec.ts b/packages/workspace/src/generators/convert-to-nx-project/convert-to-nx-project.spec.ts index 04fb1da4282f4..e7d05bd3d8a2a 100644 --- a/packages/workspace/src/generators/convert-to-nx-project/convert-to-nx-project.spec.ts +++ b/packages/workspace/src/generators/convert-to-nx-project/convert-to-nx-project.spec.ts @@ -85,6 +85,7 @@ describe('convert-to-nx-project', () => { getProjectConfigurationPath(config) ); + delete config.root; expect(config).toEqual(newConfigFile); }); @@ -112,6 +113,7 @@ describe('convert-to-nx-project', () => { tree, getProjectConfigurationPath(config) ); + delete config.root; expect(config).toEqual(newConfigFile); } }); diff --git a/packages/workspace/src/generators/convert-to-nx-project/convert-to-nx-project.ts b/packages/workspace/src/generators/convert-to-nx-project/convert-to-nx-project.ts index d40f53fd47dec..2cd1d7b5fdb97 100644 --- a/packages/workspace/src/generators/convert-to-nx-project/convert-to-nx-project.ts +++ b/packages/workspace/src/generators/convert-to-nx-project/convert-to-nx-project.ts @@ -68,6 +68,8 @@ To upgrade change the version number at the top of ${getWorkspacePath( continue; } + delete configuration.root; + writeJson(host, configPath, configuration); updateJson(host, getWorkspacePath(host), (value) => {