From f7a77a37f713457df02db62f8b17ca433faf6db1 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Mon, 28 Aug 2023 19:57:24 -0700 Subject: [PATCH 1/5] Start changes to incorporate DT into history --- packages/core/src/createPackage.ts | 149 +++++++++++++--------- packages/history/scripts/checkPackages.ts | 80 ++++++++---- packages/history/scripts/generateFull.ts | 10 +- packages/history/scripts/types.ts | 1 + 4 files changed, 151 insertions(+), 89 deletions(-) diff --git a/packages/core/src/createPackage.ts b/packages/core/src/createPackage.ts index 03d7c11..b5d650f 100644 --- a/packages/core/src/createPackage.ts +++ b/packages/core/src/createPackage.ts @@ -84,11 +84,12 @@ export interface CreatePackageFromNpmOptions { * @default true */ definitelyTyped?: string | boolean; + before?: Date; } export async function createPackageFromNpm( packageSpec: string, - { definitelyTyped = true }: CreatePackageFromNpmOptions = {} + { definitelyTyped = true, before }: CreatePackageFromNpmOptions = {} ): Promise { const parsed = parsePackageSpec(packageSpec); if (parsed.status === "error") { @@ -99,7 +100,7 @@ export async function createPackageFromNpm( parsed.data.versionKind === "none" && typeof definitelyTyped === "string" ? parsePackageSpec(`${packageName}@${definitelyTyped}`) : parsed; - const { tarballUrl, version } = await getNpmTarballUrl(spec.data || parsed.data); + const { tarballUrl, packageVersion } = await getNpmTarballUrl([spec.data || parsed.data], before); const pkg = await createPackageFromTarballUrl(tarballUrl); if (!definitelyTyped || pkg.containsTypes()) { return pkg; @@ -108,37 +109,18 @@ export async function createPackageFromNpm( const typesPackageName = ts.getTypesPackageName(packageName); let typesPackageData; if (definitelyTyped === true) { - try { - typesPackageData = await getNpmTarballUrl({ - name: typesPackageName, - versionKind: "range", - version: `${major(version)}.${minor(version)}`, - }); - } catch { - try { - typesPackageData = await getNpmTarballUrl({ - name: typesPackageName, - versionKind: "range", - version: `${major(version)}`, - }); - } catch { - try { - typesPackageData = await getNpmTarballUrl({ - name: typesPackageName, - versionKind: "tag", - version: "latest", - }); - } catch { - typesPackageData = undefined; - } - } - } + typesPackageData = await getTypesPackageForPackage(packageName, packageVersion, before); } else { - typesPackageData = await getNpmTarballUrl({ - name: typesPackageName, - versionKind: valid(definitelyTyped) ? "exact" : validRange(definitelyTyped) ? "range" : "tag", - version: definitelyTyped, - }); + typesPackageData = await getNpmTarballUrl( + [ + { + name: typesPackageName, + versionKind: valid(definitelyTyped) ? "exact" : validRange(definitelyTyped) ? "range" : "tag", + version: definitelyTyped, + }, + ], + before + ); } if (typesPackageData) { @@ -147,34 +129,87 @@ export async function createPackageFromNpm( return pkg; } -async function getNpmTarballUrl(packageSpec: ParsedPackageSpec): Promise<{ tarballUrl: string; version: string }> { - const registryUrl = - packageSpec.versionKind === "range" || (packageSpec.versionKind === "tag" && packageSpec.version !== "latest") - ? `https://registry.npmjs.org/${packageSpec.name}` - : `https://registry.npmjs.org/${packageSpec.name}/${packageSpec.version || "latest"}`; - const Accept = - packageSpec.versionKind === "range" || (packageSpec.versionKind === "tag" && packageSpec.version !== "latest") - ? "application/vnd.npm.install-v1+json" - : "application/json"; - const doc = await fetch(registryUrl, { headers: { Accept } }).then((r) => r.json()); - let tarballUrl, version; - if (packageSpec.versionKind === "range") { - version = maxSatisfying(Object.keys(doc.versions), packageSpec.version); - if (!version) { - throw new Error(`No version found matching '${packageSpec.version}'`); +export async function getTypesPackageForPackage( + packageName: string, + packageVersion: string, + before?: Date +): Promise<{ packageName: string; packageVersion: string; tarballUrl: string } | undefined> { + const typesPackageName = ts.getTypesPackageName(packageName); + try { + return { + packageName: typesPackageName, + ...(await getNpmTarballUrl( + [ + { + name: typesPackageName, + versionKind: "range", + version: `${major(packageVersion)}.${minor(packageVersion)}`, + }, + { + name: typesPackageName, + versionKind: "range", + version: `${major(packageVersion)}`, + }, + { + name: typesPackageName, + versionKind: "tag", + version: "latest", + }, + ], + before + )), + }; + } catch {} +} + +async function getNpmTarballUrl( + packageSpecs: readonly ParsedPackageSpec[], + before?: Date +): Promise<{ tarballUrl: string; packageVersion: string }> { + const fetchPackument = packageSpecs.some( + (spec) => spec.versionKind === "range" || (spec.versionKind === "tag" && spec.version !== "latest") + ); + const packumentUrl = `https://registry.npmjs.org/${packageSpecs[0].name}`; + const includeTimes = before !== undefined && packageSpecs.some((spec) => spec.versionKind !== "exact"); + const Accept = includeTimes ? "application/json" : "application/vnd.npm.install-v1+json"; + const packument = fetchPackument + ? await fetch(packumentUrl, { headers: { Accept } }).then((r) => r.json()) + : undefined; + + for (const packageSpec of packageSpecs) { + const manifestUrl = `https://registry.npmjs.org/${packageSpec.name}/${packageSpec.version || "latest"}`; + const doc = packument || (await fetch(manifestUrl).then((r) => r.json())); + let tarballUrl, packageVersion; + if (packageSpec.versionKind === "range") { + packageVersion = maxSatisfying( + Object.keys(doc.versions).filter( + (v) => !doc.versions[v].deprecated && (!before || !doc.time || new Date(doc.time[v]) <= before) + ), + packageSpec.version + ); + if (!packageVersion) { + continue; + } + tarballUrl = doc.versions[packageVersion].dist.tarball; + } else if (packageSpec.versionKind === "tag" && packageSpec.version !== "latest") { + packageVersion = doc["dist-tags"][packageSpec.version]; + if (!packageVersion) { + continue; + } + if (before && doc.time && new Date(doc.time[packageVersion]) > before) { + continue; + } + tarballUrl = doc.versions[packageVersion].dist.tarball; + } else { + packageVersion = doc.version; + tarballUrl = doc.dist.tarball; } - tarballUrl = doc.versions[version].dist.tarball; - } else if (packageSpec.versionKind === "tag" && packageSpec.version !== "latest") { - version = doc["dist-tags"][packageSpec.version]; - if (!version) { - throw new Error(`No version found matching '${packageSpec.version}'`); + + if (packageVersion && tarballUrl) { + return { packageVersion, tarballUrl }; } - tarballUrl = doc.versions[version].dist.tarball; - } else { - version = doc.version; - tarballUrl = doc.dist.tarball; } - return { version, tarballUrl }; + throw new Error(`Failed to find a matching version for ${packageSpecs[0].name}`); } export async function createPackageFromTarballUrl(tarballUrl: string): Promise { diff --git a/packages/history/scripts/checkPackages.ts b/packages/history/scripts/checkPackages.ts index 5bbc3a7..2de793d 100644 --- a/packages/history/scripts/checkPackages.ts +++ b/packages/history/scripts/checkPackages.ts @@ -1,4 +1,4 @@ -import { checkPackage, createPackageFromTarballUrl } from "@arethetypeswrong/core"; +import { checkPackage, createPackageFromTarballUrl, getTypesPackageForPackage } from "@arethetypeswrong/core"; import { appendFileSync } from "fs"; import { Worker, isMainThread, parentPort, workerData } from "node:worker_threads"; import type { Blob, FullJsonLine } from "./types.ts"; @@ -20,40 +20,59 @@ function postBlob(blob: Blob) { } if (!isMainThread && parentPort) { - parentPort.on("message", async ({ packageName, packageVersion, tarballUrl, prevMessage }) => { - let tries = 0; - while (true) { - try { - const analysis = await checkPackage(await createPackageFromTarballUrl(tarballUrl)); - postBlob({ - kind: "analysis", - workerId: workerData.workerId, - data: analysis, - }); - return; - } catch (error) { - await sleep(delay * 100 * tries); - if (tries++ > 3) { + parentPort.on( + "message", + async ({ packageName, packageVersion, tarballUrl, prevMessage, typesPackageUrl, before }) => { + let tries = 0; + while (true) { + try { + let pkg = await createPackageFromTarballUrl(tarballUrl); + if (typesPackageUrl) { + pkg = pkg.mergedWithTypes(await createPackageFromTarballUrl(typesPackageUrl)); + } else if (typesPackageUrl !== false) { + const typesPackageData = await getTypesPackageForPackage(packageName, packageVersion, new Date(before)); + if (typesPackageData) { + pkg = pkg.mergedWithTypes(await createPackageFromTarballUrl(typesPackageData.tarballUrl)); + } + } + const analysis = await checkPackage(pkg); postBlob({ - kind: "error", + kind: "analysis", workerId: workerData.workerId, - packageName, - packageVersion, - tarballUrl, - message: "" + (error as Error)?.message, - prevMessage, + data: analysis, }); return; + } catch (error) { + await sleep(delay * 100 * tries); + if (tries++ > 3) { + postBlob({ + kind: "error", + workerId: workerData.workerId, + packageName, + packageVersion, + tarballUrl, + message: "" + (error as Error)?.message, + typesPackageUrl, + prevMessage, + }); + return; + } } } } - }); + ); } export default function checkPackages( - packages: { packageName: string; packageVersion: string; tarballUrl: string }[], + packages: { + packageName: string; + packageVersion: string; + tarballUrl: string; + typesPackageUrl?: string | false; + }[], outFile: URL, - workerCount: number + workerCount: number, + before: string ): Promise { if (!packages.length) { return Promise.resolve(false); @@ -70,9 +89,14 @@ export default function checkPackages( return new Promise(async (resolve, reject) => { let wroteChanges = false; const packagesDonePerWorker = new Array(workerCount).fill(0); - const workQueue: { packageName: string; packageVersion: string; tarballUrl: string; prevMessage?: string }[] = [ - ...packages, - ]; + const workQueue: { + packageName: string; + packageVersion: string; + tarballUrl: string; + typesPackageUrl?: string | false; + before: string; + prevMessage?: string; + }[] = [...packages.map((p) => ({ ...p, before }))]; let finishedWorkers = 0; for (const worker of workers) { worker.on("message", async (blob: Blob) => { @@ -87,6 +111,8 @@ export default function checkPackages( packageName: blob.packageName, packageVersion: blob.packageVersion, tarballUrl: blob.tarballUrl, + typesPackageUrl: blob.typesPackageUrl, + before, prevMessage: blob.message, }); } diff --git a/packages/history/scripts/generateFull.ts b/packages/history/scripts/generateFull.ts index 734d0f5..9926382 100644 --- a/packages/history/scripts/generateFull.ts +++ b/packages/history/scripts/generateFull.ts @@ -52,12 +52,12 @@ for (const date of dates) { bytesRead = (await fh.stat()).size; for await (const line of fh.readLines({ start })) { const result: FullJsonLine = JSON.parse(line); - seenResults.set(result.packageSpec, [result.coreVersion, !!result.analysis.types]); + seenResults.set(result.packageSpec, [result.coreVersion, /*temporary*/ true]); } await fh.close(); const work = []; - const packages: DatesJson["dates"][string] = []; + const packages: (DatesJson["dates"][string][number] & { typesPackageUrl?: string | false | undefined })[] = []; const errors: { packageName: string; message: string }[] = []; if (!existingDates.dates?.[date] || existingDates.npmHighImpactVersion !== npmHighImpactVersion) { console.log(`*** Fetching versions for ${date} ***`); @@ -72,7 +72,7 @@ for (const date of dates) { bar.increment(); const packageVersion = manifest.version; const tarballUrl = manifest.dist.tarball; - packages.push({ packageName, packageVersion, tarballUrl }); + packages.push({ packageName, packageVersion, tarballUrl, typesPackageUrl: undefined }); } catch (e) { errors.push({ packageName, message: (e as any).message }); } @@ -96,7 +96,7 @@ for (const date of dates) { !existing || (existing[1] && (major(existing[0]) !== major(versions.core) || minor(existing[0]) !== minor(versions.core))) ) { - work.push(pkg); + work.push({ ...pkg }); } } @@ -107,7 +107,7 @@ for (const date of dates) { ); const workerCount = Math.min(os.cpus().length - 1 || 1, 6); - fullModified = await checkPackages(work, fullJsonFileName, workerCount); + fullModified = await checkPackages(work, fullJsonFileName, workerCount, date); } console.log("Cleaning full.json"); diff --git a/packages/history/scripts/types.ts b/packages/history/scripts/types.ts index ebe273a..5564ec9 100644 --- a/packages/history/scripts/types.ts +++ b/packages/history/scripts/types.ts @@ -11,6 +11,7 @@ export interface ErrorBlob { message: string; packageName: string; packageVersion: string; + typesPackageUrl: string | false | undefined; tarballUrl: string; prevMessage?: string; } From 5ca1ba9e305f0f668a6428e1e145216c2b805858 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Wed, 30 Aug 2023 19:58:24 -0700 Subject: [PATCH 2/5] Incorporate DefinitelyTyped results into @arethetypeswrong/history --- package-lock.json | 125 ++++++++++++++++++++-- packages/core/src/createPackage.ts | 17 +-- packages/history/package.json | 7 +- packages/history/scripts/checkPackages.ts | 23 +++- packages/history/scripts/generateFull.ts | 77 ++++++++++--- packages/history/scripts/tsconfig.json | 4 +- packages/history/scripts/types.ts | 10 +- packages/history/src/main.js | 2 +- packages/history/tsconfig.json | 5 +- 9 files changed, 232 insertions(+), 38 deletions(-) diff --git a/package-lock.json b/package-lock.json index f44f304..6d0af94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2036,8 +2036,9 @@ }, "node_modules/@types/node-fetch": { "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "form-data": "^3.0.0" @@ -2667,6 +2668,15 @@ "dev": true, "license": "MIT" }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3064,6 +3074,29 @@ "reusify": "^1.0.4" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/fetch-ponyfill": { "version": "7.1.0", "license": "MIT", @@ -3206,6 +3239,18 @@ "node": ">= 6" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/fs-extra": { "version": "7.0.1", "dev": true, @@ -4455,6 +4500,25 @@ "node": ">= 0.6" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-emoji": { "version": "1.11.0", "license": "MIT", @@ -6081,6 +6145,12 @@ "node": ">=8" } }, + "node_modules/ts-expose-internals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ts-expose-internals/-/ts-expose-internals-5.2.2.tgz", + "integrity": "sha512-HYknqnfn3hQcNV1a00Ag4Nv+LM5wv2hUDzLH2oh+utspiKafKYtRYdv7a/iNhtqbzRJVV3FgVYRNoWKA3AZ3Uw==", + "dev": true + }, "node_modules/tslib": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", @@ -6171,9 +6241,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/types-registry": { + "version": "0.1.658", + "resolved": "https://registry.npmjs.org/types-registry/-/types-registry-0.1.658.tgz", + "integrity": "sha512-BizewDy1MZ7dONMTE43yw5NmQsiJIF1XjivaIAKa74eQgxpIZXgzMX9GawuGbz8RoVO5u4CtYUSXBhjrAKLf4g==", + "dev": true + }, "node_modules/typescript": { - "version": "5.1.3", - "license": "Apache-2.0", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6705,6 +6782,15 @@ "defaults": "^1.0.3" } }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "license": "BSD-2-Clause" @@ -6912,10 +6998,10 @@ }, "packages/cli": { "name": "@arethetypeswrong/cli", - "version": "0.7.0", + "version": "0.8.0", "license": "MIT", "dependencies": { - "@arethetypeswrong/core": "0.7.0", + "@arethetypeswrong/core": "0.8.0", "chalk": "^4.1.2", "cli-table3": "^0.6.3", "commander": "^10.0.1", @@ -6941,7 +7027,7 @@ }, "packages/core": { "name": "@arethetypeswrong/core", - "version": "0.7.0", + "version": "0.8.0", "license": "MIT", "dependencies": { "@andrewbranch/untar.js": "^1.0.0", @@ -6965,20 +7051,25 @@ }, "packages/history": { "name": "@arethetypeswrong/history", - "version": "0.1.0", + "version": "0.2.0", "devDependencies": { "@arethetypeswrong/core": "file:../core", "@azure/storage-blob": "^12.14.0", "@types/cli-progress": "^3.11.0", "@types/node": "^20.3.1", + "@types/node-fetch": "^2.6.4", "@types/pacote": "^11.1.5", "@types/semver": "^7.5.0", "cli-progress": "^3.12.0", "dotenv": "^16.3.1", + "node-fetch": "^3.3.2", "npm-high-impact": "^1.3.0", "pacote": "^15.2.0", "semver": "^7.5.3", - "tsx": "^3.12.7" + "ts-expose-internals": "^5.2.2", + "tsx": "^3.12.7", + "types-registry": "latest", + "typescript": "^5.2.2" } }, "packages/history/node_modules/@types/node": { @@ -6991,6 +7082,24 @@ "dev": true, "license": "MIT" }, + "packages/history/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "packages/web": { "name": "@arethetypeswrong/web", "version": "0.0.1", diff --git a/packages/core/src/createPackage.ts b/packages/core/src/createPackage.ts index b5d650f..768dc0b 100644 --- a/packages/core/src/createPackage.ts +++ b/packages/core/src/createPackage.ts @@ -8,29 +8,30 @@ export class Package { #files: Record = {}; readonly packageName: string; readonly packageVersion: string; + readonly resolvedUrl?: string; readonly typesPackage?: { packageName: string; packageVersion: string; + resolvedUrl?: string; }; constructor( files: Record, packageName: string, packageVersion: string, - typesPackage?: { - packageName: string; - packageVersion: string; - } + resolvedUrl?: string, + typesPackage?: Package["typesPackage"] ) { this.#files = files; this.packageName = packageName; this.packageVersion = packageVersion; + this.resolvedUrl = resolvedUrl; this.typesPackage = typesPackage; } readFile(path: string): string { const file = this.#files[path]; - if (!file) { + if (file === undefined) { throw new Error(`File not found: ${path}`); } if (typeof file === "string") { @@ -68,9 +69,10 @@ export class Package { mergedWithTypes(typesPackage: Package): Package { const files = { ...this.#files, ...typesPackage.#files }; - return new Package(files, this.packageName, this.packageVersion, { + return new Package(files, this.packageName, this.packageVersion, this.resolvedUrl, { packageName: typesPackage.packageName, packageVersion: typesPackage.packageVersion, + resolvedUrl: typesPackage.resolvedUrl, }); } } @@ -214,7 +216,8 @@ async function getNpmTarballUrl( export async function createPackageFromTarballUrl(tarballUrl: string): Promise { const tarball = await fetchTarball(tarballUrl); - return createPackageFromTarballData(tarball); + const { files, packageName, packageVersion } = extractTarball(tarball); + return new Package(files, packageName, packageVersion, tarballUrl); } async function fetchTarball(tarballUrl: string) { diff --git a/packages/history/package.json b/packages/history/package.json index e6690a4..c4f39de 100644 --- a/packages/history/package.json +++ b/packages/history/package.json @@ -30,13 +30,18 @@ "@azure/storage-blob": "^12.14.0", "@types/cli-progress": "^3.11.0", "@types/node": "^20.3.1", + "@types/node-fetch": "^2.6.4", "@types/pacote": "^11.1.5", "@types/semver": "^7.5.0", "cli-progress": "^3.12.0", "dotenv": "^16.3.1", + "node-fetch": "^3.3.2", "npm-high-impact": "^1.3.0", "pacote": "^15.2.0", "semver": "^7.5.3", - "tsx": "^3.12.7" + "ts-expose-internals": "^5.2.2", + "tsx": "^3.12.7", + "types-registry": "latest", + "typescript": "^5.2.2" } } diff --git a/packages/history/scripts/checkPackages.ts b/packages/history/scripts/checkPackages.ts index 2de793d..212fc4c 100644 --- a/packages/history/scripts/checkPackages.ts +++ b/packages/history/scripts/checkPackages.ts @@ -27,12 +27,19 @@ if (!isMainThread && parentPort) { while (true) { try { let pkg = await createPackageFromTarballUrl(tarballUrl); - if (typesPackageUrl) { + if (typeof typesPackageUrl === "string") { pkg = pkg.mergedWithTypes(await createPackageFromTarballUrl(typesPackageUrl)); - } else if (typesPackageUrl !== false) { + } else if (typesPackageUrl === true) { const typesPackageData = await getTypesPackageForPackage(packageName, packageVersion, new Date(before)); if (typesPackageData) { pkg = pkg.mergedWithTypes(await createPackageFromTarballUrl(typesPackageData.tarballUrl)); + if (pkg.typesPackage?.resolvedUrl) { + postBlob({ + kind: "resolvedTypesPackageUrl", + packageName, + typesPackageUrl: pkg.typesPackage.resolvedUrl, + }); + } } } const analysis = await checkPackage(pkg); @@ -68,11 +75,12 @@ export default function checkPackages( packageName: string; packageVersion: string; tarballUrl: string; - typesPackageUrl?: string | false; + typesPackageUrl: string | boolean; }[], outFile: URL, workerCount: number, - before: string + before: string, + onResolveTypesPackageUrl: (packageName: string, typesPackageUrl: string) => void ): Promise { if (!packages.length) { return Promise.resolve(false); @@ -93,13 +101,18 @@ export default function checkPackages( packageName: string; packageVersion: string; tarballUrl: string; - typesPackageUrl?: string | false; + typesPackageUrl: string | boolean; before: string; prevMessage?: string; }[] = [...packages.map((p) => ({ ...p, before }))]; let finishedWorkers = 0; for (const worker of workers) { worker.on("message", async (blob: Blob) => { + if (blob.kind === "resolvedTypesPackageUrl") { + onResolveTypesPackageUrl(blob.packageName, blob.typesPackageUrl); + return; + } + const workerIndex = workers.indexOf(worker); packagesDonePerWorker[workerIndex]++; if (blob.kind === "error") { diff --git a/packages/history/scripts/generateFull.ts b/packages/history/scripts/generateFull.ts index 9926382..50564bd 100644 --- a/packages/history/scripts/generateFull.ts +++ b/packages/history/scripts/generateFull.ts @@ -3,10 +3,12 @@ import cliProgress from "cli-progress"; import { appendFileSync, createReadStream, createWriteStream } from "fs"; import { open, readFile, rename, unlink, writeFile } from "fs/promises"; import { createRequire } from "module"; +import fetch from "node-fetch"; import { npmHighImpact } from "npm-high-impact"; import os from "os"; import pacote from "pacote"; import { major, minor } from "semver"; +import ts from "typescript"; import { createGzip } from "zlib"; import checkPackages from "./checkPackages.ts"; import { downloadData, uploadData } from "./storage.ts"; @@ -40,24 +42,43 @@ const dates = Array.from( let datesModified = false; let fullModified = false; const npmHighImpactVersion = createRequire(import.meta.url)("npm-high-impact/package.json").version; +const outJsonFileName = new URL("../data/out.json", import.meta.url); +try { + await unlink(outJsonFileName); +} catch {} + const fullJsonFileName = new URL("../data/full.json", import.meta.url); const datesFileName = new URL("../data/dates.json", import.meta.url); await downloadData(); const existingDates: DatesJson = JSON.parse(await readFile(datesFileName, "utf8")); + +const typesRegistry: { entries: Record> } = createRequire(import.meta.url)( + "types-registry/index.json" +); +const notNeededPackages: { packages: Record } = (await fetch( + "https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/notNeededPackages.json" +).then((r) => r.json())) as any; +const typesPackages = new Set([...Object.keys(typesRegistry.entries), ...Object.keys(notNeededPackages.packages)]); + let bytesRead = 0; -const seenResults = new Map(); +const seenResults = new Map(); for (const date of dates) { const fh = await open(fullJsonFileName, "r"); const start = bytesRead; bytesRead = (await fh.stat()).size; for await (const line of fh.readLines({ start })) { const result: FullJsonLine = JSON.parse(line); - seenResults.set(result.packageSpec, [result.coreVersion, /*temporary*/ true]); + seenResults.set(result.packageSpec, { + coreVersion: result.coreVersion, + containsTypes: + result.analysis.types && + ((result.analysis.types as any) === "included" || result.analysis.types.kind === "included"), + }); } await fh.close(); const work = []; - const packages: (DatesJson["dates"][string][number] & { typesPackageUrl?: string | false | undefined })[] = []; + const packages: (DatesJson["dates"][string][number] & { typesPackageUrl: string | boolean })[] = []; const errors: { packageName: string; message: string }[] = []; if (!existingDates.dates?.[date] || existingDates.npmHighImpactVersion !== npmHighImpactVersion) { console.log(`*** Fetching versions for ${date} ***`); @@ -72,7 +93,12 @@ for (const date of dates) { bar.increment(); const packageVersion = manifest.version; const tarballUrl = manifest.dist.tarball; - packages.push({ packageName, packageVersion, tarballUrl, typesPackageUrl: undefined }); + packages.push({ + packageName, + packageVersion, + tarballUrl, + typesPackageUrl: typesPackages.has(ts.getTypesPackageName(packageName)), + }); } catch (e) { errors.push({ packageName, message: (e as any).message }); } @@ -80,11 +106,16 @@ for (const date of dates) { bar.stop(); existingDates.dates[date] = packages; - await writeFile(datesFileName, JSON.stringify(existingDates)); + await writeFile(datesFileName, JSON.stringify(existingDates, undefined, 2)); datesModified = true; } else { console.log(`*** Using cached versions for ${date} ***`); - packages.push(...existingDates.dates[date]); + packages.push( + ...existingDates.dates[date].map((p) => ({ + ...p, + typesPackageUrl: (("typesPackageUrl" in p) as any) ? p.typesPackageUrl! : typesPackages.has(p.packageName), + })) + ); } for (const pkg of packages) { @@ -94,7 +125,8 @@ for (const date of dates) { const existing = seenResults.get(`${pkg.packageName}@${pkg.packageVersion}`); if ( !existing || - (existing[1] && (major(existing[0]) !== major(versions.core) || minor(existing[0]) !== minor(versions.core))) + ((existing.containsTypes || pkg.typesPackageUrl) && + (major(existing.coreVersion) !== major(versions.core) || minor(existing.coreVersion) !== minor(versions.core))) ) { work.push({ ...pkg }); } @@ -107,7 +139,16 @@ for (const date of dates) { ); const workerCount = Math.min(os.cpus().length - 1 || 1, 6); - fullModified = await checkPackages(work, fullJsonFileName, workerCount, date); + fullModified = await checkPackages(work, outJsonFileName, workerCount, date, (packageName, typesPackageUrl) => { + Object.keys(existingDates.dates).forEach((date) => { + const version = existingDates.dates[date].find((v) => v.packageName === packageName); + if (version) { + version.typesPackageUrl = typesPackageUrl; + } + }); + }); + + await writeFile(datesFileName, JSON.stringify(existingDates, undefined, 2)); } console.log("Cleaning full.json"); @@ -120,16 +161,28 @@ for (const date of Object.keys(existingDates.dates)) { } } } -const fh = await open(fullJsonFileName, "r"); -for await (const line of fh.readLines()) { +const outFh = await open(outJsonFileName, "r"); +const newSpecs = new Set(); +for await (const line of outFh.readLines()) { const result: FullJsonLine = JSON.parse(line); if (allSpecs.has(result.packageSpec)) { + newSpecs.add(result.packageSpec); appendFileSync(cleanedFileName, `${JSON.stringify(result, (key, value) => (key === "trace" ? [] : value))}\n`); - } else { fullModified = true; } } -await fh.close(); +await outFh.close(); + +const fullFh = await open(fullJsonFileName, "r"); +for await (const line of fullFh.readLines()) { + const result: FullJsonLine = JSON.parse(line); + if (!newSpecs.has(result.packageSpec)) { + appendFileSync(cleanedFileName, `${JSON.stringify(result, (key, value) => (key === "trace" ? [] : value))}\n`); + fullModified = true; + } +} + +await fullFh.close(); await unlink(fullJsonFileName); await rename(cleanedFileName, fullJsonFileName); await new Promise((resolve, reject) => { diff --git a/packages/history/scripts/tsconfig.json b/packages/history/scripts/tsconfig.json index af91fbe..f2ed1d5 100644 --- a/packages/history/scripts/tsconfig.json +++ b/packages/history/scripts/tsconfig.json @@ -11,8 +11,10 @@ "allowImportingTsExtensions": true, "verbatimModuleSyntax": true, "resolveJsonModule": true, + "skipLibCheck": true, "types": [ - "node" + "node", + "ts-expose-internals" ], }, "references": [ diff --git a/packages/history/scripts/types.ts b/packages/history/scripts/types.ts index 5564ec9..b949e0c 100644 --- a/packages/history/scripts/types.ts +++ b/packages/history/scripts/types.ts @@ -11,11 +11,16 @@ export interface ErrorBlob { message: string; packageName: string; packageVersion: string; - typesPackageUrl: string | false | undefined; + typesPackageUrl: string | boolean; tarballUrl: string; prevMessage?: string; } -export type Blob = CheckResultBlob | ErrorBlob; +export interface ResolvedTypesPackageUrlBlob { + kind: "resolvedTypesPackageUrl"; + packageName: string; + typesPackageUrl: string; +} +export type Blob = CheckResultBlob | ErrorBlob | ResolvedTypesPackageUrlBlob; export interface FullJsonLine { packageSpec: string; @@ -31,6 +36,7 @@ export interface DatesJson { packageName: string; packageVersion: string; tarballUrl: string; + typesPackageUrl?: string | boolean; }[]; }; } diff --git a/packages/history/src/main.js b/packages/history/src/main.js index e3dae92..8c50394 100644 --- a/packages/history/src/main.js +++ b/packages/history/src/main.js @@ -54,7 +54,7 @@ export async function getAllDataAsObject() { return result; } -/** @typedef {Record} VersionsByDate */ +/** @typedef {Record} VersionsByDate */ /** * Gets the list of top packages processed for each sampled date. diff --git a/packages/history/tsconfig.json b/packages/history/tsconfig.json index c165655..2f1dd3d 100644 --- a/packages/history/tsconfig.json +++ b/packages/history/tsconfig.json @@ -5,7 +5,10 @@ "checkJs": true, "declaration": true, "emitDeclarationOnly": true, - "outDir": "lib" + "outDir": "lib", + "types": [ + "node", + ] }, "include": [ "src/**/*.js" From 7e90ea5a45a40994d3658e1d9fe885a7a3230fc3 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Wed, 30 Aug 2023 20:01:28 -0700 Subject: [PATCH 3/5] Rename function --- packages/core/src/createPackage.ts | 4 ++-- packages/history/scripts/checkPackages.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/src/createPackage.ts b/packages/core/src/createPackage.ts index 768dc0b..76287e3 100644 --- a/packages/core/src/createPackage.ts +++ b/packages/core/src/createPackage.ts @@ -111,7 +111,7 @@ export async function createPackageFromNpm( const typesPackageName = ts.getTypesPackageName(packageName); let typesPackageData; if (definitelyTyped === true) { - typesPackageData = await getTypesPackageForPackage(packageName, packageVersion, before); + typesPackageData = await resolveTypesPackageForPackage(packageName, packageVersion, before); } else { typesPackageData = await getNpmTarballUrl( [ @@ -131,7 +131,7 @@ export async function createPackageFromNpm( return pkg; } -export async function getTypesPackageForPackage( +export async function resolveTypesPackageForPackage( packageName: string, packageVersion: string, before?: Date diff --git a/packages/history/scripts/checkPackages.ts b/packages/history/scripts/checkPackages.ts index 212fc4c..6868f2a 100644 --- a/packages/history/scripts/checkPackages.ts +++ b/packages/history/scripts/checkPackages.ts @@ -1,4 +1,4 @@ -import { checkPackage, createPackageFromTarballUrl, getTypesPackageForPackage } from "@arethetypeswrong/core"; +import { checkPackage, createPackageFromTarballUrl, resolveTypesPackageForPackage } from "@arethetypeswrong/core"; import { appendFileSync } from "fs"; import { Worker, isMainThread, parentPort, workerData } from "node:worker_threads"; import type { Blob, FullJsonLine } from "./types.ts"; @@ -30,7 +30,7 @@ if (!isMainThread && parentPort) { if (typeof typesPackageUrl === "string") { pkg = pkg.mergedWithTypes(await createPackageFromTarballUrl(typesPackageUrl)); } else if (typesPackageUrl === true) { - const typesPackageData = await getTypesPackageForPackage(packageName, packageVersion, new Date(before)); + const typesPackageData = await resolveTypesPackageForPackage(packageName, packageVersion, new Date(before)); if (typesPackageData) { pkg = pkg.mergedWithTypes(await createPackageFromTarballUrl(typesPackageData.tarballUrl)); if (pkg.typesPackage?.resolvedUrl) { From c3a69f7a6c0ba921252aeced6f6ec837416e1388 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Wed, 30 Aug 2023 20:10:01 -0700 Subject: [PATCH 4/5] Add changeset --- .changeset/curly-eels-reflect.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/curly-eels-reflect.md diff --git a/.changeset/curly-eels-reflect.md b/.changeset/curly-eels-reflect.md new file mode 100644 index 0000000..dbc514a --- /dev/null +++ b/.changeset/curly-eels-reflect.md @@ -0,0 +1,5 @@ +--- +"@arethetypeswrong/core": minor +--- + +Package creation API changes to support @arethetypeswrong/history better. `createPackageFromNpm` options now take a `before` property similar to `npm install --before date`. From f9aa8dc723362bc090c718864c671f503ff5c144 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Wed, 30 Aug 2023 20:18:48 -0700 Subject: [PATCH 5/5] Update snapshots from TS version change --- package-lock.json | 2 +- packages/core/package.json | 2 +- .../@reduxjs__toolkit@2.0.0-beta.0.tgz.md | 40 +++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d0af94..5c71384 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7034,7 +7034,7 @@ "fetch-ponyfill": "^7.1.0", "fflate": "^0.7.4", "semver": "^7.5.4", - "typescript": "^5.1.3", + "typescript": "^5.2.2", "validate-npm-package-name": "^5.0.0" }, "devDependencies": { diff --git a/packages/core/package.json b/packages/core/package.json index 9203b5f..5b99ed3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -51,7 +51,7 @@ "fetch-ponyfill": "^7.1.0", "fflate": "^0.7.4", "semver": "^7.5.4", - "typescript": "^5.1.3", + "typescript": "^5.2.2", "validate-npm-package-name": "^5.0.0" }, "devDependencies": { diff --git a/packages/core/test/snapshots/@reduxjs__toolkit@2.0.0-beta.0.tgz.md b/packages/core/test/snapshots/@reduxjs__toolkit@2.0.0-beta.0.tgz.md index 96414af..ab66caf 100644 --- a/packages/core/test/snapshots/@reduxjs__toolkit@2.0.0-beta.0.tgz.md +++ b/packages/core/test/snapshots/@reduxjs__toolkit@2.0.0-beta.0.tgz.md @@ -42,6 +42,7 @@ "Export specifier './dist/tsHelpers' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/tsHelpers' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/tsHelpers' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/tsHelpers'", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/node_modules' does not exist, skipping all lookups in it.", @@ -56,6 +57,7 @@ "Export specifier './dist/tsHelpers' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/tsHelpers'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -84,6 +86,7 @@ "Export specifier './dist/dynamicMiddleware/types' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/dynamicMiddleware/types' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/dynamicMiddleware/types' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/dynamicMiddleware/types'", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/node_modules' does not exist, skipping all lookups in it.", @@ -98,6 +101,7 @@ "Export specifier './dist/dynamicMiddleware/types' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/dynamicMiddleware/types'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -127,6 +131,7 @@ "Export specifier './dist/query/core/apiState' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/core/apiState' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/core/apiState' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/apiState'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -141,6 +146,7 @@ "Export specifier './dist/query/core/apiState' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/apiState'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -184,6 +190,7 @@ "Export specifier './dist/query/core/buildSelectors' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/core/buildSelectors' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/core/buildSelectors' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/buildSelectors'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -198,6 +205,7 @@ "Export specifier './dist/query/core/buildSelectors' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/buildSelectors'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -227,6 +235,7 @@ "Export specifier './dist/query/core/buildInitiate' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/core/buildInitiate' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/core/buildInitiate' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/buildInitiate'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -241,6 +250,7 @@ "Export specifier './dist/query/core/buildInitiate' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/buildInitiate'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -270,6 +280,7 @@ "Export specifier './dist/query/defaultSerializeQueryArgs' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/defaultSerializeQueryArgs' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/defaultSerializeQueryArgs' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/defaultSerializeQueryArgs'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -284,6 +295,7 @@ "Export specifier './dist/query/defaultSerializeQueryArgs' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/defaultSerializeQueryArgs'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -327,6 +339,7 @@ "Export specifier './dist/query/tsHelpers' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/tsHelpers' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/tsHelpers' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/tsHelpers'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -341,6 +354,7 @@ "Export specifier './dist/query/tsHelpers' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/tsHelpers'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -398,6 +412,7 @@ "Export specifier './dist/query/endpointDefinitions' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/endpointDefinitions' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/endpointDefinitions' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/endpointDefinitions'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -412,6 +427,7 @@ "Export specifier './dist/query/endpointDefinitions' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/endpointDefinitions'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -441,6 +457,7 @@ "Export specifier './dist/query/baseQueryTypes' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/baseQueryTypes' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/baseQueryTypes' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/baseQueryTypes'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -455,6 +472,7 @@ "Export specifier './dist/query/baseQueryTypes' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/baseQueryTypes'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -498,6 +516,7 @@ "Export specifier './dist/query/core/module' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/core/module' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/core/module' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/module'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -512,6 +531,7 @@ "Export specifier './dist/query/core/module' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/module'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -540,6 +560,7 @@ "Export specifier './dist/tsHelpers' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/tsHelpers' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/tsHelpers' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/tsHelpers'", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/node_modules' does not exist, skipping all lookups in it.", @@ -554,6 +575,7 @@ "Export specifier './dist/tsHelpers' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/tsHelpers'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -582,6 +604,7 @@ "Export specifier './dist/dynamicMiddleware/types' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/dynamicMiddleware/types' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/dynamicMiddleware/types' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/dynamicMiddleware/types'", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/node_modules' does not exist, skipping all lookups in it.", @@ -596,6 +619,7 @@ "Export specifier './dist/dynamicMiddleware/types' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/dynamicMiddleware/types'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/dynamicMiddleware/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -624,6 +648,7 @@ "Export specifier './dist/query/core/apiState' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/core/apiState' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/core/apiState' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/apiState'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -638,6 +663,7 @@ "Export specifier './dist/query/core/apiState' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/apiState'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -679,6 +705,7 @@ "Export specifier './dist/query/core/buildSelectors' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/core/buildSelectors' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/core/buildSelectors' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/buildSelectors'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -693,6 +720,7 @@ "Export specifier './dist/query/core/buildSelectors' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/buildSelectors'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -721,6 +749,7 @@ "Export specifier './dist/query/core/buildInitiate' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/core/buildInitiate' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/core/buildInitiate' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/buildInitiate'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -735,6 +764,7 @@ "Export specifier './dist/query/core/buildInitiate' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/buildInitiate'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -763,6 +793,7 @@ "Export specifier './dist/query/defaultSerializeQueryArgs' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/defaultSerializeQueryArgs' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/defaultSerializeQueryArgs' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/defaultSerializeQueryArgs'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -777,6 +808,7 @@ "Export specifier './dist/query/defaultSerializeQueryArgs' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/defaultSerializeQueryArgs'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -818,6 +850,7 @@ "Export specifier './dist/query/tsHelpers' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/tsHelpers' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/tsHelpers' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/tsHelpers'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -832,6 +865,7 @@ "Export specifier './dist/query/tsHelpers' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/tsHelpers'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -886,6 +920,7 @@ "Export specifier './dist/query/endpointDefinitions' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/endpointDefinitions' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/endpointDefinitions' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/endpointDefinitions'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -900,6 +935,7 @@ "Export specifier './dist/query/endpointDefinitions' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/endpointDefinitions'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -928,6 +964,7 @@ "Export specifier './dist/query/baseQueryTypes' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/baseQueryTypes' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/baseQueryTypes' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/baseQueryTypes'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -942,6 +979,7 @@ "Export specifier './dist/query/baseQueryTypes' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/baseQueryTypes'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.", @@ -983,6 +1021,7 @@ "Export specifier './dist/query/core/module' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Export specifier './dist/query/core/module' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Loading module '@reduxjs/toolkit/dist/query/core/module' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/module'", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", @@ -997,6 +1036,7 @@ "Export specifier './dist/query/core/module' does not exist in package.json scope at path '/node_modules/@reduxjs/toolkit'.", "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", "Scoped package detected, looking in 'reduxjs__toolkit/dist/query/core/module'", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/react/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/query/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules/@reduxjs/toolkit/dist/node_modules' does not exist, skipping all lookups in it.",