Skip to content

Commit

Permalink
feat(release): updateDependents generator option for versioning
Browse files Browse the repository at this point in the history
  • Loading branch information
JamesHenry committed Apr 16, 2024
1 parent 2ee9650 commit 5d5dbff
Show file tree
Hide file tree
Showing 10 changed files with 687 additions and 114 deletions.
8 changes: 3 additions & 5 deletions e2e/release/src/independent-projects.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -191,8 +191,10 @@ describe('nx release - independent projects', () => {
{project-name} 🔍 Reading data for package "@proj/{project-name}" from {project-name}/package.json
{project-name} 📄 Resolved the current version as 0.0.0 from {project-name}/package.json
{project-name} 📄 Using the provided version specifier "999.9.9-package.3".
{project-name} ⚠️ Warning, the following packages depend on "{project-name}" but have been filtered out via --projects, and therefore will not be updated:
- {project-name}
=> You can adjust this behavior by setting \`version.generatorOptions.updateDependents.when\` to "always"
{project-name} ✍️ New version 999.9.9-package.3 written to {project-name}/package.json
{project-name} ✍️ Applying new version 999.9.9-package.3 to 1 package which depends on {project-name}
"name": "@proj/{project-name}",
Expand All @@ -201,10 +203,6 @@ describe('nx release - independent projects', () => {
"scripts": {
"dependencies": {
- "@proj/{project-name}": "0.0.0"
+ "@proj/{project-name}": "999.9.9-package.3"
}
NX Staging changed files with git
Expand Down
306 changes: 240 additions & 66 deletions packages/js/src/generators/release-version/release-version.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -444,78 +444,252 @@ To fix this you will either need to add a package.json file at that location, or
`);
});

