diff --git a/docs/generated/devkit/NxJsonConfiguration.md b/docs/generated/devkit/NxJsonConfiguration.md index e1752312e17aff..43e1bcc493fc54 100644 --- a/docs/generated/devkit/NxJsonConfiguration.md +++ b/docs/generated/devkit/NxJsonConfiguration.md @@ -19,6 +19,7 @@ Nx.json configuration ### Properties - [affected](../../devkit/documents/NxJsonConfiguration#affected): NxAffectedConfig +- [base](../../devkit/documents/NxJsonConfiguration#base): string - [cacheDirectory](../../devkit/documents/NxJsonConfiguration#cachedirectory): string - [cli](../../devkit/documents/NxJsonConfiguration#cli): Object - [defaultProject](../../devkit/documents/NxJsonConfiguration#defaultproject): string @@ -49,6 +50,14 @@ Default options for `nx affected` --- +### base + +• `Optional` **base**: `string` + +Default value for --base used by `nx affected` and `nx format`. + +--- + ### cacheDirectory • `Optional` **cacheDirectory**: `string` diff --git a/docs/generated/devkit/Workspace.md b/docs/generated/devkit/Workspace.md index 989510615dc9bd..0790ff10f19216 100644 --- a/docs/generated/devkit/Workspace.md +++ b/docs/generated/devkit/Workspace.md @@ -17,6 +17,7 @@ use ProjectsConfigurations or NxJsonConfiguration ### Properties - [affected](../../devkit/documents/Workspace#affected): NxAffectedConfig +- [base](../../devkit/documents/Workspace#base): string - [cacheDirectory](../../devkit/documents/Workspace#cachedirectory): string - [cli](../../devkit/documents/Workspace#cli): Object - [defaultProject](../../devkit/documents/Workspace#defaultproject): string @@ -53,6 +54,18 @@ Default options for `nx affected` --- +### base + +• `Optional` **base**: `string` + +Default value for --base used by `nx affected` and `nx format`. + +#### Inherited from + +[NxJsonConfiguration](../../devkit/documents/NxJsonConfiguration).[base](../../devkit/documents/NxJsonConfiguration#base) + +--- + ### cacheDirectory • `Optional` **cacheDirectory**: `string` diff --git a/docs/shared/reference/nx-json.md b/docs/shared/reference/nx-json.md index 8dc972d55b6831..8c3d9cf2167f95 100644 --- a/docs/shared/reference/nx-json.md +++ b/docs/shared/reference/nx-json.md @@ -47,11 +47,9 @@ In Nx 16, if the `npmScope` property is present, it will be used as a prefix. If In Nx 17, the `npmScope` property is ignored. -### Affected +### Base -Tells Nx which branch and HEAD to use when calculating affected projects. - -- `defaultBase` defines the default base branch, defaulted to `main`. +Tells Nx which branch and HEAD to use when calculating affected projects. Defaults to `main`. ### inputs & namedInputs diff --git a/e2e/angular-core/src/ng-add.test.ts b/e2e/angular-core/src/ng-add.test.ts index 31db4f3789e633..df10f89aea0a2b 100644 --- a/e2e/angular-core/src/ng-add.test.ts +++ b/e2e/angular-core/src/ng-add.test.ts @@ -141,9 +141,7 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { // check nx.json const nxJson = readJson('nx.json'); expect(nxJson).toEqual({ - affected: { - defaultBase: 'main', - }, + base: 'main', namedInputs: { default: ['{projectRoot}/**/*', 'sharedGlobals'], production: [ 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 86f37c16528e0b..c928863b0ab1f7 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 @@ -80,9 +80,7 @@ exports[`workspace move to nx layout should create a root eslint config 1`] = ` exports[`workspace move to nx layout should create nx.json 1`] = ` { - "affected": { - "defaultBase": "main", - }, + "base": "main", "defaultProject": "myApp", "namedInputs": { "default": [ diff --git a/packages/angular/src/generators/ng-add/utilities/workspace.ts b/packages/angular/src/generators/ng-add/utilities/workspace.ts index 1248088cf799f7..0abc6b6745ba6e 100644 --- a/packages/angular/src/generators/ng-add/utilities/workspace.ts +++ b/packages/angular/src/generators/ng-add/utilities/workspace.ts @@ -49,9 +49,7 @@ export function createNxJson( const targets = getWorkspaceCommonTargets(tree); writeJson(tree, 'nx.json', { - affected: { - defaultBase: options.defaultBase ?? deduceDefaultBase(), - }, + base: options.defaultBase ?? deduceDefaultBase(), namedInputs: { sharedGlobals: [], default: ['{projectRoot}/**/*', 'sharedGlobals'], diff --git a/packages/nx/migrations.json b/packages/nx/migrations.json index bea9737741c84f..c579dec4ca274e 100644 --- a/packages/nx/migrations.json +++ b/packages/nx/migrations.json @@ -76,6 +76,11 @@ "version": "17.0.0-rc.1", "description": "Migration for v17.0.0-rc.1", "implementation": "./src/migrations/update-17-0-0/rm-default-collection-npm-scope" + }, + "update-17.1.0": { + "version": "17.1.0", + "description": "Moves affected.defaultBase to base in `nx.json`", + "implementation": "./src/migrations/update-17-1-0/move-default-base" } } } diff --git a/packages/nx/schemas/nx-schema.json b/packages/nx/schemas/nx-schema.json index 1e3df3ecb154d9..76183ff0b0f9f8 100644 --- a/packages/nx/schemas/nx-schema.json +++ b/packages/nx/schemas/nx-schema.json @@ -18,7 +18,12 @@ "description": "Default based branch used by affected commands." } }, - "additionalProperties": false + "additionalProperties": false, + "deprecated": "Use `base` instead." + }, + "base": { + "type": "string", + "description": "Default --base used by affected logic." }, "tasksRunnerOptions": { "type": "object", diff --git a/packages/nx/src/adapter/compat.ts b/packages/nx/src/adapter/compat.ts index 4a122afa3c713f..fbfbc310a29f17 100644 --- a/packages/nx/src/adapter/compat.ts +++ b/packages/nx/src/adapter/compat.ts @@ -53,6 +53,7 @@ export const allowedProjectExtensions = [ export const allowedWorkspaceExtensions = [ 'implicitDependencies', 'affected', + 'base', 'tasksRunnerOptions', 'workspaceLayout', 'plugins', diff --git a/packages/nx/src/command-line/init/implementation/utils.ts b/packages/nx/src/command-line/init/implementation/utils.ts index 4502dfe30323eb..fbe8a65d30e784 100644 --- a/packages/nx/src/command-line/init/implementation/utils.ts +++ b/packages/nx/src/command-line/init/implementation/utils.ts @@ -76,8 +76,7 @@ export function createNxJsonFile( nxJson.targetDefaults[target].cache ??= true; } - nxJson.affected ??= {}; - nxJson.affected.defaultBase ??= deduceDefaultBase(); + nxJson.base ??= deduceDefaultBase(); writeJsonFile(nxJsonPath, nxJson); } diff --git a/packages/nx/src/config/nx-json.ts b/packages/nx/src/config/nx-json.ts index eff7a9441f81d4..efa70482593a4d 100644 --- a/packages/nx/src/config/nx-json.ts +++ b/packages/nx/src/config/nx-json.ts @@ -183,6 +183,12 @@ export interface NxJsonConfiguration { * Default options for `nx affected` */ affected?: NxAffectedConfig; + + /** + * Default value for --base used by `nx affected` and `nx format`. + */ + base?: string; + /** * Where new apps + libs should be placed */ diff --git a/packages/nx/src/migrations/update-17-1-0/move-default-base.spec.ts b/packages/nx/src/migrations/update-17-1-0/move-default-base.spec.ts new file mode 100644 index 00000000000000..d8c7454e29c9ef --- /dev/null +++ b/packages/nx/src/migrations/update-17-1-0/move-default-base.spec.ts @@ -0,0 +1,46 @@ +import { createTreeWithEmptyWorkspace } from 'nx/src/generators/testing-utils/create-tree-with-empty-workspace'; +import update from './move-default-base'; +import { Tree } from 'nx/src/generators/tree'; +import { readNxJson, updateNxJson } from 'nx/src/generators/utils/nx-json'; + +describe('update-17.1.0 migration', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + }); + + it("shouldn't do anything if affected.defaultBase is not set", () => { + tree.write('nx.json', JSON.stringify({})); + update(tree); + expect(readNxJson(tree)).toEqual({}); + }); + + it("shouldn't remove affected if other keys present", () => { + updateNxJson(tree, { + affected: { + defaultBase: 'master', + otherKey: 'otherValue', + } as any, + }); + update(tree); + expect(readNxJson(tree)).toEqual({ + affected: { + otherKey: 'otherValue', + }, + base: 'master', + }); + }); + + it('should remove affected if no other keys present', () => { + updateNxJson(tree, { + affected: { + defaultBase: 'master', + } as any, + }); + update(tree); + expect(readNxJson(tree)).toEqual({ + base: 'master', + }); + }); +}); diff --git a/packages/nx/src/migrations/update-17-1-0/move-default-base.ts b/packages/nx/src/migrations/update-17-1-0/move-default-base.ts new file mode 100644 index 00000000000000..312acc01ee931c --- /dev/null +++ b/packages/nx/src/migrations/update-17-1-0/move-default-base.ts @@ -0,0 +1,18 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { readNxJson, updateNxJson } from '../../generators/utils/nx-json'; +import { Tree } from '../../generators/tree'; + +/** + * Updates existing workspaces to move nx.json's affected.defaultBase to nx.json's base. + */ +export default function update(host: Tree) { + const nxJson = readNxJson(host); + if (nxJson.affected?.defaultBase) { + nxJson.base = nxJson.affected.defaultBase; + delete nxJson.affected.defaultBase; + if (Object.keys(nxJson.affected).length === 0) { + delete nxJson.affected; + } + updateNxJson(host, nxJson); + } +} diff --git a/packages/nx/src/utils/command-line-utils.ts b/packages/nx/src/utils/command-line-utils.ts index cc5a731c92cc17..1a4ff589b5b429 100644 --- a/packages/nx/src/utils/command-line-utils.ts +++ b/packages/nx/src/utils/command-line-utils.ts @@ -142,7 +142,7 @@ export function splitArgsIntoNxArgsAndOverrides( } if (!nxArgs.base) { - nxArgs.base = nxJson.affected?.defaultBase || 'main'; + nxArgs.base = nxJson.base ?? nxJson.affected?.defaultBase ?? 'main'; // No user-provided arguments to set the affected criteria, so inform the user of the defaults being used if ( diff --git a/packages/workspace/src/generators/ci-workflow/ci-workflow.spec.ts b/packages/workspace/src/generators/ci-workflow/ci-workflow.spec.ts index b1c3cb24df6545..95c4d57da8836a 100644 --- a/packages/workspace/src/generators/ci-workflow/ci-workflow.spec.ts +++ b/packages/workspace/src/generators/ci-workflow/ci-workflow.spec.ts @@ -88,6 +88,21 @@ describe('CI Workflow generator', () => { ); }); + it('should prefix nx.json base with origin/ if ci is bitbucket-pipelines', async () => { + setNxCloud(tree); + + const nxJson = readJson(tree, 'nx.json'); + nxJson.base = 'my-branch'; + writeJson(tree, 'nx.json', nxJson); + + await ciWorkflowGenerator(tree, { + ci: 'bitbucket-pipelines', + name: 'CI', + }); + + expect(readJson(tree, 'nx.json').base).toEqual('origin/my-branch'); + }); + it('should generate gitlab config', async () => { setNxCloud(tree); await ciWorkflowGenerator(tree, { ci: 'gitlab', name: 'CI' }); diff --git a/packages/workspace/src/generators/ci-workflow/ci-workflow.ts b/packages/workspace/src/generators/ci-workflow/ci-workflow.ts index a2a9e59f500728..05a63e51f7cead 100644 --- a/packages/workspace/src/generators/ci-workflow/ci-workflow.ts +++ b/packages/workspace/src/generators/ci-workflow/ci-workflow.ts @@ -68,13 +68,11 @@ function defaultBranchNeedsOriginPrefix(nxJson: NxJsonConfiguration): boolean { } function appendOriginPrefix(nxJson: NxJsonConfiguration): NxJsonConfiguration { - return { - ...nxJson, - affected: { - ...(nxJson.affected ?? {}), - defaultBase: nxJson.affected?.defaultBase - ? `origin/${nxJson.affected.defaultBase}` - : 'origin/main', - }, - }; + if (nxJson?.affected?.defaultBase) { + nxJson.affected.defaultBase = `origin/${nxJson.affected.defaultBase}`; + } + if (nxJson.base || !nxJson.affected) { + nxJson.base = `origin/${nxJson.base ?? deduceDefaultBase()}`; + } + return nxJson; } diff --git a/packages/workspace/src/generators/new/generate-workspace-files.ts b/packages/workspace/src/generators/new/generate-workspace-files.ts index 9d6d16168190f2..445b3ec6ff7f30 100644 --- a/packages/workspace/src/generators/new/generate-workspace-files.ts +++ b/packages/workspace/src/generators/new/generate-workspace-files.ts @@ -64,9 +64,7 @@ function createNxJson( ) { const nxJson: NxJsonConfiguration & { $schema: string } = { $schema: './node_modules/nx/schemas/nx-schema.json', - affected: { - defaultBase, - }, + base: defaultBase, targetDefaults: { build: { cache: true, @@ -86,6 +84,7 @@ function createNxJson( if (defaultBase === 'main') { delete nxJson.affected; + delete nxJson.base; } if (preset !== Preset.NPM) { nxJson.namedInputs = {