Skip to content

Commit

Permalink
Merge pull request #150 from arethetypeswrong/allowDeprecated
Browse files Browse the repository at this point in the history
Add `allowDeprecated` to options accepted by `createPackageFromNpm` API
  • Loading branch information
andrewbranch authored Feb 21, 2024
2 parents 7307b41 + 60ae2aa commit b596e74
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 13 deletions.
5 changes: 5 additions & 0 deletions .changeset/gold-carrots-relate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@arethetypeswrong/core": patch
---

Add `allowDeprecated` to options accepted by `createPackageFromNpm` API
30 changes: 18 additions & 12 deletions packages/core/src/createPackage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,12 @@ export interface CreatePackageFromNpmOptions {
*/
definitelyTyped?: string | boolean;
before?: Date;
allowDeprecated?: boolean;
}

export async function createPackageFromNpm(
packageSpec: string,
{ definitelyTyped = true, before }: CreatePackageFromNpmOptions = {},
{ definitelyTyped = true, ...options }: CreatePackageFromNpmOptions = {},
): Promise<Package> {
const parsed = parsePackageSpec(packageSpec);
if (parsed.status === "error") {
Expand All @@ -109,16 +110,16 @@ export async function createPackageFromNpm(
const typesPackageName = ts.getTypesPackageName(packageName);
const { tarballUrl, packageVersion } =
parsed.data.versionKind === "none" && typeof definitelyTyped === "string"
? await resolveImplementationPackageForTypesPackage(typesPackageName, definitelyTyped, { before })
: await getNpmTarballUrl([parsed.data], before);
? await resolveImplementationPackageForTypesPackage(typesPackageName, definitelyTyped, options)
: await getNpmTarballUrl([parsed.data], options);
const pkg = await createPackageFromTarballUrl(tarballUrl);
if (!definitelyTyped || pkg.containsTypes()) {
return pkg;
}

let typesPackageData;
if (definitelyTyped === true) {
typesPackageData = await resolveTypesPackageForPackage(packageName, packageVersion, before);
typesPackageData = await resolveTypesPackageForPackage(packageName, packageVersion, options);
} else {
typesPackageData = await getNpmTarballUrl(
[
Expand All @@ -128,7 +129,7 @@ export async function createPackageFromNpm(
version: definitelyTyped,
},
],
before,
options,
);
}

Expand All @@ -141,7 +142,7 @@ export async function createPackageFromNpm(
export async function resolveImplementationPackageForTypesPackage(
typesPackageName: string,
typesPackageVersion: string,
options?: Pick<CreatePackageFromNpmOptions, "before">,
options?: Omit<CreatePackageFromNpmOptions, "definitelyTyped">,
): Promise<ResolvedPackageId> {
if (!typesPackageName.startsWith("@types/")) {
throw new Error(`'resolveImplementationPackageForTypesPackage' expects an @types package name and version`);
Expand All @@ -155,7 +156,7 @@ export async function resolveImplementationPackageForTypesPackage(
parsePackageSpec(`${packageName}@${major(version)}`).data!,
parsePackageSpec(`${packageName}@latest`).data!,
],
options?.before,
options,
);
}

Expand All @@ -166,7 +167,7 @@ export async function resolveImplementationPackageForTypesPackage(
{ name: packageName, versionKind: "range", version: range },
{ name: packageName, versionKind: "tag", version: "latest" },
],
options?.before,
options,
);
}

Expand All @@ -176,7 +177,7 @@ export async function resolveImplementationPackageForTypesPackage(
export async function resolveTypesPackageForPackage(
packageName: string,
packageVersion: string,
before?: Date,
options?: Omit<CreatePackageFromNpmOptions, "definitelyTyped">,
): Promise<ResolvedPackageId | undefined> {
const typesPackageName = ts.getTypesPackageName(packageName);
try {
Expand All @@ -198,7 +199,7 @@ export async function resolveTypesPackageForPackage(
version: "latest",
},
],
before,
options,
);
} catch {}
}
Expand All @@ -209,7 +210,10 @@ export interface ResolvedPackageId {
tarballUrl: string;
}

async function getNpmTarballUrl(packageSpecs: readonly ParsedPackageSpec[], before?: Date): Promise<ResolvedPackageId> {
async function getNpmTarballUrl(
packageSpecs: readonly ParsedPackageSpec[],
{ before, allowDeprecated }: Omit<CreatePackageFromNpmOptions, "definitelyTyped"> = {},
): Promise<ResolvedPackageId> {
const fetchPackument = packageSpecs.some(
(spec) => spec.versionKind === "range" || (spec.versionKind === "tag" && spec.version !== "latest"),
);
Expand All @@ -231,7 +235,9 @@ async function getNpmTarballUrl(packageSpecs: readonly ParsedPackageSpec[], befo
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),
(v) =>
(allowDeprecated || !doc.versions[v].deprecated) &&
(!before || !doc.time || new Date(doc.time[v]) <= before),
),
packageSpec.version,
);
Expand Down
4 changes: 3 additions & 1 deletion packages/history/scripts/checkPackages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@ if (!isMainThread && parentPort) {
if (typeof typesPackageUrl === "string") {
pkg = pkg.mergedWithTypes(await createPackageFromTarballUrl(typesPackageUrl));
} else if (typesPackageUrl === true) {
const typesPackageData = await resolveTypesPackageForPackage(packageName, packageVersion, new Date(before));
const typesPackageData = await resolveTypesPackageForPackage(packageName, packageVersion, {
before: new Date(before),
});
if (typesPackageData) {
pkg = pkg.mergedWithTypes(await createPackageFromTarballUrl(typesPackageData.tarballUrl));
if (pkg.typesPackage?.resolvedUrl) {
Expand Down

0 comments on commit b596e74

Please sign in to comment.