Skip to content

Commit 0647fc7

Browse files
authored
feat(swc-plugins): Add Wasm plugin data (#56)
1 parent 4f667b2 commit 0647fc7

File tree

5 files changed

+112
-3
lines changed

5 files changed

+112
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { UpdateWasmPluginsInputSchema } from "@/lib/api/updater/router";
2+
import { createCaller } from "@/lib/server";
3+
import { NextRequest, NextResponse } from "next/server";
4+
5+
export const POST = async (req: NextRequest) => {
6+
const body = UpdateWasmPluginsInputSchema.parse(await req.json());
7+
8+
const api = await createCaller();
9+
10+
await api.updater.updateWasmPlugins(body);
11+
12+
return NextResponse.json({ ok: true });
13+
};

apps/swc-plugins/lib/api/router.ts

+3
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ import { router } from "@/lib/base";
33
import { inferRouterInputs, inferRouterOutputs } from "@trpc/server";
44
import { compatRangeRouter } from "./compatRange/router";
55
import { runtimeRouter } from "./runtimes/router";
6+
import { updaterRouter } from "./updater/router";
67
import { userRouter } from "./users/router";
78

89
export const apiRouter = router({
910
users: userRouter,
1011

1112
runtime: runtimeRouter,
1213
compatRange: compatRangeRouter,
14+
15+
updater: updaterRouter,
1316
});
1417

1518
export type ApiRouter = typeof apiRouter;

apps/swc-plugins/lib/api/runtimes/router.ts

+3
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ export const runtimeRouter = router({
4747
version: true,
4848
compatRangeId: true,
4949
},
50+
orderBy: {
51+
version: "desc",
52+
},
5053
});
5154

5255
return versions;

apps/swc-plugins/lib/api/server.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,18 @@ export function defineAbilitiesFor({ user }: { user: User | null }): Abilities {
154154

155155
const factory = createCallerFactory(apiRouter);
156156

157-
export const createCaller = async () => {
157+
export const createCaller = async (ctx?: Context) => {
158+
if (ctx) {
159+
return factory(ctx);
160+
}
161+
158162
const user: User | null = await getCurrentUser();
159163

160164
const abilities = defineAbilitiesFor({
161165
user,
162166
});
163167

164-
const ctx: Context = {
168+
const newCtx: Context = {
165169
getAccessToken() {
166170
const h = headers();
167171
const auth = h.get("authorization");
@@ -172,5 +176,5 @@ export const createCaller = async () => {
172176
responseHeaders: null,
173177
isAdmin: false,
174178
};
175-
return factory(ctx);
179+
return factory(newCtx);
176180
};
+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import { publicProcedure, router } from "@/lib/base";
2+
import { db } from "@/lib/prisma";
3+
import { TRPCError } from "@trpc/server";
4+
import { z } from "zod";
5+
6+
function validateToken(token: string) {
7+
if (token === process.env.CRAWL_SECRET) {
8+
return;
9+
}
10+
11+
throw new TRPCError({
12+
code: "UNAUTHORIZED",
13+
message: "Invalid token",
14+
});
15+
}
16+
17+
const NpmPackageVersionSchema = z.object({
18+
version: z.string(),
19+
swcCoreVersion: z.string(),
20+
});
21+
22+
const NpmPackageSchema = z.object({
23+
name: z.string(),
24+
versions: z.array(NpmPackageVersionSchema),
25+
});
26+
27+
export const UpdateWasmPluginsInputSchema = z.object({
28+
token: z.string(),
29+
pkgs: z.array(NpmPackageSchema),
30+
});
31+
32+
export const updaterRouter = router({
33+
updateWasmPlugins: publicProcedure
34+
.input(UpdateWasmPluginsInputSchema)
35+
.output(z.void())
36+
.mutation(async ({ input, ctx }) => {
37+
validateToken(input.token);
38+
39+
const api = await (await import("@/lib/api/server")).createCaller(ctx);
40+
41+
for (const pkg of input.pkgs) {
42+
const plugin = await db.swcPlugin.upsert({
43+
where: {
44+
name: pkg.name,
45+
},
46+
create: {
47+
name: pkg.name,
48+
},
49+
update: {},
50+
});
51+
52+
for (const version of pkg.versions) {
53+
const swcCoreVersion = version.swcCoreVersion;
54+
const compatRange = await api.compatRange.byCoreVersion({
55+
version: swcCoreVersion,
56+
});
57+
58+
if (!compatRange) {
59+
throw new TRPCError({
60+
code: "NOT_FOUND",
61+
message: `Compat range not found for SWC core version ${swcCoreVersion}`,
62+
});
63+
}
64+
65+
await db.swcPluginVersion.upsert({
66+
where: {
67+
pluginId_version: {
68+
pluginId: plugin.id,
69+
version: version.version,
70+
},
71+
},
72+
create: {
73+
pluginId: plugin.id,
74+
version: version.version,
75+
compatRangeId: compatRange.id,
76+
swcCoreVersion,
77+
},
78+
update: {
79+
compatRangeId: compatRange.id,
80+
swcCoreVersion,
81+
},
82+
});
83+
}
84+
}
85+
}),
86+
});

0 commit comments

Comments
 (0)