yarn-plugin: add additional check during pack to confirm that all backstage versions have been replaced

Adds an additional check during pack which walks all the
dependencies in the manifest, and verifies that
there are no remaining `backstage:` versions.
I'm not aware of any realistic cases where the
code that does the replacement would be expected
to fail, but since a backstage:^ package in the
manifest will break the release, it seems prudent
to double check and fail fast to allow us to catch
unexpected results.

Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
This commit is contained in:
MT Lewis
2024-09-16 11:40:27 +01:00
parent 8c5c6b8c1a
commit bd32d5a999
3 changed files with 51 additions and 1 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'yarn-plugin-backstage': patch
---
Add additional check before packing workspace to verify that all backstage:^ versions have been removed.
@@ -28,6 +28,14 @@ jest.mock('@backstage/release-manifests', () => ({
name: '@backstage/core',
version: '3.2.1',
},
{
name: '@backstage/plugin-1',
version: '6.5.4',
},
{
name: '@backstage/plugin-2',
version: '9.8.7',
},
],
}),
}));
@@ -100,7 +108,29 @@ describe('beforeWorkspacePacking', () => {
await expect(() =>
beforeWorkspacePacking(makeWorkspace(result), result),
).rejects.toThrow();
).rejects.toThrow(/unexpected version range/i);
});
it(`throws an error if the final manifest unexpectedly contains backstage: versions`, async () => {
const result = {
name: 'test-package',
[dependencyType]: {
get ['@backstage/core']() {
return 'backstage:^';
},
set ['@backstage/core'](_value: unknown) {
// ignore the attempt to set the value to
// allow testing the validation logic at
// the end of the hook.
},
'@backstage/plugin-1': 'backstage:^',
'@backstage/plugin-2': 'backstage:^',
},
};
await expect(() =>
beforeWorkspacePacking(makeWorkspace(result), result),
).rejects.toThrow(/failed to replace all "backstage:" ranges/i);
});
it('converts backstage:^ versions to the corresponding package version prefixed by ^', async () => {
@@ -15,9 +15,13 @@
*/
import { Descriptor, Workspace, structUtils } from '@yarnpkg/core';
import { some } from 'lodash';
import { getCurrentBackstageVersion, getPackageVersion } from '../util';
import { PROTOCOL } from '../constants';
const hasBackstageVersion = (range: string) =>
structUtils.parseRange(range).protocol === PROTOCOL;
const getFinalDependencyType = (
dependencyType: string,
descriptor: Descriptor,
@@ -69,4 +73,15 @@ export const beforeWorkspacePacking = async (
)}`;
}
}
if (
some(
['dependencies', 'devDependencies', 'optionalDependencies'],
dependencyType => some(rawManifest[dependencyType], hasBackstageVersion),
)
) {
throw new Error(
`Failed to replace all "backstage:" ranges in manifest for ${rawManifest.name}`,
);
}
};