@typespec/compiler
Version:
TypeSpec Compiler Preview
42 lines • 1.73 kB
JavaScript
// Helpers to access the npm registry api https://github.com/npm/registry/blob/main/docs/REGISTRY-API.md#package-endpoints
import { createHash } from "crypto";
import { Readable } from "stream";
import { extract as tarX } from "tar/extract";
const registry = `https://registry.npmjs.org`;
export async function fetchPackageManifest(packageName, version) {
const url = `${registry}/${packageName}/${version}`;
const res = await fetch(url);
return await res.json();
}
export function fetchLatestPackageManifest(packageName) {
return fetchPackageManifest(packageName, "latest");
}
export async function downloadPackageVersion(packageName, version, dest) {
const manifest = await fetchPackageManifest(packageName, version);
return downloadAndExtractTarball(manifest.dist.tarball, dest);
}
export async function downloadAndExtractPackage(manifest, dest, hashAlgorithm = "sha512") {
return downloadAndExtractTarball(manifest.dist.tarball, dest, hashAlgorithm);
}
async function downloadAndExtractTarball(url, dest, hashAlgorithm = "sha512") {
const res = await fetch(url);
const tarballStream = Readable.fromWeb(res.body);
const hash = tarballStream.pipe(createHash(hashAlgorithm));
const extractor = tarX({
strip: 1,
cwd: dest,
});
const p = new Promise((resolve, reject) => {
extractor.on("end", () => {
resolve();
});
extractor.on("error", (er) => {
reject(er);
});
tarballStream.on("error", (er) => reject(er));
});
tarballStream.pipe(extractor);
await p;
return { dest, hash: { algorithm: hashAlgorithm, value: hash.digest("hex") } };
}
//# sourceMappingURL=npm-registry-utils.js.map