From 997192846dede0dbed843af1c6bfac6b5d946c32 Mon Sep 17 00:00:00 2001 From: Miroslav Jonas Date: Fri, 4 Feb 2022 12:19:57 +0100 Subject: [PATCH] chore(core): add migration and tests --- packages/workspace/migrations.json | 6 + .../add-project-json-to-implicit-deps.spec.ts | 127 ++++++++++++++++++ .../add-project-json-to-implicit-deps.ts | 24 ++++ 3 files changed, 157 insertions(+) create mode 100644 packages/workspace/src/migrations/update-13-7-3/add-project-json-to-implicit-deps.spec.ts create mode 100644 packages/workspace/src/migrations/update-13-7-3/add-project-json-to-implicit-deps.ts diff --git a/packages/workspace/migrations.json b/packages/workspace/migrations.json index 0c64d1edc4dfb5..991fc74b438f10 100644 --- a/packages/workspace/migrations.json +++ b/packages/workspace/migrations.json @@ -115,6 +115,12 @@ "description": "Remove old options that are no longer used", "cli": "nx", "implementation": "./src/migrations/update-13-6-0/remove-old-task-runner-options" + }, + "13-7-3-add-project-json-to-implicit-deps": { + "version": "13.7.3", + "description": "Add project.json to nx implicitDependencies", + "cli": "nx", + "implementation": "./src/migrations/update-13-7-3/add-project-json-to-implicit-deps" } }, "packageJsonUpdates": { diff --git a/packages/workspace/src/migrations/update-13-7-3/add-project-json-to-implicit-deps.spec.ts b/packages/workspace/src/migrations/update-13-7-3/add-project-json-to-implicit-deps.spec.ts new file mode 100644 index 00000000000000..6a68d78c690156 --- /dev/null +++ b/packages/workspace/src/migrations/update-13-7-3/add-project-json-to-implicit-deps.spec.ts @@ -0,0 +1,127 @@ +import { NxJsonConfiguration, readJson, Tree, writeJson } from '@nrwl/devkit'; +import { createTree } from '@nrwl/devkit/testing'; +import addProjectJsonToImplicitDeps from './add-project-json-to-implicit-deps'; + +describe('addProjectJsonToImplicitDeps', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTree(); + }); + + it("should not add implicit dependencies if extends preset json's", () => { + writeJson(tree, 'nx.json', { + npmScope: 'scope', + extends: '@nrwl/workspace/presets/core.json', + }); + addProjectJsonToImplicitDeps(tree); + const result = readJson(tree, 'nx.json'); + expect(result).toEqual({ + npmScope: 'scope', + extends: '@nrwl/workspace/presets/core.json', + }); + }); + + it('should add implicit dependencies if missing', () => { + writeJson(tree, 'nx.json', { + npmScope: 'scope', + }); + addProjectJsonToImplicitDeps(tree); + const result = readJson(tree, 'nx.json'); + expect(result).toEqual({ + npmScope: 'scope', + implicitDependencies: { + 'apps/**/project.json': '*', + 'libs/**/project.json': '*', + }, + }); + }); + + it('should update implicit dependencies if available', () => { + writeJson(tree, 'nx.json', { + npmScope: 'scope', + implicitDependencies: { + 'package.json': { + dependencies: '*', + devDependencies: '*', + }, + '.eslintrc.json': '*', + }, + }); + addProjectJsonToImplicitDeps(tree); + const result = readJson(tree, 'nx.json'); + expect(result).toEqual({ + npmScope: 'scope', + implicitDependencies: { + 'package.json': { + dependencies: '*', + devDependencies: '*', + }, + '.eslintrc.json': '*', + 'apps/**/project.json': '*', + 'libs/**/project.json': '*', + }, + }); + }); + + it('should use workspaceLayout folder names if available', () => { + writeJson(tree, 'nx.json', { + npmScope: 'scope', + workspaceLayout: { appsDir: 'appz', libsDir: 'libz' }, + }); + addProjectJsonToImplicitDeps(tree); + const result = readJson(tree, 'nx.json'); + expect(result).toEqual({ + npmScope: 'scope', + workspaceLayout: { appsDir: 'appz', libsDir: 'libz' }, + implicitDependencies: { + 'appz/**/project.json': '*', + 'libz/**/project.json': '*', + }, + }); + }); + + it('should create single entry is apps and libs folder are same', () => { + writeJson(tree, 'nx.json', { + npmScope: 'scope', + workspaceLayout: { appsDir: 'packages', libsDir: 'packages' }, + }); + addProjectJsonToImplicitDeps(tree); + const result = readJson(tree, 'nx.json'); + expect(result).toEqual({ + npmScope: 'scope', + workspaceLayout: { appsDir: 'packages', libsDir: 'packages' }, + implicitDependencies: { + 'packages/**/project.json': '*', + }, + }); + }); + + it('should not update implicit dependencies for apps or libs if already set', () => { + writeJson(tree, 'nx.json', { + npmScope: 'scope', + implicitDependencies: { + 'package.json': { + dependencies: '*', + devDependencies: '*', + }, + '.eslintrc.json': '*', + 'apps/**/project.json': ['testing'], + }, + }); + addProjectJsonToImplicitDeps(tree); + const result = readJson(tree, 'nx.json'); + expect(result).toEqual({ + npmScope: 'scope', + implicitDependencies: { + 'package.json': { + dependencies: '*', + devDependencies: '*', + }, + '.eslintrc.json': '*', + 'apps/**/project.json': ['testing'], + 'libs/**/project.json': '*', + }, + }); + }); +}); diff --git a/packages/workspace/src/migrations/update-13-7-3/add-project-json-to-implicit-deps.ts b/packages/workspace/src/migrations/update-13-7-3/add-project-json-to-implicit-deps.ts new file mode 100644 index 00000000000000..5e5b915c1372cb --- /dev/null +++ b/packages/workspace/src/migrations/update-13-7-3/add-project-json-to-implicit-deps.ts @@ -0,0 +1,24 @@ +import { + readWorkspaceConfiguration, + Tree, + updateWorkspaceConfiguration, +} from '@nrwl/devkit'; + +export function addProjectJsonToImplicitDeps(host: Tree) { + const workspaceConfig = readWorkspaceConfiguration(host); + if (!workspaceConfig.extends) { + const appsDir = workspaceConfig.workspaceLayout?.appsDir || 'apps'; + const libsDir = workspaceConfig.workspaceLayout?.libsDir || 'libs'; + // make sure dependencies exist + workspaceConfig.implicitDependencies = + workspaceConfig.implicitDependencies || {}; + // set implicit dependencies + workspaceConfig.implicitDependencies[`${appsDir}/**/project.json`] = + workspaceConfig.implicitDependencies[`${appsDir}/**/project.json`] || '*'; + workspaceConfig.implicitDependencies[`${libsDir}/**/project.json`] = + workspaceConfig.implicitDependencies[`${libsDir}/**/project.json`] || '*'; + } + updateWorkspaceConfiguration(host, workspaceConfig); +} + +export default addProjectJsonToImplicitDeps;