diff --git a/.github/workflows/publish-registry.yml b/.github/workflows/publish-registry.yml index b808b4a3b7..e0a8a17fe3 100644 --- a/.github/workflows/publish-registry.yml +++ b/.github/workflows/publish-registry.yml @@ -16,14 +16,11 @@ jobs: - run: yarn build - name: Parse declarations run: yarn workspace @definitelytyped/publisher parse - # https://github.com/microsoft/types-publisher/commit/7fa7f9c3cbd0c8bd6131398b4fea1faf9baf9665#diff-c4063aea1f6d1c21c51407252387627e9a506c735f8dbd58fbf82ae821fae128R170 - uses: actions/cache@v3 with: - path: packages/publisher/cache/ + path: packages/utils/cache/ key: cache-${{ github.run_id }} restore-keys: cache- - - name: Calculate versions - run: yarn workspace @definitelytyped/publisher calculate-versions - name: Publish registry run: yarn workspace @definitelytyped/publisher publish-registry env: diff --git a/package.json b/package.json index 50b1052c50..703d67b994 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,6 @@ "ts-jest": "^25.2.1", "tslint": "^6.1.2", "tslint-microsoft-contrib": "^6.2.0", - "typescript": "^4.5.5" + "typescript": "^4.7.4" } } diff --git a/packages/definitions-parser/package.json b/packages/definitions-parser/package.json index 4d585416a0..87a782383b 100644 --- a/packages/definitions-parser/package.json +++ b/packages/definitions-parser/package.json @@ -24,10 +24,12 @@ "@definitelytyped/utils": "^0.0.118", "@types/node": "^14.14.35", "fs-extra": "^9.1.0", + "pacote": "^13.6.1", "semver": "^7.3.7" }, "devDependencies": { - "@types/fs-extra": "^9.0.8" + "@types/fs-extra": "^9.0.8", + "@types/pacote": "^11.1.5" }, "peerDependencies": { "typescript": "*" diff --git a/packages/definitions-parser/src/check-parse-results.ts b/packages/definitions-parser/src/check-parse-results.ts index 57a6cb38f9..7151167dc1 100644 --- a/packages/definitions-parser/src/check-parse-results.ts +++ b/packages/definitions-parser/src/check-parse-results.ts @@ -1,37 +1,13 @@ import { ParseDefinitionsOptions } from "./get-definitely-typed"; import { TypingsData, AllPackages, formatTypingVersion } from "./packages"; -import { - assertDefined, - mapDefined, - nAtATime, - FS, - logger, - writeLog, - Logger, - UncachedNpmInfoClient, - NpmInfoRawVersions, - NpmInfoVersion, - max, - min, -} from "@definitelytyped/utils"; +import { mapDefined, nAtATime, FS, logger, writeLog, Logger, cacheDir, max, min } from "@definitelytyped/utils"; +import * as pacote from "pacote"; import * as semver from "semver"; -export async function checkParseResults( - includeNpmChecks: false, - dt: FS, - options: ParseDefinitionsOptions -): Promise; -export async function checkParseResults( - includeNpmChecks: true, - dt: FS, - options: ParseDefinitionsOptions, - client: UncachedNpmInfoClient -): Promise; export async function checkParseResults( includeNpmChecks: boolean, dt: FS, - options: ParseDefinitionsOptions, - client?: UncachedNpmInfoClient + options: ParseDefinitionsOptions ): Promise { const allPackages = await AllPackages.read(dt); const [log, logResult] = logger(); @@ -57,7 +33,7 @@ export async function checkParseResults( await nAtATime( 10, allPackages.allTypings(), - (pkg) => checkNpm(pkg, log, dependedOn, client!), + (pkg) => checkNpm(pkg, log, dependedOn), options.progress ? { name: "Checking for typed packages...", @@ -120,14 +96,16 @@ Check the path mappings for [${Array.from(allPackages.allDependencyTypings(pkg)) async function checkNpm( { major, minor, name, libraryName, projectName, contributors }: TypingsData, log: Logger, - dependedOn: ReadonlySet, - client: UncachedNpmInfoClient + dependedOn: ReadonlySet ): Promise { if (notNeededExceptions.has(name)) { return; } - const info = await client.fetchRawNpmInfo(name); // Gets info for the real package, not the @types package + const info = await pacote.packument(name, { cache: cacheDir, fullMetadata: true }).catch((reason) => { + if (reason.code !== "E404") throw reason; + return undefined; + }); // Gets info for the real package, not the @types package if (!info) { return; } @@ -169,13 +147,12 @@ async function checkNpm( } } -export async function packageHasTypes(packageName: string, client: UncachedNpmInfoClient): Promise { - const info = assertDefined(await client.fetchRawNpmInfo(packageName)); - return versionHasTypes(info.versions[info["dist-tags"].latest]); +export async function packageHasTypes(packageName: string): Promise { + return versionHasTypes(await pacote.manifest(packageName, { cache: cacheDir, fullMetadata: true })); } function getRegularVersions( - versions: NpmInfoRawVersions + versions: pacote.Packument["versions"] ): readonly { readonly version: semver.SemVer; readonly hasTypes: boolean }[] { return Object.entries(versions).map(([versionString, info]) => ({ version: new semver.SemVer(versionString), @@ -183,7 +160,7 @@ function getRegularVersions( })); } -function versionHasTypes(info: NpmInfoVersion): boolean { +function versionHasTypes(info: pacote.Manifest): boolean { return "types" in info || "typings" in info; } diff --git a/packages/definitions-parser/src/git.ts b/packages/definitions-parser/src/git.ts index 4c7bf9d177..8e9feccfa1 100644 --- a/packages/definitions-parser/src/git.ts +++ b/packages/definitions-parser/src/git.ts @@ -17,9 +17,9 @@ import { FS, consoleLogger, assertDefined, - UncachedNpmInfoClient, - NpmInfo, + cacheDir, } from "@definitelytyped/utils"; +import * as pacote from "pacote"; import * as semver from "semver"; import { getAffectedPackages } from "./get-affected-packages"; @@ -96,11 +96,8 @@ export async function getAffectedPackagesFromDiff( const allPackages = await AllPackages.read(dt); const diffs = await gitDiff(consoleLogger.info, definitelyTypedPath); if (diffs.find((d) => d.file === "notNeededPackages.json")) { - const uncached = new UncachedNpmInfoClient(); for (const deleted of getNotNeededPackages(allPackages, diffs)) { - const source = await uncached.fetchNpmInfo(deleted.libraryName); // eg @babel/parser - const typings = await uncached.fetchNpmInfo(deleted.fullNpmName); // eg @types/babel__parser - checkNotNeededPackage(deleted, source, typings); + checkNotNeededPackage(deleted); } } @@ -133,30 +130,30 @@ export async function getAffectedPackagesFromDiff( * 2. asOfVersion must be newer than `@types/name@latest` on npm * 3. `name@asOfVersion` must exist on npm */ -export function checkNotNeededPackage( - unneeded: NotNeededPackage, - source: NpmInfo | undefined, - typings: NpmInfo | undefined -) { - source = assertDefined( - source, - `The entry for ${unneeded.fullNpmName} in notNeededPackages.json has +export async function checkNotNeededPackage(unneeded: NotNeededPackage) { + await pacote.manifest(`${unneeded.libraryName}@${unneeded.version}`, { cache: cacheDir }).catch((reason) => { + throw reason.code === "E404" + ? new Error( + `The entry for ${unneeded.fullNpmName} in notNeededPackages.json has "libraryName": "${unneeded.libraryName}", but there is no npm package with this name. -Unneeded packages have to be replaced with a package on npm.` - ); - typings = assertDefined(typings, `Unexpected error: @types package not found for ${unneeded.fullNpmName}`); - const latestTypings = assertDefined( - typings.distTags.get("latest"), - `Unexpected error: ${unneeded.fullNpmName} is missing the "latest" tag.` - ); +Unneeded packages have to be replaced with a package on npm.`, + { cause: reason } + ) + : reason.code === "ETARGET" + ? new Error(`The specified version ${unneeded.version} of ${unneeded.libraryName} is not on npm.`, { + cause: reason, + }) + : reason; + }); // eg @babel/parser + const typings = await pacote.manifest(unneeded.fullNpmName, { cache: cacheDir }).catch((reason) => { + throw reason.code === "E404" + ? new Error(`Unexpected error: @types package not found for ${unneeded.fullNpmName}`, { cause: reason }) + : reason; + }); // eg @types/babel__parser assert( - semver.gt(unneeded.version, latestTypings), + semver.gt(unneeded.version, typings.version), `The specified version ${unneeded.version} of ${unneeded.libraryName} must be newer than the version -it is supposed to replace, ${latestTypings} of ${unneeded.fullNpmName}.` - ); - assert( - source.versions.has(String(unneeded.version)), - `The specified version ${unneeded.version} of ${unneeded.libraryName} is not on npm.` +it is supposed to replace, ${typings.version} of ${unneeded.fullNpmName}.` ); } diff --git a/packages/definitions-parser/test/git.test.ts b/packages/definitions-parser/test/git.test.ts index ce7974f2b1..2153e0cd2c 100644 --- a/packages/definitions-parser/test/git.test.ts +++ b/packages/definitions-parser/test/git.test.ts @@ -1,4 +1,5 @@ -import { NpmInfo } from "@definitelytyped/utils"; +import * as util from "util"; +import * as pacote from "pacote"; import { createTypingsVersionRaw, testo } from "./utils"; import { GitDiff, getNotNeededPackages, checkNotNeededPackage } from "../src/git"; import { NotNeededPackage, TypesDataFile, AllPackages } from "../src/packages"; @@ -65,94 +66,62 @@ testo({ // TODO: Test with dependents, etc etc }); -const empty: NpmInfo = { - homepage: "", - distTags: new Map(), - versions: new Map(), - time: new Map(), -}; +jest.mock("pacote", () => ({ + async manifest(spec: string, opts: pacote.Options) { + switch (spec) { + case "jest@4.0.0": // Older than the @types/jest package. + case "jest@50.0.0": // The same version as the @types/jest package. + case "jest@100.0.0": // Newer than the @types/jest package. + // These versions exist (don't throw). + return; + case "jest@999.0.0": // A nonexistent version of the replacement package. + // eslint-disable-next-line no-throw-literal + throw { code: "ETARGET" }; + case "@types/jest": // The @types/jest package. + return { version: "50.0.0" }; + case "nonexistent@100.0.0": // A nonexistent replacement package. + case "@types/nonexistent": // A nonexistent @types package. + // eslint-disable-next-line no-throw-literal + throw { code: opts.offline ? "ENOTCACHED" : "E404" }; + } + throw new Error(`Unexpected npm registry fetch: ${util.inspect(spec)}`); + }, +})); + +const newerReplacement = new NotNeededPackage("jest", "jest", "100.0.0"); +const olderReplacement = new NotNeededPackage("jest", "jest", "4.0.0"); +const sameVersion = new NotNeededPackage("jest", "jest", "50.0.0"); +const nonexistentReplacementVersion = new NotNeededPackage("jest", "jest", "999.0.0"); +const nonexistentReplacementPackage = new NotNeededPackage("jest", "nonexistent", "100.0.0"); +const nonexistentTypesPackage = new NotNeededPackage("nonexistent", "jest", "100.0.0"); + testo({ missingSource() { - expect(() => checkNotNeededPackage(jestNotNeeded[0], undefined, empty)).toThrow( + return expect(checkNotNeededPackage(nonexistentReplacementPackage)).rejects.toThrow( "The entry for @types/jest in notNeededPackages.json" ); }, missingTypings() { - expect(() => checkNotNeededPackage(jestNotNeeded[0], empty, undefined)).toThrow( - "@types package not found for @types/jest" - ); - }, - missingTypingsLatest() { - expect(() => checkNotNeededPackage(jestNotNeeded[0], empty, empty)).toThrow( - '@types/jest is missing the "latest" tag' + return expect(checkNotNeededPackage(nonexistentTypesPackage)).rejects.toThrow( + "@types package not found for @types/nonexistent" ); }, deprecatedSameVersion() { - expect(() => { - checkNotNeededPackage(jestNotNeeded[0], empty, { - homepage: "jest.com", - distTags: new Map([["latest", "100.0.0"]]), - versions: new Map(), - time: new Map([["modified", ""]]), - }); - }).toThrow(`The specified version 100.0.0 of jest must be newer than the version -it is supposed to replace, 100.0.0 of @types/jest.`); + return expect(checkNotNeededPackage(sameVersion)).rejects + .toThrow(`The specified version 50.0.0 of jest must be newer than the version +it is supposed to replace, 50.0.0 of @types/jest.`); }, deprecatedOlderVersion() { - expect(() => { - checkNotNeededPackage(jestNotNeeded[0], empty, { - homepage: "jest.com", - distTags: new Map([["latest", "999.0.0"]]), - versions: new Map(), - time: new Map([["modified", ""]]), - }); - }).toThrow(`The specified version 100.0.0 of jest must be newer than the version -it is supposed to replace, 999.0.0 of @types/jest.`); + return expect(checkNotNeededPackage(olderReplacement)).rejects + .toThrow(`The specified version 4.0.0 of jest must be newer than the version +it is supposed to replace, 50.0.0 of @types/jest.`); }, missingNpmVersion() { - expect(() => { - checkNotNeededPackage(jestNotNeeded[0], empty, { - homepage: "jest.com", - distTags: new Map([["latest", "4.0.0"]]), - versions: new Map(), - time: new Map([["modified", ""]]), - }); - }).toThrow("The specified version 100.0.0 of jest is not on npm."); - }, - olderNpmVersion() { - expect(() => - checkNotNeededPackage( - jestNotNeeded[0], - { - homepage: "jest.com", - distTags: new Map(), - versions: new Map([["50.0.0", {}]]), - time: new Map([["modified", ""]]), - }, - { - homepage: "jest.com", - distTags: new Map([["latest", "4.0.0"]]), - versions: new Map(), - time: new Map([["modified", ""]]), - } - ) - ).toThrow("The specified version 100.0.0 of jest is not on npm."); + return expect(checkNotNeededPackage(nonexistentReplacementVersion)).rejects.toThrow( + "The specified version 999.0.0 of jest is not on npm." + ); }, ok() { - checkNotNeededPackage( - jestNotNeeded[0], - { - homepage: "jest.com", - distTags: new Map(), - versions: new Map([["100.0.0", {}]]), - time: new Map([["modified", ""]]), - }, - { - homepage: "jest.com", - distTags: new Map([["latest", "4.0.0"]]), - versions: new Map(), - time: new Map([["modified", ""]]), - } - ); + return checkNotNeededPackage(newerReplacement); }, }); diff --git a/packages/perf/src/measure/measurePerf.ts b/packages/perf/src/measure/measurePerf.ts index 31c2d7a090..02772119c1 100644 --- a/packages/perf/src/measure/measurePerf.ts +++ b/packages/perf/src/measure/measurePerf.ts @@ -260,7 +260,7 @@ function getLatestTypesVersionForTypeScriptVersion( ): string | undefined { const tsVersion = new semver.SemVer(typeScriptVersion); for (let i = typesVersions.length - 1; i > 0; i--) { - if (semver.gte(tsVersion, `${typesVersions[i]}.0-`)) { + if (semver.gte(tsVersion, `${typesVersions[i]}.0-0`)) { return typesVersions[i]; } } diff --git a/packages/publisher/.gitignore b/packages/publisher/.gitignore index 73ed0376e3..8ad31c6a02 100644 --- a/packages/publisher/.gitignore +++ b/packages/publisher/.gitignore @@ -1,5 +1,4 @@ bin/ -cache/ data/ logs/ node_modules/ diff --git a/packages/publisher/package.json b/packages/publisher/package.json index 2242fabe6e..0ff644b3ff 100644 --- a/packages/publisher/package.json +++ b/packages/publisher/package.json @@ -21,6 +21,7 @@ "hh-mm-ss": "^1.2.0", "longjohn": "^0.2.11", "oboe": "^2.1.3", + "pacote": "^13.6.1", "semver": "^7.3.7", "source-map-support": "^0.4.0", "typescript": "^4.1.0", @@ -31,6 +32,7 @@ "@types/hh-mm-ss": "^1.2.1", "@types/mz": "^0.0.31", "@types/oboe": "^2.0.28", + "@types/pacote": "^11.1.5", "@types/source-map-support": "^0.4.0", "@types/yargs": "^15.0.4" }, diff --git a/packages/publisher/src/calculate-versions.ts b/packages/publisher/src/calculate-versions.ts index 24851d7b74..baef5ee5c6 100644 --- a/packages/publisher/src/calculate-versions.ts +++ b/packages/publisher/src/calculate-versions.ts @@ -3,53 +3,38 @@ import { defaultLocalOptions, defaultRemoteOptions } from "./lib/common"; import { ChangedPackages, ChangedPackagesJson, ChangedTypingJson, versionsFilename } from "./lib/versions"; import { getDefinitelyTyped, AllPackages, NotNeededPackage, writeDataFile } from "@definitelytyped/definitions-parser"; import { - assertDefined, mapDefinedAsync, logUncaughtErrors, loggerWithErrors, FS, LoggerWithErrors, - UncachedNpmInfoClient, - withNpmCache, - CachedNpmInfoClient, + cacheDir, } from "@definitelytyped/utils"; import { fetchTypesPackageVersionInfo } from "@definitelytyped/retag"; -import { cacheDirPath } from "./lib/settings"; +import * as pacote from "pacote"; if (!module.parent) { const log = loggerWithErrors()[0]; logUncaughtErrors(async () => calculateVersions( await getDefinitelyTyped(process.env.GITHUB_ACTIONS ? defaultRemoteOptions : defaultLocalOptions, log), - new UncachedNpmInfoClient(), log ) ); } -export default async function calculateVersions( - dt: FS, - uncachedClient: UncachedNpmInfoClient, - log: LoggerWithErrors -): Promise { +export default async function calculateVersions(dt: FS, log: LoggerWithErrors): Promise { log.info("=== Calculating versions ==="); - return withNpmCache( - uncachedClient, - async (client) => { - log.info("* Reading packages..."); - const packages = await AllPackages.read(dt); - return computeAndSaveChangedPackages(packages, log, client); - }, - cacheDirPath - ); + log.info("* Reading packages..."); + const packages = await AllPackages.read(dt); + return computeAndSaveChangedPackages(packages, log); } async function computeAndSaveChangedPackages( allPackages: AllPackages, - log: LoggerWithErrors, - client: CachedNpmInfoClient + log: LoggerWithErrors ): Promise { - const cp = await computeChangedPackages(allPackages, log, client); + const cp = await computeChangedPackages(allPackages, log); const json: ChangedPackagesJson = { changedTypings: cp.changedTypings.map( ({ pkg: { id }, version, latestVersion }): ChangedTypingJson => ({ id, version, latestVersion }) @@ -60,36 +45,41 @@ async function computeAndSaveChangedPackages( return cp; } -async function computeChangedPackages( - allPackages: AllPackages, - log: LoggerWithErrors, - client: CachedNpmInfoClient -): Promise { +async function computeChangedPackages(allPackages: AllPackages, log: LoggerWithErrors): Promise { log.info("# Computing changed packages..."); const changedTypings = await mapDefinedAsync(allPackages.allTypings(), async (pkg) => { - const { version, needsPublish } = await fetchTypesPackageVersionInfo(pkg, client, /*publish*/ true, log); + const { version, needsPublish } = await fetchTypesPackageVersionInfo(pkg, /*publish*/ true, log); if (needsPublish) { log.info(`Need to publish: ${pkg.desc}@${version}`); for (const { name } of pkg.packageJsonDependencies) { - assertDefined( - await client.fetchAndCacheNpmInfo(name), - `'${pkg.name}' depends on '${name}' which does not exist on npm. All dependencies must exist.` - ); + // Assert that dependencies exist on npm. + // Also checked when we install the dependencies, in dtslint-runner. + await pacote.manifest(name, { cache: cacheDir }).catch((reason) => { + throw reason.code === "E404" + ? new Error( + `'${pkg.name}' depends on '${name}' which does not exist on npm. All dependencies must exist.`, + { cause: reason } + ) + : reason; + }); } const latestVersion = pkg.isLatest ? undefined - : (await fetchTypesPackageVersionInfo(allPackages.getLatest(pkg), client, /*publish*/ true)).version; + : (await fetchTypesPackageVersionInfo(allPackages.getLatest(pkg), /*publish*/ true)).version; return { pkg, version, latestVersion }; } return undefined; }); log.info("# Computing deprecated packages..."); const changedNotNeededPackages = await mapDefinedAsync(allPackages.allNotNeeded(), async (pkg) => { - if (!(await isAlreadyDeprecated(pkg, client, log))) { - assertDefined( - await client.fetchAndCacheNpmInfo(pkg.libraryName), - `To deprecate '@types/${pkg.name}', '${pkg.libraryName}' must exist on npm.` - ); + if (!(await isAlreadyDeprecated(pkg, log))) { + // Assert that dependencies (i.e. the replacement package) exist on npm. + // Also checked in checkNotNeededPackage(). + await pacote.manifest(pkg.libraryName, { cache: cacheDir }).catch((reason) => { + throw reason.code === "E404" + ? new Error(`To deprecate '@types/${pkg.name}', '${pkg.libraryName}' must exist on npm.`, { cause: reason }) + : reason; + }); log.info(`To be deprecated: ${pkg.name}`); return pkg; } @@ -98,19 +88,13 @@ async function computeChangedPackages( return { changedTypings, changedNotNeededPackages }; } -async function isAlreadyDeprecated( - pkg: NotNeededPackage, - client: CachedNpmInfoClient, - log: LoggerWithErrors -): Promise { - const cachedInfo = client.getNpmInfoFromCache(pkg.fullNpmName); - let latestVersion = cachedInfo && assertDefined(cachedInfo.distTags.get("latest")); - let latestVersionInfo = cachedInfo && latestVersion && assertDefined(cachedInfo.versions.get(latestVersion)); - if (!latestVersionInfo || !latestVersionInfo.deprecated) { - log.info(`Version info not cached for deprecated package ${pkg.desc}`); - const info = assertDefined(await client.fetchAndCacheNpmInfo(pkg.fullNpmName)); - latestVersion = assertDefined(info.distTags.get("latest")); - latestVersionInfo = assertDefined(info.versions.get(latestVersion)); - } - return !!latestVersionInfo.deprecated; +async function isAlreadyDeprecated(pkg: NotNeededPackage, log: LoggerWithErrors): Promise { + const offline = await pacote.manifest(pkg.fullNpmName, { cache: cacheDir, offline: true }).catch((reason) => { + if (reason.code !== "ENOTCACHED") throw reason; + return undefined; + }); + if (offline?.deprecated) return offline.deprecated; + log.info(`Version info not cached for deprecated package ${pkg.desc}`); + const online = await pacote.manifest(pkg.fullNpmName, { cache: cacheDir, preferOnline: true }); + return online.deprecated; } diff --git a/packages/publisher/src/crawl-npm.ts b/packages/publisher/src/crawl-npm.ts index 3e54ebc18e..1d59780553 100644 --- a/packages/publisher/src/crawl-npm.ts +++ b/packages/publisher/src/crawl-npm.ts @@ -6,7 +6,6 @@ import { logUncaughtErrors, ProgressBar, strProgress, - UncachedNpmInfoClient, npmRegistry, } from "@definitelytyped/utils"; import { defaultLocalOptions } from "./lib/common"; @@ -20,11 +19,10 @@ if (!module.parent) { async function main(options: ParseDefinitionsOptions): Promise { const all = await allNpmPackages(); await writeDataFile("all-npm-packages.json", all); - const client = new UncachedNpmInfoClient(); const allTyped = await filterNAtATimeOrdered( 10, all, - (pkg) => packageHasTypes(pkg, client), + (pkg) => packageHasTypes(pkg), options.progress ? { name: "Checking for types...", diff --git a/packages/publisher/src/full.ts b/packages/publisher/src/full.ts index 4c8d9ed4e7..9274001241 100644 --- a/packages/publisher/src/full.ts +++ b/packages/publisher/src/full.ts @@ -6,14 +6,7 @@ import { clean } from "./clean"; import generatePackages from "./generate-packages"; import publishPackages from "./publish-packages"; import { getDefinitelyTyped, parseDefinitions, ParseDefinitionsOptions } from "@definitelytyped/definitions-parser"; -import { - Fetcher, - logUncaughtErrors, - loggerWithErrors, - LoggerWithErrors, - assertDefined, - UncachedNpmInfoClient, -} from "@definitelytyped/utils"; +import { Fetcher, logUncaughtErrors, loggerWithErrors, LoggerWithErrors, assertDefined } from "@definitelytyped/utils"; import { numberOfOsProcesses } from "./util/util"; import { defaultLocalOptions } from "./lib/common"; @@ -35,7 +28,6 @@ export default async function full( options: ParseDefinitionsOptions, log: LoggerWithErrors ): Promise { - const infoClient = new UncachedNpmInfoClient(); clean(); const dt = await getDefinitelyTyped(options, log); const allPackages = await parseDefinitions( @@ -45,7 +37,7 @@ export default async function full( : undefined, log ); - const changedPackages = await calculateVersions(dt, infoClient, log); + const changedPackages = await calculateVersions(dt, log); await generatePackages(dt, allPackages, changedPackages); await publishPackages(changedPackages, dry, githubAccessToken, fetcher); } diff --git a/packages/publisher/src/generate-packages.ts b/packages/publisher/src/generate-packages.ts index 5f2848895c..d7422279a2 100644 --- a/packages/publisher/src/generate-packages.ts +++ b/packages/publisher/src/generate-packages.ts @@ -1,11 +1,10 @@ import { makeTypesVersionsForPackageJson } from "@definitelytyped/header-parser"; -import assert = require("assert"); import { emptyDir, mkdir, mkdirp, readFileSync } from "fs-extra"; import path = require("path"); import yargs = require("yargs"); import { defaultLocalOptions } from "./lib/common"; -import { outputDirPath, sourceBranch, cacheDirPath } from "./lib/settings"; +import { outputDirPath, sourceBranch } from "./lib/settings"; import { assertNever, joinPaths, @@ -17,10 +16,8 @@ import { writeLog, writeFile, Logger, + cacheDir, writeTgz, - withNpmCache, - UncachedNpmInfoClient, - CachedNpmInfoClient, } from "@definitelytyped/utils"; import { getDefinitelyTyped, @@ -34,6 +31,7 @@ import { License, formatTypingVersion, } from "@definitelytyped/definitions-parser"; +import * as pacote from "pacote"; import { readChangedPackages, ChangedPackages } from "./lib/versions"; import { outputDirectory } from "./util/util"; import { skipBadPublishes } from "./lib/npm"; @@ -70,16 +68,10 @@ export default async function generatePackages( log(` * ${pkg.desc}`); } log("## Generating deprecated packages"); - await withNpmCache( - new UncachedNpmInfoClient(), - async (client) => { - for (const pkg of changedPackages.changedNotNeededPackages) { - log(` * ${pkg.libraryName}`); - await generateNotNeededPackage(pkg, client, log); - } - }, - cacheDirPath - ); + for (const pkg of changedPackages.changedNotNeededPackages) { + log(` * ${pkg.libraryName}`); + await generateNotNeededPackage(pkg, log); + } await writeLog("package-generator.md", logResult()); } async function generateTypingPackage( @@ -100,14 +92,9 @@ async function generateTypingPackage( ); } -async function generateNotNeededPackage( - pkg: NotNeededPackage, - client: CachedNpmInfoClient, - log: Logger -): Promise { - pkg = skipBadPublishes(pkg, client, log); - const info = await client.fetchAndCacheNpmInfo(pkg.libraryName); - assert(info); +async function generateNotNeededPackage(pkg: NotNeededPackage, log: Logger): Promise { + pkg = await skipBadPublishes(pkg, log); + const info = await pacote.manifest(pkg.libraryName, { cache: cacheDir, fullMetadata: true }); const readme = `This is a stub types definition for ${getFullNpmName(pkg.name)} (${info.homepage}).\n ${pkg.libraryName} provides its own type definitions, so you don't need ${getFullNpmName(pkg.name)} installed!`; await writeCommonOutputs(pkg, createNotNeededPackageJSON(pkg), readme); diff --git a/packages/publisher/src/lib/npm.ts b/packages/publisher/src/lib/npm.ts index 238d88594d..c42177fab8 100644 --- a/packages/publisher/src/lib/npm.ts +++ b/packages/publisher/src/lib/npm.ts @@ -1,5 +1,6 @@ import { NotNeededPackage } from "@definitelytyped/definitions-parser"; -import { Logger, assertDefined, CachedNpmInfoClient, max } from "@definitelytyped/utils"; +import { Logger, cacheDir } from "@definitelytyped/utils"; +import * as pacote from "pacote"; import * as semver from "semver"; /** @@ -7,26 +8,14 @@ import * as semver from "semver"; * So the keys of 'time' give the actual 'latest'. * If that's not equal to the expected latest, try again by bumping the patch version of the last attempt by 1. */ -export function skipBadPublishes(pkg: NotNeededPackage, client: CachedNpmInfoClient, log: Logger) { +export async function skipBadPublishes(pkg: NotNeededPackage, log: Logger) { // because this is called right after isAlreadyDeprecated, we can rely on the cache being up-to-date - const info = assertDefined(client.getNpmInfoFromCache(pkg.fullNpmName)); - const notNeeded = pkg.version; - const latest = new semver.SemVer(findActualLatest(info.time)); - if (semver.lte(notNeeded, latest)) { - const plusOne = semver.inc(latest, "patch")!; - log(`Deprecation of ${notNeeded} failed, instead using ${plusOne}.`); + const info = await pacote.packument(pkg.fullNpmName, { cache: cacheDir }); + const maxVersion = semver.maxSatisfying(Object.keys(info.versions), "*")!; + if (semver.lte(pkg.version, maxVersion)) { + const plusOne = semver.inc(maxVersion, "patch")!; + log(`Deprecation of ${pkg.version} failed, instead using ${plusOne}.`); return new NotNeededPackage(pkg.name, pkg.libraryName, plusOne); } return pkg; } - -function findActualLatest(times: Map) { - const actual = max( - [...times].filter(([version]) => version !== "modified" && version !== "created"), - ([, a], [, b]) => (new Date(a) as never) - (new Date(b) as never) - ); - if (!actual) { - throw new Error("failed to find actual latest"); - } - return actual[0]; -} diff --git a/packages/publisher/src/lib/settings.ts b/packages/publisher/src/lib/settings.ts index ed2c8bdf94..4a95c46844 100644 --- a/packages/publisher/src/lib/settings.ts +++ b/packages/publisher/src/lib/settings.ts @@ -4,7 +4,6 @@ import { toS } from "hh-mm-ss"; const hostJson = require("../../host.json"); const root = joinPaths(__dirname, "..", ".."); const storageDirPath = process.env.STORAGE_DIR || root; -export const cacheDirPath = joinPaths(storageDirPath, "cache"); export const outputDirPath = joinPaths(storageDirPath, "output"); export const validateOutputPath = joinPaths(storageDirPath, "validateOutput"); export const logDir = joinPaths(storageDirPath, "logs"); diff --git a/packages/publisher/src/publish-packages.ts b/packages/publisher/src/publish-packages.ts index 28b400125f..5b7b168526 100644 --- a/packages/publisher/src/publish-packages.ts +++ b/packages/publisher/src/publish-packages.ts @@ -11,13 +11,10 @@ import { Fetcher, writeLog, NpmPublishClient, - withNpmCache, - UncachedNpmInfoClient, } from "@definitelytyped/utils"; import { readChangedPackages, ChangedPackages } from "./lib/versions"; import { skipBadPublishes } from "./lib/npm"; import { getSecret, Secret } from "./lib/secrets"; -import { cacheDirPath } from "./lib/settings"; if (!module.parent) { const dry = !!yargs.argv.dry; @@ -129,16 +126,10 @@ export default async function publishPackages( } } - await withNpmCache( - new UncachedNpmInfoClient(), - async (infoClient) => { - for (const n of changedPackages.changedNotNeededPackages) { - const target = skipBadPublishes(n, infoClient, log); - await publishNotNeededPackage(client, target, dry, log); - } - }, - cacheDirPath - ); + for (const n of changedPackages.changedNotNeededPackages) { + const target = await skipBadPublishes(n, log); + await publishNotNeededPackage(client, target, dry, log); + } await writeLog("publishing.md", logResult()); console.log("Done!"); diff --git a/packages/publisher/src/publish-registry.ts b/packages/publisher/src/publish-registry.ts index 9c2a96e41b..0474a01ace 100644 --- a/packages/publisher/src/publish-registry.ts +++ b/packages/publisher/src/publish-registry.ts @@ -4,7 +4,7 @@ import { emptyDir } from "fs-extra"; import * as yargs from "yargs"; import { defaultLocalOptions, defaultRemoteOptions } from "./lib/common"; -import { outputDirPath, validateOutputPath, cacheDirPath } from "./lib/settings"; +import { outputDirPath, validateOutputPath } from "./lib/settings"; import { getDefinitelyTyped, AllPackages, @@ -13,7 +13,6 @@ import { TypingsData, } from "@definitelytyped/definitions-parser"; import { - assertDefined, computeHash, execAndThrowErrors, joinPaths, @@ -28,13 +27,11 @@ import { sleep, npmInstallFlags, readJson, - UncachedNpmInfoClient, - withNpmCache, NpmPublishClient, - CachedNpmInfoClient, + cacheDir, isObject, - max, } from "@definitelytyped/utils"; +import * as pacote from "pacote"; import * as semver from "semver"; // @ts-ignore import pkg from "../package.json"; @@ -51,32 +48,22 @@ if (!module.parent) { process.env.GITHUB_ACTIONS ? defaultRemoteOptions : defaultLocalOptions, loggerWithErrors()[0] ); - await publishRegistry(dt, await AllPackages.read(dt), dry, new UncachedNpmInfoClient()); + await publishRegistry(dt, await AllPackages.read(dt), dry); }); } -export default async function publishRegistry( - dt: FS, - allPackages: AllPackages, - dry: boolean, - client: UncachedNpmInfoClient -): Promise { +export default async function publishRegistry(dt: FS, allPackages: AllPackages, dry: boolean): Promise { const [log, logResult] = logger(); log("=== Publishing types-registry ==="); - const { npmVersion, highestSemverVersion, npmContentHash } = await fetchAndProcessNpmInfo(typesRegistry, client); - assert.strictEqual(npmVersion.major, 0); - assert.strictEqual(npmVersion.minor, 1); + const { latestVersion, maxVersion, latestContentHash } = await fetchAndProcessNpmInfo(typesRegistry); + assert(semver.satisfies(latestVersion, "~0.1")); // Don't include not-needed packages in the registry. - const registryJsonData = await withNpmCache( - client, - (cachedClient) => generateRegistry(allPackages.allLatestTypings(), cachedClient), - cacheDirPath - ); + const registryJsonData = await generateRegistry(allPackages.allLatestTypings()); const registry = JSON.stringify(registryJsonData); const newContentHash = computeHash(registry); - const newVersion = semver.inc(npmVersion, "patch")!; + const newVersion = semver.inc(latestVersion, "patch")!; await publishToRegistry(); await writeLog("publish-registry.md", logResult()); @@ -88,20 +75,18 @@ export default async function publishRegistry( const token = process.env.NPM_TOKEN!; const publishClient = () => NpmPublishClient.create(token, { defaultTag: "next" }); - if (!semver.eq(highestSemverVersion, npmVersion)) { + if (maxVersion !== latestVersion) { // There was an error in the last publish and types-registry wasn't validated. // This may have just been due to a timeout, so test if types-registry@next is a subset of the one we're about to publish. // If so, we should just update it to "latest" now. log("Old version of types-registry was never tagged latest, so updating"); await validateIsSubset(readNotNeededPackages(dt), log); - await (await publishClient()).tag(typesRegistry, String(highestSemverVersion), "latest", dry, log); - } else if (npmContentHash !== newContentHash) { + await (await publishClient()).tag(typesRegistry, maxVersion, "latest", dry, log); + } else if (latestContentHash !== newContentHash) { log("New packages have been added, so publishing a new registry."); await publish(await publishClient(), typesRegistry, packageJson, newVersion, dry, log); } else { - const reason = - npmContentHash === newContentHash ? "No new packages published" : "Was modified less than a week ago"; - log(`${reason}, so no need to publish new registry.`); + log("No new packages published, so no need to publish new registry."); // Just making sure... await validate(log); } @@ -241,47 +226,35 @@ interface Registry { }; }; } -async function generateRegistry(typings: readonly TypingsData[], client: CachedNpmInfoClient): Promise { - const entries: { [packageName: string]: { [distTags: string]: string } } = {}; - for (const typing of typings) { - // Unconditionally use cached info, this should have been set in calculate-versions so should be recent enough. - const info = client.getNpmInfoFromCache(typing.fullNpmName); - if (!info) { - const missings = typings.filter((t) => !client.getNpmInfoFromCache(t.fullNpmName)).map((t) => t.fullNpmName); - throw new Error(`${missings.toString()} not found in cached npm info.`); - } - entries[typing.name] = filterTags(info.distTags); - } - return { entries }; +async function generateRegistry(typings: readonly TypingsData[]): Promise { + return { + entries: Object.fromEntries( + await Promise.all( + typings.map(async (typing) => [ + typing.name, + filterTags((await pacote.packument(typing.fullNpmName, { cache: cacheDir }))["dist-tags"]), + ]) + ) + ), + }; - function filterTags(tags: Map): { readonly [tag: string]: string } { - const latestTag = "latest"; - const latestVersion = tags.get(latestTag); - const out: { [tag: string]: string } = {}; - tags.forEach((value, tag) => { - if (tag === latestTag || value !== latestVersion) { - out[tag] = value; - } - }); - return out; + function filterTags(tags: pacote.Packument["dist-tags"]): { readonly [tag: string]: string } { + return Object.fromEntries( + Object.entries(tags).filter(([tag, version]) => tag === "latest" || version !== tags.latest) + ); } } interface ProcessedNpmInfo { - readonly npmVersion: semver.SemVer; - readonly highestSemverVersion: semver.SemVer; - readonly npmContentHash: string; + readonly latestVersion: string; + readonly maxVersion: string; + readonly latestContentHash: unknown; } -async function fetchAndProcessNpmInfo(packageName: string, client: UncachedNpmInfoClient): Promise { - const info = assertDefined(await client.fetchNpmInfo(packageName)); - const npmVersion = new semver.SemVer(assertDefined(info.distTags.get("latest"))); - const { distTags, versions } = info; - const highestSemverVersion = max( - Array.from(versions.keys(), (v) => new semver.SemVer(v)), - semver.compare - )!; - assert.strictEqual(String(highestSemverVersion), distTags.get("next")); - const npmContentHash = versions.get(String(npmVersion))!.typesPublisherContentHash || ""; - return { npmVersion, highestSemverVersion, npmContentHash }; +async function fetchAndProcessNpmInfo(packageName: string): Promise { + const info = await pacote.packument(packageName, { cache: cacheDir, fullMetadata: true }); + const latestVersion = info["dist-tags"].latest; + const maxVersion = semver.maxSatisfying(Object.keys(info.versions), "*"); + assert.strictEqual(maxVersion, info["dist-tags"].next); + return { latestVersion, maxVersion, latestContentHash: info.versions[latestVersion].typesPublisherContentHash }; } diff --git a/packages/retag/package.json b/packages/retag/package.json index 2a0d7cb4dc..cb14a7041b 100644 --- a/packages/retag/package.json +++ b/packages/retag/package.json @@ -21,11 +21,13 @@ "@definitelytyped/definitions-parser": "^0.0.118", "@definitelytyped/typescript-versions": "^0.0.118", "@definitelytyped/utils": "^0.0.118", + "pacote": "^13.6.1", "semver": "^7.3.7", "yargs": "^15.3.1" }, "devDependencies": { "@types/node": "^10.17.21", + "@types/pacote": "^11.1.5", "@types/yargs": "^15.0.5" }, "main": "dist/index.js", diff --git a/packages/retag/src/index.ts b/packages/retag/src/index.ts index 97c0320335..277ef487ef 100644 --- a/packages/retag/src/index.ts +++ b/packages/retag/src/index.ts @@ -8,17 +8,13 @@ import os = require("os"); import { TypeScriptVersion } from "@definitelytyped/typescript-versions"; import { Logger, - assertDefined, - withNpmCache, NpmPublishClient, - UncachedNpmInfoClient, consoleLogger, - NpmInfoVersion, logUncaughtErrors, loggerWithErrors, LoggerWithErrors, + cacheDir, nAtATime, - CachedNpmInfoClient, } from "@definitelytyped/utils"; import { AnyPackage, @@ -27,6 +23,7 @@ import { parseDefinitions, getDefinitelyTyped, } from "@definitelytyped/definitions-parser"; +import * as pacote from "pacote"; import * as semver from "semver"; if (!module.parent) { @@ -62,21 +59,19 @@ async function tag(dry: boolean, nProcesses: number, name?: string) { const token = process.env.NPM_TOKEN as string; const publishClient = await NpmPublishClient.create(token, {}); - await withNpmCache(new UncachedNpmInfoClient(), async (infoClient) => { - if (name) { - const pkg = await AllPackages.readSingle(name); - const version = await getLatestTypingVersion(pkg, infoClient); + if (name) { + const pkg = await AllPackages.readSingle(name); + const version = await getLatestTypingVersion(pkg); + await updateTypeScriptVersionTags(pkg, version, publishClient, consoleLogger.info, dry); + await updateLatestTag(pkg.fullNpmName, version, publishClient, consoleLogger.info, dry); + } else { + await nAtATime(10, await AllPackages.readLatestTypings(), async (pkg) => { + // Only update tags for the latest version of the package. + const version = await getLatestTypingVersion(pkg); await updateTypeScriptVersionTags(pkg, version, publishClient, consoleLogger.info, dry); await updateLatestTag(pkg.fullNpmName, version, publishClient, consoleLogger.info, dry); - } else { - await nAtATime(10, await AllPackages.readLatestTypings(), async (pkg) => { - // Only update tags for the latest version of the package. - const version = await getLatestTypingVersion(pkg, infoClient); - await updateTypeScriptVersionTags(pkg, version, publishClient, consoleLogger.info, dry); - await updateLatestTag(pkg.fullNpmName, version, publishClient, consoleLogger.info, dry); - }); - } - }); + }); + } // Don't tag notNeeded packages } @@ -114,45 +109,40 @@ export async function updateLatestTag( } } -export async function getLatestTypingVersion(pkg: TypingsData, client: CachedNpmInfoClient): Promise { - return (await fetchTypesPackageVersionInfo(pkg, client, /*publish*/ false)).version; +export async function getLatestTypingVersion(pkg: TypingsData): Promise { + return (await fetchTypesPackageVersionInfo(pkg, /*publish*/ false)).version; } export async function fetchTypesPackageVersionInfo( pkg: TypingsData, - client: CachedNpmInfoClient, canPublish: boolean, log?: LoggerWithErrors ): Promise<{ version: string; needsPublish: boolean }> { - let info = client.getNpmInfoFromCache(pkg.fullNpmName); - let latestVersion = info && getHighestVersionForMajor(info.versions, pkg); - let latestVersionInfo = latestVersion && assertDefined(info!.versions.get(latestVersion)); - if (!latestVersionInfo || latestVersionInfo.typesPublisherContentHash !== pkg.contentHash) { + const spec = `${pkg.fullNpmName}@~${pkg.major}.${pkg.minor}`; + let info = await pacote.manifest(spec, { cache: cacheDir, fullMetadata: true, offline: true }).catch((reason) => { + if (reason.code !== "ENOTCACHED" && reason.code !== "ETARGET") throw reason; + return undefined; + }); + if (!info || info.typesPublisherContentHash !== pkg.contentHash) { if (log) { - log.info(`Version info not cached for ${pkg.desc}@${latestVersion || "(no latest version)"}`); + log.info(`Version info not cached for ${pkg.desc}@${info ? info.version : "(no latest version)"}`); } - info = await client.fetchAndCacheNpmInfo(pkg.fullNpmName); - latestVersion = info && getHighestVersionForMajor(info.versions, pkg); - if (!latestVersion) { + info = await pacote.manifest(spec, { cache: cacheDir, fullMetadata: true, preferOnline: true }).catch((reason) => { + if (reason.code !== "E404" && reason.code !== "ETARGET") throw reason; + return undefined; + }); + if (!info) { return { version: `${pkg.major}.${pkg.minor}.0`, needsPublish: true }; } - latestVersionInfo = assertDefined(info!.versions.get(latestVersion)); } - if (latestVersionInfo.deprecated) { + if (info.deprecated) { // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/22306 assert( pkg.name === "angular-ui-router" || pkg.name === "ui-router-extras", `Package ${pkg.name} has been deprecated, so we shouldn't have parsed it. Was it re-added?` ); } - const needsPublish = canPublish && pkg.contentHash !== latestVersionInfo.typesPublisherContentHash; - return { version: needsPublish ? semver.inc(latestVersion!, "patch")! : latestVersion!, needsPublish }; -} - -function getHighestVersionForMajor( - versions: ReadonlyMap, - { major, minor }: TypingsData -): string | null { - return semver.maxSatisfying([...versions.keys()], `~${major}.${minor}`); + const needsPublish = canPublish && pkg.contentHash !== info.typesPublisherContentHash; + return { version: needsPublish ? semver.inc(info.version, "patch")! : info.version, needsPublish }; } diff --git a/packages/utils/src/collections.ts b/packages/utils/src/collections.ts index 1c37109908..b1379452a2 100644 --- a/packages/utils/src/collections.ts +++ b/packages/utils/src/collections.ts @@ -185,26 +185,6 @@ export function sortObjectKeys(data: T): T return out; } -export function recordToMap(record: Record): Map; -export function recordToMap(record: Record, cb: (t: T) => U): Map; -export function recordToMap(record: Record, cb?: (t: T) => U): Map { - const m = new Map(); - for (const key of Object.keys(record)) { - m.set(key, cb ? cb(record[key]) : record[key]); - } - return m; -} - -export function mapToRecord(map: Map): Record; -export function mapToRecord(map: Map, cb: (t: T) => U): Record; -export function mapToRecord(map: Map, cb?: (t: T) => U): Record { - const o: Record = {}; - map.forEach((value, key) => { - o[key] = cb ? cb(value) : value; - }); - return o; -} - export function min(array: readonly [T, ...(T | undefined)[]]): T; export function min(array: readonly T[], compare?: (a: T, b: T) => number): T | undefined; export function min(array: readonly T[], compare?: (a: T, b: T) => number) { diff --git a/packages/utils/src/npm.ts b/packages/utils/src/npm.ts index c8cad22813..7e33cdcc48 100644 --- a/packages/utils/src/npm.ts +++ b/packages/utils/src/npm.ts @@ -1,157 +1,16 @@ -import assert = require("assert"); -import { ensureFile, pathExists, readJson, writeJson, readFile } from "fs-extra"; +import * as os from "os"; +import process from "process"; +import { readFile } from "fs-extra"; import RegClient from "@qiwi/npm-registry-client"; import { resolve as resolveUrl } from "url"; import { joinPaths } from "./fs"; -import { loggerWithErrors, Logger } from "./logging"; -import { mapToRecord, recordToMap } from "./collections"; -import { Fetcher, createTgz } from "./io"; -import { sleep, identity } from "./miscellany"; +import { Logger } from "./logging"; +import { createTgz } from "./io"; export const npmRegistryHostName = "registry.npmjs.org"; export const npmRegistry = `https://${npmRegistryHostName}/`; -export const npmApi = "api.npmjs.org"; -const defaultCacheDir = joinPaths(__dirname, "..", "cache"); -const cacheFileBasename = "npmInfo.json"; - -export type NpmInfoCache = ReadonlyMap; - -export interface NpmInfoRaw { - readonly "dist-tags": { - readonly [tag: string]: string; - }; - readonly versions: NpmInfoRawVersions; - readonly time: { - readonly [s: string]: string; - }; - readonly homepage: string; -} -export interface NpmInfoRawVersions { - readonly [version: string]: NpmInfoVersion; -} - -// Processed npm info. Intentially kept small so it can be cached. -export interface NpmInfo { - readonly distTags: Map; - readonly versions: Map; - readonly time: Map; - readonly homepage: string; -} -export interface NpmInfoVersion { - readonly typesPublisherContentHash?: string; - readonly deprecated?: string; -} - -export interface CachedNpmInfoClient { - getNpmInfoFromCache(packageName: string): NpmInfo | undefined; - fetchAndCacheNpmInfo(packageName: string): Promise; -} - -export async function withNpmCache( - uncachedClient: UncachedNpmInfoClient, - cb: (client: CachedNpmInfoClient) => Promise, - cacheDir = defaultCacheDir -): Promise { - const log = loggerWithErrors()[0]; - const cacheFile = joinPaths(cacheDir, cacheFileBasename); - let unroll: Map; - log.info(`Checking for cache file at ${cacheFile}...`); - const cacheFileExists = await pathExists(cacheFile); - if (cacheFileExists) { - log.info("Reading cache file..."); - const cachedJson = (await readJson(cacheFile)) as Record; - log.info(`Cache file ${cacheFile} exists, copying to map...`); - unroll = recordToMap(cachedJson, npmInfoFromJson); - } else { - log.info("Cache file doesn't exist, using empty map."); - unroll = new Map(); - } - - const res = await cb({ getNpmInfoFromCache, fetchAndCacheNpmInfo }); - log.info("Writing npm cache."); - await ensureFile(cacheFile); - await writeJson(cacheFile, mapToRecord(unroll, jsonFromNpmInfo)); - return res; - - /** May return old info -- caller should check that this looks up-to-date. */ - function getNpmInfoFromCache(packageName: string): NpmInfo | undefined { - return unroll.get(packageName); - } - - /** Call this when the result of getNpmInfoFromCache looks potentially out-of-date. */ - async function fetchAndCacheNpmInfo(packageName: string): Promise { - const info = await uncachedClient.fetchNpmInfo(packageName); - if (info) { - unroll.set(packageName, info); - } - return info; - } -} - -export class UncachedNpmInfoClient { - private readonly fetcher = new Fetcher(); - - async fetchNpmInfo(packageName: string): Promise { - const raw = await this.fetchRawNpmInfo(packageName); - await sleep(0.01); // If we don't do this, npm resets the connection? - return raw === undefined ? undefined : npmInfoFromJson(raw); - } - - async fetchRawNpmInfo(packageName: string): Promise { - const info = (await this.fetcher.fetchJson({ - hostname: npmRegistryHostName, - path: packageName, - retries: true, - })) as { readonly error: string } | NpmInfoRaw; - if ("error" in info) { - if (info.error === "Not found") { - return undefined; - } - throw new Error(`Error getting version at ${packageName}: ${info.error}`); - } - if (!info["dist-tags"] && !info.versions) { - // Unpublished - return undefined; - } - return info; - } - - // See https://github.com/npm/download-counts - async getDownloads(packageNames: readonly string[]): Promise { - // NPM uses a different API if there's only a single name, so ensure there's at least 2 for every batch of 128. - const names = packageNames.length % 128 === 1 ? [...packageNames, "dummy"] : packageNames; - const nameGroups = Array.from(splitToFixedSizeGroups(names, 128)); // NPM has a limit of 128 packages at a time. - - const out: number[] = []; - for (const nameGroup of nameGroups) { - const data = (await this.fetcher.fetchJson({ - hostname: npmApi, - path: `/downloads/point/last-month/${nameGroup.join(",")}`, - retries: true, - })) as { readonly error: string } | { readonly [key: string]: { readonly downloads: number } }; - if ("error" in data) { - throw new Error(data.error as string); - } - for (const key of Object.keys(data)) { - assert( - key === names[out.length], - `at index ${out.length} of ${Object.keys(data).toString()} : ${key} !== ${names[out.length]}` - ); - out.push(data[key] ? data[key].downloads : 0); - } - } - return out; - } -} - -function splitToFixedSizeGroups(names: readonly string[], chunkSize: number): readonly (readonly string[])[] { - const out: string[][] = []; - for (let i = 0; i < names.length; i += chunkSize) { - out.push(names.slice(i, i + chunkSize)); - } - return out; -} +export const cacheDir = joinPaths(process.env.GITHUB_ACTIONS ? joinPaths(__dirname, "..") : os.tmpdir(), "cache"); type NeedToFixNpmRegistryClientTypings = any; @@ -217,28 +76,6 @@ export class NpmPublishClient { } } -function npmInfoFromJson(n: NpmInfoRaw): NpmInfo { - return { - ...n, - distTags: recordToMap(n["dist-tags"], identity), - // Callback ensures we remove any other properties - versions: recordToMap(n.versions, ({ typesPublisherContentHash, deprecated }) => ({ - typesPublisherContentHash, - deprecated, - })), - time: recordToMap(n.time), - }; -} - -function jsonFromNpmInfo(n: NpmInfo): NpmInfoRaw { - return { - ...n, - "dist-tags": mapToRecord(n.distTags), - versions: mapToRecord(n.versions), - time: mapToRecord(n.time), - }; -} - function promisifyVoid(callsBack: (cb: (error: Error | undefined) => void) => void): Promise { return new Promise((resolve, reject) => { callsBack((error) => { diff --git a/tsconfig.base.json b/tsconfig.base.json index 9bb65a6423..e986bebd1c 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2018", + "target": "es2019", "module": "commonjs", "strict": true, "esModuleInterop": true, @@ -13,6 +13,7 @@ "allowUnreachableCode": false, "allowUnusedLabels": false, "composite": true, - "types": ["node"] + "types": ["node"], + "lib": ["es2022"] } } diff --git a/yarn.lock b/yarn.lock index 5002244d36..bf56f84e33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -496,6 +496,11 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== +"@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + "@humanwhocodes/config-array@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" @@ -1417,6 +1422,14 @@ "@gar/promisify" "^1.0.1" semver "^7.3.5" +"@npmcli/fs@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.0.tgz#f2a21c28386e299d1a9fae8051d35ad180e33109" + integrity sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + "@npmcli/git@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6" @@ -1431,7 +1444,22 @@ semver "^7.3.5" which "^2.0.2" -"@npmcli/installed-package-contents@^1.0.6": +"@npmcli/git@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-3.0.1.tgz#049b99b1381a2ddf7dc56ba3e91eaf76ca803a8d" + integrity sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A== + dependencies: + "@npmcli/promise-spawn" "^3.0.0" + lru-cache "^7.4.4" + mkdirp "^1.0.4" + npm-pick-manifest "^7.0.0" + proc-log "^2.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^2.0.2" + +"@npmcli/installed-package-contents@^1.0.6", "@npmcli/installed-package-contents@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== @@ -1447,11 +1475,24 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@npmcli/move-file@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.0.tgz#417f585016081a0184cef3e38902cd917a9bbd02" + integrity sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + "@npmcli/node-gyp@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz#3cdc1f30e9736dbc417373ed803b42b1a0a29ede" integrity sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg== +"@npmcli/node-gyp@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz#8c20e53e34e9078d18815c1d2dda6f2420d75e35" + integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A== + "@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5" @@ -1459,6 +1500,13 @@ dependencies: infer-owner "^1.0.4" +"@npmcli/promise-spawn@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz#53283b5f18f855c6925f23c24e67c911501ef573" + integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g== + dependencies: + infer-owner "^1.0.4" + "@npmcli/run-script@^1.8.2": version "1.8.6" resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.6.tgz#18314802a6660b0d4baa4c3afe7f1ad39d8c28b7" @@ -1469,6 +1517,16 @@ node-gyp "^7.1.0" read-package-json-fast "^2.0.1" +"@npmcli/run-script@^4.1.0": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.1.2.tgz#05847f11016139d22f7185a2003a07870bdee6cc" + integrity sha512-fCSOS4L4yKRjX+FoWkGHugihBgUK+EjATJn6gfmZnRCt620OqRB8Mrtu/LMv7m1dMrTFVGdywsDq8wFGpyZKDA== + dependencies: + "@npmcli/node-gyp" "^2.0.0" + "@npmcli/promise-spawn" "^3.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^2.0.3" + "@octokit/auth-token@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.0.tgz#b64178975218b99e4dfe948253f0673cbbb59d9f" @@ -1699,6 +1757,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@types/babel__core@^7.1.7": version "7.1.7" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" @@ -1863,6 +1926,14 @@ dependencies: "@types/node" "*" +"@types/node-fetch@*": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" + integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + "@types/node-fetch@^2.5.0": version "2.5.12" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" @@ -1901,6 +1972,27 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== +"@types/npm-package-arg@*": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@types/npm-package-arg/-/npm-package-arg-6.1.1.tgz#9e2d8adc04d39824a3d9f36f738010a3f7da3c1a" + integrity sha512-452/1Kp9IdM/oR10AyqAgZOxUt7eLbm+EMJ194L6oarMYdZNiFIFAOJ7IIr0OrZXTySgfHjJezh2oiyk2kc3ag== + +"@types/npm-registry-fetch@*": + version "8.0.4" + resolved "https://registry.yarnpkg.com/@types/npm-registry-fetch/-/npm-registry-fetch-8.0.4.tgz#77b2737cde22314ccda1dfdb9568fd7769e95b90" + integrity sha512-R9yEj6+NDmXLpKNS19cIaMyaHfV0aHjy/1qbo8K9jiHyjyaYg0CEmuOV/L0Q91DZDi3SuxlYY+2XYwh9TbB+eQ== + dependencies: + "@types/node" "*" + "@types/node-fetch" "*" + "@types/npm-package-arg" "*" + "@types/npmlog" "*" + "@types/ssri" "*" + +"@types/npmlog@*": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.4.tgz#30eb872153c7ead3e8688c476054ddca004115f6" + integrity sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ== + "@types/oboe@^2.0.28": version "2.0.28" resolved "https://registry.yarnpkg.com/@types/oboe/-/oboe-2.0.28.tgz#3afcb0cc949fcdf777861d96e8571f3b486f0fa7" @@ -1908,6 +2000,16 @@ dependencies: "@types/node" "*" +"@types/pacote@^11.1.5": + version "11.1.5" + resolved "https://registry.yarnpkg.com/@types/pacote/-/pacote-11.1.5.tgz#3efc5eb49069206a678f5483a7e008af06788a66" + integrity sha512-kMsfmhP2G45ngnpvH0LKd1celWnjgdiws1FHu3vMmYuoElGdqnd0ydf1ucZzeXamYnLe0NvSzGP2gYiETOEiQA== + dependencies: + "@types/node" "*" + "@types/npm-registry-fetch" "*" + "@types/npmlog" "*" + "@types/ssri" "*" + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -1943,6 +2045,13 @@ dependencies: "@types/node" "*" +"@types/ssri@*": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/ssri/-/ssri-7.1.1.tgz#2a2c94abf0d3a8c3b07bb4ff08142dd571407bb5" + integrity sha512-DPP/jkDaqGiyU75MyMURxLWyYLwKSjnAuGe9ZCsLp9QZOpXmDfuevk769F0BS86TmRuD5krnp06qw9nSoNO+0g== + dependencies: + "@types/node" "*" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -2241,6 +2350,15 @@ agentkeepalive@^4.1.3: depd "^1.1.2" humanize-ms "^1.2.1" +agentkeepalive@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" + integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -2351,11 +2469,19 @@ aproba@^1.0.3: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -aproba@^2.0.0: +"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== +are-we-there-yet@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d" + integrity sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" @@ -2654,6 +2780,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -2736,6 +2869,13 @@ builtins@^1.0.3: resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" @@ -2770,6 +2910,30 @@ cacache@^15.0.5, cacache@^15.2.0: tar "^6.0.2" unique-filename "^1.1.1" +cacache@^16.0.0, cacache@^16.1.0: + version "16.1.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.1.tgz#4e79fb91d3efffe0630d5ad32db55cc1b870669c" + integrity sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^1.1.1" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -3009,6 +3173,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + columnify@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" @@ -3075,7 +3244,7 @@ config-chain@^1.1.12: ini "^1.3.4" proto-list "~1.2.1" -console-control-strings@^1.0.0, console-control-strings@~1.1.0: +console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= @@ -3298,7 +3467,7 @@ debug@^4.1.0: dependencies: ms "^2.1.1" -debug@^4.3.2, debug@^4.3.4: +debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3545,7 +3714,7 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -encoding@^0.1.12: +encoding@^0.1.12, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -4273,6 +4442,20 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -4444,6 +4627,17 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.1: + version "8.0.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -4502,6 +4696,11 @@ graceful-fs@^4.2.3: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +graceful-fs@^4.2.6: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -4626,6 +4825,13 @@ hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: dependencies: lru-cache "^6.0.0" +hosted-git-info@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-5.0.0.tgz#df7a06678b4ebd722139786303db80fdf302ea56" + integrity sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q== + dependencies: + lru-cache "^7.5.1" + html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -4657,6 +4863,15 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -4717,6 +4932,13 @@ ignore-walk@^3.0.3: dependencies: minimatch "^3.0.4" +ignore-walk@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776" + integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== + dependencies: + minimatch "^5.0.1" + ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -4885,6 +5107,13 @@ is-core-module@^2.5.0: dependencies: has "^1.0.3" +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -5625,7 +5854,7 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-parse-even-better-errors@^2.3.0: +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -6031,6 +6260,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.10.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.10.1.tgz#db577f42a94c168f676b638d15da8fb073448cab" + integrity sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A== + macos-release@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" @@ -6056,6 +6290,28 @@ make-error@1.x: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6: + version "10.1.8" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.1.8.tgz#3b6e93dd8d8fdb76c0d7bf32e617f37c3108435a" + integrity sha512-0ASJbG12Au6+N5I84W+8FhGS6iM8MyzvZady+zaQAu+6IOaESFzCLLD0AR1sAFF3Jufi8bxm586ABN6hWd3k7g== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + make-fetch-happen@^8.0.9: version "8.0.14" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" @@ -6228,6 +6484,13 @@ minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -6260,6 +6523,17 @@ minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: optionalDependencies: encoding "^0.1.12" +minipass-fetch@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.0.tgz#ca1754a5f857a3be99a9271277246ac0b44c3ff8" + integrity sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-flush@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" @@ -6304,6 +6578,13 @@ minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: dependencies: yallist "^4.0.0" +minipass@^3.1.6: + version "3.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.3.tgz#fd1f0e6c06449c10dadda72618b59c00f3d6378d" + integrity sha512-N0BOsdFAlNRfmwMhjAsLVWOk7Ljmeb39iqFlsV1At+jqRhSUP9yeof8FyJu4imaJiSUp8vQebWD/guZwGQC8iA== + dependencies: + yallist "^4.0.0" + minizlib@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" @@ -6311,7 +6592,7 @@ minizlib@^1.2.1: dependencies: minipass "^2.9.0" -minizlib@^2.0.0, minizlib@^2.1.1: +minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -6428,6 +6709,11 @@ negotiator@^0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + neo-async@^2.6.0: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -6490,6 +6776,22 @@ node-gyp@^7.1.0: tar "^6.0.2" which "^2.0.2" +node-gyp@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.0.0.tgz#e1da2067427f3eb5bb56820cb62bc6b1e4bd2089" + integrity sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^10.0.3" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -6546,6 +6848,16 @@ normalize-package-data@^3.0.0, normalize-package-data@^3.0.2, "normalize-package semver "^7.3.4" validate-npm-package-license "^3.0.1" +normalize-package-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-4.0.0.tgz#1122d5359af21d4cd08718b92b058a658594177c" + integrity sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g== + dependencies: + hosted-git-info "^5.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -6563,7 +6875,7 @@ normalize-url@^3.3.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== -npm-bundled@^1.1.1: +npm-bundled@^1.1.1, npm-bundled@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== @@ -6577,6 +6889,13 @@ npm-install-checks@^4.0.0: dependencies: semver "^7.1.1" +npm-install-checks@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-5.0.0.tgz#5ff27d209a4e3542b8ac6b0c1db6063506248234" + integrity sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA== + dependencies: + semver "^7.1.1" + npm-lifecycle@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309" @@ -6605,6 +6924,16 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: semver "^7.3.4" validate-npm-package-name "^3.0.0" +npm-package-arg@^9.0.0, npm-package-arg@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.1.0.tgz#a60e9f1e7c03e4e3e4e994ea87fff8b90b522987" + integrity sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw== + dependencies: + hosted-git-info "^5.0.0" + proc-log "^2.0.1" + semver "^7.3.5" + validate-npm-package-name "^4.0.0" + npm-packlist@^2.1.4: version "2.2.2" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" @@ -6615,6 +6944,16 @@ npm-packlist@^2.1.4: npm-bundled "^1.1.1" npm-normalize-package-bin "^1.0.1" +npm-packlist@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.0.tgz#f3fd52903a021009913a133732022132eb355ce7" + integrity sha512-a04sqF6FbkyOAFA19AA0e94gS7Et5T2/IMj3VOT9nOF2RaRdVPQ1Q17Fb/HaDRFs+gbC7HOmhVZ29adpWgmDZg== + dependencies: + glob "^8.0.1" + ignore-walk "^5.0.1" + npm-bundled "^1.1.2" + npm-normalize-package-bin "^1.0.1" + npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" @@ -6625,6 +6964,16 @@ npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: npm-package-arg "^8.1.2" semver "^7.3.4" +npm-pick-manifest@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz#76dda30a7cd6b99be822217a935c2f5eacdaca4c" + integrity sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg== + dependencies: + npm-install-checks "^5.0.0" + npm-normalize-package-bin "^1.0.1" + npm-package-arg "^9.0.0" + semver "^7.3.5" + npm-registry-fetch@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76" @@ -6637,6 +6986,19 @@ npm-registry-fetch@^11.0.0: minizlib "^2.0.0" npm-package-arg "^8.0.0" +npm-registry-fetch@^13.0.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.1.1.tgz#26dc4b26d0a545886e807748032ba2aefaaae96b" + integrity sha512-5p8rwe6wQPLJ8dMqeTnA57Dp9Ox6GH9H60xkyJup07FmVlu3Mk7pf/kIIpl9gaN5bM8NM+UUx3emUWvDNTt39w== + dependencies: + make-fetch-happen "^10.0.6" + minipass "^3.1.6" + minipass-fetch "^2.0.3" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^9.0.1" + proc-log "^2.0.0" + npm-registry-fetch@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz#86f3feb4ce00313bc0b8f1f8f69daae6face1661" @@ -6675,6 +7037,16 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: gauge "~2.7.3" set-blocking "~2.0.0" +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -6973,6 +7345,33 @@ pacote@^11.2.6: ssri "^8.0.1" tar "^6.1.0" +pacote@^13.6.1: + version "13.6.1" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.6.1.tgz#ac6cbd9032b4c16e5c1e0c60138dfe44e4cc589d" + integrity sha512-L+2BI1ougAPsFjXRyBhcKmfT016NscRFLv6Pz5EiNf1CCFJFU0pSKKQwsZTyAQB+sTuUL4TyFyp6J1Ork3dOqw== + dependencies: + "@npmcli/git" "^3.0.0" + "@npmcli/installed-package-contents" "^1.0.7" + "@npmcli/promise-spawn" "^3.0.0" + "@npmcli/run-script" "^4.1.0" + cacache "^16.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + infer-owner "^1.0.4" + minipass "^3.1.6" + mkdirp "^1.0.4" + npm-package-arg "^9.0.0" + npm-packlist "^5.1.0" + npm-pick-manifest "^7.0.0" + npm-registry-fetch "^13.0.1" + proc-log "^2.0.0" + promise-retry "^2.0.1" + read-package-json "^5.0.0" + read-package-json-fast "^2.0.3" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -7190,6 +7589,11 @@ pretty-format@^25.2.1, pretty-format@^25.5.0: ansi-styles "^4.0.0" react-is "^16.12.0" +proc-log@^2.0.0, proc-log@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" + integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -7308,7 +7712,7 @@ read-cmd-shim@^2.0.0: resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9" integrity sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw== -read-package-json-fast@^2.0.1: +read-package-json-fast@^2.0.1, read-package-json-fast@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== @@ -7348,6 +7752,16 @@ read-package-json@^4.1.1: normalize-package-data "^3.0.0" npm-normalize-package-bin "^1.0.0" +read-package-json@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.1.tgz#1ed685d95ce258954596b13e2e0e76c7d0ab4c26" + integrity sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg== + dependencies: + glob "^8.0.1" + json-parse-even-better-errors "^2.3.1" + normalize-package-data "^4.0.0" + npm-normalize-package-bin "^1.0.1" + read-package-tree@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636" @@ -7400,7 +7814,7 @@ read@1, read@~1.0.1: dependencies: mute-stream "~0.0.4" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -7704,7 +8118,7 @@ semver@6.x, semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.7: +semver@^7.0.0, semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -7781,6 +8195,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -7824,6 +8243,11 @@ smart-buffer@^4.1.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -7872,6 +8296,15 @@ socks-proxy-agent@^6.0.0: debug "^4.3.1" socks "^2.6.1" +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + socks@^2.3.3, socks@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" @@ -7880,6 +8313,14 @@ socks@^2.3.3, socks@^2.6.1: ip "^1.1.5" smart-buffer "^4.1.0" +socks@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" + integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== + dependencies: + ip "^1.1.5" + smart-buffer "^4.2.0" + sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" @@ -8014,6 +8455,13 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" +ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== + dependencies: + minipass "^3.1.1" + stack-chain@^1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/stack-chain/-/stack-chain-1.3.7.tgz#d192c9ff4ea6a22c94c4dd459171e3f00cea1285" @@ -8074,6 +8522,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" @@ -8083,15 +8540,6 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" @@ -8281,7 +8729,7 @@ tar@^4.4.12: safe-buffer "^5.1.2" yallist "^3.0.3" -tar@^6.0.2, tar@^6.1.0, tar@^6.1.11: +tar@^6.0.2, tar@^6.1.0, tar@^6.1.11, tar@^6.1.2: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== @@ -8656,11 +9104,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.1.0, typescript@^4.5.5: +typescript@^4.1.0: version "4.5.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== +typescript@^4.7.4: + version "4.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== + typescript@next: version "4.6.0-dev.20211126" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.0-dev.20211126.tgz#d27ce3a360dc4da1dcdebd80efe42b51afdeebdb" @@ -8830,6 +9283,13 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" +validate-npm-package-name@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" + integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== + dependencies: + builtins "^5.0.0" + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -8959,6 +9419,13 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + windows-release@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.0.tgz#dce167e9f8be733f21c849ebd4d03fe66b29b9f0"