1
1
import { publicProcedure , router } from "@/lib/base" ;
2
2
import { db } from "@/lib/prisma" ;
3
3
import { TRPCError } from "@trpc/server" ;
4
+ import semver from "semver" ;
4
5
import { z } from "zod" ;
5
6
6
7
function validateToken ( token : string ) {
@@ -14,19 +15,24 @@ function validateToken(token: string) {
14
15
} ) ;
15
16
}
16
17
17
- const NpmPackageVersionSchema = z . object ( {
18
+ const PackageVersionSchema = z . object ( {
18
19
version : z . string ( ) ,
19
20
swcCoreVersion : z . string ( ) ,
20
21
} ) ;
21
22
22
- const NpmPackageSchema = z . object ( {
23
+ const PackageSchema = z . object ( {
23
24
name : z . string ( ) ,
24
- versions : z . array ( NpmPackageVersionSchema ) ,
25
+ versions : z . array ( PackageVersionSchema ) ,
25
26
} ) ;
26
27
27
28
export const UpdateWasmPluginsInputSchema = z . object ( {
28
29
token : z . string ( ) ,
29
- pkgs : z . array ( NpmPackageSchema ) ,
30
+ pkgs : z . array ( PackageSchema ) ,
31
+ } ) ;
32
+
33
+ export const UpdateRuntimesInputSchema = z . object ( {
34
+ token : z . string ( ) ,
35
+ pkgs : z . array ( PackageSchema ) ,
30
36
} ) ;
31
37
32
38
export const updaterRouter = router ( {
@@ -83,4 +89,74 @@ export const updaterRouter = router({
83
89
}
84
90
}
85
91
} ) ,
92
+
93
+ updateRuntimes : publicProcedure
94
+ . input ( UpdateRuntimesInputSchema )
95
+ . output ( z . void ( ) )
96
+ . mutation ( async ( { input, ctx } ) => {
97
+ validateToken ( input . token ) ;
98
+
99
+ const compatRanges = await db . compatRange . findMany ( {
100
+ select : {
101
+ id : true ,
102
+ from : true ,
103
+ to : true ,
104
+ } ,
105
+ } ) ;
106
+
107
+ // Runtimes has so many versions so we need a faster logic.
108
+ function byVersion ( swcCoreVersion : string ) {
109
+ for ( const range of compatRanges ) {
110
+ if (
111
+ semver . gte ( swcCoreVersion , range . from ) &&
112
+ ( range . to === "*" || semver . lte ( swcCoreVersion , range . to ) )
113
+ ) {
114
+ return range ;
115
+ }
116
+ }
117
+ }
118
+
119
+ for ( const pkg of input . pkgs ) {
120
+ const runtime = await db . swcRuntime . upsert ( {
121
+ where : {
122
+ name : pkg . name ,
123
+ } ,
124
+ create : {
125
+ name : pkg . name ,
126
+ } ,
127
+ update : { } ,
128
+ } ) ;
129
+
130
+ for ( const version of pkg . versions ) {
131
+ const swcCoreVersion = version . swcCoreVersion ;
132
+ const compatRange = byVersion ( swcCoreVersion ) ;
133
+
134
+ if ( ! compatRange ) {
135
+ throw new TRPCError ( {
136
+ code : "NOT_FOUND" ,
137
+ message : `Compat range not found for SWC core version ${ swcCoreVersion } ` ,
138
+ } ) ;
139
+ }
140
+
141
+ await db . swcRuntimeVersion . upsert ( {
142
+ where : {
143
+ runtimeId_version : {
144
+ runtimeId : runtime . id ,
145
+ version : version . version ,
146
+ } ,
147
+ } ,
148
+ create : {
149
+ runtimeId : runtime . id ,
150
+ version : version . version ,
151
+ compatRangeId : compatRange . id ,
152
+ swcCoreVersion,
153
+ } ,
154
+ update : {
155
+ compatRangeId : compatRange . id ,
156
+ swcCoreVersion,
157
+ } ,
158
+ } ) ;
159
+ }
160
+ }
161
+ } ) ,
86
162
} ) ;
0 commit comments