yarn-plugin: replace backstage:^ with ^ ranges when packing

Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
This commit is contained in:
MT Lewis
2024-04-16 21:45:07 +01:00
parent 038f851c28
commit 97ffd7ec18
3 changed files with 43 additions and 39 deletions
@@ -15,7 +15,7 @@
*/
import { Descriptor, Workspace, structUtils } from '@yarnpkg/core';
import { inferPackageVersion } from '../util';
import { getCurrentBackstageVersion, getPackageVersion } from '../util';
import { PROTOCOL } from '../constants';
const getFinalDependencyType = (
@@ -43,21 +43,34 @@ export const beforeWorkspacePacking = async (
'devDependencies',
'peerDependencies',
] as const) {
const backstageVersion = getCurrentBackstageVersion();
const entries = Array.from(
workspace.manifest.getForScope(dependencyType).values(),
).filter(descriptor => descriptor.range === `${PROTOCOL}^`);
).filter(descriptor => descriptor.range.startsWith(PROTOCOL));
for (const descriptor of entries) {
const ident = structUtils.stringifyIdent(descriptor);
const range = structUtils.parseRange(descriptor.range);
if (range.selector !== '^') {
throw new Error(
`Unexpected version range "${descriptor.range}" for dependency on "${ident}"`,
);
}
const finalDependencyType = getFinalDependencyType(
dependencyType,
descriptor,
workspace,
);
const ident = structUtils.stringifyIdent(descriptor);
rawManifest[finalDependencyType][ident] = await inferPackageVersion(
descriptor,
);
rawManifest[finalDependencyType][ident] = `^${await getPackageVersion(
structUtils.makeDescriptor(
descriptor,
`${PROTOCOL}${backstageVersion}`,
),
)}`;
}
}
};
@@ -22,7 +22,7 @@ import {
Resolver,
} from '@yarnpkg/core';
import { PROTOCOL } from '../constants';
import { inferBackstageVersion, inferPackageVersion } from '../util';
import { getCurrentBackstageVersion, getPackageVersion } from '../util';
export class BackstageResolver implements Resolver {
static protocol = PROTOCOL;
@@ -35,7 +35,7 @@ export class BackstageResolver implements Resolver {
bindDescriptor(descriptor: Descriptor): Descriptor {
return structUtils.makeDescriptor(
descriptor,
`${PROTOCOL}${inferBackstageVersion(descriptor)}`,
`${PROTOCOL}${getCurrentBackstageVersion()}`,
);
}
@@ -43,7 +43,7 @@ export class BackstageResolver implements Resolver {
return [
structUtils.makeLocator(
descriptor,
`npm:${await inferPackageVersion(descriptor)}`,
`npm:${await getPackageVersion(descriptor)}`,
),
];
}
+21 -30
View File
@@ -14,49 +14,40 @@
* limitations under the License.
*/
import { Descriptor, structUtils } from '@yarnpkg/core';
import { npath, xfs } from '@yarnpkg/fslib';
import { valid as semverValid } from 'semver';
import { getManifestByVersion } from '@backstage/release-manifests';
import { Descriptor, structUtils } from '@yarnpkg/core';
import { PROTOCOL } from './constants';
export const inferBackstageVersion = (descriptor: Descriptor) => {
export const getCurrentBackstageVersion = () => {
const backstageJson = xfs.readJsonSync(
npath.toPortablePath('./backstage.json'),
);
const backstageVersion = semverValid(backstageJson.version);
if (backstageVersion === null) {
throw new Error('Valid version string not found in backstage.json');
}
return backstageVersion;
};
export const getPackageVersion = async (descriptor: Descriptor) => {
const ident = structUtils.stringifyIdent(descriptor);
const range = structUtils.parseRange(descriptor.range);
if (range.protocol !== PROTOCOL) {
throw new Error(
`inferBackstageVersion called with unexpected protocol ${range.protocol}`,
);
throw new Error(`Unexpected ${range.protocol} range when packing`);
}
let selector = range.selector;
// For backstage:^ we look up the version from backstage.json
if (selector === `^`) {
const backstageJson = xfs.readJsonSync(
npath.toPortablePath('./backstage.json'),
);
selector = backstageJson.version;
if (!semverValid(range.selector)) {
throw new Error(`Missing backstage version in range ${descriptor.range}`);
}
if (!semverValid(selector)) {
throw new Error(
`Invalid "backstage:" version string found for ${structUtils.stringifyIdent(
descriptor,
)}. Version must be either "backstage:*" or "backstage:<version>", where version is a single Backstage release version.`,
);
}
return selector;
};
export const inferPackageVersion = async (descriptor: Descriptor) => {
const ident = structUtils.stringifyIdent(descriptor);
const backstageVersion = inferBackstageVersion(descriptor);
const manifest = await getManifestByVersion({
version: backstageVersion,
version: range.selector,
});
const manifestEntry = manifest.packages.find(