UNPKG

@typespec/compiler

Version:

TypeSpec Compiler Preview

42 lines 1.73 kB
// 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