From 18776f676420a4268d251afb1d2744df08b35be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leosvel=20P=C3=A9rez=20Espinosa?= Date: Thu, 31 Mar 2022 16:30:06 +0100 Subject: [PATCH] feat(angular): update ng-add generator so the migration result is more aligned with new nx workspaces (#9630) --- docs/generated/api-nx-devkit/index.md | 19 ++-- e2e/angular-core/src/ng-add.test.ts | 100 +++++++----------- .../migrate-from-angular-cli.spec.ts.snap | 37 +++++++ .../angular/src/generators/ng-add/compat.ts | 2 +- .../files/prettier/__dot__prettierignore | 3 + .../{schematics => generators}/__dot__gitkeep | 0 .../ng-add/migrate-from-angular-cli.spec.ts | 51 +++++++++ .../ng-add/migrate-from-angular-cli.ts | 6 ++ .../ng-add/utilities/app.migrator.ts | 12 ++- .../ng-add/utilities/e2e-project.migrator.ts | 22 ++-- .../generators/ng-add/utilities/workspace.ts | 55 +++------- .../devkit/src/utils/invoke-nx-generator.ts | 36 +++++-- 12 files changed, 217 insertions(+), 126 deletions(-) rename packages/angular/src/generators/ng-add/files/root/tools/{schematics => generators}/__dot__gitkeep (100%) diff --git a/docs/generated/api-nx-devkit/index.md b/docs/generated/api-nx-devkit/index.md index b8a8d5455f4e8..5b45914e150fd 100644 --- a/docs/generated/api-nx-devkit/index.md +++ b/docs/generated/api-nx-devkit/index.md @@ -792,9 +792,9 @@ Use this to expose a compatible Angular Builder ### convertNxGenerator -▸ **convertNxGenerator**<`T`\>(`generator`): (`options`: `T`) => (`tree`: `any`, `context`: `any`) => `Promise`<`any`\> +▸ **convertNxGenerator**<`T`\>(`generator`, `skipWritingConfigInOldFormat?`): (`generatorOptions`: `T`) => (`tree`: `any`, `context`: `any`) => `Promise`<`any`\> -Convert an Nx Generator into an Angular Devkit Schematic +Convert an Nx Generator into an Angular Devkit Schematic. #### Type parameters @@ -804,21 +804,22 @@ Convert an Nx Generator into an Angular Devkit Schematic #### Parameters -| Name | Type | -| :---------- | :--------------------------------------------------- | -| `generator` | [`Generator`](../../nx-devkit/index#generator)<`T`\> | +| Name | Type | Default value | Description | +| :----------------------------- | :--------------------------------------------------- | :------------ | :------------------------------------------------------------------------------------------------ | +| `generator` | [`Generator`](../../nx-devkit/index#generator)<`T`\> | `undefined` | The Nx generator to convert to an Angular Devkit Schematic. | +| `skipWritingConfigInOldFormat` | `boolean` | `false` | Whether to skip writing the configuration in the old format (the one used by the Angular DevKit). | #### Returns `fn` -▸ (`options`): (`tree`: `any`, `context`: `any`) => `Promise`<`any`\> +▸ (`generatorOptions`): (`tree`: `any`, `context`: `any`) => `Promise`<`any`\> ##### Parameters -| Name | Type | -| :-------- | :--- | -| `options` | `T` | +| Name | Type | +| :----------------- | :--- | +| `generatorOptions` | `T` | ##### Returns diff --git a/e2e/angular-core/src/ng-add.test.ts b/e2e/angular-core/src/ng-add.test.ts index 9875c40fdfd36..543126704af35 100644 --- a/e2e/angular-core/src/ng-add.test.ts +++ b/e2e/angular-core/src/ng-add.test.ts @@ -121,28 +121,10 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { expect(updatedPackageJson.description).toEqual('some description'); expect(updatedPackageJson.scripts).toEqual({ ng: 'nx', - start: 'ng serve', - build: 'ng build', - watch: 'ng build --watch --configuration development', - test: 'ng test', - nx: 'nx', - 'affected:apps': 'nx affected:apps', - 'affected:libs': 'nx affected:libs', - 'affected:build': 'nx affected:build', - 'affected:e2e': 'nx affected:e2e', - 'affected:test': 'nx affected:test', - 'affected:lint': 'nx affected:lint', - 'affected:graph': 'nx affected:graph', - affected: 'nx affected', - format: 'nx format:write', - 'format:write': 'nx format:write', - 'format:check': 'nx format:check', - update: 'ng update @nrwl/workspace', - 'update:check': 'ng update', - lint: 'nx workspace-lint && ng lint', - graph: 'nx graph', - 'workspace-generator': 'nx workspace-generator', - help: 'nx help', + start: 'nx serve', + build: 'nx build', + watch: 'nx build --watch --configuration development', + test: 'nx test', postinstall: 'node ./decorate-angular-cli.js', }); expect(updatedPackageJson.devDependencies['@nrwl/workspace']).toBeDefined(); @@ -186,15 +168,20 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { }); // check angular.json - const updatedAngularCLIJson = readJson('angular.json'); - expect(updatedAngularCLIJson.projects[project].root).toEqual( - `apps/${project}` - ); - expect(updatedAngularCLIJson.projects[project].sourceRoot).toEqual( - `apps/${project}/src` - ); - expect(updatedAngularCLIJson.projects[project].architect.build).toEqual({ - builder: '@angular-devkit/build-angular:browser', + expect(readJson('angular.json')).toStrictEqual({ + version: 2, + projects: { + [project]: `apps/${project}`, + [`${project}-e2e`]: `apps/${project}-e2e`, + }, + }); + + // 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', options: { outputPath: `dist/apps/${project}`, index: `apps/${project}/src/index.html`, @@ -241,16 +228,16 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { }, defaultConfiguration: 'production', }); - expect(updatedAngularCLIJson.projects[project].architect.serve).toEqual({ - builder: '@angular-devkit/build-angular:dev-server', + expect(projectConfig.targets.serve).toEqual({ + executor: '@angular-devkit/build-angular:dev-server', configurations: { production: { browserTarget: `${project}:build:production` }, development: { browserTarget: `${project}:build:development` }, }, defaultConfiguration: 'development', }); - expect(updatedAngularCLIJson.projects[project].architect.test).toEqual({ - builder: '@angular-devkit/build-angular:karma', + expect(projectConfig.targets.test).toEqual({ + executor: '@angular-devkit/build-angular:karma', options: { main: `apps/${project}/src/test.ts`, polyfills: `apps/${project}/src/polyfills.ts`, @@ -264,18 +251,13 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { scripts: [`apps/${project}/src/scripts.ts`], }, }); + expect(projectConfig.targets.e2e).toBeUndefined(); // check e2e project config - expect( - updatedAngularCLIJson.projects[project].architect.e2e - ).toBeUndefined(); - expect(updatedAngularCLIJson.projects[`${project}-e2e`].root).toEqual( - `apps/${project}-e2e` - ); - expect( - updatedAngularCLIJson.projects[`${project}-e2e`].architect.e2e - ).toEqual({ - builder: '@angular-devkit/build-angular:protractor', + 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: { protractorConfig: `apps/${project}-e2e/protractor.conf.js`, devServerTarget: `${project}:serve`, @@ -363,18 +345,16 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { `apps/${e2eProject}/src/support/index.ts` ); - const angularJson = readJson('angular.json'); + const projectConfig = readJson(`apps/${project}/project.json`); + expect(projectConfig.targets['cypress-run']).toBeUndefined(); + expect(projectConfig.targets['cypress-open']).toBeUndefined(); + expect(projectConfig.targets.e2e).toBeUndefined(); + // check e2e project config - expect( - angularJson.projects[project].architect['cypress-run'] - ).toBeUndefined(); - expect( - angularJson.projects[project].architect['cypress-open'] - ).toBeUndefined(); - expect(angularJson.projects[project].architect.e2e).toBeUndefined(); - expect(angularJson.projects[e2eProject].root).toEqual(`apps/${e2eProject}`); - expect(angularJson.projects[e2eProject].architect['cypress-run']).toEqual({ - builder: '@nrwl/cypress:cypress', + 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: { devServerTarget: `${project}:serve`, cypressConfig: `apps/${e2eProject}/cypress.json`, @@ -385,15 +365,15 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { }, }, }); - expect(angularJson.projects[e2eProject].architect['cypress-open']).toEqual({ - builder: '@nrwl/cypress:cypress', + expect(e2eProjectConfig.targets['cypress-open']).toEqual({ + executor: '@nrwl/cypress:cypress', options: { watch: true, cypressConfig: `apps/${e2eProject}/cypress.json`, }, }); - expect(angularJson.projects[e2eProject].architect.e2e).toEqual({ - builder: '@nrwl/cypress:cypress', + expect(e2eProjectConfig.targets.e2e).toEqual({ + executor: '@nrwl/cypress:cypress', options: { devServerTarget: `${project}:serve`, watch: true, diff --git a/packages/angular/src/generators/ng-add/__snapshots__/migrate-from-angular-cli.spec.ts.snap b/packages/angular/src/generators/ng-add/__snapshots__/migrate-from-angular-cli.spec.ts.snap index 0173d79dbfe5e..6668958923bae 100644 --- a/packages/angular/src/generators/ng-add/__snapshots__/migrate-from-angular-cli.spec.ts.snap +++ b/packages/angular/src/generators/ng-add/__snapshots__/migrate-from-angular-cli.spec.ts.snap @@ -197,6 +197,35 @@ Object { } `; +exports[`workspace move to nx layout should update project configuration 1`] = ` +Object { + "root": "apps/myApp", + "sourceRoot": "apps/myApp/src", + "targets": Object { + "build": Object { + "configurations": Object {}, + "options": Object { + "tsConfig": "apps/myApp/tsconfig.app.json", + }, + }, + "lint": Object { + "options": Object { + "tsConfig": Array [ + "apps/myApp/tsconfig.app.json", + "apps/myApp/tsconfig.spec.json", + ], + }, + }, + "test": Object { + "options": Object { + "karmaConfig": "apps/myApp/karma.conf.js", + "tsConfig": "apps/myApp/tsconfig.spec.json", + }, + }, + }, +} +`; + exports[`workspace move to nx layout should update tsconfig.base.json if present 1`] = ` Object { "compilerOptions": Object { @@ -204,6 +233,10 @@ Object { "paths": Object {}, "rootDir": ".", }, + "exclude": Array [ + "node_modules", + "tmp", + ], } `; @@ -214,5 +247,9 @@ Object { "paths": Object {}, "rootDir": ".", }, + "exclude": Array [ + "node_modules", + "tmp", + ], } `; diff --git a/packages/angular/src/generators/ng-add/compat.ts b/packages/angular/src/generators/ng-add/compat.ts index bcc66b52aba73..ac2246d833c10 100644 --- a/packages/angular/src/generators/ng-add/compat.ts +++ b/packages/angular/src/generators/ng-add/compat.ts @@ -1,4 +1,4 @@ import { convertNxGenerator } from '@nrwl/devkit'; import { ngAddGenerator } from './ng-add'; -export default convertNxGenerator(ngAddGenerator); +export default convertNxGenerator(ngAddGenerator, true); diff --git a/packages/angular/src/generators/ng-add/files/prettier/__dot__prettierignore b/packages/angular/src/generators/ng-add/files/prettier/__dot__prettierignore index 931aad9929fc2..d0b804da2a462 100644 --- a/packages/angular/src/generators/ng-add/files/prettier/__dot__prettierignore +++ b/packages/angular/src/generators/ng-add/files/prettier/__dot__prettierignore @@ -1 +1,4 @@ # Add files here to ignore them from prettier formatting + +/dist +/coverage diff --git a/packages/angular/src/generators/ng-add/files/root/tools/schematics/__dot__gitkeep b/packages/angular/src/generators/ng-add/files/root/tools/generators/__dot__gitkeep similarity index 100% rename from packages/angular/src/generators/ng-add/files/root/tools/schematics/__dot__gitkeep rename to packages/angular/src/generators/ng-add/files/root/tools/generators/__dot__gitkeep diff --git a/packages/angular/src/generators/ng-add/migrate-from-angular-cli.spec.ts b/packages/angular/src/generators/ng-add/migrate-from-angular-cli.spec.ts index 66164a6c8cf28..69fe1642abfc8 100644 --- a/packages/angular/src/generators/ng-add/migrate-from-angular-cli.spec.ts +++ b/packages/angular/src/generators/ng-add/migrate-from-angular-cli.spec.ts @@ -189,6 +189,57 @@ describe('workspace', () => { ).rejects.toThrow('Can only convert projects with one app'); }); + it('should update project configuration', async () => { + await migrateFromAngularCli(tree, { name: 'myApp' }); + + const angularJson = readJson(tree, 'angular.json'); + expect(angularJson.projects.myApp).toBe('apps/myApp'); + expect(readJson(tree, 'apps/myApp/project.json')).toMatchSnapshot(); + }); + + it('should update the npm scripts', async () => { + tree.write( + 'package.json', + JSON.stringify({ + scripts: { + ng: 'ng', + start: 'ng serve', + build: 'ng build', + watch: 'ng build --watch --configuration development', + test: 'ng test', + }, + }) + ); + + await migrateFromAngularCli(tree, { name: 'myApp' }); + + expect(readJson(tree, 'package.json').scripts).toStrictEqual({ + ng: 'nx', + start: 'nx serve', + build: 'nx build', + watch: 'nx build --watch --configuration development', + test: 'nx test', + postinstall: 'node ./decorate-angular-cli.js', + }); + }); + + it('should handle existing postinstall script', async () => { + tree.write( + 'package.json', + JSON.stringify({ + scripts: { + postinstall: 'node some-awesome-script.js', + }, + }) + ); + + await migrateFromAngularCli(tree, { name: 'myApp' }); + + expect(readJson(tree, 'package.json').scripts.postinstall).toEqual( + 'node some-awesome-script.js && node ./decorate-angular-cli.js' + ); + }); + it('should remove the newProjectRoot key from configuration', async () => { tree.write( '/angular.json', diff --git a/packages/angular/src/generators/ng-add/migrate-from-angular-cli.ts b/packages/angular/src/generators/ng-add/migrate-from-angular-cli.ts index 00682001648d4..324282abdc4a3 100755 --- a/packages/angular/src/generators/ng-add/migrate-from-angular-cli.ts +++ b/packages/angular/src/generators/ng-add/migrate-from-angular-cli.ts @@ -3,6 +3,7 @@ import { formatFiles, installPackagesTask, Tree, + updateJson, } from '@nrwl/devkit'; import { nxVersion } from '../../utils/versions'; import type { GeneratorOptions } from './schema'; @@ -52,6 +53,11 @@ export async function migrateFromAngularCli( // multiple projects are supported // create and update root files and configurations + updateJson(tree, 'angular.json', (json) => ({ + ...json, + version: 2, + $schema: undefined, + })); createNxJson(tree, options); updateWorkspaceConfigDefaults(tree); updateRootTsConfig(tree); diff --git a/packages/angular/src/generators/ng-add/utilities/app.migrator.ts b/packages/angular/src/generators/ng-add/utilities/app.migrator.ts index 381938da52792..789c96da541f1 100644 --- a/packages/angular/src/generators/ng-add/utilities/app.migrator.ts +++ b/packages/angular/src/generators/ng-add/utilities/app.migrator.ts @@ -5,6 +5,7 @@ import { updateJson, updateProjectConfiguration, } from '@nrwl/devkit'; +import { convertToNxProjectGenerator } from '@nrwl/workspace/generators'; import { getRootTsConfigPathInTree } from '@nrwl/workspace/src/utilities/typescript'; import { GeneratorOptions } from '../schema'; import { E2eProjectMigrator } from './e2e-project.migrator'; @@ -25,10 +26,10 @@ export class AppMigrator extends ProjectMigrator { } async migrate(): Promise { - this.e2eMigrator.migrate(); + await this.e2eMigrator.migrate(); this.moveProjectFiles(); - this.updateProjectConfiguration(); + await this.updateProjectConfiguration(); this.updateTsConfigs(); // TODO: check later if it's still needed this.updateProjectTsLint(); @@ -77,7 +78,7 @@ export class AppMigrator extends ProjectMigrator { this.moveDir(this.project.oldSourceRoot, this.project.newSourceRoot); } - private updateProjectConfiguration(): void { + private async updateProjectConfiguration(): Promise { this.projectConfig.root = this.project.newRoot; this.projectConfig.sourceRoot = this.project.newSourceRoot; @@ -129,6 +130,11 @@ export class AppMigrator extends ProjectMigrator { updateProjectConfiguration(this.tree, this.project.name, { ...this.projectConfig, }); + + await convertToNxProjectGenerator(this.tree, { + project: this.project.name, + skipFormat: true, + }); } private updateTsConfigs(): void { diff --git a/packages/angular/src/generators/ng-add/utilities/e2e-project.migrator.ts b/packages/angular/src/generators/ng-add/utilities/e2e-project.migrator.ts index 7d7c905a342cc..fb61e7af3e223 100644 --- a/packages/angular/src/generators/ng-add/utilities/e2e-project.migrator.ts +++ b/packages/angular/src/generators/ng-add/utilities/e2e-project.migrator.ts @@ -128,9 +128,14 @@ export class E2eProjectMigrator extends ProjectMigrator { implicitDependencies: [this.appName], tags: [], }; - addProjectConfiguration(this.tree, this.project.name, { - ...this.projectConfig, - }); + addProjectConfiguration( + this.tree, + this.project.name, + { + ...this.projectConfig, + }, + true + ); // remove e2e target from the app config delete this.appConfig.targets.e2e; @@ -221,9 +226,14 @@ export class E2eProjectMigrator extends ProjectMigrator { ); } - addProjectConfiguration(this.tree, this.project.name, { - ...this.projectConfig, - }); + addProjectConfiguration( + this.tree, + this.project.name, + { + ...this.projectConfig, + }, + true + ); delete this.appConfig.targets['cypress-run']; delete this.appConfig.targets['cypress-open']; diff --git a/packages/angular/src/generators/ng-add/utilities/workspace.ts b/packages/angular/src/generators/ng-add/utilities/workspace.ts index ae7b0aa3312cc..a8903a40051e3 100644 --- a/packages/angular/src/generators/ng-add/utilities/workspace.ts +++ b/packages/angular/src/generators/ng-add/utilities/workspace.ts @@ -7,7 +7,6 @@ import { Tree, updateJson, updateWorkspaceConfiguration, - workspaceRoot, writeJson, } from '@nrwl/devkit'; import { DEFAULT_NRWL_PRETTIER_CONFIG } from '@nrwl/workspace/src/generators/workspace/workspace'; @@ -188,11 +187,15 @@ export function updateWorkspaceConfigDefaults(tree: Tree): void { } export function updateRootTsConfig(tree: Tree): void { - writeJson( - tree, - 'tsconfig.base.json', - setUpCompilerOptions(readJson(tree, getRootTsConfigPathInTree(tree))) + const tsconfig = readJson(tree, getRootTsConfigPathInTree(tree)); + tsconfig.compilerOptions.paths ??= {}; + tsconfig.compilerOptions.baseUrl = '.'; + tsconfig.compilerOptions.rootDir = '.'; + tsconfig.exclude = Array.from( + new Set([...(tsconfig.exclude ?? []), 'node_modules', 'tmp']) ); + writeJson(tree, 'tsconfig.base.json', tsconfig); + if (tree.exists('tsconfig.json')) { tree.delete('tsconfig.json'); } @@ -200,33 +203,15 @@ export function updateRootTsConfig(tree: Tree): void { export function updatePackageJson(tree: Tree): void { updateJson(tree, 'package.json', (packageJson) => { - packageJson.scripts = packageJson.scripts || {}; - packageJson.scripts = { - ...packageJson.scripts, - nx: 'nx', - 'affected:apps': 'nx affected:apps', - 'affected:libs': 'nx affected:libs', - 'affected:build': 'nx affected:build', - 'affected:e2e': 'nx affected:e2e', - 'affected:test': 'nx affected:test', - 'affected:lint': 'nx affected:lint', - 'affected:graph': 'nx affected:graph', - affected: 'nx affected', - format: 'nx format:write', - 'format:write': 'nx format:write', - 'format:check': 'nx format:check', - update: 'ng update @nrwl/workspace', - 'update:check': 'ng update', - lint: 'nx workspace-lint && ng lint', - graph: 'nx graph', - 'workspace-generator': 'nx workspace-generator', - help: 'nx help', - }; + packageJson.scripts = packageJson.scripts ?? {}; + Object.keys(packageJson.scripts).forEach((script) => { + packageJson.scripts[script] = packageJson.scripts[script] + .replace(/^ng /, 'nx ') + .replace(/ ng /, ' nx '); + }); + packageJson.devDependencies = packageJson.devDependencies ?? {}; packageJson.dependencies = packageJson.dependencies ?? {}; - if (!packageJson.dependencies['@nrwl/angular']) { - packageJson.dependencies['@nrwl/angular'] = nxVersion; - } if (!packageJson.devDependencies['@angular/cli']) { packageJson.devDependencies['@angular/cli'] = angularDevkitVersion; } @@ -338,13 +323,3 @@ async function updatePrettierConfig(tree: Tree): Promise { ); } } - -function setUpCompilerOptions(tsconfig: any) { - if (!tsconfig.compilerOptions.paths) { - tsconfig.compilerOptions.paths = {}; - } - tsconfig.compilerOptions.baseUrl = '.'; - tsconfig.compilerOptions.rootDir = '.'; - - return tsconfig; -} diff --git a/packages/devkit/src/utils/invoke-nx-generator.ts b/packages/devkit/src/utils/invoke-nx-generator.ts index 0d29982744b43..fe30553ac80c8 100644 --- a/packages/devkit/src/utils/invoke-nx-generator.ts +++ b/packages/devkit/src/utils/invoke-nx-generator.ts @@ -31,17 +31,31 @@ function createRunCallbackTask() { } /** - * Convert an Nx Generator into an Angular Devkit Schematic + * Convert an Nx Generator into an Angular Devkit Schematic. + * @param generator The Nx generator to convert to an Angular Devkit Schematic. + * @param skipWritingConfigInOldFormat Whether to skip writing the configuration in the old format (the one used by the Angular DevKit). */ -export function convertNxGenerator(generator: Generator) { +export function convertNxGenerator( + generator: Generator, + skipWritingConfigInOldFormat: boolean = false +) { // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - return (options: T) => invokeNxGenerator(generator, options); + return (generatorOptions: T) => + invokeNxGenerator( + generator, + generatorOptions, + skipWritingConfigInOldFormat + ); } /** * Create a Rule to invoke an Nx Generator */ -function invokeNxGenerator(generator: Generator, options: T) { +function invokeNxGenerator( + generator: Generator, + options: T, + skipWritingConfigInOldFormat?: boolean +) { return async (tree, context) => { if (context.engine.workflow) { const engineHost = (context.engine.workflow as any).engineHost; @@ -53,7 +67,11 @@ function invokeNxGenerator(generator: Generator, options: T) { ? context.engine.workflow.engineHost.paths[1] : tree.root.path; - const adapterTree = new DevkitTreeFromAngularDevkitTree(tree, root); + const adapterTree = new DevkitTreeFromAngularDevkitTree( + tree, + root, + skipWritingConfigInOldFormat + ); const result = await generator(adapterTree, options); if (!result) { @@ -76,7 +94,11 @@ const actionToFileChangeMap = { class DevkitTreeFromAngularDevkitTree implements Tree { private configFileName: string; - constructor(private tree, private _root: string) {} + constructor( + private tree, + private _root: string, + private skipWritingConfigInOldFormat?: boolean + ) {} get root(): string { return this._root; @@ -166,7 +188,7 @@ class DevkitTreeFromAngularDevkitTree implements Tree { this.warnUnsupportedFilePermissionsChange(filePath, options.mode); } - if (isWorkspaceJsonChange(filePath)) { + if (!this.skipWritingConfigInOldFormat && isWorkspaceJsonChange(filePath)) { const w = parseJson(content.toString()); for (const [project, configuration] of Object.entries(w.projects)) { if (typeof configuration === 'string') {