Skip to content

Commit 0717c6a

Browse files
authored
feat(yarn): fallback to npm when COREPACK_NPM_REGISTRY is set (#339)
Yarn publishing its versions on its own was inconvenient for people using private npm mirrors, so it makes sense to offer a way to fallback to the npm store when requested. This diff changes the logic so that we use the `@yarnpkg/cli-dist` package when the `COREPACK_NPM_REGISTRY` variable is set. It should be backward-compatible, since the `registry` field is still the same.
1 parent adcd989 commit 0717c6a

File tree

4 files changed

+19
-2
lines changed

4 files changed

+19
-2
lines changed

config.json

+4
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@
143143
"versions": "tags"
144144
}
145145
},
146+
"npmRegistry": {
147+
"type": "npm",
148+
"package": "@yarnpkg/cli-dist"
149+
},
146150
"commands": {
147151
"use": [
148152
"yarn",

sources/Engine.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,10 @@ export class Engine {
156156
const ranges = Object.keys(definition.ranges);
157157
const tagRange = ranges[ranges.length - 1];
158158

159-
const tags = await corepackUtils.fetchAvailableTags(definition.ranges[tagRange].registry);
159+
const packageManagerSpec = definition.ranges[tagRange];
160+
const registry = corepackUtils.getRegistryFromPackageManagerSpec(packageManagerSpec);
161+
162+
const tags = await corepackUtils.fetchAvailableTags(registry);
160163
if (!Object.prototype.hasOwnProperty.call(tags, descriptor.range))
161164
throw new UsageError(`Tag not found (${descriptor.range})`);
162165

@@ -178,7 +181,10 @@ export class Engine {
178181
return {name: finalDescriptor.name, reference: finalDescriptor.range};
179182

180183
const versions = await Promise.all(Object.keys(definition.ranges).map(async range => {
181-
const versions = await corepackUtils.fetchAvailableVersions(definition.ranges[range].registry);
184+
const packageManagerSpec = definition.ranges[range];
185+
const registry = corepackUtils.getRegistryFromPackageManagerSpec(packageManagerSpec);
186+
187+
const versions = await corepackUtils.fetchAvailableVersions(registry);
182188
return versions.filter(version => semverUtils.satisfiesWithPrereleases(version, finalDescriptor.range));
183189
}));
184190

sources/corepackUtils.ts

+6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ import * as nodeUtils from './nodeUtils
1414
import * as npmRegistryUtils from './npmRegistryUtils';
1515
import {RegistrySpec, Descriptor, Locator, PackageManagerSpec} from './types';
1616

17+
export function getRegistryFromPackageManagerSpec(spec: PackageManagerSpec) {
18+
return process.env.COREPACK_NPM_REGISTRY
19+
? spec.npmRegistry ?? spec.registry
20+
: spec.registry;
21+
}
22+
1723
export async function fetchLatestStableVersion(spec: RegistrySpec): Promise<string> {
1824
switch (spec.type) {
1925
case `npm`: {

sources/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export interface PackageManagerSpec {
4747
url: string;
4848
bin: BinSpec | BinList;
4949
registry: RegistrySpec;
50+
npmRegistry?: NpmRegistrySpec;
5051
commands?: {
5152
use?: Array<string>;
5253
};

0 commit comments

Comments
 (0)