1
1
import { read } from '$app/server' ;
2
+ import { PACKAGES_META } from '$lib/packages-meta' ;
2
3
import type { Document , DocumentSummary } from '@sveltejs/site-kit' ;
3
4
import { create_index } from '@sveltejs/site-kit/server/content' ;
4
5
@@ -17,6 +18,15 @@ const assets = import.meta.glob<string>(
17
18
}
18
19
) ;
19
20
21
+ const registry_docs = import . meta. glob < string > (
22
+ '../../../src/lib/server/generated/registry/*.json' ,
23
+ {
24
+ eager : true ,
25
+ query : '?raw' ,
26
+ import : 'default'
27
+ }
28
+ ) ;
29
+
20
30
// https://github.com/vitejs/vite/issues/17453
21
31
export const index = await create_index ( documents , assets , '../../../content' , read ) ;
22
32
@@ -142,3 +152,332 @@ export function create_summary(document: Document): DocumentSummary {
142
152
export const docs = create_docs ( ) ;
143
153
144
154
export const examples = index . examples . children ;
155
+
156
+ /**
157
+ * Represents a Svelte package in the registry
158
+ */
159
+ export interface Package {
160
+ /** Package name */
161
+ name : string ;
162
+
163
+ version : string ;
164
+
165
+ /** Package description (HTML formatted) */
166
+ description ?: string ;
167
+
168
+ /** Repository URL (typically GitHub) */
169
+ repo_url ?: string ;
170
+
171
+ /** Author username */
172
+ authors ?: string [ ] ;
173
+
174
+ /** Homepage URL */
175
+ homepage ?: string ;
176
+
177
+ /** Weekly download count */
178
+ downloads ?: number ;
179
+
180
+ /** Last update timestamp */
181
+ updated : string ;
182
+
183
+ /** Number of GitHub stars */
184
+ github_stars ?: number ;
185
+
186
+ outdated ?: boolean ;
187
+
188
+ deprecated ?: boolean ;
189
+
190
+ svelte : {
191
+ 3 : boolean ;
192
+ 4 : boolean ;
193
+ 5 : boolean ;
194
+ } ;
195
+
196
+ /** @deprecated DO NOT USE ON FRONTEND */
197
+ svelte_range ?: string ;
198
+ /** @deprecated DO NOT USE ON FRONTEND */
199
+ kit_range ?: string ;
200
+ /** @deprecated DO NOT USE ON FRONTEND */
201
+ last_rune_check_version ?: string ;
202
+
203
+ runes : boolean ;
204
+
205
+ /** Tags for categorizing the package */
206
+ tags : string [ ] ;
207
+
208
+ official ?: boolean ;
209
+
210
+ typescript : boolean ;
211
+ }
212
+
213
+ /**
214
+ * Checks if a semver range supports Svelte versions 3.x, 4.x, and 5.x
215
+ */
216
+ function supports_svelte_versions ( version_range : string ) : {
217
+ 3 : boolean ;
218
+ 4 : boolean ;
219
+ 5 : boolean ;
220
+ } {
221
+ if ( ! version_range ) return { 3 : false , 4 : false , 5 : false } ;
222
+
223
+ // Initialize result object
224
+ const result = { 3 : false , 4 : false , 5 : false } ;
225
+
226
+ // Handle version range with OR operators first before any other processing
227
+ if ( version_range . includes ( '||' ) ) {
228
+ const ranges = version_range . split ( '||' ) . map ( ( r ) => r . trim ( ) ) ;
229
+
230
+ // Check each range and combine results with OR logic
231
+ for ( const range of ranges ) {
232
+ const range_result = supports_svelte_versions ( range ) ;
233
+ result [ 3 ] = result [ 3 ] || range_result [ 3 ] ;
234
+ result [ 4 ] = result [ 4 ] || range_result [ 4 ] ;
235
+ result [ 5 ] = result [ 5 ] || range_result [ 5 ] ;
236
+ }
237
+
238
+ return result ;
239
+ }
240
+
241
+ // Handle exact version with equals sign
242
+ if ( version_range . startsWith ( '=' ) ) {
243
+ const exact_version = version_range . substring ( 1 ) ;
244
+ return supports_svelte_versions ( exact_version ) ;
245
+ }
246
+
247
+ // Handle hyphen ranges directly (not part of a complex expression)
248
+ if ( version_range . includes ( ' - ' ) ) {
249
+ // Split by hyphen and trim whitespace
250
+ const parts = version_range . split ( '-' ) . map ( ( p ) => p . trim ( ) ) ;
251
+ // Handle "x - y" format correctly
252
+ if ( parts . length === 2 ) {
253
+ const start = parseFloat ( parts [ 0 ] ) ;
254
+ const end = parseFloat ( parts [ 1 ] ) ;
255
+
256
+ result [ 3 ] = start <= 3 && end >= 3 ;
257
+ result [ 4 ] = start <= 4 && end >= 4 ;
258
+ result [ 5 ] = start <= 5 && end >= 5 ;
259
+
260
+ return result ;
261
+ }
262
+ }
263
+
264
+ // Handle complex version ranges with both upper and lower bounds in the same expression
265
+ // Examples: ">=1.0.0 <=4.9.9", ">=3.0.0 <6.0.0", ">3.0.0-rc.1 <3.1.0"
266
+ if (
267
+ version_range . includes ( ' ' ) &&
268
+ ( version_range . includes ( '<' ) ||
269
+ version_range . includes ( '<=' ) ||
270
+ version_range . includes ( '>=' ) ||
271
+ version_range . includes ( '>' ) )
272
+ ) {
273
+ // Process for complex range with multiple constraints
274
+ let includes_version_3 = true ;
275
+ let includes_version_4 = true ;
276
+ let includes_version_5 = true ;
277
+
278
+ // Split by spaces to get individual constraints
279
+ const constraints = version_range
280
+ . split ( ' ' )
281
+ . filter (
282
+ ( c ) => c . startsWith ( '<' ) || c . startsWith ( '<=' ) || c . startsWith ( '>' ) || c . startsWith ( '>=' )
283
+ ) ;
284
+
285
+ // If we couldn't parse any valid constraints, return false
286
+ if ( constraints . length === 0 ) {
287
+ return { 3 : false , 4 : false , 5 : false } ;
288
+ }
289
+
290
+ // Special case handling for pre-release specific ranges (e.g., ">3.0.0-rc.1 <3.1.0")
291
+ if ( constraints . some ( ( c ) => c . includes ( '-' ) ) ) {
292
+ // Identify if this is a narrow range for a specific major version
293
+ let major_version = null ;
294
+
295
+ for ( const constraint of constraints ) {
296
+ const match = constraint . match ( / [ < > = ] + \s * ( \d + ) / ) ;
297
+ if ( match ) {
298
+ const version = parseInt ( match [ 1 ] ) ;
299
+ if ( major_version === null ) {
300
+ major_version = version ;
301
+ } else if ( major_version !== version ) {
302
+ major_version = null ; // Different major versions, not a narrow range
303
+ break ;
304
+ }
305
+ }
306
+ }
307
+
308
+ // If we identified a specific major version for this pre-release constraint
309
+ if ( major_version !== null ) {
310
+ result [ 3 ] = major_version === 3 ;
311
+ result [ 4 ] = major_version === 4 ;
312
+ result [ 5 ] = major_version === 5 ;
313
+ return result ;
314
+ }
315
+ }
316
+
317
+ for ( const constraint of constraints ) {
318
+ if ( constraint . startsWith ( '>=' ) ) {
319
+ const version_number = parseFloat ( constraint . substring ( 2 ) ) ;
320
+ // Check lower bounds for each version
321
+ if ( version_number > 3 ) includes_version_3 = false ;
322
+ if ( version_number > 4 ) includes_version_4 = false ;
323
+ if ( version_number > 5 ) includes_version_5 = false ;
324
+ } else if ( constraint . startsWith ( '>' ) ) {
325
+ const version_number = parseFloat ( constraint . substring ( 1 ) ) ;
326
+ // Check lower bounds for each version
327
+ if ( version_number >= 3 ) includes_version_3 = false ;
328
+ if ( version_number >= 4 ) includes_version_4 = false ;
329
+ if ( version_number >= 5 ) includes_version_5 = false ;
330
+ } else if ( constraint . startsWith ( '<=' ) ) {
331
+ const version_number = parseFloat ( constraint . substring ( 2 ) ) ;
332
+ // Check upper bounds for each version
333
+ if ( version_number < 3 ) includes_version_3 = false ;
334
+ if ( version_number < 4 ) includes_version_4 = false ;
335
+ if ( version_number < 5 ) includes_version_5 = false ;
336
+ } else if ( constraint . startsWith ( '<' ) ) {
337
+ const version_number = parseFloat ( constraint . substring ( 1 ) ) ;
338
+ // Check upper bounds for each version
339
+ if ( version_number <= 3 ) includes_version_3 = false ;
340
+ if ( version_number <= 4 ) includes_version_4 = false ;
341
+ if ( version_number <= 5 ) includes_version_5 = false ;
342
+ }
343
+ }
344
+
345
+ result [ 3 ] = includes_version_3 ;
346
+ result [ 4 ] = includes_version_4 ;
347
+ result [ 5 ] = includes_version_5 ;
348
+
349
+ return result ;
350
+ }
351
+
352
+ // Handle exact major version format
353
+ if ( / ^ [ 0 - 9 ] + $ / . test ( version_range ) ) {
354
+ const version = parseInt ( version_range ) ;
355
+ result [ 3 ] = version === 3 ;
356
+ result [ 4 ] = version === 4 ;
357
+ result [ 5 ] = version === 5 ;
358
+ return result ;
359
+ }
360
+
361
+ // Handle caret ranges
362
+ if ( version_range . startsWith ( '^' ) ) {
363
+ const major_version = parseInt ( version_range . substring ( 1 ) . split ( '.' ) [ 0 ] ) ;
364
+ result [ 3 ] = major_version === 3 ;
365
+ result [ 4 ] = major_version === 4 ;
366
+ result [ 5 ] = major_version === 5 ;
367
+ return result ;
368
+ }
369
+
370
+ // Handle pre-release versions directly (e.g., 5.0.0-next.42)
371
+ if ( / ^ ( [ 0 - 9 ] + ) \. ( [ 0 - 9 ] + ) \. ( [ 0 - 9 ] + ) - / . test ( version_range ) ) {
372
+ const match = version_range . match ( / ^ ( [ 0 - 9 ] + ) \. / ) ;
373
+ if ( match ) {
374
+ // Extract major version from the pre-release
375
+ const major_version = parseInt ( match [ 1 ] ) ;
376
+ result [ 3 ] = major_version === 3 ;
377
+ result [ 4 ] = major_version === 4 ;
378
+ result [ 5 ] = major_version === 5 ;
379
+ return result ;
380
+ }
381
+ }
382
+
383
+ // Handle tilde ranges
384
+ if ( version_range . startsWith ( '~' ) ) {
385
+ const major_version = parseInt ( version_range . substring ( 1 ) . split ( '.' ) [ 0 ] ) ;
386
+ result [ 3 ] = major_version === 3 ;
387
+ result [ 4 ] = major_version === 4 ;
388
+ result [ 5 ] = major_version === 5 ;
389
+ return result ;
390
+ }
391
+
392
+ // Handle wildcard (*) by itself, which means any version
393
+ if ( version_range === '*' ) {
394
+ return { 3 : true , 4 : true , 5 : true } ;
395
+ }
396
+
397
+ // Handle * and x ranges (e.g., "3.x", "4.*")
398
+ if ( / ^ ( [ 0 - 9 ] + ) \. ( x | \* ) / . test ( version_range ) ) {
399
+ const match = version_range . match ( / ^ ( [ 0 - 9 ] + ) \. / ) ;
400
+ if ( match ) {
401
+ const major_version = parseInt ( match [ 1 ] ) ;
402
+ result [ 3 ] = major_version === 3 ;
403
+ result [ 4 ] = major_version === 4 ;
404
+ result [ 5 ] = major_version === 5 ;
405
+ return result ;
406
+ }
407
+ }
408
+
409
+ // Handle >= ranges
410
+ if ( version_range . startsWith ( '>=' ) ) {
411
+ const version_number = parseFloat ( version_range . substring ( 2 ) ) ;
412
+ result [ 3 ] = version_number <= 3 ;
413
+ result [ 4 ] = version_number <= 4 ;
414
+ result [ 5 ] = version_number <= 5 ;
415
+ return result ;
416
+ }
417
+
418
+ // Handle > ranges
419
+ if ( version_range . startsWith ( '>' ) ) {
420
+ const version_number = parseFloat ( version_range . substring ( 1 ) ) ;
421
+ result [ 3 ] = version_number < 3 ;
422
+ result [ 4 ] = version_number < 4 ;
423
+ result [ 5 ] = version_number < 5 ;
424
+ return result ;
425
+ }
426
+
427
+ // Handle <= ranges
428
+ if ( version_range . startsWith ( '<=' ) ) {
429
+ const version_number = parseFloat ( version_range . substring ( 2 ) ) ;
430
+ result [ 3 ] = version_number >= 3 ;
431
+ result [ 4 ] = version_number >= 4 ;
432
+ result [ 5 ] = version_number >= 5 ;
433
+ return result ;
434
+ }
435
+
436
+ // Handle < ranges
437
+ if ( version_range . startsWith ( '<' ) ) {
438
+ const version_number = parseFloat ( version_range . substring ( 1 ) ) ;
439
+ result [ 3 ] = version_number > 3 ;
440
+ result [ 4 ] = version_number > 4 ;
441
+ result [ 5 ] = version_number > 5 ;
442
+ return result ;
443
+ }
444
+
445
+ // Handle exact versions (like 3.0.0, 4.1.2, etc.)
446
+ if ( / ^ [ 0 - 9 ] + \. [ 0 - 9 ] + \. [ 0 - 9 ] + $ / . test ( version_range ) ) {
447
+ const major_version = parseInt ( version_range . split ( '.' ) [ 0 ] ) ;
448
+ result [ 3 ] = major_version === 3 ;
449
+ result [ 4 ] = major_version === 4 ;
450
+ result [ 5 ] = major_version === 5 ;
451
+ return result ;
452
+ }
453
+
454
+ // Handle x-ranges (3.x.x, 4.x, etc.)
455
+ if ( version_range . includes ( '.x' ) || version_range . includes ( '.*' ) ) {
456
+ const major_version = parseInt ( version_range . split ( '.' ) [ 0 ] ) ;
457
+ result [ 3 ] = major_version === 3 ;
458
+ result [ 4 ] = major_version === 4 ;
459
+ result [ 5 ] = major_version === 5 ;
460
+ return result ;
461
+ }
462
+
463
+ return result ;
464
+ }
465
+
466
+ function create_registry ( ) {
467
+ let output : Package [ ] = [ ] ;
468
+
469
+ for ( const frontmatter of Object . values ( registry_docs ) ) {
470
+ const json = JSON . parse ( frontmatter ) ;
471
+ json . description = json . description ;
472
+ json . outdated = + new Date ( ) - + new Date ( json . updated ) > 2 * 365 * 24 * 60 * 60 * 1000 ;
473
+ json . official = json . official ?? PACKAGES_META . is_official ( json . name ) ;
474
+ json . ts_support = json . typescript ?. types_source ;
475
+ json . svelte = supports_svelte_versions ( json . svelte_range ) ;
476
+
477
+ output . push ( json as unknown as Package ) ;
478
+ }
479
+
480
+ return output ;
481
+ }
482
+
483
+ export const registry = create_registry ( ) ;
0 commit comments