Skip to content

Commit 14b8a01

Browse files
authored
chore: fix tests on custom registry (#445)
1 parent d267753 commit 14b8a01

File tree

1 file changed

+62
-70
lines changed

1 file changed

+62
-70
lines changed

tests/_registryServer.mjs

Lines changed: 62 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -36,87 +36,79 @@ const mockPackageTarGz = gzipSync(Buffer.concat([
3636
Buffer.alloc(1024),
3737
]));
3838
const shasum = createHash(`sha1`).update(mockPackageTarGz).digest(`hex`);
39-
39+
const integrity = `sha512-${createHash(`sha512`).update(mockPackageTarGz).digest(`base64`)}`;
40+
41+
const registry = {
42+
__proto__: null,
43+
yarn: [`1.9998.9999`],
44+
pnpm: [`1.9998.9999`],
45+
// eslint-disable-next-line @typescript-eslint/naming-convention
46+
'@yarnpkg/cli-dist': [`5.9999.9999`],
47+
customPkgManager: [`1.0.0`],
48+
};
49+
50+
function generateVersionMetadata(packageName, version) {
51+
return {
52+
name: packageName,
53+
version,
54+
bin: {
55+
[packageName]: `./bin/${packageName}.js`,
56+
},
57+
dist: {
58+
integrity,
59+
shasum,
60+
size: mockPackageTarGz.length,
61+
noattachment: false,
62+
tarball: `${process.env.COREPACK_NPM_REGISTRY}/${packageName}/-/${packageName}-${version}.tgz`,
63+
},
64+
};
65+
}
4066

4167
const server = createServer((req, res) => {
4268
const auth = req.headers.authorization;
4369
if (!auth?.startsWith(`Bearer `) || Buffer.from(auth.slice(`Bearer `.length), `base64`).toString() !== `user:pass`) {
44-
res.statusCode = 401;
45-
res.end(`Unauthorized`);
70+
res.writeHead(401).end(`Unauthorized`);
4671
return;
4772
}
48-
switch (req.url) {
49-
case `/yarn`: {
50-
res.end(JSON.stringify({"dist-tags": {
51-
latest: `1.9998.9999`,
52-
}, versions: {'1.9998.9999': {
53-
dist: {
54-
shasum,
55-
size: mockPackageTarGz.length,
56-
noattachment: false,
57-
tarball: `${process.env.COREPACK_NPM_REGISTRY}/yarn.tgz`,
58-
},
59-
}}}));
60-
break;
61-
}
6273

63-
case `/pnpm`: {
64-
res.end(JSON.stringify({"dist-tags": {
65-
latest: `1.9998.9999`,
66-
}, versions: {'1.9998.9999': {
67-
dist: {
68-
shasum,
69-
size: mockPackageTarGz.length,
70-
noattachment: false,
71-
tarball: `${process.env.COREPACK_NPM_REGISTRY}/pnpm/-/pnpm-1.9998.9999.tgz`,
72-
},
73-
}}}));
74-
break;
75-
}
74+
let slashPosition = req.url.indexOf(`/`, 1);
75+
if (req.url.charAt(1) === `@`) slashPosition = req.url.indexOf(`/`, slashPosition + 1);
7676

77-
case `/@yarnpkg/cli-dist`: {
77+
const packageName = req.url.slice(1, slashPosition === -1 ? undefined : slashPosition);
78+
if (packageName in registry) {
79+
if (req.url === `/${packageName}`) {
80+
// eslint-disable-next-line @typescript-eslint/naming-convention
7881
res.end(JSON.stringify({"dist-tags": {
79-
latest: `5.9999.9999`,
80-
}, versions: {'5.9999.9999': {
81-
bin: {
82-
yarn: `./bin/yarn.js`,
83-
yarnpkg: `./bin/yarn.js`,
84-
},
85-
dist: {
86-
shasum,
87-
size: mockPackageTarGz.length,
88-
noattachment: false,
89-
tarball: `${process.env.COREPACK_NPM_REGISTRY}/yarn.tgz`,
90-
},
91-
}}}));
92-
break;
82+
latest: registry[packageName].at(-1),
83+
}, versions: Object.fromEntries(registry[packageName].map(version =>
84+
[version, generateVersionMetadata(packageName, version)],
85+
))}));
86+
return;
9387
}
94-
95-
case `/customPkgManager`: {
96-
res.end(JSON.stringify({"dist-tags": {
97-
latest: `1.0.0`,
98-
}, versions: {'1.0.0': {
99-
bin: {
100-
customPkgManager: `./bin/customPkgManager.js`,
101-
},
102-
dist: {
103-
shasum,
104-
size: mockPackageTarGz.length,
105-
noattachment: false,
106-
tarball: `${process.env.COREPACK_NPM_REGISTRY}/customPkgManager/-/customPkgManager-1.0.0.tgz`,
107-
},
108-
}}}));
109-
break;
88+
const isDownloadingRequest = req.url.slice(packageName.length + 1, packageName.length + 4) === `/-/`;
89+
let version;
90+
if (isDownloadingRequest) {
91+
const match = /^(.+)-(.+)\.tgz$/.exec(req.url.slice(packageName.length + 4));
92+
if (match?.[1] === packageName) {
93+
version = match[2];
94+
}
95+
} else {
96+
version = req.url.slice(packageName.length + 2);
11097
}
111-
112-
case `/pnpm/-/pnpm-1.9998.9999.tgz`:
113-
case `/yarn.tgz`:
114-
case `/customPkgManager/-/customPkgManager-1.0.0.tgz`:
115-
res.end(mockPackageTarGz);
116-
break;
117-
118-
default:
119-
throw new Error(`unsupported request`, {cause: req.url});
98+
if (version === `latest`) version = registry[packageName].at(-1);
99+
if (registry[packageName].includes(version)) {
100+
res.end(
101+
isDownloadingRequest ?
102+
mockPackageTarGz :
103+
JSON.stringify(generateVersionMetadata(packageName, version)),
104+
);
105+
} else {
106+
res.writeHead(404).end(`Not Found`);
107+
throw new Error(`unsupported request`, {cause: {url: req.url, packageName, version, isDownloadingRequest}});
108+
}
109+
} else {
110+
res.writeHead(500).end(`Internal Error`);
111+
throw new Error(`unsupported request`, {cause: {url: req.url, packageName}});
120112
}
121113
}).listen(0, `localhost`);
122114

0 commit comments

Comments
 (0)