yarn-plugin: replace backstage:^ with ^ ranges when packing
Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
This commit is contained in:
@@ -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)}`,
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user