it(`should update dependents even when filtering to a subset of projects which do not include those dependents`, async () => {
expect(readJson(tree, 'libs/my-lib/package.json').version).toEqual(
'0.0.1'
);
expect(
readJson(tree, 'libs/project-with-dependency-on-my-pkg/package.json')
).toMatchInlineSnapshot(`
{
"dependencies": {
"my-lib": "0.0.1",
},
"name": "project-with-dependency-on-my-pkg",
"version": "0.0.1",
}
`);
expect(
readJson(
tree,
'libs/project-with-devDependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"devDependencies": {
"my-lib": "0.0.1",
},
"name": "project-with-devDependency-on-my-pkg",
"version": "0.0.1",
}
`);
describe('updateDependentsOptions', () => {
it(`should not update dependents when filtering to a subset of projects by default`, async () => {
expect(readJson(tree, 'libs/my-lib/package.json').version).toEqual(
'0.0.1'
);
expect(
readJson(
tree,
'libs/project-with-dependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"dependencies": {
"my-lib": "0.0.1",
},
"name": "project-with-dependency-on-my-pkg",
"version": "0.0.1",
}
`);
expect(
readJson(
tree,
'libs/project-with-devDependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"devDependencies": {
"my-lib": "0.0.1",
},
"name": "project-with-devDependency-on-my-pkg",
"version": "0.0.1",
}
`);

await releaseVersionGenerator(tree, {
projects: [projectGraph.nodes['my-lib']], // version only my-lib
projectGraph,
specifier: '9.9.9', // user CLI specifier override set, no prompting should occur
currentVersionResolver: 'disk',
specifierSource: 'prompt',
releaseGroup: createReleaseGroup('independent'),
await releaseVersionGenerator(tree, {
projects: [projectGraph.nodes['my-lib']], // version only my-lib
projectGraph,
specifier: '9.9.9', // user CLI specifier override set, no prompting should occur
currentVersionResolver: 'disk',
specifierSource: 'prompt',
releaseGroup: createReleaseGroup('independent'),
});

expect(readJson(tree, 'libs/my-lib/package.json'))
.toMatchInlineSnapshot(`
{
"name": "my-lib",
"version": "9.9.9",
}
`);

expect(
readJson(
tree,
'libs/project-with-dependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"dependencies": {
"my-lib": "0.0.1",
},
"name": "project-with-dependency-on-my-pkg",
"version": "0.0.1",
}
`);
expect(
readJson(
tree,
'libs/project-with-devDependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"devDependencies": {
"my-lib": "0.0.1",
},
"name": "project-with-devDependency-on-my-pkg",
"version": "0.0.1",
}
`);
});

expect(readJson(tree, 'libs/my-lib/package.json'))
.toMatchInlineSnapshot(`
{
"name": "my-lib",
"version": "9.9.9",
}
`);
it(`should not update dependents when filtering to a subset of projects by default, if "when" is set to "auto"`, async () => {
expect(readJson(tree, 'libs/my-lib/package.json').version).toEqual(
'0.0.1'
);
expect(
readJson(
tree,
'libs/project-with-dependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"dependencies": {
"my-lib": "0.0.1",
},
"name": "project-with-dependency-on-my-pkg",
"version": "0.0.1",
}
`);
expect(
readJson(
tree,
'libs/project-with-devDependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"devDependencies": {
"my-lib": "0.0.1",
},
"name": "project-with-devDependency-on-my-pkg",
"version": "0.0.1",
}
`);

expect(
readJson(tree, 'libs/project-with-dependency-on-my-pkg/package.json')
).toMatchInlineSnapshot(`
{
"dependencies": {
"my-lib": "9.9.9",
await releaseVersionGenerator(tree, {
projects: [projectGraph.nodes['my-lib']], // version only my-lib
projectGraph,
specifier: '9.9.9', // user CLI specifier override set, no prompting should occur
currentVersionResolver: 'disk',
specifierSource: 'prompt',
releaseGroup: createReleaseGroup('independent'),
updateDependents: {
when: 'auto',
},
"name": "project-with-dependency-on-my-pkg",
"version": "0.0.1",
}
`);
expect(
readJson(
tree,
'libs/project-with-devDependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"devDependencies": {
"my-lib": "9.9.9",
});

expect(readJson(tree, 'libs/my-lib/package.json'))
.toMatchInlineSnapshot(`
{
"name": "my-lib",
"version": "9.9.9",
}
`);

expect(
readJson(
tree,
'libs/project-with-dependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"dependencies": {
"my-lib": "0.0.1",
},
"name": "project-with-dependency-on-my-pkg",
"version": "0.0.1",
}
`);
expect(
readJson(
tree,
'libs/project-with-devDependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"devDependencies": {
"my-lib": "0.0.1",
},
"name": "project-with-devDependency-on-my-pkg",
"version": "0.0.1",
}
`);
});

it(`should update dependents even when filtering to a subset of projects which do not include those dependents, if "when" is "always"`, async () => {
expect(readJson(tree, 'libs/my-lib/package.json').version).toEqual(
'0.0.1'
);
expect(
readJson(
tree,
'libs/project-with-dependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"dependencies": {
"my-lib": "0.0.1",
},
"name": "project-with-dependency-on-my-pkg",
"version": "0.0.1",
}
`);
expect(
readJson(
tree,
'libs/project-with-devDependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"devDependencies": {
"my-lib": "0.0.1",
},
"name": "project-with-devDependency-on-my-pkg",
"version": "0.0.1",
}
`);

await releaseVersionGenerator(tree, {
projects: [projectGraph.nodes['my-lib']], // version only my-lib
projectGraph,
specifier: '9.9.9', // user CLI specifier override set, no prompting should occur
currentVersionResolver: 'disk',
specifierSource: 'prompt',
releaseGroup: createReleaseGroup('independent'),
updateDependents: {
when: 'always',
},
"name": "project-with-devDependency-on-my-pkg",
"version": "0.0.1",
}
`);
});

expect(readJson(tree, 'libs/my-lib/package.json'))
.toMatchInlineSnapshot(`
{
"name": "my-lib",
"version": "9.9.9",
}
`);

expect(
readJson(
tree,
'libs/project-with-dependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"dependencies": {
"my-lib": "9.9.9",
},
"name": "project-with-dependency-on-my-pkg",
"version": "0.0.2",
}
`);
expect(
readJson(
tree,
'libs/project-with-devDependency-on-my-pkg/package.json'
)
).toMatchInlineSnapshot(`
{
"devDependencies": {
"my-lib": "9.9.9",
},
"name": "project-with-devDependency-on-my-pkg",
"version": "0.0.2",
}
`);
});
});
});
});
Expand Down

0 comments on commit 5d5dbff

Please sign in to comment.