Skip to content

Commit e7315b1

Browse files
committed
Implementation of svelte.dev/packages only with no package search
1 parent 8999dfd commit e7315b1

File tree

126 files changed

+3073
-3
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

126 files changed

+3073
-3
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const OFFICIAL = [
2+
/^@sveltejs\//,
3+
'prettier-plugin-svelte',
4+
'svelte',
5+
'svelte2tsx',
6+
'eslint-plugin-svelte',
7+
'sv',
8+
'svelte-loader',
9+
'rollup-plugin-svelte'
10+
];
11+
function is_official(pkg: string): boolean {
12+
for (const official of OFFICIAL) {
13+
if (official instanceof RegExp) {
14+
if (official.test(pkg)) return true;
15+
continue;
16+
}
17+
18+
if (official === pkg) return true;
19+
}
20+
21+
return false;
22+
}
23+
24+
export const PACKAGES_META = {
25+
is_official
26+
};

apps/svelte.dev/src/lib/server/content.ts

Lines changed: 339 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { read } from '$app/server';
2+
import { PACKAGES_META } from '$lib/packages-meta';
23
import type { Document, DocumentSummary } from '@sveltejs/site-kit';
34
import { create_index } from '@sveltejs/site-kit/server/content';
45

@@ -17,6 +18,15 @@ const assets = import.meta.glob<string>(
1718
}
1819
);
1920

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+
2030
// https://github.com/vitejs/vite/issues/17453
2131
export const index = await create_index(documents, assets, '../../../content', read);
2232

@@ -142,3 +152,332 @@ export function create_summary(document: Document): DocumentSummary {
142152
export const docs = create_docs();
143153

144154
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();
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"name": "@ai-sdk/svelte",
3+
"description": "Provide Svelte UI components for AI SDK.",
4+
"repo_url": "https://github.com/vercel/ai",
5+
"authors": ["jaredpalmer", "vercel-release-bot"],
6+
"homepage": "https://sdk.vercel.ai/docs",
7+
"downloads": 343180,
8+
"updated": "2025-04-14T07:12:31.855Z",
9+
"tags": ["ui"],
10+
"runes": true,
11+
"github_stars": 13390,
12+
"typescript": true,
13+
"version": "2.1.9",
14+
"svelte_range": "^5.0.0",
15+
"last_rune_check_version": "2.1.9"
16+
}

0 commit comments

Comments
 (0)