Skip to content

Commit 406fc66

Browse files
committed
Fix bugs in createPackageFromNpm, allow resolveImplementationPackageForTypesPackage to accept a range
1 parent f4cf164 commit 406fc66

File tree

4 files changed

+80
-32
lines changed

4 files changed

+80
-32
lines changed

.changeset/wet-birds-marry.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@arethetypeswrong/core": patch
3+
---
4+
5+
Fix bugs in createPackageFromNpm, allow resolveImplementationPackageForTypesPackage to accept a range

packages/core/src/createPackage.ts

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { untar } from "@andrewbranch/untar.js";
22
import { gunzipSync } from "fflate";
33
import ts from "typescript";
44
import { parsePackageSpec, type ParsedPackageSpec } from "./utils.js";
5-
import { maxSatisfying, major, minor, valid, validRange } from "semver";
5+
import { maxSatisfying, major, minor, valid, validRange, coerce } from "semver";
66

77
export class Package {
88
#files: Record<string, string | Uint8Array> = {};
@@ -106,16 +106,16 @@ export async function createPackageFromNpm(
106106
throw new Error(parsed.error);
107107
}
108108
const packageName = parsed.data.name;
109+
const typesPackageName = ts.getTypesPackageName(packageName);
109110
const { tarballUrl, packageVersion } =
110111
parsed.data.versionKind === "none" && typeof definitelyTyped === "string"
111-
? await resolveImplementationPackageForTypesPackage(packageName, definitelyTyped, { before })
112+
? await resolveImplementationPackageForTypesPackage(typesPackageName, definitelyTyped, { before })
112113
: await getNpmTarballUrl([parsed.data], before);
113114
const pkg = await createPackageFromTarballUrl(tarballUrl);
114115
if (!definitelyTyped || pkg.containsTypes()) {
115116
return pkg;
116117
}
117118

118-
const typesPackageName = ts.getTypesPackageName(packageName);
119119
let typesPackageData;
120120
if (definitelyTyped === true) {
121121
typesPackageData = await resolveTypesPackageForPackage(packageName, packageVersion, before);
@@ -147,14 +147,30 @@ export async function resolveImplementationPackageForTypesPackage(
147147
throw new Error(`'resolveImplementationPackageForTypesPackage' expects an @types package name and version`);
148148
}
149149
const packageName = ts.unmangleScopedPackageName(typesPackageName.slice("@types/".length));
150-
return getNpmTarballUrl(
151-
[
152-
parsePackageSpec(`${packageName}@${major(typesPackageVersion)}.${minor(typesPackageVersion)}`).data!,
153-
parsePackageSpec(`${packageName}@${major(typesPackageVersion)}`).data!,
154-
parsePackageSpec(`${packageName}@latest`).data!,
155-
],
156-
options?.before,
157-
);
150+
const version = valid(typesPackageVersion);
151+
if (version) {
152+
return getNpmTarballUrl(
153+
[
154+
parsePackageSpec(`${packageName}@${major(version)}.${minor(version)}`).data!,
155+
parsePackageSpec(`${packageName}@${major(version)}`).data!,
156+
parsePackageSpec(`${packageName}@latest`).data!,
157+
],
158+
options?.before,
159+
);
160+
}
161+
162+
const range = validRange(typesPackageVersion);
163+
if (range) {
164+
return getNpmTarballUrl(
165+
[
166+
{ name: packageName, versionKind: "range", version: range },
167+
{ name: packageName, versionKind: "tag", version: "latest" },
168+
],
169+
options?.before,
170+
);
171+
}
172+
173+
throw new Error(`'resolveImplementationPackageForTypesPackage' expects a valid SemVer version or range`);
158174
}
159175

160176
export async function resolveTypesPackageForPackage(

packages/web/src/main.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
1-
import type { ResultMessage } from "../worker/worker.ts";
1+
import type { Message } from "../worker/worker.ts";
22
import { subscribeRenderer } from "./renderer.ts";
33
import { updateState, type PackageInfo, getState, subscribe, type State } from "./state.ts";
44
import { shallowEqual } from "./utils/shallowEqual.ts";
55
import NProgress from "nprogress";
66
import { parsePackageSpec, type ParsedPackageSpec } from "@arethetypeswrong/core/utils";
77

88
const worker = new Worker(new URL("../worker/worker.ts", import.meta.url), { type: "module" });
9-
worker.onmessage = async (event: MessageEvent<ResultMessage>) => {
9+
worker.onmessage = async (event: MessageEvent<Message>) => {
1010
updateState((state) => {
11-
state.analysis = event.data.data.result;
12-
state.isLoading = false;
13-
state.message = undefined;
11+
if (event.data.kind === "error") {
12+
state.isLoading = false;
13+
state.message = {
14+
isError: true,
15+
text: event.data.data.error,
16+
};
17+
} else {
18+
state.analysis = event.data.data.result;
19+
state.isLoading = false;
20+
state.message = undefined;
21+
}
1422
});
1523

1624
const params = new URLSearchParams(location.search);
@@ -56,7 +64,6 @@ if (location.search) {
5664
onPackageNameInput(packageSpec);
5765
getPackageInfo().then(() => {
5866
const info = getState().packageInfo.info;
59-
console.log(info);
6067
if (info && info.size && info.size < 1_000_000 && !navigator.connection?.saveData) {
6168
onCheck();
6269
}

packages/web/worker/worker.ts

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,49 @@ export interface CheckFileEventData {
1616
file: Uint8Array;
1717
}
1818

19+
export interface ErrorMessage {
20+
kind: "error";
21+
data: {
22+
error: string;
23+
};
24+
}
25+
1926
export interface ResultMessage {
2027
kind: "result";
2128
data: {
2229
result: CheckResult;
2330
};
2431
}
2532

33+
export type Message = ErrorMessage | ResultMessage;
34+
2635
onmessage = async (event: MessageEvent<CheckPackageEventData | CheckFileEventData>) => {
27-
const result = await checkPackage(
28-
event.data.kind === "check-file"
29-
? createPackageFromTarballData(event.data.file)
30-
: event.data.packageSpec.startsWith("@types/")
31-
? await createPackageFromNpm(getImplementationPackageName(event.data.packageSpec), {
32-
definitelyTyped: parsePackageSpec(event.data.packageSpec).data?.version,
33-
})
34-
: await createPackageFromNpm(event.data.packageSpec),
35-
);
36-
postMessage({
37-
kind: "result",
38-
data: {
39-
result,
40-
},
41-
} satisfies ResultMessage);
36+
try {
37+
const result = await checkPackage(
38+
event.data.kind === "check-file"
39+
? createPackageFromTarballData(event.data.file)
40+
: event.data.packageSpec.startsWith("@types/")
41+
? await createPackageFromNpm(getImplementationPackageName(event.data.packageSpec), {
42+
definitelyTyped: parsePackageSpec(event.data.packageSpec).data?.version,
43+
})
44+
: await createPackageFromNpm(event.data.packageSpec),
45+
);
46+
postMessage({
47+
kind: "result",
48+
data: {
49+
result,
50+
},
51+
} satisfies ResultMessage);
52+
} catch (err) {
53+
if (err instanceof Error) {
54+
postMessage({
55+
kind: "error",
56+
data: {
57+
error: err.message,
58+
},
59+
} satisfies ErrorMessage);
60+
}
61+
}
4262
};
4363

4464
function getImplementationPackageName(typesPackageSpec: string): string {

0 commit comments

Comments
 (0)