1
1
import { publicProcedure , router } from "@/lib/base" ;
2
2
import { db } from "@/lib/prisma" ;
3
+ import { TRPCError } from "@trpc/server" ;
3
4
import semver from "semver" ;
4
5
import { z } from "zod" ;
5
6
import { VersionRange , VersionRangeSchema } from "./zod" ;
6
7
8
+ export const CompatRangeSchema = z . object ( {
9
+ id : z . bigint ( ) ,
10
+ from : z . string ( ) ,
11
+ to : z . string ( ) ,
12
+ } ) ;
13
+
7
14
export const compatRangeRouter = router ( {
8
15
list : publicProcedure
9
16
. input ( z . void ( ) )
10
- . output (
11
- z . array (
12
- z . object ( {
13
- id : z . bigint ( ) ,
14
- from : z . string ( ) ,
15
- to : z . string ( ) ,
16
- } )
17
- )
18
- )
17
+ . output ( z . array ( CompatRangeSchema ) )
19
18
. query ( async ( { ctx } ) => {
20
19
const versions = await db . compatRange . findMany ( {
21
20
orderBy : {
@@ -97,31 +96,72 @@ export const compatRangeRouter = router({
97
96
} ;
98
97
} ) ,
99
98
100
- byVersion : publicProcedure
99
+ byPluginRunnerVersion : publicProcedure
101
100
. input (
102
101
z . object ( {
103
- version : z . string ( ) ,
102
+ version : z . string ( ) . describe ( "The version of the swc_plugin_runner" ) ,
104
103
} )
105
104
)
106
- . output (
107
- z . nullable (
108
- z . object ( {
109
- id : z . bigint ( ) ,
110
- from : z . string ( ) ,
111
- to : z . string ( ) ,
112
- } )
113
- )
105
+ . output ( z . nullable ( CompatRangeSchema ) )
106
+ . query ( async ( { ctx, input : { version } } ) => {
107
+ const v = await db . swcPluginRunnerVersion . findUnique ( {
108
+ where : {
109
+ version,
110
+ } ,
111
+ select : {
112
+ compatRange : {
113
+ select : {
114
+ id : true ,
115
+ from : true ,
116
+ to : true ,
117
+ } ,
118
+ } ,
119
+ } ,
120
+ } ) ;
121
+
122
+ return v ?. compatRange ?? null ;
123
+ } ) ,
124
+
125
+ byCoreVersion : publicProcedure
126
+ . input (
127
+ z . object ( {
128
+ version : z . string ( ) ,
129
+ } )
114
130
)
131
+ . output ( z . nullable ( CompatRangeSchema ) )
115
132
. query ( async ( { ctx, input : { version } } ) => {
116
- const versions = await db . compatRange . findMany ( {
133
+ // Try the cache first.
134
+ {
135
+ const v = await db . swcCoreVersion . findUnique ( {
136
+ where : {
137
+ version,
138
+ } ,
139
+ select : {
140
+ compatRange : {
141
+ select : {
142
+ id : true ,
143
+ from : true ,
144
+ to : true ,
145
+ } ,
146
+ } ,
147
+ } ,
148
+ } ) ;
149
+
150
+ if ( v ) {
151
+ return v . compatRange ;
152
+ }
153
+ }
154
+
155
+ console . warn ( "Fallback to full search" ) ;
156
+ const compatRanges = await db . compatRange . findMany ( {
117
157
select : {
118
158
id : true ,
119
159
from : true ,
120
160
to : true ,
121
161
} ,
122
162
} ) ;
123
163
124
- for ( const range of versions ) {
164
+ for ( const range of compatRanges ) {
125
165
if (
126
166
semver . gte ( version , range . from ) &&
127
167
( range . to === "*" || semver . lte ( version , range . to ) )
@@ -132,6 +172,115 @@ export const compatRangeRouter = router({
132
172
133
173
return null ;
134
174
} ) ,
175
+
176
+ addCacheForCrates : publicProcedure
177
+ . input (
178
+ z . object ( {
179
+ pluginRunnerVersions : z . array ( z . string ( ) ) ,
180
+ coreVersions : z . array (
181
+ z . object ( {
182
+ version : z . string ( ) . describe ( "The version of the swc_core" ) ,
183
+ pluginRunnerReq : z . string ( ) ,
184
+ } )
185
+ ) ,
186
+ } )
187
+ )
188
+ . output ( z . void ( ) )
189
+ . mutation (
190
+ async ( { ctx, input : { coreVersions, pluginRunnerVersions } } ) => {
191
+ if ( process . env . NODE_ENV === "production" ) {
192
+ throw new TRPCError ( {
193
+ code : "FORBIDDEN" ,
194
+ } ) ;
195
+ }
196
+
197
+ const previousMaxCoreVersion = await maxSwcCoreVersion ( ) ;
198
+ const previousMaxPluginRunnerVersion =
199
+ await maxSwcPluginRunnerVersion ( ) ;
200
+
201
+ const compatRanges = await db . compatRange . findMany ( {
202
+ select : {
203
+ id : true ,
204
+ from : true ,
205
+ to : true ,
206
+ } ,
207
+ } ) ;
208
+
209
+ const done = new Set < string > ( ) ;
210
+
211
+ function byVersion ( swcCoreVersion : string ) {
212
+ for ( const range of compatRanges ) {
213
+ if (
214
+ semver . gte ( swcCoreVersion , range . from ) &&
215
+ ( range . to === "*" || semver . lte ( swcCoreVersion , range . to ) )
216
+ ) {
217
+ return range ;
218
+ }
219
+ }
220
+ }
221
+
222
+ for ( const corePkg of coreVersions ) {
223
+ corePkg . version = corePkg . version . replace ( "v" , "" ) ;
224
+
225
+ if ( semver . lt ( corePkg . version , previousMaxCoreVersion ) ) {
226
+ console . log (
227
+ `Skipping swc_core@${ corePkg . version } as it's less than previous max (${ previousMaxCoreVersion } )`
228
+ ) ;
229
+ continue ;
230
+ }
231
+
232
+ const compatRange = byVersion ( corePkg . version ) ;
233
+
234
+ if ( ! compatRange ) {
235
+ console . error ( `Compat range not found for ${ corePkg . version } ` ) ;
236
+ continue ;
237
+ }
238
+
239
+ for ( let rv of pluginRunnerVersions ) {
240
+ rv = rv . replace ( "v" , "" ) ;
241
+
242
+ if ( done . has ( rv ) ) {
243
+ continue ;
244
+ }
245
+ if ( semver . lt ( rv , previousMaxPluginRunnerVersion ) ) {
246
+ continue ;
247
+ }
248
+
249
+ if ( semver . satisfies ( rv , corePkg . pluginRunnerReq ) ) {
250
+ await db . swcPluginRunnerVersion . upsert ( {
251
+ where : {
252
+ version : rv ,
253
+ } ,
254
+ create : {
255
+ version : rv ,
256
+ compatRangeId : compatRange . id ,
257
+ } ,
258
+ update : {
259
+ compatRangeId : compatRange . id ,
260
+ } ,
261
+ } ) ;
262
+ console . log ( `Imported swc_plugin_runner@${ rv } ` ) ;
263
+ done . add ( rv ) ;
264
+ }
265
+ }
266
+
267
+ await db . swcCoreVersion . upsert ( {
268
+ where : {
269
+ version : corePkg . version ,
270
+ } ,
271
+ create : {
272
+ version : corePkg . version ,
273
+ pluginRunnerReq : corePkg . pluginRunnerReq ,
274
+ compatRangeId : compatRange . id ,
275
+ } ,
276
+ update : {
277
+ pluginRunnerReq : corePkg . pluginRunnerReq ,
278
+ } ,
279
+ } ) ;
280
+ console . log ( `Imported swc_core@${ corePkg . version } ` ) ;
281
+ }
282
+ }
283
+ ) ,
135
284
} ) ;
136
285
137
286
function merge ( ranges : { name : string ; version : string } [ ] ) : VersionRange [ ] {
@@ -165,3 +314,27 @@ function mergeVersion(min: string, max: string, newValue: string) {
165
314
166
315
return { min : minVersion , max : maxVersion } ;
167
316
}
317
+
318
+ async function maxSwcCoreVersion ( ) {
319
+ const coreVersions = await db . swcCoreVersion . findMany ( {
320
+ select : {
321
+ version : true ,
322
+ } ,
323
+ } ) ;
324
+
325
+ return coreVersions . reduce ( ( max , core ) => {
326
+ return semver . gt ( max , core . version ) ? max : core . version ;
327
+ } , "0.0.0" ) ;
328
+ }
329
+
330
+ async function maxSwcPluginRunnerVersion ( ) {
331
+ const pluginRunnerVersions = await db . swcPluginRunnerVersion . findMany ( {
332
+ select : {
333
+ version : true ,
334
+ } ,
335
+ } ) ;
336
+
337
+ return pluginRunnerVersions . reduce ( ( max , pluginRunner ) => {
338
+ return semver . gt ( max , pluginRunner . version ) ? max : pluginRunner . version ;
339
+ } , "0.0.0" ) ;
340
+ }
0 commit comments