Skip to content

Commit fd1c5bd

Browse files
authored
Fix bump logic for deps using file protocol (#1080)
1 parent f873be1 commit fd1c5bd

4 files changed

Lines changed: 88 additions & 1 deletion

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "patch",
3+
"comment": "Fix bump logic for dependencies using file protocol",
4+
"packageName": "beachball",
5+
"email": "thomas.norling@microsoft.com",
6+
"dependentChangeType": "patch"
7+
}

src/__e2e__/bump.test.ts

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,76 @@ describe('version bumping', () => {
374374
expect(changeFiles).toHaveLength(0);
375375
});
376376

377+
it('should not bump local package dependencies', async () => {
378+
const monorepo: RepoFixture['folders'] = {
379+
packages: {
380+
'pkg-1': {
381+
version: '1.0.0',
382+
dependencies: { 'pkg-2': 'file:../pkg-2' },
383+
devDependencies: { 'pkg-3': 'file:../pkg-3' },
384+
peerDependencies: { 'pkg-4': 'file:../pkg-4' },
385+
optionalDependencies: { 'pkg-5': 'file:../pkg-5' },
386+
},
387+
'pkg-2': { version: '1.0.0' },
388+
'pkg-3': { version: '1.0.0' },
389+
'pkg-4': { version: '1.0.0' },
390+
'pkg-5': { version: '1.0.0' },
391+
},
392+
};
393+
repositoryFactory = new RepositoryFactory({ folders: monorepo });
394+
repo = repositoryFactory.cloneRepository();
395+
396+
const { originalPackageInfos, options, parsedOptions } = getOptionsAndPackages({
397+
bumpDeps: true,
398+
generateChangelog: true,
399+
});
400+
generateChangeFiles([{ packageName: 'pkg-1', type: 'minor' }], options);
401+
402+
repo.push();
403+
404+
await bump(options, originalPackageInfos);
405+
406+
const packageInfos = getPackageInfos(parsedOptions);
407+
408+
const pkg1NewVersion = '1.1.0';
409+
expect(packageInfos['pkg-1'].version).toBe(pkg1NewVersion);
410+
expect(packageInfos['pkg-2'].version).toBe(monorepo['packages']['pkg-2'].version);
411+
expect(packageInfos['pkg-3'].version).toBe(monorepo['packages']['pkg-3'].version);
412+
expect(packageInfos['pkg-4'].version).toBe(monorepo['packages']['pkg-4'].version);
413+
expect(packageInfos['pkg-5'].version).toBe(monorepo['packages']['pkg-5'].version);
414+
415+
expect(packageInfos['pkg-1'].dependencies!['pkg-2']).toBe(monorepo['packages']['pkg-1'].dependencies!['pkg-2']);
416+
expect(packageInfos['pkg-1'].devDependencies!['pkg-3']).toBe(
417+
monorepo['packages']['pkg-1'].devDependencies!['pkg-3']
418+
);
419+
expect(packageInfos['pkg-1'].peerDependencies!['pkg-4']).toBe(
420+
monorepo['packages']['pkg-1'].peerDependencies!['pkg-4']
421+
);
422+
expect(packageInfos['pkg-1'].optionalDependencies!['pkg-5']).toBe(
423+
monorepo['packages']['pkg-1'].optionalDependencies!['pkg-5']
424+
);
425+
426+
const changeFiles = getChangeFiles(options);
427+
expect(changeFiles).toHaveLength(0);
428+
429+
// Verify changelog doesn't include entries for file: dependencies
430+
const changelogJson = readChangelogJson(repo.pathTo('packages/pkg-1'));
431+
expect(changelogJson?.entries).toHaveLength(1);
432+
const changelogComments = changelogJson?.entries[0].comments;
433+
const allComments = [
434+
...(changelogComments?.major || []),
435+
...(changelogComments?.minor || []),
436+
...(changelogComments?.patch || []),
437+
...(changelogComments?.none || []),
438+
];
439+
// Changelog should not mention pkg-2, pkg-3, pkg-4, or pkg-5 since they use file: protocol
440+
const commentTexts = allComments.map(c => c.comment).join(' ');
441+
expect(commentTexts).not.toContain('pkg-2');
442+
expect(commentTexts).not.toContain('pkg-3');
443+
expect(commentTexts).not.toContain('pkg-4');
444+
expect(commentTexts).not.toContain('pkg-5');
445+
});
446+
377447
it('bumps all packages and keeps change files with `keep-change-files` flag', async () => {
378448
const monorepo: RepoFixture['folders'] = {
379449
packages: {

src/__tests__/bump/bumpMinSemverRange.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ describe('bumpMinSemverRange', () => {
77
expect(result).toBe('*');
88
});
99

10+
it('preserves file: protocol with relative path', () => {
11+
const result = bumpMinSemverRange('1.0.0', 'file:../local-package');
12+
expect(result).toBe('file:../local-package');
13+
});
14+
15+
it('preserves file: protocol with absolute path', () => {
16+
const result = bumpMinSemverRange('1.0.0', 'file:/absolute/path/to/package');
17+
expect(result).toBe('file:/absolute/path/to/package');
18+
});
19+
1020
it('attaches ~ to semver range', () => {
1121
const result = bumpMinSemverRange('1.3.0', '~1.2.0');
1222
expect(result).toBe('~1.3.0');

src/bump/bumpMinSemverRange.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import semver from 'semver';
22
import { getWorkspaceRange } from '../packageManager/getWorkspaceRange';
33

44
export function bumpMinSemverRange(minVersion: string, semverRange: string): string {
5-
if (semverRange === '*') {
5+
if (semverRange === '*' || semverRange.startsWith('file:')) {
66
return semverRange;
77
}
88

0 commit comments

Comments
 (0)