diff --git a/.github/workflows/sync-packages.yml b/.github/workflows/sync-packages.yml new file mode 100644 index 0000000000..90045be951 --- /dev/null +++ b/.github/workflows/sync-packages.yml @@ -0,0 +1,37 @@ +name: Sync packages + +on: + schedule: + - cron: '0 0 * * 0' # At 00:00 on Sunday. + workflow_dispatch: # Allow manual triggering + +permissions: + contents: write + pull-requests: write + +jobs: + update: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v5 + with: + node-version: 24 + - run: pnpm install --frozen-lockfile --ignore-scripts + + - name: Sync packages + run: cd apps/svelte.dev && pnpm sync-packages + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create or update pull request + uses: peter-evans/create-pull-request@599a7e63a6240886b1b61fe984db1de9e0b05bc4 # v7.0.8 + with: + commit-message: 'chore(packages): Update metadata' + title: 'chore(packages): Update metadata' + body: Automatically fetch latest packages metadata from NPM & GitHub. + branch: ci/update-packages-metadata + delete-branch: true diff --git a/apps/svelte.dev/package.json b/apps/svelte.dev/package.json index e6bc3a452f..6f12f0879a 100644 --- a/apps/svelte.dev/package.json +++ b/apps/svelte.dev/package.json @@ -13,7 +13,8 @@ "check": "node scripts/update.js && svelte-kit sync && svelte-check", "format": "prettier --write .", "lint": "prettier --check .", - "sync-docs": "tsx scripts/sync-docs/index.ts" + "sync-docs": "tsx scripts/sync-docs/index.ts", + "sync-packages": "node scripts/sync-packages/index.ts" }, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", @@ -40,6 +41,7 @@ "flexsearch": "^0.7.43", "flru": "^1.0.2", "icons": "workspace:*", + "logos": "workspace:*", "port-authority": "^2.0.1", "topojson-client": "^3.1.0", "vitest": "^3.2.4", diff --git a/apps/svelte.dev/scripts/sync-docs/index.ts b/apps/svelte.dev/scripts/sync-docs/index.ts index 4f0f86c231..ae4be99692 100644 --- a/apps/svelte.dev/scripts/sync-docs/index.ts +++ b/apps/svelte.dev/scripts/sync-docs/index.ts @@ -4,11 +4,11 @@ import path from 'node:path'; import fs from 'node:fs'; import { parseArgs } from 'node:util'; import ts from 'typescript'; -import glob from 'tiny-glob/sync'; +import glob from 'tiny-glob/sync.js'; import chokidar from 'chokidar'; import { fileURLToPath } from 'node:url'; -import { clone_repo, migrate_meta_json } from './utils'; -import { get_types, read_d_ts_file, read_types } from './types'; +import { clone_repo, migrate_meta_json } from './utils.ts'; +import { get_types, read_d_ts_file, read_types } from './types.ts'; import type { Modules } from '@sveltejs/site-kit/markdown'; interface Package { diff --git a/apps/svelte.dev/scripts/sync-docs/utils.ts b/apps/svelte.dev/scripts/sync-docs/utils.ts index c5f41c0279..816bc42fa9 100644 --- a/apps/svelte.dev/scripts/sync-docs/utils.ts +++ b/apps/svelte.dev/scripts/sync-docs/utils.ts @@ -1,6 +1,6 @@ import { execSync, spawn, type SpawnOptions } from 'node:child_process'; import fs from 'node:fs'; -import glob from 'tiny-glob/sync'; +import glob from 'tiny-glob/sync.js'; export async function clone_repo(repo: string, name: string, branch: string, cwd: string) { const dir = `${cwd}/${name}`; diff --git a/apps/svelte.dev/scripts/sync-packages/README.md b/apps/svelte.dev/scripts/sync-packages/README.md new file mode 100644 index 0000000000..765a7ccc15 --- /dev/null +++ b/apps/svelte.dev/scripts/sync-packages/README.md @@ -0,0 +1,19 @@ +# sync-packages + +This script syncs the packages metadata from NPM & GitHub. + +## Usage + +```bash +pnpm sync-packages +``` + +## Notes + +- All packages `names` are in `FEATURED` of [packages-meta.ts](apps/svelte.dev/src/lib/packages-meta.ts) file. + +If you want to add or remove a package, you need to update `FEATURED` objects and run the script again (it will update the json files in the `src/lib/server/generated/registry` directory). + +- [sync-packages.yml](/.github/workflows/sync-packages.yml) is responsible for running the script regularly and update all metadata (it can also be triggered manually). + +- Ambassadors and maintainers are curating the list of packages. diff --git a/apps/svelte.dev/scripts/sync-packages/index.ts b/apps/svelte.dev/scripts/sync-packages/index.ts new file mode 100644 index 0000000000..305faedbae --- /dev/null +++ b/apps/svelte.dev/scripts/sync-packages/index.ts @@ -0,0 +1,280 @@ +import { PACKAGES_META } from '../../src/lib/packages-meta.ts'; +import type { PackageKey, PackageNpm, PackageGithub } from '../../src/lib/server/content.ts'; +import { execSync } from 'node:child_process'; +import fs from 'node:fs'; +import path from 'node:path'; +import process from 'node:process'; + +let skipGithubStars = false; + +const start = performance.now(); +console.log('[sync-packages] start'); + +let logsAtTheEnd: { + type: + | 'no_repo_url' + | 'low_downloads' + | 'low_github_stars' + | 'new_json_file' + | 'deleted_unused_json_file' + | 'outdated' + | 'deprecated' + | 'npm_error'; + pkg: string; + extra: string; +}[] = []; + +const packages = PACKAGES_META.FEATURED.flatMap((pkg) => pkg.packages).map((pkg) => pkg.name); + +const registryFolder = 'src/lib/server/generated/registry'; + +// PART 1: create missing json files +for (const pkg of packages) { + const cleanPkg = pkg.replace('@', '').replace('/', '-'); + const jsonPath = path.join(registryFolder, `${cleanPkg}.json`); + if (!fs.existsSync(jsonPath)) { + const p = await getNpmAndGitHubData(pkg); + writeJsonData(jsonPath, p); + logsAtTheEnd.push({ type: 'new_json_file', pkg, extra: `created -> ${jsonPath}` }); + } +} + +// PART 2: delete unused json files +let registryJsonFiles = fs.readdirSync(registryFolder); +const jsonUsed: string[] = []; +for (const pkg of packages) { + const cleanPkg = pkg.replace('@', '').replace('/', '-'); + const cleanPkgFile = `${cleanPkg}.json`; + const jsonPath = path.join(registryFolder, cleanPkgFile); + if (fs.existsSync(jsonPath)) { + jsonUsed.push(cleanPkgFile); + } +} +const jsonNotNeeded = registryJsonFiles.filter((pkg) => !jsonUsed.includes(pkg)); +if (jsonNotNeeded.length > 0) { + // delete json files + for (const pkg of jsonNotNeeded) { + const jsonPath = path.join(registryFolder, pkg); + fs.unlinkSync(jsonPath); + logsAtTheEnd.push({ type: 'deleted_unused_json_file', pkg, extra: `deleted -> ${jsonPath}` }); + } + + // Let's continue + // theEnd(1); +} + +// PART 3: refresh data +registryJsonFiles = fs.readdirSync(registryFolder); //.slice(0, 20); + +const batch = 10; +for (let i = 0; i < registryJsonFiles.length; i += batch) { + const batchFiles = registryJsonFiles.slice(i, i + batch); + await Promise.all( + batchFiles.map(async (pkg) => { + await refreshJsonFile(path.join(registryFolder, pkg)); + }) + ); +} + +theEnd(0); + +// HELPERS + +function theEnd(val: number) { + const msg = ['[sync-packages]']; + if (val > 0) { + msg.push(`exit(${val}) - `); + } + msg.push(`took: ${(performance.now() - start).toFixed(0)}ms`); + console.log(msg.join(' ')); + if (logsAtTheEnd.length > 0) { + console.log('[sync-packages] report:'); + const typePrints: Record<(typeof logsAtTheEnd)[number]['type'], string> = { + no_repo_url: 'No GitHub URL', + low_downloads: 'Low Downloads', + low_github_stars: 'Low Stars', + new_json_file: 'NEW JSON', + deleted_unused_json_file: 'DEL JSON', + outdated: 'Outdated', + deprecated: 'Deprecated', + npm_error: 'NPM Error' + }; + console.log( + ` - ${logsAtTheEnd.map((l) => `${typePrints[l.type].padEnd(15)} | ${l.pkg.padEnd(35)} | ${l.extra}`).join('\n - ')}` + ); + } + process.exit(val); +} + +async function getNpmAndGitHubData(pkg: string): Promise { + const [npmInfo, npmDlInfo] = await Promise.all([ + fetchJson(`https://registry.npmjs.org/${pkg}`), + fetchJson(`https://api.npmjs.org/downloads/point/last-week/${pkg}`) + ]); + + if (npmInfo.error) { + logsAtTheEnd.push({ type: 'npm_error', pkg, extra: npmInfo.error }); + theEnd(1); + } + + // delete npmInfo.readme; + // delete npmInfo.versions; + // console.log(`npmInfo`, npmInfo); + + const npm_description = npmInfo.description; + const raw_repo_url = npmInfo.repository?.url ?? ''; + const repo_url = raw_repo_url?.replace(/^git\+/, '').replace(/\.git$/, ''); + if (!repo_url) { + // console.error(`repo_url not found for ${pkg}`); + logsAtTheEnd.push({ type: 'no_repo_url', pkg, extra: `not found` }); + } + const git_org = repo_url?.split('/')[3]; + const git_repo = repo_url?.split('/')[4]; + + const authors = npmInfo.maintainers?.map((m: { name: string }) => m.name); + const homepage = npmInfo.homepage; + const downloads = npmDlInfo.downloads; + const version = npmInfo['dist-tags'].latest; + const updated = npmInfo.time[version]; + const pkgInfo = npmInfo.versions[version]; + const deprecated_reason = pkgInfo.deprecated; + + const svelte_range = + pkgInfo.peerDependencies?.svelte ?? + pkgInfo.dependencies?.svelte ?? + pkgInfo.devDependencies?.svelte; + + const kit_range = + pkgInfo.peerDependencies?.['@sveltejs/kit'] ?? + pkgInfo.dependencies?.['@sveltejs/kit'] ?? + pkgInfo.devDependencies?.['@sveltejs/kit']; + + // GitHub + let github_stars: number | undefined = undefined; + if (git_org && git_repo && !skipGithubStars) { + const token = process.env.GITHUB_TOKEN; + const headers = token ? new Headers({ authorization: 'Bearer ' + token }) : {}; + const res = await fetchJson(`https://api.github.com/repos/${git_org}/${git_repo}`, { headers }); + if (res?.message && res?.message.startsWith('API rate limit exceeded')) { + skipGithubStars = true; + } else { + github_stars = res.stargazers_count; + } + } + + return { + name: pkg, + npm_description, + repo_url, + authors, + homepage, + version, + deprecated_reason, + downloads, + updated, + svelte_range, + kit_range, + + // GitHub + github_stars + }; +} + +async function refreshJsonFile(fullPath: string) { + console.log(`Refreshing:`, fullPath); + + const currentJson = JSON.parse(fs.readFileSync(fullPath, 'utf-8')); + const newData = await getNpmAndGitHubData(currentJson.name); + + // remove all undefined values + for (const key in newData) { + if (newData[key] === undefined) { + delete newData[key]; + } + } + + // Let's not filter npm downloads changes + // // filter changes of downloads + // if (newData.downloads && currentJson.downloads) { + // const dlDelta = Math.abs( + // ((newData.downloads - currentJson.downloads) / currentJson.downloads) * 100 + // ); + // if (dlDelta < 2.5) delete newData.downloads; + // } + + const data = { ...currentJson, ...newData }; + + // Some stats infos to log + if (data.downloads && data.downloads < 255) { + logsAtTheEnd.push({ type: 'low_downloads', pkg: data.name, extra: `${data.downloads}` }); + } + + if (data.github_stars && data.github_stars < 42) { + logsAtTheEnd.push({ + type: 'low_github_stars', + pkg: data.name, + extra: `${data.github_stars}` + }); + } + + if (data.updated && PACKAGES_META.is_outdated(data.updated)) { + logsAtTheEnd.push({ type: 'outdated', pkg: data.name, extra: `${data.updated}` }); + } + + if (data.deprecated_reason) { + logsAtTheEnd.push({ type: 'deprecated', pkg: data.name, extra: `${data.deprecated_reason}` }); + } + + writeJsonData(fullPath, data); +} + +function writeJsonData(path: string, data: any) { + const keysOrder: (keyof PackageKey | keyof PackageNpm | keyof PackageGithub)[] = [ + 'name', + 'npm_description', + 'repo_url', + 'authors', + 'homepage', + 'version', + 'deprecated_reason', + 'downloads', + 'github_stars', + 'updated', + 'svelte_range', + 'kit_range', + 'typescript', + 'runes', + 'last_rune_check_version' + ]; + + const sortedData: Record = {}; + for (const key of keysOrder) { + if (data[key] !== undefined) { + sortedData[key] = data[key]; + } + } + // all all the remaining keys + for (const key in data) { + if (!keysOrder.includes(key as keyof PackageKey | keyof PackageNpm | keyof PackageGithub)) { + sortedData[key] = data[key]; + } + } + + fs.writeFileSync(path, JSON.stringify(sortedData, null, 2)); + execSync(`prettier --write ${path}`); +} + +async function fetchJson(url: string, options: RequestInit = {}): Promise { + const headers = new Headers({ ...options.headers, 'User-Agent': 'svelte.dev/packages_v0.0.1' }); + + for (let i = 0; i < 5; i++) { + try { + const res = await fetch(url, { ...options, headers }); + return await res.json(); + } catch (e) { + console.error(`Failed to fetch ${url} after ${i + 1} retries`); + } + + await new Promise((resolve) => setTimeout(resolve, 1000 * Math.pow(2, i + 1))); + } +} diff --git a/apps/svelte.dev/src/lib/packages-meta.ts b/apps/svelte.dev/src/lib/packages-meta.ts new file mode 100644 index 0000000000..463e7ebbf7 --- /dev/null +++ b/apps/svelte.dev/src/lib/packages-meta.ts @@ -0,0 +1,694 @@ +import type { PackageDefinition, PackageKey, PackageManual, PackageNpm } from './server/content'; + +const FEATURED: { + title: string; + description?: string; + packages: PackageDefinition[]; +}[] = [ + { + title: 'Svelte CLI add-ons', + description: + 'The Svelte CLI lets you instantly add functionality to a new or existing project with npx sv add', + packages: [ + { name: 'tailwindcss', svAlias: 'tailwind', description: 'A utility-first CSS framework' }, + { + name: 'drizzle-orm', + svAlias: 'drizzle', + description: + 'Serverless-ready TypeScript ORM offering both relational and SQL-like query APIs' + }, + { + name: 'mdsvex', + svAlias: 'mdsvex', + description: + 'A Markdown preprocessor that lets you put Markdown in your Svelte and Svelte in your Markdown' + }, + { name: 'lucia', svAlias: 'lucia', description: 'Session-based password auth using Drizzle' }, + { + name: 'storybook', + svAlias: 'storybook', + description: 'Develop, document, and test UI components in isolation' + }, + { name: 'prettier', svAlias: 'prettier', description: 'An opinionated code formatter' }, + { name: 'eslint', svAlias: 'eslint', description: 'Find and fix problems in your code' }, + { name: 'vitest', svAlias: 'vitest', description: 'Vite-powered testing framework' }, + { + name: 'playwright', + svAlias: 'playwright', + description: 'Browser automation for end-to-end testing' + }, + { + name: '@inlang/paraglide-js', + svAlias: 'paraglide', + description: 'A compiler-based i18n library that emits tree-shakeable message functions' + }, + { + name: 'vite-plugin-devtools-json', + svAlias: 'devtools-json', + description: 'Generates Chromium DevTools project settings during development' + } + ] + }, + { + title: 'Component libraries', + packages: [ + { + name: 'shadcn-svelte', + description: 'A port of shadcn/ui, built with Bits UI and Tailwind CSS' + }, + { + name: 'bits-ui', + description: 'Headless component primitives — bring your own styles' + }, + { + name: '@skeletonlabs/skeleton', + description: 'An adaptive design system powered by Tailwind CSS' + }, + { + name: 'flowbite-svelte', + description: 'Official Svelte port of Flowbite, a UI library powered by Tailwind CSS' + }, + { name: '@ark-ui/svelte', description: 'Headless component library built on top of Zag.js' }, + { + name: 'daisyui', + description: 'A set of classnames encapsulating Tailwind CSS styles' + }, + { name: 'svelte-material-ui', description: 'An implementation of Google’s Material UI' }, + { name: 'carbon-components-svelte' }, + { + name: 'melt', + description: 'A low-level headless UI library' + }, + { name: '@sveltestrap/sveltestrap' } + ] + }, + { + title: 'SvelteKit adapters', + packages: [ + { name: '@sveltejs/adapter-node', description: 'Builds a standalone Node server' }, + { name: '@sveltejs/adapter-cloudflare', description: 'Builds your app for Cloudflare' }, + { name: '@sveltejs/adapter-netlify', description: 'Builds your app for Netlify' }, + { name: '@sveltejs/adapter-vercel', description: 'Builds your app for Vercel' }, + { name: '@sveltejs/adapter-static', description: 'Builds your static site' }, + { name: '@deno/svelte-adapter', description: 'Builds your app for Deno Deploy' }, + { name: 'amplify-adapter', description: 'Builds your app for AWS Amplify' }, + { name: 'svelte-kit-sst', description: 'Builds your app for AWS Lambda and AWS Lamda@Edge' }, + { name: 'svelte-adapter-bun', description: 'Builds your app for Bun' }, + { + name: 'svelte-adapter-appengine', + description: 'Builds your app for Google Cloud App Engine' + }, + { + name: 'sveltekit-adapter-chrome-extension', + description: 'Builds your app as a Chrome extension using manifest v3' + }, + { + name: '@slicemachine/adapter-sveltekit', + description: "Integrate with Prismic's Slice Machine" + } + ] + }, + { + title: 'Content', + packages: [ + { + name: 'mdsvex', + description: 'Put Markdown in your Svelte and Svelte in your Markdown' + }, + { + name: '@content-collections/core', + description: 'Transform your content into type-safe data collections' + }, + { name: 'svelte-exmarkdown', description: 'Extensible component for Markdown rendering' }, + { + name: '@magidoc/plugin-svelte-marked', + description: 'Markdown parser that supports Github Flavored Markdown' + }, + { + name: '@prismicio/svelte', + description: 'Components and helpers to fetch and present Prismic content' + }, + { name: 'carta-md' }, + { name: '@sveltepress/vite', description: 'A content centered site build tool' }, + { + name: '@evidence-dev/evidence', + description: + 'A framework for building and publishing data products using SQL, Markdown, and AI' + }, + { name: 'svelte-pdf', description: 'Render PDF documents using PDF.js' }, + { name: 'typewriter-editor' } + ] + }, + { + title: 'Icons', + packages: [ + { name: '@iconify/tailwind4' }, + { name: '@unocss/preset-icons' }, + { name: '@lucide/svelte', description: 'Beautiful and consistent icons' }, + { name: 'svelte-awesome', description: 'Font Awesome icons for Svelte' }, + { name: 'phosphor-svelte', description: 'A clean and friendly icon family' } + ] + }, + { + title: 'Data visualization', + packages: [ + { + name: 'layerchart', + description: 'Composable chart components for building a wide range of visualizations' + }, + { + name: 'layercake', + description: 'Create responsive graphics that can work without JavaScript' + }, + { + name: 'svelte-maplibre', + description: 'Publish maps on your website with GPU-accelerated vector tile rendering' + }, + { + name: '@xyflow/svelte', + description: 'Customizable component for building node-based UIs and diagrams' + }, + { + name: 'svelte-maplibre-gl', + description: 'Build interactive web maps with MapLibre GL' + } + ] + }, + { + title: 'Auth', + packages: [ + { name: 'better-auth', description: 'Comprehensive authentication library' }, + { + name: '@supabase/ssr', + description: 'Server-side library for cookie-based authentication with SvelteKit' + }, + { + name: 'altcha', + description: + 'Privacy-first CAPTCHA widget, compliant with global regulations and WCAG accessible' + }, + { + name: 'svelte-clerk', + description: 'Unofficial implementation of Clerk' + }, + { name: 'svelte-session-manager', description: 'JWT session store' }, + { + name: 'svelte-kit-sessions', + description: 'Session management library for SvelteKit' + }, + { name: '@passlock/sveltekit' } + ] + }, + { + title: 'Third party services', + packages: [ + { name: '@sentry/svelte' }, + { name: '@sentry/sveltekit' }, + { name: 'svelte-stripe', description: 'Add Stripe Elements to your project' }, + { + name: 'svelte-clerk', + description: 'Unofficial implementation of Clerk' + }, + { + name: '@storyblok/svelte', + description: 'Integrate the Storyblok headless CMS into your project' + }, + { + name: '@inlang/paraglide-js', + description: 'A compiler-based i18n library that emits tree-shakable message functions' + } + ] + }, + { + title: 'Testing and devtools', + packages: [ + { name: '@testing-library/svelte', description: 'Testing utilities for DOM interaction' }, + { name: 'playwright', description: 'Browser automation for end-to-end testing' }, + { name: 'vitest' }, + { name: 'svelte-render-scan', description: 'Visual debugging tool' }, + { name: 'svelte-inspect-value', description: 'Value inspector component' } + ] + }, + { + title: 'Internationalization (i18n)', + packages: [ + { + name: '@inlang/paraglide-js', + description: 'A compiler-based i18n library that emits tree-shakable message functions' + }, + { name: '@wuchale/svelte', description: 'Protobuf-like i18n from plain code' }, + { name: 'i18n-js' } + ] + }, + { + title: 'Bundler plugins', + packages: [ + { name: '@sveltejs/vite-plugin-svelte' }, + { name: 'rollup-plugin-svelte' }, + { name: 'svelte-loader', description: 'Compile Svelte components with webpack' }, + { name: 'esbuild-svelte', description: 'Compile Svelte components with esbuild' } + ] + }, + { + title: 'Media', + packages: [ + { name: '@sveltejs/enhanced-img' }, + { + name: '@unpic/svelte', + description: 'Responsive image component that integrates with popular CDNs' + }, + { name: '@poppanator/sveltekit-svg' }, + { name: 'svelte-easy-crop', description: 'A component for cropping images' }, + { + name: '@uppy/svelte', + description: 'Upload files from your computer or cloud storage services' + }, + { name: 'scrolly-video' } + ] + }, + { + title: 'Individual components', + packages: [ + { + name: '@tanstack/svelte-table', + description: 'Headless UI for building powerful tables & datagrids' + }, + { + name: '@ai-sdk/svelte', + description: 'Library for building AI-powered applications and agents' + }, + { + name: '@tanstack/svelte-virtual', + description: 'Headless UI for virtualizing scrollable elements' + }, + { + name: 'virtua', + description: 'A zero-config, fast and small (~3kB) virtual list and grid component' + }, + { name: '@event-calendar/core' } + ] + }, + { + title: 'Animations', + packages: [ + { name: '@threlte/core' }, + { name: '@neoconfetti/svelte', description: 'Confetti explosion' }, + { name: 'svelte-motion', description: 'Animation library based on framer-motion' }, + { name: '@lottiefiles/svelte-lottie-player', description: 'Lottie animation player' }, + { + name: '@tsparticles/svelte', + description: 'Easily create highly customizable particles, confetti, and fireworks' + } + ] + }, + { + title: 'SEO', + packages: [ + { + name: 'svelte-meta-tags', + description: 'SEO components with deep merge functionality and JSON-LD support' + }, + { + name: 'super-sitemap', + description: + 'A SvelteKit sitemap generator that makes it impossible to forget to add your paths' + }, + { name: 'svelte-seo', description: 'Add meta tags, Open Graph, and JSON-LD to your site' }, + { + name: 'svead', + description: + 'Set head meta information, canonical, title, Twitter and Facebook Open Graph tags, and schema.org data' + } + ] + }, + { + title: 'Routing', + description: + 'The official router is SvelteKit, but here are some alternatives', + packages: [ + { name: 'svelte5-router' }, + { name: '@roxi/routify', description: 'Routes based on file structure' }, + { name: 'svelte-pathfinder', description: 'A tiny, state-based router' }, + { name: 'universal-router' } + ] + }, + { + title: 'Data fetching', + description: + 'We recommend using SvelteKit’s remote functions, but for specific needs you can use these alternatives', + packages: [ + { + name: '@tanstack/svelte-query', + description: 'Primitives for managing, caching and syncing asynchronous and remote data' + }, + { name: '@urql/svelte', description: 'Customizable GraphQL client' }, + { name: 'houdini', description: 'The disappearing GraphQL framework' }, + { + name: 'trpc-sveltekit', + description: 'SvelteKit adapter for tRPC.io that supports Node, Vercel and Netlify' + }, + { + name: '@orpc/svelte-query', + description: 'APIs that are end-to-end type-safe and adhere to OpenAPI standards' + }, + { name: 'sswr' } + ] + }, + { + title: 'Forms', + description: + 'SvelteKit has built-in forms, but you can also use these packages', + packages: [ + { + name: 'sveltekit-superforms', + description: 'Server-side and client-side form validation library' + }, + { + name: 'formsnap', + description: 'Accessible form components built on top of sveltekit-superforms' + }, + { name: 'felte', description: 'An extensible form library' }, + { name: '@tanstack/svelte-form', description: 'Powerful, type-safe forms' } + ] + } +]; + +const OFFICIAL = [ + /^@sveltejs\//, + 'prettier-plugin-svelte', + 'svelte', + 'svelte2tsx', + 'eslint-plugin-svelte', + 'sv', + 'svelte-loader', + 'rollup-plugin-svelte' +]; +function is_official(pkg: string): boolean { + for (const official of OFFICIAL) { + if (official instanceof RegExp) { + if (official.test(pkg)) return true; + continue; + } + + if (official === pkg) return true; + } + + return false; +} + +function is_outdated(iso: string): boolean { + // 2 years + return +new Date() - +new Date(iso) > 2 * 365 * 24 * 60 * 60 * 1000; +} + +/** + * Checks if a semver range supports Svelte versions 3.x, 4.x, and 5.x + */ +function supports_svelte_versions(version_range: string): { + 3: boolean; + 4: boolean; + 5: boolean; +} { + if (!version_range) return { 3: false, 4: false, 5: false }; + + // Initialize result object + const result = { 3: false, 4: false, 5: false }; + + // Handle version range with OR operators first before any other processing + if (version_range.includes('||')) { + const ranges = version_range.split('||').map((r) => r.trim()); + + // Check each range and combine results with OR logic + for (const range of ranges) { + const range_result = supports_svelte_versions(range); + result[3] = result[3] || range_result[3]; + result[4] = result[4] || range_result[4]; + result[5] = result[5] || range_result[5]; + } + + return result; + } + + // Handle exact version with equals sign + if (version_range.startsWith('=')) { + const exact_version = version_range.substring(1); + return supports_svelte_versions(exact_version); + } + + // Handle hyphen ranges directly (not part of a complex expression) + if (version_range.includes(' - ')) { + // Split by hyphen and trim whitespace + const parts = version_range.split('-').map((p) => p.trim()); + // Handle "x - y" format correctly + if (parts.length === 2) { + const start = parseFloat(parts[0]); + const end = parseFloat(parts[1]); + + result[3] = start <= 3 && end >= 3; + result[4] = start <= 4 && end >= 4; + result[5] = start <= 5 && end >= 5; + + return result; + } + } + + // Handle complex version ranges with both upper and lower bounds in the same expression + // Examples: ">=1.0.0 <=4.9.9", ">=3.0.0 <6.0.0", ">3.0.0-rc.1 <3.1.0" + if ( + version_range.includes(' ') && + (version_range.includes('<') || + version_range.includes('<=') || + version_range.includes('>=') || + version_range.includes('>')) + ) { + // Process for complex range with multiple constraints + let includes_version_3 = true; + let includes_version_4 = true; + let includes_version_5 = true; + + // Split by spaces to get individual constraints + const constraints = version_range + .split(' ') + .filter( + (c) => c.startsWith('<') || c.startsWith('<=') || c.startsWith('>') || c.startsWith('>=') + ); + + // If we couldn't parse any valid constraints, return false + if (constraints.length === 0) { + return { 3: false, 4: false, 5: false }; + } + + // Special case handling for pre-release specific ranges (e.g., ">3.0.0-rc.1 <3.1.0") + if (constraints.some((c) => c.includes('-'))) { + // Identify if this is a narrow range for a specific major version + let major_version = null; + + for (const constraint of constraints) { + const match = constraint.match(/[<>=]+\s*(\d+)/); + if (match) { + const version = parseInt(match[1]); + if (major_version === null) { + major_version = version; + } else if (major_version !== version) { + major_version = null; // Different major versions, not a narrow range + break; + } + } + } + + // If we identified a specific major version for this pre-release constraint + if (major_version !== null) { + result[3] = major_version === 3; + result[4] = major_version === 4; + result[5] = major_version === 5; + return result; + } + } + + for (const constraint of constraints) { + if (constraint.startsWith('>=')) { + const version_number = parseFloat(constraint.substring(2)); + // Check lower bounds for each version + if (version_number > 3) includes_version_3 = false; + if (version_number > 4) includes_version_4 = false; + if (version_number > 5) includes_version_5 = false; + } else if (constraint.startsWith('>')) { + const version_number = parseFloat(constraint.substring(1)); + // Check lower bounds for each version + if (version_number >= 3) includes_version_3 = false; + if (version_number >= 4) includes_version_4 = false; + if (version_number >= 5) includes_version_5 = false; + } else if (constraint.startsWith('<=')) { + const version_number = parseFloat(constraint.substring(2)); + // Check upper bounds for each version + if (version_number < 3) includes_version_3 = false; + if (version_number < 4) includes_version_4 = false; + if (version_number < 5) includes_version_5 = false; + } else if (constraint.startsWith('<')) { + const version_number = parseFloat(constraint.substring(1)); + // Check upper bounds for each version + if (version_number <= 3) includes_version_3 = false; + if (version_number <= 4) includes_version_4 = false; + if (version_number <= 5) includes_version_5 = false; + } + } + + result[3] = includes_version_3; + result[4] = includes_version_4; + result[5] = includes_version_5; + + return result; + } + + // Handle exact major version format + if (/^[0-9]+$/.test(version_range)) { + const version = parseInt(version_range); + result[3] = version === 3; + result[4] = version === 4; + result[5] = version === 5; + return result; + } + + // Handle caret ranges + if (version_range.startsWith('^')) { + const major_version = parseInt(version_range.substring(1).split('.')[0]); + result[3] = major_version === 3; + result[4] = major_version === 4; + result[5] = major_version === 5; + return result; + } + + // Handle pre-release versions directly (e.g., 5.0.0-next.42) + if (/^([0-9]+)\.([0-9]+)\.([0-9]+)-/.test(version_range)) { + const match = version_range.match(/^([0-9]+)\./); + if (match) { + // Extract major version from the pre-release + const major_version = parseInt(match[1]); + result[3] = major_version === 3; + result[4] = major_version === 4; + result[5] = major_version === 5; + return result; + } + } + + // Handle tilde ranges + if (version_range.startsWith('~')) { + const major_version = parseInt(version_range.substring(1).split('.')[0]); + result[3] = major_version === 3; + result[4] = major_version === 4; + result[5] = major_version === 5; + return result; + } + + // Handle wildcard (*) by itself, which means any version + if (version_range === '*') { + return { 3: true, 4: true, 5: true }; + } + + // Handle * and x ranges (e.g., "3.x", "4.*") + if (/^([0-9]+)\.(x|\*)/.test(version_range)) { + const match = version_range.match(/^([0-9]+)\./); + if (match) { + const major_version = parseInt(match[1]); + result[3] = major_version === 3; + result[4] = major_version === 4; + result[5] = major_version === 5; + return result; + } + } + + // Handle >= ranges + if (version_range.startsWith('>=')) { + const version_number = parseFloat(version_range.substring(2)); + result[3] = version_number <= 3; + result[4] = version_number <= 4; + result[5] = version_number <= 5; + return result; + } + + // Handle > ranges + if (version_range.startsWith('>')) { + const version_number = parseFloat(version_range.substring(1)); + result[3] = version_number < 3; + result[4] = version_number < 4; + result[5] = version_number < 5; + return result; + } + + // Handle <= ranges + if (version_range.startsWith('<=')) { + const version_number = parseFloat(version_range.substring(2)); + result[3] = version_number >= 3; + result[4] = version_number >= 4; + result[5] = version_number >= 5; + return result; + } + + // Handle < ranges + if (version_range.startsWith('<')) { + const version_number = parseFloat(version_range.substring(1)); + result[3] = version_number > 3; + result[4] = version_number > 4; + result[5] = version_number > 5; + return result; + } + + // Handle exact versions (like 3.0.0, 4.1.2, etc.) + if (/^[0-9]+\.[0-9]+\.[0-9]+$/.test(version_range)) { + const major_version = parseInt(version_range.split('.')[0]); + result[3] = major_version === 3; + result[4] = major_version === 4; + result[5] = major_version === 5; + return result; + } + + // Handle x-ranges (3.x.x, 4.x, etc.) + if (version_range.includes('.x') || version_range.includes('.*')) { + const major_version = parseInt(version_range.split('.')[0]); + result[3] = major_version === 3; + result[4] = major_version === 4; + result[5] = major_version === 5; + return result; + } + + return result; +} + +function remove_ending_by(str: string, endings: string[]): string { + for (const ending of endings) { + if (str.endsWith(ending)) { + return str.slice(0, -ending.length); + } + } + return str; +} + +function calculate_description(pkg: PackageKey & PackageNpm): string { + const found = FEATURED.flatMap((f) => f.packages).find((p) => p.name === pkg.name); + if (found && found.description) return remove_ending_by(found.description, ['.']); + + let desc = pkg.npm_description ?? 'NO DESCRIPTION!'; + const replaces = [ + // strip out markdown links + { key: /\[(.*?)\]\((.*?)\)/g, value: '$1' } + ]; + for (const { key, value } of replaces) { + desc = desc.replace(key, value); + } + return remove_ending_by(desc, ['.']); +} + +function calculate_homepage(pkg: PackageKey & PackageNpm): string { + return remove_ending_by(pkg.homepage ?? '', ['#readme']); +} + +export const PACKAGES_META = { + FEATURED, + + calculate_description, + calculate_homepage, + + is_official, + is_outdated, + supports_svelte_versions +}; diff --git a/apps/svelte.dev/src/lib/server/content.ts b/apps/svelte.dev/src/lib/server/content.ts index ca60ed814b..0479b869a8 100644 --- a/apps/svelte.dev/src/lib/server/content.ts +++ b/apps/svelte.dev/src/lib/server/content.ts @@ -1,4 +1,5 @@ import { read } from '$app/server'; +import { PACKAGES_META } from '$lib/packages-meta'; import type { Document, DocumentSummary } from '@sveltejs/site-kit'; import { create_index } from '@sveltejs/site-kit/server/content'; @@ -17,6 +18,15 @@ const assets = import.meta.glob( } ); +const registry_docs = import.meta.glob( + '../../../src/lib/server/generated/registry/*.json', + { + eager: true, + query: '?raw', + import: 'default' + } +); + // https://github.com/vitejs/vite/issues/17453 export const index = await create_index(documents, assets, '../../../content', read); @@ -142,3 +152,113 @@ export function create_summary(document: Document): DocumentSummary { export const docs = create_docs(); export const examples = index.examples.children; + +/** + * Represents a Svelte package in the registry + */ +export interface Package + extends PackageKey, + PackageManual, + PackageNpm, + PackageGithub, + PackageCalculated {} + +export interface PackageKey { + /** Package name */ + name: string; +} + +export interface PackageManual { + description?: string; + + /** sv info */ + svAlias?: string; + svOptions?: string; +} + +export interface PackageDefinition extends PackageKey, PackageManual {} + +export interface PackageNpm { + /** Package description (HTML formatted) */ + npm_description?: string; + + /** Repository URL (typically GitHub) */ + repo_url?: string; + + /** Author username */ + authors?: string[]; + + /** Homepage URL */ + homepage?: string; + + /** Latest version */ + version: string; + + /** Why the package is deprecated */ + deprecated_reason: false | string; + + /** Weekly download count */ + downloads?: number; + + /** Last update timestamp */ + updated: string; + + /** Svelte version range */ + svelte_range?: string; + + /** SvelteKit version range */ + kit_range?: string; + + // SHOULD BE CALCULATED WHEN GET FROM NPM + /** @deprecated */ + typescript?: boolean; + // SHOULD BE CALCULATED WHEN GET FROM NPM + /** @deprecated */ + runes?: boolean; + // SHOULD BE DELETED (in *.json files as well) + /** @deprecated */ + last_rune_check_version?: string; +} + +export interface PackageGithub { + /** Number of GitHub stars */ + github_stars?: number; +} + +export interface PackageCalculated { + description?: string; + official?: boolean; + outdated?: boolean; + svelte: { + 3: boolean; + 4: boolean; + 5: boolean; + }; +} + +export interface Category { + title: string; + hash: string; + description?: string; + packages: Package[]; +} + +function create_registry() { + let output: Package[] = []; + + for (const frontmatter of Object.values(registry_docs)) { + const json = JSON.parse(frontmatter); + + json.description = PACKAGES_META.calculate_description(json); + json.homepage = PACKAGES_META.calculate_homepage(json); + json.official = PACKAGES_META.is_official(json.name); + json.outdated = PACKAGES_META.is_outdated(json.updated); + json.svelte = PACKAGES_META.supports_svelte_versions(json.svelte_range); + + output.push(json as unknown as Package); + } + + return output; +} + +export const registry = create_registry(); diff --git a/apps/svelte.dev/src/lib/server/generated/registry/ai-sdk-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/ai-sdk-svelte.json new file mode 100644 index 0000000000..8326f0c778 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/ai-sdk-svelte.json @@ -0,0 +1,15 @@ +{ + "name": "@ai-sdk/svelte", + "npm_description": "[Svelte](https://svelte.dev/) UI components for the [AI SDK](https://ai-sdk.dev/docs):", + "repo_url": "https://github.com/vercel/ai", + "authors": ["jaredpalmer", "vercel-release-bot", "matheuss", "matt.straka"], + "homepage": "https://ai-sdk.dev/docs", + "version": "3.0.59", + "downloads": 334767, + "github_stars": 18158, + "updated": "2025-09-29T23:31:14.293Z", + "svelte_range": "^5.31.0", + "typescript": true, + "runes": true, + "last_rune_check_version": "2.1.9" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/altcha.json b/apps/svelte.dev/src/lib/server/generated/registry/altcha.json new file mode 100644 index 0000000000..6de00759cd --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/altcha.json @@ -0,0 +1,15 @@ +{ + "name": "altcha", + "npm_description": "Privacy-first CAPTCHA widget, compliant with global regulations (GDPR/HIPAA/CCPA/LGDP/DPDPA/PIPL) and WCAG accessible. No tracking, self-verifying.", + "repo_url": "https://github.com/altcha-org/altcha", + "authors": ["ovx"], + "homepage": "https://altcha.org", + "version": "2.2.4", + "downloads": 18656, + "github_stars": 1554, + "updated": "2025-09-27T22:35:07.312Z", + "svelte_range": "^5.28.6", + "typescript": true, + "runes": false, + "last_rune_check_version": "1.4.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/amplify-adapter.json b/apps/svelte.dev/src/lib/server/generated/registry/amplify-adapter.json new file mode 100644 index 0000000000..be43370cdc --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/amplify-adapter.json @@ -0,0 +1,15 @@ +{ + "name": "amplify-adapter", + "npm_description": "Adapter for SvelteKit v1/v2 + Amplify SSR CI/CD", + "repo_url": "https://github.com/gzimbron/amplify-adapter", + "authors": ["zimbronapps"], + "homepage": "https://github.com/gzimbron/amplify-adapter#readme", + "version": "1.2.3", + "downloads": 1867, + "github_stars": 32, + "updated": "2025-09-11T19:17:42.448Z", + "kit_range": "^2.4.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.2.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/ark-ui-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/ark-ui-svelte.json new file mode 100644 index 0000000000..9bb20f07db --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/ark-ui-svelte.json @@ -0,0 +1,16 @@ +{ + "name": "@ark-ui/svelte", + "npm_description": "A collection of unstyled, accessible UI components for Svelte", + "repo_url": "https://github.com/chakra-ui/ark", + "authors": ["segunadebayo", "schroetier"], + "homepage": "https://ark-ui.com", + "version": "5.10.1", + "downloads": 488, + "github_stars": 4659, + "updated": "2025-09-27T19:08:23.695Z", + "svelte_range": ">=5.20.0", + "kit_range": "2.42.2", + "typescript": true, + "runes": true, + "last_rune_check_version": "0.3.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/better-auth.json b/apps/svelte.dev/src/lib/server/generated/registry/better-auth.json new file mode 100644 index 0000000000..8f43a51db4 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/better-auth.json @@ -0,0 +1,16 @@ +{ + "name": "better-auth", + "npm_description": "The most comprehensive authentication library for TypeScript.", + "repo_url": "https://github.com/better-auth/better-auth", + "authors": ["bekacru"], + "homepage": "https://github.com/better-auth/better-auth#readme", + "version": "1.3.24", + "downloads": 351361, + "github_stars": 21325, + "updated": "2025-09-30T18:23:46.067Z", + "svelte_range": "^4.0.0 || ^5.0.0", + "kit_range": "^2.37.1", + "typescript": true, + "runes": false, + "last_rune_check_version": "1.3.12" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/bits-ui.json b/apps/svelte.dev/src/lib/server/generated/registry/bits-ui.json new file mode 100644 index 0000000000..96b6c18304 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/bits-ui.json @@ -0,0 +1,16 @@ +{ + "name": "bits-ui", + "npm_description": "The headless components for Svelte.", + "repo_url": "https://github.com/huntabyte/bits-ui", + "authors": ["huntabyte"], + "homepage": "https://github.com/huntabyte/bits-ui#readme", + "version": "2.11.4", + "downloads": 252025, + "github_stars": 2643, + "updated": "2025-09-24T22:52:43.701Z", + "svelte_range": "^5.33.0", + "kit_range": "^2.42.0", + "typescript": true, + "runes": true, + "last_rune_check_version": "1.3.19" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/carbon-components-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/carbon-components-svelte.json new file mode 100644 index 0000000000..2dd38a7c3a --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/carbon-components-svelte.json @@ -0,0 +1,14 @@ +{ + "name": "carbon-components-svelte", + "npm_description": "Svelte implementation of the Carbon Design System", + "repo_url": "https://github.com/carbon-design-system/carbon-components-svelte", + "authors": ["metonym"], + "homepage": "https://svelte.carbondesignsystem.com/", + "version": "0.89.7", + "downloads": 12568, + "github_stars": 2829, + "updated": "2025-09-05T16:18:10.948Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.88.4" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/carta-md.json b/apps/svelte.dev/src/lib/server/generated/registry/carta-md.json new file mode 100644 index 0000000000..9f8454ca0e --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/carta-md.json @@ -0,0 +1,16 @@ +{ + "name": "carta-md", + "npm_description": "A lightweight, fully customizable, Markdown editor", + "repo_url": "https://github.com/BearToCode/carta", + "authors": ["astrobear"], + "homepage": "https://github.com/BearToCode/carta#readme", + "version": "4.11.1", + "downloads": 3666, + "github_stars": 669, + "updated": "2025-06-13T20:58:58.615Z", + "svelte_range": "^5.0.0", + "kit_range": "catalog:", + "typescript": true, + "runes": true, + "last_rune_check_version": "4.9.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/content-collections-core.json b/apps/svelte.dev/src/lib/server/generated/registry/content-collections-core.json new file mode 100644 index 0000000000..e837e73ca7 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/content-collections-core.json @@ -0,0 +1,15 @@ +{ + "name": "@content-collections/core", + "npm_description": "Core of Content Collections", + "repo_url": "https://github.com/sdorra/content-collections", + "authors": ["sdorra"], + "homepage": "https://content-collections.dev", + "version": "0.11.1", + "downloads": 29026, + "github_stars": 913, + "updated": "2025-08-30T07:41:29.913Z", + "svelte_range": "^3.0.0 || ^4.0.0 || ^5.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.11.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/daisyui.json b/apps/svelte.dev/src/lib/server/generated/registry/daisyui.json new file mode 100644 index 0000000000..9f4473deb2 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/daisyui.json @@ -0,0 +1,15 @@ +{ + "name": "daisyui", + "npm_description": "daisyUI 5 - The Tailwind CSS Component Library", + "repo_url": "https://github.com/saadeghi/daisyui", + "authors": ["saadeghi"], + "homepage": "https://daisyui.com", + "version": "5.1.26", + "downloads": 513035, + "github_stars": 38856, + "updated": "2025-09-30T19:58:19.793Z", + "svelte_range": "^3.0.0 || ^4.0.0 || ^5.0.0", + "typescript": false, + "runes": false, + "last_rune_check_version": "1.3.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/deno-svelte-adapter.json b/apps/svelte.dev/src/lib/server/generated/registry/deno-svelte-adapter.json new file mode 100644 index 0000000000..6136690016 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/deno-svelte-adapter.json @@ -0,0 +1,15 @@ +{ + "name": "@deno/svelte-adapter", + "npm_description": "Official Deno adapter for SvelteKit", + "repo_url": "https://github.com/denoland/svelte-adapter", + "authors": ["ry", "kt3k", "dsherret", "divy-work", "denobot"], + "homepage": "https://github.com/denoland/svelte-adapter#readme", + "version": "0.1.0", + "downloads": 561, + "github_stars": 8, + "updated": "2025-05-19T16:20:54.327Z", + "kit_range": "2.x", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.0.1" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/drizzle-orm.json b/apps/svelte.dev/src/lib/server/generated/registry/drizzle-orm.json new file mode 100644 index 0000000000..1f7aa43ac0 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/drizzle-orm.json @@ -0,0 +1,14 @@ +{ + "name": "drizzle-orm", + "npm_description": "Drizzle ORM package for SQL databases", + "repo_url": "https://github.com/drizzle-team/drizzle-orm", + "authors": ["dankochetov", "sheriman", "alexblokh", "kyrylo_usichenko"], + "homepage": "https://orm.drizzle.team", + "version": "0.44.6", + "downloads": 2173757, + "github_stars": 30565, + "updated": "2025-10-02T09:49:33.326Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.41.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/esbuild-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/esbuild-svelte.json new file mode 100644 index 0000000000..b22dd8b095 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/esbuild-svelte.json @@ -0,0 +1,15 @@ +{ + "name": "esbuild-svelte", + "npm_description": "esbuild plugin to resolve .svelte files", + "repo_url": "https://github.com/EMH333/esbuild-svelte", + "authors": ["emh333"], + "homepage": "https://github.com/EMH333/esbuild-svelte#readme", + "version": "0.9.3", + "downloads": 27782, + "github_stars": 256, + "updated": "2025-05-24T15:51:24.773Z", + "svelte_range": ">=4.2.1 <6", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.9.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/eslint.json b/apps/svelte.dev/src/lib/server/generated/registry/eslint.json new file mode 100644 index 0000000000..155dc4a7e1 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/eslint.json @@ -0,0 +1,14 @@ +{ + "name": "eslint", + "npm_description": "An AST-based pattern checker for JavaScript.", + "repo_url": "https://github.com/eslint/eslint", + "authors": ["openjsfoundation", "eslintbot"], + "homepage": "https://eslint.org", + "version": "9.36.0", + "downloads": 62656947, + "github_stars": 26535, + "updated": "2025-09-19T14:32:08.465Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "9.35.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/event-calendar-core.json b/apps/svelte.dev/src/lib/server/generated/registry/event-calendar-core.json new file mode 100644 index 0000000000..8f318a6275 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/event-calendar-core.json @@ -0,0 +1,15 @@ +{ + "name": "@event-calendar/core", + "npm_description": "Full-sized drag & drop event calendar with resource & timeline views", + "repo_url": "https://github.com/vkurko/calendar", + "authors": ["vkurko"], + "homepage": "https://vkurko.github.io/calendar/", + "version": "4.6.0", + "downloads": 9941, + "github_stars": 1944, + "updated": "2025-09-04T09:48:08.711Z", + "svelte_range": "^5.34.8", + "typescript": false, + "runes": false, + "last_rune_check_version": "3.12.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/evidence-dev-evidence.json b/apps/svelte.dev/src/lib/server/generated/registry/evidence-dev-evidence.json new file mode 100644 index 0000000000..91d7196d4e --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/evidence-dev-evidence.json @@ -0,0 +1,15 @@ +{ + "name": "@evidence-dev/evidence", + "npm_description": "dependencies for evidence projects", + "repo_url": "", + "authors": ["archiewood", "mcrascal", "hughess", "charles-evidence"], + "version": "40.1.2", + "downloads": 18371, + "github_stars": 0, + "updated": "2025-04-11T20:02:23.417Z", + "svelte_range": "4.2.19", + "kit_range": "2.8.4", + "typescript": true, + "runes": false, + "last_rune_check_version": "40.1.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/felte.json b/apps/svelte.dev/src/lib/server/generated/registry/felte.json new file mode 100644 index 0000000000..99109b8bba --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/felte.json @@ -0,0 +1,15 @@ +{ + "name": "felte", + "npm_description": "An extensible form library for Svelte", + "repo_url": "https://github.com/pablo-abc/felte", + "authors": ["pberganza"], + "homepage": "https://felte.dev", + "version": "1.3.0", + "downloads": 9167, + "github_stars": 1079, + "updated": "2024-10-29T20:35:41.611Z", + "svelte_range": "^3.31.0 || ^4.0.0 || ^5.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "1.3.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/flowbite-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/flowbite-svelte.json new file mode 100644 index 0000000000..e677a37292 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/flowbite-svelte.json @@ -0,0 +1,16 @@ +{ + "name": "flowbite-svelte", + "npm_description": "Flowbite components for Svelte", + "repo_url": "https://github.com/themesberg/flowbite-svelte", + "authors": ["jjagielka", "zoliszogyenyi", "shinichiokada"], + "homepage": "https://flowbite-svelte.com/", + "version": "1.16.0", + "downloads": 50973, + "github_stars": 2620, + "updated": "2025-09-28T10:37:43.647Z", + "svelte_range": "^5.29.0", + "kit_range": "^2.43.2", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.48.6" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/formsnap.json b/apps/svelte.dev/src/lib/server/generated/registry/formsnap.json new file mode 100644 index 0000000000..f1454b8b65 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/formsnap.json @@ -0,0 +1,16 @@ +{ + "name": "formsnap", + "npm_description": "The goal of this library is to make working with the already incredible [sveltekit-superforms](https://github.com/ciscoheat/sveltekit-superforms) even more pleasant, by wrapping it with accessible form components.", + "repo_url": "https://github.com/svecosystem/formsnap", + "authors": ["huntabyte"], + "homepage": "https://github.com/svecosystem/formsnap#readme", + "version": "2.0.1", + "downloads": 44970, + "github_stars": 753, + "updated": "2025-04-09T02:30:42.332Z", + "svelte_range": "^5.0.0", + "kit_range": "^2.5.28", + "typescript": true, + "runes": true, + "last_rune_check_version": "2.0.1" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/houdini.json b/apps/svelte.dev/src/lib/server/generated/registry/houdini.json new file mode 100644 index 0000000000..fea4c756db --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/houdini.json @@ -0,0 +1,14 @@ +{ + "name": "houdini", + "npm_description": "The disappearing GraphQL clients", + "repo_url": "https://github.com/HoudiniGraphql/houdini", + "authors": ["aaivazis", "jycouet"], + "homepage": "https://github.com/HoudiniGraphql/houdini", + "version": "1.5.10", + "downloads": 5237, + "github_stars": 965, + "updated": "2025-08-02T15:47:14.762Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "1.5.4" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/i18n-js.json b/apps/svelte.dev/src/lib/server/generated/registry/i18n-js.json new file mode 100644 index 0000000000..5f5ee49490 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/i18n-js.json @@ -0,0 +1,14 @@ +{ + "name": "i18n-js", + "npm_description": "A small library to provide I18n on JavaScript.", + "repo_url": "https://github.com/fnando/i18n", + "authors": ["fnando"], + "homepage": "https://github.com/fnando/i18n#readme", + "version": "4.5.1", + "downloads": 350490, + "github_stars": 210, + "updated": "2024-12-14T00:45:20.293Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "4.5.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/iconify-tailwind4.json b/apps/svelte.dev/src/lib/server/generated/registry/iconify-tailwind4.json new file mode 100644 index 0000000000..b5d5a44e7f --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/iconify-tailwind4.json @@ -0,0 +1,14 @@ +{ + "name": "@iconify/tailwind4", + "npm_description": "Iconify plugin for Tailwind CSS", + "repo_url": "https://github.com/iconify/iconify-tailwind", + "authors": ["cyberalien"], + "homepage": "https://iconify.design/", + "version": "1.0.6", + "downloads": 10756, + "github_stars": 9, + "updated": "2025-02-28T13:34:23.013Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "1.0.6" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/inlang-paraglide-js.json b/apps/svelte.dev/src/lib/server/generated/registry/inlang-paraglide-js.json new file mode 100644 index 0000000000..6ec60866c3 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/inlang-paraglide-js.json @@ -0,0 +1,14 @@ +{ + "name": "@inlang/paraglide-js", + "npm_description": "[![Inlang-ecosystem compatibility badge](https://cdn.jsdelivr.net/gh/opral/monorepo@main/inlang/assets/md-badges/inlang.svg)](https://inlang.com)", + "repo_url": "https://github.com/opral/inlang-paraglide-js", + "authors": ["samuelstroschein", "inlangbot"], + "homepage": "https://inlang.com/m/gerre34r/library-inlang-paraglideJs", + "version": "2.4.0", + "downloads": 89556, + "github_stars": 123, + "updated": "2025-09-26T01:32:38.150Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "2.0.11" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/layercake.json b/apps/svelte.dev/src/lib/server/generated/registry/layercake.json new file mode 100644 index 0000000000..8dca40e842 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/layercake.json @@ -0,0 +1,16 @@ +{ + "name": "layercake", + "npm_description": "graphics framework for sveltejs", + "repo_url": "https://github.com/mhkeller/layercake", + "authors": ["mhkeller0"], + "homepage": "https://layercake.graphics/", + "version": "10.0.2", + "downloads": 13030, + "github_stars": 1651, + "updated": "2025-09-23T18:49:20.036Z", + "svelte_range": ">=5", + "kit_range": "^2.22.5", + "typescript": true, + "runes": false, + "last_rune_check_version": "8.4.3" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/layerchart.json b/apps/svelte.dev/src/lib/server/generated/registry/layerchart.json new file mode 100644 index 0000000000..5e6d2c703f --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/layerchart.json @@ -0,0 +1,16 @@ +{ + "name": "layerchart", + "npm_description": "Composable Svelte chart components to build a wide range of visualizations", + "repo_url": "https://github.com/techniq/layerchart", + "authors": ["techniq"], + "homepage": "https://github.com/techniq/layerchart#readme", + "version": "1.0.12", + "downloads": 25583, + "github_stars": 1012, + "updated": "2025-09-17T14:45:16.933Z", + "svelte_range": "^3.56.0 || ^4.0.0 || ^5.0.0", + "kit_range": "^2.21.0", + "typescript": true, + "runes": true, + "last_rune_check_version": "1.0.8" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/lottiefiles-svelte-lottie-player.json b/apps/svelte.dev/src/lib/server/generated/registry/lottiefiles-svelte-lottie-player.json new file mode 100644 index 0000000000..feb85ba893 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/lottiefiles-svelte-lottie-player.json @@ -0,0 +1,15 @@ +{ + "name": "@lottiefiles/svelte-lottie-player", + "npm_description": "Lottie animation player component for Svelte", + "repo_url": "https://github.com/LottieFiles/svelte-lottie-player", + "authors": ["jawish"], + "homepage": "https://github.com/LottieFiles/svelte-lottie-player", + "version": "0.3.1", + "downloads": 3825, + "github_stars": 136, + "updated": "2024-01-16T08:16:28.170Z", + "svelte_range": "^3.21.0", + "typescript": false, + "runes": false, + "last_rune_check_version": "0.3.1" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/lucia.json b/apps/svelte.dev/src/lib/server/generated/registry/lucia.json new file mode 100644 index 0000000000..df2772aca7 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/lucia.json @@ -0,0 +1,15 @@ +{ + "name": "lucia", + "npm_description": "A simple and flexible authentication library", + "repo_url": "https://github.com/pilcrowOnPaper/lucia", + "authors": ["pilcrowonpaper"], + "homepage": "https://github.com/pilcrowOnPaper/lucia#readme", + "version": "3.2.2", + "deprecated_reason": "This package has been deprecated. Please see https://lucia-auth.com/lucia-v3/migrate.", + "downloads": 63229, + "github_stars": 10346, + "updated": "2024-10-20T12:40:32.030Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "3.2.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/lucide-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/lucide-svelte.json new file mode 100644 index 0000000000..d0375a641c --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/lucide-svelte.json @@ -0,0 +1,15 @@ +{ + "name": "@lucide/svelte", + "npm_description": "A Lucide icon library package for Svelte applications.", + "repo_url": "https://github.com/lucide-icons/lucide", + "authors": ["ericfennis"], + "homepage": "https://lucide.dev", + "version": "0.544.0", + "downloads": 95395, + "github_stars": 19165, + "updated": "2025-09-11T09:54:17.934Z", + "svelte_range": "^5", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.488.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/magidoc-plugin-svelte-marked.json b/apps/svelte.dev/src/lib/server/generated/registry/magidoc-plugin-svelte-marked.json new file mode 100644 index 0000000000..9cc00006c0 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/magidoc-plugin-svelte-marked.json @@ -0,0 +1,16 @@ +{ + "name": "@magidoc/plugin-svelte-marked", + "npm_description": "A markdown parser library that renders to svelte components.", + "repo_url": "https://github.com/magidoc-org/magidoc", + "authors": ["pelletier197"], + "homepage": "https://github.com/magidoc-org/magidoc#readme", + "version": "6.2.0", + "downloads": 7544, + "github_stars": 273, + "updated": "2024-11-08T18:33:01.933Z", + "svelte_range": "4.2.19", + "kit_range": "2.6.1", + "typescript": true, + "runes": false, + "last_rune_check_version": "6.2.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/mdsvex.json b/apps/svelte.dev/src/lib/server/generated/registry/mdsvex.json new file mode 100644 index 0000000000..094de4018c --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/mdsvex.json @@ -0,0 +1,15 @@ +{ + "name": "mdsvex", + "npm_description": "Markdown preprocessor for Svelte", + "repo_url": "https://github.com/pngwn/MDsveX", + "authors": ["evilpingwin"], + "homepage": "https://github.com/pngwn/MDsveX#readme", + "version": "0.12.6", + "downloads": 54093, + "github_stars": 2819, + "updated": "2025-05-08T23:01:30.005Z", + "svelte_range": "^3.56.0 || ^4.0.0 || ^5.0.0-next.120", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.12.3" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/melt.json b/apps/svelte.dev/src/lib/server/generated/registry/melt.json new file mode 100644 index 0000000000..be5a3434b7 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/melt.json @@ -0,0 +1,16 @@ +{ + "name": "melt", + "npm_description": "The next generation of Melt UI. Built for Svelte 5.", + "repo_url": "https://github.com/melt-ui/next-gen", + "authors": ["tglide_personal"], + "homepage": "https://next.melt-ui.com/", + "version": "0.40.2", + "downloads": 3598, + "github_stars": 240, + "updated": "2025-09-09T17:41:24.967Z", + "svelte_range": "^5.30.1", + "kit_range": "^2.15.2", + "typescript": true, + "runes": true, + "last_rune_check_version": "0.40.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/neoconfetti-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/neoconfetti-svelte.json new file mode 100644 index 0000000000..9059320231 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/neoconfetti-svelte.json @@ -0,0 +1,15 @@ +{ + "name": "@neoconfetti/svelte", + "npm_description": "Confetti explosion in Svelte 🎉🎊", + "repo_url": "https://github.com/puruvj/neoconfetti", + "authors": ["puruvj"], + "homepage": "https://github.com/puruvj/neoconfetti/tree/main/packages/svelte#readme", + "version": "2.2.2", + "downloads": 23717, + "github_stars": 300, + "updated": "2025-03-09T12:58:01.521Z", + "svelte_range": "^3.0.0 || ^4.0.0 || ^5.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "2.2.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/orpc-svelte-query.json b/apps/svelte.dev/src/lib/server/generated/registry/orpc-svelte-query.json new file mode 100644 index 0000000000..478b381782 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/orpc-svelte-query.json @@ -0,0 +1,15 @@ +{ + "name": "@orpc/svelte-query", + "npm_description": "
\"oRPC
", + "repo_url": "https://github.com/unnoq/orpc", + "authors": ["unnoq"], + "homepage": "https://orpc.unnoq.com", + "version": "1.9.2", + "downloads": 3239, + "github_stars": 3456, + "updated": "2025-09-29T09:01:25.118Z", + "svelte_range": ">=4.2.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.54.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/passlock-sveltekit.json b/apps/svelte.dev/src/lib/server/generated/registry/passlock-sveltekit.json new file mode 100644 index 0000000000..daae897570 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/passlock-sveltekit.json @@ -0,0 +1,16 @@ +{ + "name": "@passlock/sveltekit", + "npm_description": "Passkey authentication and social login for SvelteKit apps", + "repo_url": "https://github.com/passlock-dev/passlock", + "authors": ["toby.hobson"], + "homepage": "https://passlock.dev", + "version": "0.9.31", + "downloads": 20, + "github_stars": 180, + "updated": "2024-11-27T14:09:44.610Z", + "svelte_range": "^4.0.0", + "kit_range": "^2.6.2", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.9.31" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/phosphor-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/phosphor-svelte.json new file mode 100644 index 0000000000..ee72a25a40 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/phosphor-svelte.json @@ -0,0 +1,15 @@ +{ + "name": "phosphor-svelte", + "npm_description": "A clean and friendly icon family for Svelte", + "repo_url": "https://github.com/haruaki07/phosphor-svelte", + "authors": ["haruaki07"], + "homepage": "https://phosphoricons.com", + "version": "3.0.1", + "downloads": 13673, + "github_stars": 214, + "updated": "2024-12-06T04:02:09.247Z", + "svelte_range": "^5.0.0 || ^5.0.0-next.96", + "typescript": true, + "runes": true, + "last_rune_check_version": "3.0.1" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/playwright.json b/apps/svelte.dev/src/lib/server/generated/registry/playwright.json new file mode 100644 index 0000000000..08652ab29a --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/playwright.json @@ -0,0 +1,15 @@ +{ + "name": "playwright", + "npm_description": "A high-level API to automate web browsers", + "repo_url": "https://github.com/microsoft/playwright", + "authors": ["pavelfeldman", "yurys", "dgozman-ms", "playwright-bot"], + "homepage": "https://playwright.dev", + "version": "1.55.1", + "downloads": 21420706, + "github_stars": 77751, + "updated": "2025-09-23T09:57:04.991Z", + "svelte_range": "^3.0.0 || ^4.0.0 || ^5.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "1.55.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/poppanator-sveltekit-svg.json b/apps/svelte.dev/src/lib/server/generated/registry/poppanator-sveltekit-svg.json new file mode 100644 index 0000000000..95cf99adf5 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/poppanator-sveltekit-svg.json @@ -0,0 +1,16 @@ +{ + "name": "@poppanator/sveltekit-svg", + "npm_description": "Import SVG files as Svelte components", + "repo_url": "https://github.com/poppa/sveltekit-svg", + "authors": ["poppanator_"], + "homepage": "https://github.com/poppa/sveltekit-svg#readme", + "version": "6.0.0", + "downloads": 16731, + "github_stars": 263, + "updated": "2025-09-01T05:39:43.829Z", + "svelte_range": ">=5.x", + "kit_range": "^6.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "4.0.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/prettier.json b/apps/svelte.dev/src/lib/server/generated/registry/prettier.json new file mode 100644 index 0000000000..d456e5572e --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/prettier.json @@ -0,0 +1,26 @@ +{ + "name": "prettier", + "npm_description": "Prettier is an opinionated code formatter", + "repo_url": "https://github.com/prettier/prettier", + "authors": [ + "jlongster", + "lydell", + "thorn0", + "vjeux", + "fisker", + "suchipi", + "duailibe", + "ikatyang", + "azz", + "sosukesuzuki", + "prettier-bot" + ], + "homepage": "https://prettier.io", + "version": "3.6.2", + "downloads": 56965427, + "github_stars": 51036, + "updated": "2025-06-27T02:53:53.185Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "3.5.3" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/prismicio-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/prismicio-svelte.json new file mode 100644 index 0000000000..39e53f9b90 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/prismicio-svelte.json @@ -0,0 +1,42 @@ +{ + "name": "@prismicio/svelte", + "npm_description": "Svelte components to present Prismic content.", + "repo_url": "ssh://git@github.com/prismicio/prismic-svelte", + "authors": [ + "chrrrs", + "samuelhorn", + "prismic", + "raph22", + "sre", + "arnaudlewis", + "michel.chau", + "gholgot", + "odim", + "prismic-ci", + "lihbr", + "bapmrl", + "angeloashmore", + "levimykel", + "nvld", + "dani-mp", + "boubiyeah", + "rafa17", + "filipeue", + "ruben-prismic", + "paulyvpg", + "jomifepe", + "srflp", + "xrutayisire", + "greenwalker90" + ], + "homepage": "https://github.com/prismicio/prismic-svelte#readme", + "version": "2.0.0", + "downloads": 9181, + "github_stars": 26, + "updated": "2025-06-04T23:46:10.656Z", + "svelte_range": "^5", + "kit_range": "^2", + "typescript": true, + "runes": false, + "last_rune_check_version": "1.5.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/rollup-plugin-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/rollup-plugin-svelte.json new file mode 100644 index 0000000000..53cf7ff001 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/rollup-plugin-svelte.json @@ -0,0 +1,15 @@ +{ + "name": "rollup-plugin-svelte", + "npm_description": "Compile Svelte components with Rollup", + "repo_url": "https://github.com/sveltejs/rollup-plugin-svelte", + "authors": ["lukeed", "rich_harris", "lukastaegert", "shellscape", "conduitry", "dummdidumm"], + "homepage": "https://github.com/sveltejs/rollup-plugin-svelte#readme", + "version": "7.2.3", + "downloads": 97709, + "github_stars": 511, + "updated": "2025-08-23T20:57:08.931Z", + "svelte_range": ">=3.5.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "7.2.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/roxi-routify.json b/apps/svelte.dev/src/lib/server/generated/registry/roxi-routify.json new file mode 100644 index 0000000000..0d3eff7850 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/roxi-routify.json @@ -0,0 +1,13 @@ +{ + "name": "@roxi/routify", + "repo_url": "", + "authors": ["jakobrosenberg"], + "version": "3.6.4", + "downloads": 3455, + "github_stars": 0, + "updated": "2025-09-16T10:15:55.135Z", + "svelte_range": "^3.0.0 || ^4.0.0 || ^5.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "2.18.18" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/scrolly-video.json b/apps/svelte.dev/src/lib/server/generated/registry/scrolly-video.json new file mode 100644 index 0000000000..991051c7f0 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/scrolly-video.json @@ -0,0 +1,15 @@ +{ + "name": "scrolly-video", + "npm_description": "A component for scroll-based (or other externally controlled) playback.", + "repo_url": "https://github.com/dkaoster/scrolly-video", + "authors": ["dkao"], + "homepage": "https://github.com/dkaoster/scrolly-video#readme", + "version": "0.0.24", + "downloads": 711, + "github_stars": 1061, + "updated": "2025-03-07T04:16:43.669Z", + "svelte_range": "^4.2.19", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.0.24" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sentry-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/sentry-svelte.json new file mode 100644 index 0000000000..931d8b96b0 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sentry-svelte.json @@ -0,0 +1,26 @@ +{ + "name": "@sentry/svelte", + "npm_description": "Official Sentry SDK for Svelte", + "repo_url": "git://github.com/getsentry/sentry-javascript", + "authors": [ + "billyvg", + "mitsuhiko", + "haza", + "jauer", + "sentry-bot", + "evanpurkhiser", + "lynnagara", + "leedongwei", + "markstory", + "zeeg" + ], + "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/svelte", + "version": "10.17.0", + "downloads": 86255, + "github_stars": 8423, + "updated": "2025-09-30T11:05:52.329Z", + "svelte_range": "3.x || 4.x || 5.x", + "typescript": true, + "runes": false, + "last_rune_check_version": "9.12.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sentry-sveltekit.json b/apps/svelte.dev/src/lib/server/generated/registry/sentry-sveltekit.json new file mode 100644 index 0000000000..97971aa6ed --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sentry-sveltekit.json @@ -0,0 +1,27 @@ +{ + "name": "@sentry/sveltekit", + "npm_description": "Official Sentry SDK for SvelteKit", + "repo_url": "git://github.com/getsentry/sentry-javascript", + "authors": [ + "billyvg", + "mitsuhiko", + "haza", + "jauer", + "sentry-bot", + "evanpurkhiser", + "lynnagara", + "leedongwei", + "markstory", + "zeeg" + ], + "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/sveltekit", + "version": "10.17.0", + "downloads": 59524, + "github_stars": 8423, + "updated": "2025-09-30T11:06:26.628Z", + "svelte_range": "^4.2.8", + "kit_range": "2.x", + "typescript": true, + "runes": false, + "last_rune_check_version": "9.12.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/shadcn-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/shadcn-svelte.json new file mode 100644 index 0000000000..95a732f894 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/shadcn-svelte.json @@ -0,0 +1,14 @@ +{ + "name": "shadcn-svelte", + "npm_description": "Add components to your apps.", + "repo_url": "https://github.com/huntabyte/shadcn-svelte", + "authors": ["huntabyte"], + "homepage": "https://github.com/huntabyte/shadcn-svelte#readme", + "version": "1.0.8", + "downloads": 8080, + "github_stars": 7470, + "updated": "2025-09-26T11:24:15.718Z", + "typescript": false, + "runes": false, + "last_rune_check_version": "0.14.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/skeletonlabs-skeleton.json b/apps/svelte.dev/src/lib/server/generated/registry/skeletonlabs-skeleton.json new file mode 100644 index 0000000000..85d7e4f4fe --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/skeletonlabs-skeleton.json @@ -0,0 +1,14 @@ +{ + "name": "@skeletonlabs/skeleton", + "npm_description": "This repository contains all the stylesheets for the Skeleton package.", + "repo_url": "https://github.com/skeletonlabs/skeleton", + "authors": ["skeletonadmin", "endigo9740", "cokakoala", "hugoskokos"], + "homepage": "https://github.com/skeletonlabs/skeleton#readme", + "version": "3.2.2", + "downloads": 21173, + "github_stars": 5675, + "updated": "2025-09-23T23:06:44.900Z", + "typescript": false, + "runes": false, + "last_rune_check_version": "3.1.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/slicemachine-adapter-sveltekit.json b/apps/svelte.dev/src/lib/server/generated/registry/slicemachine-adapter-sveltekit.json new file mode 100644 index 0000000000..49ffb25d28 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/slicemachine-adapter-sveltekit.json @@ -0,0 +1,29 @@ +{ + "name": "@slicemachine/adapter-sveltekit", + "npm_description": "Slice Machine adapter for SvelteKit.", + "repo_url": "ssh://git@github.com/prismicio/slice-machine", + "authors": [ + "lihbr", + "angeloashmore", + "amaurycahuet", + "odim", + "levimykel", + "danielbg", + "nvld", + "prismic-ci", + "jomifepe", + "srflp", + "bohdan-one", + "xrutayisire", + "bapmrl" + ], + "version": "0.3.84", + "downloads": 3448, + "github_stars": 298, + "updated": "2025-09-18T12:57:47.713Z", + "svelte_range": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.1", + "kit_range": "^1 || ^2", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.3.74" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sswr.json b/apps/svelte.dev/src/lib/server/generated/registry/sswr.json new file mode 100644 index 0000000000..95bceaa072 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sswr.json @@ -0,0 +1,14 @@ +{ + "name": "sswr", + "npm_description": "Svelte stale while revalidate (SWR) data fetching strategy", + "repo_url": "github.com/ConsoleTVs/sswr", + "authors": ["consoletvs"], + "version": "2.2.0", + "downloads": 360397, + "github_stars": 0, + "updated": "2025-03-04T20:30:45.524Z", + "svelte_range": "^4.0.0 || ^5.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "2.2.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/storyblok-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/storyblok-svelte.json new file mode 100644 index 0000000000..2535d4f71c --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/storyblok-svelte.json @@ -0,0 +1,26 @@ +{ + "name": "@storyblok/svelte", + "npm_description": "SDK to integrate Storyblok into your project using Svelte.", + "repo_url": "https://github.com/storyblok/monoblok", + "authors": [ + "delooks", + "dominikangerer", + "alexjoverm", + "emanuelgsouza", + "samuells", + "jpcfreire", + "christianzoppisb", + "alvarosaburido", + "storyblok-dx" + ], + "homepage": "https://github.com/storyblok/monoblok/tree/main/packages/svelte#readme", + "version": "5.2.10", + "downloads": 1135, + "github_stars": 21, + "updated": "2025-09-30T09:06:44.594Z", + "svelte_range": "^5.0.0", + "kit_range": "^2.20.2", + "typescript": true, + "runes": true, + "last_rune_check_version": "5.0.1" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/storybook.json b/apps/svelte.dev/src/lib/server/generated/registry/storybook.json new file mode 100644 index 0000000000..1a3a525dc8 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/storybook.json @@ -0,0 +1,23 @@ +{ + "name": "storybook", + "npm_description": "Storybook: Develop, document, and test UI components in isolation", + "repo_url": "https://github.com/storybookjs/storybook", + "authors": [ + "ndelangen", + "tmeasday", + "ghengeveld", + "kasperpeulen", + "shilman", + "jreinhold", + "valentinpalkovic", + "storybook-bot" + ], + "homepage": "https://storybook.js.org", + "version": "9.1.10", + "downloads": 8081990, + "github_stars": 87873, + "updated": "2025-10-01T10:17:55.420Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "8.6.12" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/supabase-ssr.json b/apps/svelte.dev/src/lib/server/generated/registry/supabase-ssr.json new file mode 100644 index 0000000000..00cd9ff255 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/supabase-ssr.json @@ -0,0 +1,29 @@ +{ + "name": "@supabase/ssr", + "npm_description": "Use the Supabase JavaScript library in popular server-side rendering (SSR) frameworks.", + "repo_url": "https://github.com/supabase/ssr", + "authors": [ + "etienne_supa", + "kiwicopple", + "ange1ico", + "awalias", + "gregnr", + "phamhieu1998", + "inian", + "stdim", + "ziinc_supabase", + "kamilogorek", + "lakshan-supabase", + "ceeteelam", + "kevin-supabase", + "mattrossman" + ], + "homepage": "https://github.com/supabase/ssr#readme", + "version": "0.7.0", + "downloads": 625845, + "github_stars": 160, + "updated": "2025-08-22T06:08:37.734Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.6.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/super-sitemap.json b/apps/svelte.dev/src/lib/server/generated/registry/super-sitemap.json new file mode 100644 index 0000000000..b6148ed795 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/super-sitemap.json @@ -0,0 +1,16 @@ +{ + "name": "super-sitemap", + "npm_description": "SvelteKit sitemap focused on ease of use and making it impossible to forget to add your paths.", + "repo_url": "https://github.com/jasongitmail/super-sitemap", + "authors": ["jasongitmail"], + "homepage": "https://github.com/jasongitmail/super-sitemap#readme", + "version": "1.0.5", + "downloads": 5431, + "github_stars": 223, + "updated": "2025-07-22T17:39:14.601Z", + "svelte_range": ">=4.0.0 <6.0.0", + "kit_range": "^1.27.2", + "typescript": true, + "runes": false, + "last_rune_check_version": "1.0.3" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svead.json b/apps/svelte.dev/src/lib/server/generated/registry/svead.json new file mode 100644 index 0000000000..e5f6460639 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svead.json @@ -0,0 +1,16 @@ +{ + "name": "svead", + "npm_description": "[docs](../../README.md)", + "repo_url": "https://github.com/spences10/svead", + "authors": ["spences10"], + "homepage": "https://github.com/spences10/svead#readme", + "version": "0.0.15", + "downloads": 349, + "github_stars": 102, + "updated": "2025-06-09T05:40:57.632Z", + "svelte_range": "^4.0.0 || ^5.0.0", + "kit_range": "^2.17.1", + "typescript": true, + "runes": true, + "last_rune_check_version": "0.0.13" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-adapter-appengine.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-adapter-appengine.json new file mode 100644 index 0000000000..d0b5add1aa --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-adapter-appengine.json @@ -0,0 +1,15 @@ +{ + "name": "svelte-adapter-appengine", + "npm_description": "Adapter for Svelte that integrates with Google Cloud Appengine ", + "repo_url": "https://github.com/halfdanj/svelte-adapter-appengine", + "authors": ["halfdanj"], + "homepage": "https://github.com/halfdanj/svelte-adapter-appengine#readme", + "version": "1.2.0", + "downloads": 93, + "github_stars": 72, + "updated": "2025-02-24T22:48:25.803Z", + "kit_range": "^1.0.0 || ^2.0.0", + "typescript": false, + "runes": false, + "last_rune_check_version": "1.2.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-adapter-bun.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-adapter-bun.json new file mode 100644 index 0000000000..743324d22e --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-adapter-bun.json @@ -0,0 +1,15 @@ +{ + "name": "svelte-adapter-bun", + "npm_description": "Adapter for SvelteKit apps that generates a standalone Bun.js server.", + "repo_url": "https://github.com/gornostay25/svelte-adapter-bun", + "authors": ["gornostay25"], + "homepage": "https://github.com/gornostay25/svelte-adapter-bun#readme", + "version": "1.0.0", + "downloads": 3989, + "github_stars": 591, + "updated": "2025-09-22T00:29:46.241Z", + "kit_range": "^2.4.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.5.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-awesome.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-awesome.json new file mode 100644 index 0000000000..69e251c331 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-awesome.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-awesome", + "npm_description": "Font Awesome component for Svelte JS, using inline SVG", + "repo_url": "https://github.com/RobBrazier/svelte-awesome", + "authors": ["robbrazier"], + "homepage": "https://github.com/RobBrazier/svelte-awesome#readme", + "version": "3.3.5", + "downloads": 9584, + "github_stars": 502, + "updated": "2024-10-22T12:51:36.311Z", + "svelte_range": ">= 3.43.1 < 6", + "kit_range": "^2.7.2", + "typescript": true, + "runes": false, + "last_rune_check_version": "3.3.5" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-clerk.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-clerk.json new file mode 100644 index 0000000000..ac88877c5f --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-clerk.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-clerk", + "npm_description": "Svelte Clerk is the easiest way to add authentication and user management to your Svelte and SvelteKit applications. Add sign up, sign in, and profile management to your application in minutes.", + "repo_url": "https://github.com/wobsoriano/svelte-clerk", + "authors": ["wobsoriano"], + "homepage": "https://github.com/wobsoriano/svelte-clerk#readme", + "version": "0.17.4", + "downloads": 4173, + "github_stars": 185, + "updated": "2025-10-01T02:23:19.327Z", + "svelte_range": "^5.11.0", + "kit_range": "^2.20.0", + "typescript": true, + "runes": true, + "last_rune_check_version": "0.17.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-easy-crop.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-easy-crop.json new file mode 100644 index 0000000000..42b314d7c0 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-easy-crop.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-easy-crop", + "npm_description": "A Svelte component to crop images with easy interactions", + "repo_url": "https://github.com/ValentinH/svelte-easy-crop", + "authors": ["valentinhervieu"], + "homepage": "https://github.com/ValentinH/svelte-easy-crop", + "version": "5.0.0", + "downloads": 9334, + "github_stars": 229, + "updated": "2025-09-05T14:02:02.604Z", + "svelte_range": "^5.0.0", + "kit_range": "^2.15.0", + "typescript": true, + "runes": true, + "last_rune_check_version": "4.0.1" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-exmarkdown.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-exmarkdown.json new file mode 100644 index 0000000000..0f5580dbea --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-exmarkdown.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-exmarkdown", + "npm_description": "Svelte component to render markdown. Dynamic and Extensible.", + "repo_url": "https://github.com/ssssota/svelte-exmarkdown", + "authors": ["ssssota"], + "homepage": "https://ssssota.github.io/svelte-exmarkdown", + "version": "5.0.2", + "downloads": 25808, + "github_stars": 302, + "updated": "2025-08-09T15:03:03.704Z", + "svelte_range": "^5.1.3", + "kit_range": "^2.27.3", + "typescript": true, + "runes": true, + "last_rune_check_version": "5.0.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-inspect-value.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-inspect-value.json new file mode 100644 index 0000000000..e033de45a8 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-inspect-value.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-inspect-value", + "npm_description": "Svelte value inspector component", + "repo_url": "https://github.com/ampled/svelte-inspect-value", + "authors": ["eirikk"], + "homepage": "https://inspect.eirik.space", + "version": "0.9.2", + "downloads": 544, + "github_stars": 133, + "updated": "2025-09-05T08:26:42.834Z", + "svelte_range": "^5.29.0", + "kit_range": "^2.29.1", + "typescript": true, + "runes": true, + "last_rune_check_version": "0.9.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-kit-sessions.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-kit-sessions.json new file mode 100644 index 0000000000..b2fb7a7f70 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-kit-sessions.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-kit-sessions", + "npm_description": "User-friendly session management module for SvelteKit. Effortlessly integrate efficient session handling into your projects. Session is stored in the store (ex. Redis, Cloudflare KV, etc.), not in a cookie.", + "repo_url": "ssh://git@github.com/yutak23/svelte-kit-sessions", + "authors": ["yutak23"], + "homepage": "https://github.com/yutak23/svelte-kit-sessions#readme", + "version": "0.4.0", + "downloads": 300, + "github_stars": 18, + "updated": "2024-11-13T04:51:52.547Z", + "svelte_range": "^5.1.13", + "kit_range": "^1.0.0 || ^2.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.4.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-kit-sst.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-kit-sst.json new file mode 100644 index 0000000000..fdf8fd2479 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-kit-sst.json @@ -0,0 +1,15 @@ +{ + "name": "svelte-kit-sst", + "npm_description": "Adapter for SvelteKit apps to work on AWS Lambda and AWS Lambda@Edge.", + "repo_url": "https://github.com/sst/sst", + "authors": ["thdxr", "fanjie", "sst-publisher"], + "homepage": "https://github.com/sst/sst#readme", + "version": "2.43.5", + "downloads": 5890, + "github_stars": 24576, + "updated": "2024-08-16T19:15:54.792Z", + "kit_range": "^1.5.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "2.43.5" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-loader.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-loader.json new file mode 100644 index 0000000000..d1a3b3ad0b --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-loader.json @@ -0,0 +1,15 @@ +{ + "name": "svelte-loader", + "npm_description": "A webpack loader for svelte", + "repo_url": "ssh://git@github.com/sveltejs/svelte-loader", + "authors": ["nikku", "rich_harris", "conduitry", "svelte-admin", "dummdidumm"], + "homepage": "https://github.com/sveltejs/svelte-loader#readme", + "version": "3.2.4", + "downloads": 48514, + "github_stars": 602, + "updated": "2024-10-09T21:13:47.738Z", + "svelte_range": "^3.0.0 || ^4.0.0-next.0 || ^5.0.0-next.1", + "typescript": false, + "runes": false, + "last_rune_check_version": "3.2.4" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-maplibre-gl.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-maplibre-gl.json new file mode 100644 index 0000000000..acee9be264 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-maplibre-gl.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-maplibre-gl", + "npm_description": "Build interactive web maps effortlessly with MapLibre GL JS and Svelte", + "repo_url": "https://github.com/MIERUNE/svelte-maplibre-gl", + "authors": ["mierune_iguchi", "ciscorn"], + "homepage": "https://svelte-maplibre-gl.mierune.dev/", + "version": "1.0.1", + "downloads": 1026, + "github_stars": 215, + "updated": "2025-07-09T13:47:31.490Z", + "svelte_range": ">=5.0.0", + "kit_range": "^2.22.2", + "typescript": true, + "runes": true, + "last_rune_check_version": "0.1.6" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-maplibre.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-maplibre.json new file mode 100644 index 0000000000..296215445c --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-maplibre.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-maplibre", + "npm_description": "Svelte bindings for MapLibre", + "repo_url": "https://github.com/dimfeld/svelte-maplibre", + "authors": ["dimfeld"], + "homepage": "https://svelte-maplibre.imfeld.dev", + "version": "1.2.1", + "downloads": 12760, + "github_stars": 462, + "updated": "2025-08-19T19:00:42.136Z", + "svelte_range": "^5.0.0", + "kit_range": "^2.8.1", + "typescript": true, + "runes": true, + "last_rune_check_version": "1.0.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-material-ui.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-material-ui.json new file mode 100644 index 0000000000..f8e4bc3684 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-material-ui.json @@ -0,0 +1,13 @@ +{ + "name": "svelte-material-ui", + "npm_description": "Svelte Material UI Components", + "repo_url": "https://github.com/hperrin/svelte-material-ui", + "authors": ["hperrin"], + "version": "8.0.3", + "downloads": 3313, + "github_stars": 3399, + "updated": "2025-08-13T00:55:30.427Z", + "typescript": false, + "runes": false, + "last_rune_check_version": "8.0.0-beta.3" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-meta-tags.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-meta-tags.json new file mode 100644 index 0000000000..35ae296aa7 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-meta-tags.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-meta-tags", + "npm_description": "Svelte Meta Tags provides components designed to help you manage SEO for Svelte projects", + "repo_url": "https://github.com/oekazuma/svelte-meta-tags", + "authors": ["oe.kazuma"], + "homepage": "https://github.com/oekazuma/svelte-meta-tags#readme", + "version": "4.4.1", + "downloads": 14814, + "github_stars": 608, + "updated": "2025-09-01T05:44:35.974Z", + "svelte_range": "^5.0.0", + "kit_range": "^2.37.0", + "typescript": true, + "runes": true, + "last_rune_check_version": "4.2.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-motion.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-motion.json new file mode 100644 index 0000000000..9b2235a53f --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-motion.json @@ -0,0 +1,15 @@ +{ + "name": "svelte-motion", + "npm_description": "Svelte animation library based on the React library framer-motion.", + "repo_url": "https://github.com/micha-lmxt/svelte-motion", + "authors": ["micha-lmxt"], + "homepage": "https://github.com/micha-lmxt/svelte-motion#readme", + "version": "0.12.2", + "downloads": 6450, + "github_stars": 636, + "updated": "2024-02-27T20:12:47.917Z", + "svelte_range": ">=3.35.0 || ^4.0.0 || ^5.0.0 || ^5.0.0-next.0", + "typescript": true, + "runes": true, + "last_rune_check_version": "0.12.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-pathfinder.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-pathfinder.json new file mode 100644 index 0000000000..955ac1a422 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-pathfinder.json @@ -0,0 +1,15 @@ +{ + "name": "svelte-pathfinder", + "npm_description": "Tiny, state-based, advanced router for SvelteJS.", + "repo_url": "https://github.com/sveltetools/svelte-pathfinder", + "authors": ["paulmaly"], + "homepage": "https://github.com/sveltetools/svelte-pathfinder#readme", + "version": "4.8.1", + "downloads": 2126, + "github_stars": 133, + "updated": "2024-07-04T09:03:48.158Z", + "svelte_range": ">=3 <5", + "typescript": true, + "runes": false, + "last_rune_check_version": "4.8.1" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-pdf.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-pdf.json new file mode 100644 index 0000000000..72884630a2 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-pdf.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-pdf", + "npm_description": "svelte-pdf provides a component for rendering PDF documents using PDF.js", + "repo_url": "https://github.com/vinodnimbalkar/svelte-pdf", + "authors": ["vinodnimbalkar"], + "homepage": "https://github.com/vinodnimbalkar/svelte-pdf#readme", + "version": "1.0.28", + "downloads": 874, + "github_stars": 235, + "updated": "2025-06-08T14:38:18.920Z", + "svelte_range": "^5.0.0", + "kit_range": "^2.17.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "1.0.27" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-render-scan.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-render-scan.json new file mode 100644 index 0000000000..b79e2c8301 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-render-scan.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-render-scan", + "npm_description": "Visual debugging tool for Svelte applications.", + "repo_url": "https://github.com/khromov/svelte-render-scan", + "authors": ["stanislav-khromov"], + "homepage": "https://khromov.github.io/svelte-render-scan/", + "version": "1.1.0", + "downloads": 3360, + "github_stars": 146, + "updated": "2025-03-21T21:53:49.157Z", + "svelte_range": "^5.0.0", + "kit_range": "^2.16.0", + "typescript": true, + "runes": true, + "last_rune_check_version": "1.1.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-seo.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-seo.json new file mode 100644 index 0000000000..b51963e1eb --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-seo.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-seo", + "npm_description": "Optimize your Svelte app for search engines and social media with meta tags, Open Graph, and JSON-LD.", + "repo_url": "ssh://git@github.com/artiebits/svelte-seo", + "authors": ["artiebits"], + "homepage": "https://github.com/artiebits/svelte-seo#readme", + "version": "1.7.1", + "downloads": 1994, + "github_stars": 490, + "updated": "2025-09-27T09:40:12.755Z", + "svelte_range": "^5.38.2", + "kit_range": "^2.36.1", + "typescript": true, + "runes": false, + "last_rune_check_version": "1.6.1" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-session-manager.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-session-manager.json new file mode 100644 index 0000000000..7645dae046 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-session-manager.json @@ -0,0 +1,15 @@ +{ + "name": "svelte-session-manager", + "npm_description": "Session store for svelte (currently only for JWT)", + "repo_url": "https://github.com/arlac77/svelte-session-manager", + "authors": ["arlac77"], + "homepage": "https://github.com/arlac77/svelte-session-manager#readme", + "version": "3.0.52", + "downloads": 545, + "github_stars": 106, + "updated": "2025-09-24T00:07:58.372Z", + "svelte_range": "^5.39.4", + "typescript": false, + "runes": true, + "last_rune_check_version": "3.0.36" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte-stripe.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte-stripe.json new file mode 100644 index 0000000000..4647c41f3e --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte-stripe.json @@ -0,0 +1,16 @@ +{ + "name": "svelte-stripe", + "npm_description": "Everything you need to add Stripe Elements to your Svelte project. 100% [SvelteKit](https://kit.svelte.dev/) compatible.", + "repo_url": "https://github.com/joshnuss/svelte-stripe", + "authors": ["joshnuss"], + "homepage": "https://sveltestripe.com", + "version": "1.4.0", + "downloads": 3759, + "github_stars": 474, + "updated": "2025-06-09T22:41:28.744Z", + "svelte_range": "^3 || ^4 || ^5", + "kit_range": "^2.5.7", + "typescript": true, + "runes": false, + "last_rune_check_version": "1.3.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/svelte5-router.json b/apps/svelte.dev/src/lib/server/generated/registry/svelte5-router.json new file mode 100644 index 0000000000..18008e71e7 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/svelte5-router.json @@ -0,0 +1,15 @@ +{ + "name": "svelte5-router", + "npm_description": "A declarative Svelte routing library with SSR support", + "repo_url": "https://github.com/jpcutshall/svelte5-router", + "authors": ["jpcutshall"], + "homepage": "https://github.com/jpcutshall/svelte5-router", + "version": "3.0.2", + "downloads": 1946, + "github_stars": 14, + "updated": "2025-01-22T23:26:57.572Z", + "svelte_range": "^5.0.0", + "typescript": true, + "runes": true, + "last_rune_check_version": "3.0.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-cloudflare.json b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-cloudflare.json new file mode 100644 index 0000000000..fe79b99bd2 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-cloudflare.json @@ -0,0 +1,15 @@ +{ + "name": "@sveltejs/adapter-cloudflare", + "npm_description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", + "repo_url": "https://github.com/sveltejs/kit", + "authors": ["rich_harris", "svelte-admin", "conduitry", "dominik_g"], + "homepage": "https://svelte.dev/docs/kit/adapter-cloudflare", + "version": "7.2.4", + "downloads": 50309, + "github_stars": 19739, + "updated": "2025-10-02T14:22:08.841Z", + "kit_range": "^2.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "7.0.1" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-netlify.json b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-netlify.json new file mode 100644 index 0000000000..7b34e01769 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-netlify.json @@ -0,0 +1,15 @@ +{ + "name": "@sveltejs/adapter-netlify", + "npm_description": "A SvelteKit adapter that creates a Netlify app", + "repo_url": "https://github.com/sveltejs/kit", + "authors": ["rich_harris", "svelte-admin", "conduitry", "dominik_g"], + "homepage": "https://svelte.dev/docs/kit/adapter-netlify", + "version": "5.2.4", + "downloads": 14048, + "github_stars": 19739, + "updated": "2025-10-02T14:22:09.602Z", + "kit_range": "^2.4.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "5.0.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-node.json b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-node.json new file mode 100644 index 0000000000..b81acc00b5 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-node.json @@ -0,0 +1,15 @@ +{ + "name": "@sveltejs/adapter-node", + "npm_description": "Adapter for SvelteKit apps that generates a standalone Node server", + "repo_url": "https://github.com/sveltejs/kit", + "authors": ["rich_harris", "svelte-admin", "conduitry", "dominik_g"], + "homepage": "https://svelte.dev/docs/kit/adapter-node", + "version": "5.3.3", + "downloads": 232486, + "github_stars": 19739, + "updated": "2025-10-02T14:22:09.413Z", + "kit_range": "^2.4.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "5.2.12" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-static.json b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-static.json new file mode 100644 index 0000000000..765ade822e --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-static.json @@ -0,0 +1,13 @@ +{ + "name": "@sveltejs/adapter-static", + "npm_description": "Adapter for SvelteKit apps that prerenders your entire site as a collection of static files", + "repo_url": "https://github.com/sveltejs/kit", + "authors": ["rich_harris", "svelte-admin", "conduitry", "dominik_g"], + "homepage": "https://svelte.dev/docs/kit/adapter-static", + "version": "3.0.10", + "downloads": 219928, + "github_stars": 19772, + "updated": "2025-10-02T14:22:08.571Z", + "svelte_range": "^5.39.3", + "kit_range": "^2.0.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-vercel.json b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-vercel.json new file mode 100644 index 0000000000..009b0210c3 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-adapter-vercel.json @@ -0,0 +1,15 @@ +{ + "name": "@sveltejs/adapter-vercel", + "npm_description": "A SvelteKit adapter that creates a Vercel app", + "repo_url": "https://github.com/sveltejs/kit", + "authors": ["rich_harris", "svelte-admin", "conduitry", "dominik_g"], + "homepage": "https://svelte.dev/docs/kit/adapter-vercel", + "version": "5.10.3", + "downloads": 94828, + "github_stars": 19739, + "updated": "2025-10-02T14:22:08.639Z", + "kit_range": "^2.4.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "5.7.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-enhanced-img.json b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-enhanced-img.json new file mode 100644 index 0000000000..055b1d3f27 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-enhanced-img.json @@ -0,0 +1,15 @@ +{ + "name": "@sveltejs/enhanced-img", + "npm_description": "Image optimization for your Svelte apps", + "repo_url": "https://github.com/sveltejs/kit", + "authors": ["rich_harris", "svelte-admin", "conduitry", "dominik_g"], + "homepage": "https://svelte.dev/docs/kit/images#sveltejs-enhanced-img", + "version": "0.8.3", + "downloads": 23697, + "github_stars": 19739, + "updated": "2025-10-02T14:22:08.609Z", + "svelte_range": "^5.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.4.4" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-vite-plugin-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-vite-plugin-svelte.json new file mode 100644 index 0000000000..988cc8e054 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sveltejs-vite-plugin-svelte.json @@ -0,0 +1,15 @@ +{ + "name": "@sveltejs/vite-plugin-svelte", + "npm_description": "The official [Svelte](https://svelte.dev) plugin for [Vite](https://vitejs.dev).", + "repo_url": "https://github.com/sveltejs/vite-plugin-svelte", + "authors": ["rich_harris", "svelte-admin", "conduitry", "dominik_g"], + "homepage": "https://github.com/sveltejs/vite-plugin-svelte#readme", + "version": "6.2.1", + "downloads": 1039910, + "github_stars": 952, + "updated": "2025-09-24T13:16:28.132Z", + "svelte_range": "^5.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "5.0.3" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sveltekit-adapter-chrome-extension.json b/apps/svelte.dev/src/lib/server/generated/registry/sveltekit-adapter-chrome-extension.json new file mode 100644 index 0000000000..f4b20d05fa --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sveltekit-adapter-chrome-extension.json @@ -0,0 +1,12 @@ +{ + "name": "sveltekit-adapter-chrome-extension", + "npm_description": "[Adapter](https://kit.svelte.dev/docs#adapters) for SvelteKit apps that prerenders your site as a collection of static files and removes inline scripts to comply with content source policies of Chrome extensions using manifest v3.", + "repo_url": "https://github.com/michmich112/sveltekit-adapter-chrome-extension", + "authors": ["michmich112"], + "homepage": "https://github.com/michmich112/sveltekit-adapter-chrome-extension#readme", + "version": "2.0.1", + "downloads": 272, + "github_stars": 143, + "updated": "2024-03-25T03:02:40.181Z", + "typescript": true +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sveltekit-superforms.json b/apps/svelte.dev/src/lib/server/generated/registry/sveltekit-superforms.json new file mode 100644 index 0000000000..2df0097dd0 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sveltekit-superforms.json @@ -0,0 +1,16 @@ +{ + "name": "sveltekit-superforms", + "npm_description": "Making SvelteKit forms a pleasure to use!", + "repo_url": "https://github.com/ciscoheat/sveltekit-superforms", + "authors": ["ciscoheat"], + "homepage": "https://superforms.rocks", + "version": "2.27.1", + "downloads": 75369, + "github_stars": 2628, + "updated": "2025-06-27T13:15:22.597Z", + "svelte_range": "3.x || 4.x || >=5.0.0-next.51", + "kit_range": "1.x || 2.x", + "typescript": true, + "runes": false, + "last_rune_check_version": "2.24.1" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sveltepress-vite.json b/apps/svelte.dev/src/lib/server/generated/registry/sveltepress-vite.json new file mode 100644 index 0000000000..7548c94b56 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sveltepress-vite.json @@ -0,0 +1,16 @@ +{ + "name": "@sveltepress/vite", + "npm_description": "Sveltepress plugin for vite", + "repo_url": "https://github.com/Blackman99/sveltepress", + "authors": ["philadelphia"], + "homepage": "https://sveltepress.site/", + "version": "1.2.2", + "downloads": 1409, + "github_stars": 499, + "updated": "2025-05-06T02:33:47.201Z", + "svelte_range": "^5.0.0", + "kit_range": "^1.20.4 || ^2.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "1.1.5" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/sveltestrap-sveltestrap.json b/apps/svelte.dev/src/lib/server/generated/registry/sveltestrap-sveltestrap.json new file mode 100644 index 0000000000..8b8e06f92b --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/sveltestrap-sveltestrap.json @@ -0,0 +1,15 @@ +{ + "name": "@sveltestrap/sveltestrap", + "npm_description": "Bootstrap components for Svelte", + "repo_url": "https://github.com/sveltestrap/sveltestrap", + "authors": ["dysfunc"], + "homepage": "https://sveltestrap.js.org", + "version": "7.1.0", + "downloads": 5758, + "github_stars": 191, + "updated": "2025-02-04T15:33:33.979Z", + "svelte_range": "^4.0.0 || ^5.0.0 || ^5.0.0-next.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "7.1.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/tailwindcss.json b/apps/svelte.dev/src/lib/server/generated/registry/tailwindcss.json new file mode 100644 index 0000000000..cd85c254c0 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/tailwindcss.json @@ -0,0 +1,14 @@ +{ + "name": "tailwindcss", + "npm_description": "A utility-first CSS framework for rapidly building custom user interfaces.", + "repo_url": "https://github.com/tailwindlabs/tailwindcss", + "authors": ["malfaitrobin", "adamwathan", "reinink"], + "homepage": "https://tailwindcss.com", + "version": "4.1.14", + "downloads": 23920217, + "github_stars": 90339, + "updated": "2025-10-01T16:06:45.574Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "4.1.3" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/tanstack-svelte-form.json b/apps/svelte.dev/src/lib/server/generated/registry/tanstack-svelte-form.json new file mode 100644 index 0000000000..4d5aaf6625 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/tanstack-svelte-form.json @@ -0,0 +1,15 @@ +{ + "name": "@tanstack/svelte-form", + "npm_description": "Powerful, type-safe forms for Svelte.", + "repo_url": "https://github.com/TanStack/form", + "authors": ["tannerlinsley", "kylemathews"], + "homepage": "https://tanstack.com/form", + "version": "1.23.5", + "downloads": 1546, + "github_stars": 5827, + "updated": "2025-09-30T14:21:57.259Z", + "svelte_range": "^5.0.0", + "typescript": false, + "runes": false, + "last_rune_check_version": "1.3.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/tanstack-svelte-query.json b/apps/svelte.dev/src/lib/server/generated/registry/tanstack-svelte-query.json new file mode 100644 index 0000000000..98c3a13b81 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/tanstack-svelte-query.json @@ -0,0 +1,15 @@ +{ + "name": "@tanstack/svelte-query", + "npm_description": "Primitives for managing, caching and syncing asynchronous and remote data in Svelte", + "repo_url": "https://github.com/TanStack/query", + "authors": ["tannerlinsley", "kylemathews"], + "homepage": "https://tanstack.com/query", + "version": "6.0.0", + "downloads": 45634, + "github_stars": 46767, + "updated": "2025-09-30T12:14:06.735Z", + "svelte_range": "^5.25.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "5.74.3" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/tanstack-svelte-table.json b/apps/svelte.dev/src/lib/server/generated/registry/tanstack-svelte-table.json new file mode 100644 index 0000000000..2ccdcca064 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/tanstack-svelte-table.json @@ -0,0 +1,15 @@ +{ + "name": "@tanstack/svelte-table", + "npm_description": "Headless UI for building powerful tables & datagrids for Svelte.", + "repo_url": "https://github.com/TanStack/table", + "authors": ["tannerlinsley", "kylemathews"], + "homepage": "https://tanstack.com/table", + "version": "8.21.3", + "downloads": 9030, + "github_stars": 27030, + "updated": "2025-04-14T20:20:26.877Z", + "svelte_range": "^4.0.0 || ^3.49.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "8.21.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/tanstack-svelte-virtual.json b/apps/svelte.dev/src/lib/server/generated/registry/tanstack-svelte-virtual.json new file mode 100644 index 0000000000..f60b73b912 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/tanstack-svelte-virtual.json @@ -0,0 +1,15 @@ +{ + "name": "@tanstack/svelte-virtual", + "npm_description": "Headless UI for virtualizing scrollable elements in Svelte", + "repo_url": "https://github.com/TanStack/virtual", + "authors": ["tannerlinsley", "kylemathews"], + "homepage": "https://tanstack.com/virtual", + "version": "3.13.12", + "downloads": 6519, + "github_stars": 6353, + "updated": "2025-06-27T12:47:07.412Z", + "svelte_range": "^3.48.0 || ^4.0.0 || ^5.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "3.13.6" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/testing-library-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/testing-library-svelte.json new file mode 100644 index 0000000000..7d1cc6a768 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/testing-library-svelte.json @@ -0,0 +1,32 @@ +{ + "name": "@testing-library/svelte", + "npm_description": "Simple and complete Svelte testing utilities that encourage good testing practices.", + "repo_url": "https://github.com/testing-library/svelte-testing-library", + "authors": [ + "testing-library-bot", + "kentcdodds", + "timdeschryver", + "patrickhulce", + "dfcook", + "gpx", + "mpeyper", + "mihar-22", + "pago", + "cmckinstry", + "thymikee", + "brrianalexis", + "jdecroock", + "mdjastrzebski", + "eps1lon", + "phryneas" + ], + "homepage": "https://github.com/testing-library/svelte-testing-library#readme", + "version": "5.2.8", + "downloads": 226327, + "github_stars": 647, + "updated": "2025-05-19T14:43:37.452Z", + "svelte_range": "^3 || ^4 || ^5 || ^5.0.0-next.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "5.2.7" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/threlte-core.json b/apps/svelte.dev/src/lib/server/generated/registry/threlte-core.json new file mode 100644 index 0000000000..03a1d38814 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/threlte-core.json @@ -0,0 +1,16 @@ +{ + "name": "@threlte/core", + "npm_description": "A 3D framework for the web, built on top of Svelte and Three.js", + "repo_url": "https://github.com/threlte/threlte", + "authors": ["grischaerbe"], + "homepage": "https://threlte.xyz", + "version": "8.1.5", + "downloads": 14708, + "github_stars": 3034, + "updated": "2025-08-28T22:29:59.278Z", + "svelte_range": ">=5", + "kit_range": "^2.7.7", + "typescript": true, + "runes": true, + "last_rune_check_version": "8.0.2" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/trpc-sveltekit.json b/apps/svelte.dev/src/lib/server/generated/registry/trpc-sveltekit.json new file mode 100644 index 0000000000..e47bcd0910 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/trpc-sveltekit.json @@ -0,0 +1,15 @@ +{ + "name": "trpc-sveltekit", + "npm_description": "SvelteKit adapter for tRPC.io, working with Node.js, Vercel and Netlify", + "repo_url": "https://github.com/icflorescu/trpc-sveltekit", + "authors": ["icflorescu"], + "homepage": "https://icflorescu.github.io/trpc-sveltekit/", + "version": "3.6.3", + "downloads": 3325, + "github_stars": 840, + "updated": "2025-03-06T12:52:54.703Z", + "kit_range": "^1.27.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "3.6.3" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/tsparticles-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/tsparticles-svelte.json new file mode 100644 index 0000000000..54acf2095c --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/tsparticles-svelte.json @@ -0,0 +1,16 @@ +{ + "name": "@tsparticles/svelte", + "npm_description": "Official tsParticles Svelte Component - Easily create highly customizable particle, confetti and fireworks animations and use them as animated backgrounds for your website. Ready to use components available also for Web Components, React, Vue.js (2.x and ", + "repo_url": "https://github.com/tsparticles/svelte", + "authors": ["matteobruni", "ar3s"], + "homepage": "https://github.com/tsparticles/svelte#readme", + "version": "3.1.1", + "downloads": 1009, + "github_stars": 60, + "updated": "2024-05-26T10:58:39.331Z", + "svelte_range": "^4.2.17", + "kit_range": "^2.5.10", + "typescript": true, + "runes": false, + "last_rune_check_version": "3.1.1" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/typewriter-editor.json b/apps/svelte.dev/src/lib/server/generated/registry/typewriter-editor.json new file mode 100644 index 0000000000..37ec996479 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/typewriter-editor.json @@ -0,0 +1,16 @@ +{ + "name": "typewriter-editor", + "npm_description": "A rich text editor using the Delta format with decorations and rendered with a tiny virtual dom", + "repo_url": "https://github.com/typewriter-editor/typewriter", + "authors": ["jacwright"], + "homepage": "https://github.com/typewriter-editor/typewriter#readme", + "version": "0.12.9", + "downloads": 823, + "github_stars": 428, + "updated": "2025-02-12T18:30:38.430Z", + "svelte_range": ">=3.43.0 <6", + "kit_range": "^2.5.25", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.12.9" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/universal-router.json b/apps/svelte.dev/src/lib/server/generated/registry/universal-router.json new file mode 100644 index 0000000000..d28344539b --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/universal-router.json @@ -0,0 +1,14 @@ +{ + "name": "universal-router", + "npm_description": "Isomorphic router for JavaScript web applications", + "repo_url": "https://github.com/kriasoft/universal-router", + "authors": ["koistya", "frenzzy"], + "homepage": "https://www.kriasoft.com/universal-router/", + "version": "10.0.1", + "downloads": 24714, + "github_stars": 1754, + "updated": "2025-08-08T16:58:21.053Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "10.0.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/unocss-preset-icons.json b/apps/svelte.dev/src/lib/server/generated/registry/unocss-preset-icons.json new file mode 100644 index 0000000000..1dd5e21fc1 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/unocss-preset-icons.json @@ -0,0 +1,14 @@ +{ + "name": "@unocss/preset-icons", + "npm_description": "Pure CSS Icons for UnoCSS", + "repo_url": "https://github.com/unocss/unocss", + "authors": ["antfu", "unocss-bot"], + "homepage": "https://unocss.dev", + "version": "66.5.2", + "downloads": 390316, + "github_stars": 18138, + "updated": "2025-09-23T00:52:34.949Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "66.1.0-beta.11" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/unpic-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/unpic-svelte.json new file mode 100644 index 0000000000..64a54709a7 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/unpic-svelte.json @@ -0,0 +1,16 @@ +{ + "name": "@unpic/svelte", + "npm_description": "Svelte component for responsive, high-performance images.", + "repo_url": "https://github.com/ascorbic/unpic-img", + "authors": ["ascorbic"], + "homepage": "https://unpic.pics/img/svelte", + "version": "1.0.0", + "downloads": 8004, + "github_stars": 1825, + "updated": "2025-01-19T16:47:12.413Z", + "svelte_range": "^5", + "kit_range": "^2.9.0", + "typescript": true, + "runes": true, + "last_rune_check_version": "1.0.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/uppy-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/uppy-svelte.json new file mode 100644 index 0000000000..a7010e56e7 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/uppy-svelte.json @@ -0,0 +1,16 @@ +{ + "name": "@uppy/svelte", + "npm_description": "Uppy plugin that helps integrate Uppy into your Svelte project.", + "repo_url": "https://github.com/transloadit/uppy", + "authors": ["kvz", "tim-kos", "murderlon", "mifi", "uppydev"], + "homepage": "https://uppy.io", + "version": "5.0.2", + "downloads": 1393, + "github_stars": 30353, + "updated": "2025-10-01T14:24:49.370Z", + "svelte_range": "^4.0.0 || ^5.0.0", + "kit_range": "^2.20.7", + "typescript": true, + "runes": false, + "last_rune_check_version": "4.3.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/urql-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/urql-svelte.json new file mode 100644 index 0000000000..56591341c7 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/urql-svelte.json @@ -0,0 +1,35 @@ +{ + "name": "@urql/svelte", + "npm_description": "A highly customizable and versatile GraphQL client for Svelte", + "repo_url": "https://github.com/urql-graphql/urql", + "authors": [ + "michaelmerrill", + "sarmeyer", + "mariano-formidable", + "ryan.roemer", + "formidable-owner", + "formidablelabs", + "carbonrobot", + "masiddee", + "scott-rippey", + "sarahformidable", + "robwalkerco", + "ceceppa", + "keithluchtel", + "scottianstewart", + "philpl", + "andyrichardson", + "jdecroock", + "parkerziegler", + "npm-urql" + ], + "homepage": "https://formidable.com/open-source/urql/docs/", + "version": "5.0.0", + "downloads": 9306, + "github_stars": 8855, + "updated": "2025-08-09T12:31:03.971Z", + "svelte_range": "^3.0.0 || ^4.0.0 || ^5.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "4.2.3" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/virtua.json b/apps/svelte.dev/src/lib/server/generated/registry/virtua.json new file mode 100644 index 0000000000..2f0dd640ff --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/virtua.json @@ -0,0 +1,15 @@ +{ + "name": "virtua", + "npm_description": "A zero-config, fast and small (~3kB) virtual list (and grid) component for React, Vue, Solid and Svelte.", + "repo_url": "https://github.com/inokawa/virtua", + "authors": ["inokawa"], + "homepage": "https://github.com/inokawa/virtua#readme", + "version": "0.44.0", + "downloads": 154394, + "github_stars": 3122, + "updated": "2025-10-02T00:33:25.433Z", + "svelte_range": ">=5.0", + "typescript": true, + "runes": true, + "last_rune_check_version": "0.40.3" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/vite-plugin-devtools-json.json b/apps/svelte.dev/src/lib/server/generated/registry/vite-plugin-devtools-json.json new file mode 100644 index 0000000000..d8ce956b5b --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/vite-plugin-devtools-json.json @@ -0,0 +1,14 @@ +{ + "name": "vite-plugin-devtools-json", + "npm_description": "Vite plugin for generating `com.chrome.devtools.json` on the fly in the devserver.", + "repo_url": "https://github.com/ChromeDevTools/vite-plugin-devtools-json", + "authors": ["google-wombot"], + "homepage": "https://github.com/ChromeDevTools/vite-plugin-devtools-json#readme", + "version": "1.0.0", + "downloads": 91156, + "github_stars": 312, + "updated": "2025-08-13T06:57:42.058Z", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.4.1" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/vitest.json b/apps/svelte.dev/src/lib/server/generated/registry/vitest.json new file mode 100644 index 0000000000..9fcab10c1f --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/vitest.json @@ -0,0 +1,15 @@ +{ + "name": "vitest", + "npm_description": "Next generation testing framework powered by Vite", + "repo_url": "https://github.com/vitest-dev/vitest", + "authors": ["antfu", "patak", "oreanno", "yyx990803"], + "homepage": "https://github.com/vitest-dev/vitest#readme", + "version": "3.2.4", + "downloads": 16578860, + "github_stars": 15012, + "updated": "2025-06-17T17:54:25.895Z", + "svelte_range": "^3.0.0 || ^4.0.0 || ^5.0.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "3.2.3" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/wuchale-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/wuchale-svelte.json new file mode 100644 index 0000000000..e6fbc7b1e6 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/wuchale-svelte.json @@ -0,0 +1,15 @@ +{ + "name": "@wuchale/svelte", + "npm_description": "Protobuf-like i18n from plain code: Svelte adapter", + "repo_url": "https://github.com/wuchalejs/wuchale", + "authors": ["k1dv5"], + "homepage": "https://wuchale.dev", + "version": "0.15.1", + "downloads": 349, + "github_stars": 187, + "updated": "2025-09-21T10:54:55.355Z", + "svelte_range": "^5.37.0", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.15.0" +} diff --git a/apps/svelte.dev/src/lib/server/generated/registry/xyflow-svelte.json b/apps/svelte.dev/src/lib/server/generated/registry/xyflow-svelte.json new file mode 100644 index 0000000000..2226838e60 --- /dev/null +++ b/apps/svelte.dev/src/lib/server/generated/registry/xyflow-svelte.json @@ -0,0 +1,16 @@ +{ + "name": "@xyflow/svelte", + "npm_description": "Svelte Flow - A highly customizable Svelte library for building node-based editors, workflow systems, diagrams and more.", + "repo_url": "https://github.com/xyflow/xyflow", + "authors": ["peterkogo", "webk1d"], + "homepage": "https://svelteflow.dev", + "version": "1.3.1", + "downloads": 41238, + "github_stars": 31718, + "updated": "2025-09-26T11:00:09.471Z", + "svelte_range": "^5.25.0", + "kit_range": "^2.21.4", + "typescript": true, + "runes": false, + "last_rune_check_version": "0.1.36" +} diff --git a/apps/svelte.dev/src/lib/time.js b/apps/svelte.dev/src/lib/time.ts similarity index 66% rename from apps/svelte.dev/src/lib/time.js rename to apps/svelte.dev/src/lib/time.ts index 53f4660ffd..e216fdb84b 100644 --- a/apps/svelte.dev/src/lib/time.js +++ b/apps/svelte.dev/src/lib/time.ts @@ -15,14 +15,16 @@ const DIVISIONS = { /** * @param {Date} date */ -export const ago = (date) => { +export const ago = (date: Date, short = false) => { let duration = (date.getTime() - new Date().getTime()) / 1000; for (const [name, amount] of Object.entries(DIVISIONS)) { if (Math.abs(duration) < amount) { - const format = /** @type {keyof(DIVISIONS)} */ (name); - return formatter.format(Math.round(duration), format); + return short + ? `${Math.round(-duration)}${name === 'months' ? 'mo' : name[0]} ago` + : formatter.format(Math.round(duration), name as Intl.RelativeTimeFormatUnit); } + duration /= amount; } }; diff --git a/apps/svelte.dev/src/routes/+layout.server.ts b/apps/svelte.dev/src/routes/+layout.server.ts index 4fb653d821..d5efdc2873 100644 --- a/apps/svelte.dev/src/routes/+layout.server.ts +++ b/apps/svelte.dev/src/routes/+layout.server.ts @@ -41,6 +41,10 @@ const nav_links: NavigationLink[] = [ })) })) }, + { + title: 'Packages', + slug: 'packages' + }, { title: 'Playground', slug: 'playground' diff --git a/apps/svelte.dev/src/routes/+layout.svelte b/apps/svelte.dev/src/routes/+layout.svelte index dd1021147d..d5ee36dd44 100644 --- a/apps/svelte.dev/src/routes/+layout.svelte +++ b/apps/svelte.dev/src/routes/+layout.svelte @@ -31,6 +31,7 @@ const sections: Record = { docs: 'Docs', + packages: 'Packages', playground: 'Playground', blog: 'Blog', tutorial: 'Tutorial', diff --git a/apps/svelte.dev/src/routes/packages/+page.server.ts b/apps/svelte.dev/src/routes/packages/+page.server.ts new file mode 100644 index 0000000000..188720f5fd --- /dev/null +++ b/apps/svelte.dev/src/routes/packages/+page.server.ts @@ -0,0 +1,37 @@ +import { PACKAGES_META } from '$lib/packages-meta'; +import { registry, type Category, type Package, type PackageDefinition } from '$lib/server/content'; + +export const prerender = false; + +const arrToPackages = (arr: PackageDefinition[]) => { + return arr + .map((pkgDef) => { + const pkgFound = registry.find((pkg) => pkg.name === pkgDef.name) ?? null; + if (pkgFound && pkgDef.svAlias) { + const result = structuredClone(pkgFound); + result.svAlias = pkgDef.svAlias; + result.name = pkgDef.svAlias; + result.homepage = `/docs/cli/${pkgDef.svAlias}`; + delete result.repo_url; + return result; + } + + return pkgFound; + }) + .filter((v) => Boolean(v)) as Package[]; +}; + +// Netflix style page. Send pre-done cards with categories +const homepage: Category[] = []; +for (const { packages, title, description } of PACKAGES_META.FEATURED) { + homepage.push({ + title, + hash: title.toLowerCase().replace(/ /g, '-'), + description, + packages: arrToPackages(packages) + }); +} + +export async function load() { + return { homepage }; +} diff --git a/apps/svelte.dev/src/routes/packages/+page.svelte b/apps/svelte.dev/src/routes/packages/+page.svelte new file mode 100644 index 0000000000..c0ee7fbec0 --- /dev/null +++ b/apps/svelte.dev/src/routes/packages/+page.svelte @@ -0,0 +1,62 @@ + + + + Packages • Svelte + + + + + + +
+
+

Packages

+

+ We’ve collected a few of our favourite packages that work well with Svelte and SvelteKit apps. + Official packages are marked with the logo. +

+
+ +
+ {#each data.homepage as category} + + {/each} +
+
+ + diff --git a/apps/svelte.dev/src/routes/packages/Category.svelte b/apps/svelte.dev/src/routes/packages/Category.svelte new file mode 100644 index 0000000000..28743f9dc6 --- /dev/null +++ b/apps/svelte.dev/src/routes/packages/Category.svelte @@ -0,0 +1,185 @@ + + +
+
+

+ {title} + +

+ + {#if description} +

{@html description}

+ {/if} +
+ +
+ {#each packages.slice(0, INITIAL_ITEMS) as pkg} +
+ +
+ {/each} +
+ + {#if packages.length > INITIAL_ITEMS} +
+ + + + + + show all ({packages.length}) + show less + + +
+ {#each packages.slice(INITIAL_ITEMS) as pkg} +
+ +
+ {/each} +
+
+ {/if} +
+ + diff --git a/apps/svelte.dev/src/routes/packages/PackageCard.svelte b/apps/svelte.dev/src/routes/packages/PackageCard.svelte new file mode 100644 index 0000000000..eba4ddc81b --- /dev/null +++ b/apps/svelte.dev/src/routes/packages/PackageCard.svelte @@ -0,0 +1,251 @@ + + +
+ e.stopPropagation()} + > +
+

+ {#if pkg.official} + + {/if} + + {pkg.name} +

+ + + {pkg.version} + + + {ago(new Date(pkg.updated), true)} + + +
+ +

{pkg.description}

+ + {#if pkg.svAlias} + + {:else} +

+ {#if pkg.downloads} + + + {format_number(+pkg.downloads)} + + {/if} + + {#if pkg.github_stars} + + + {format_number(pkg.github_stars)} + + {/if} + + +

+ {/if} +
+ + + {#if !pkg.svAlias} + + {/if} +
+ + diff --git a/apps/svelte.dev/src/routes/packages/utils.ts b/apps/svelte.dev/src/routes/packages/utils.ts new file mode 100644 index 0000000000..e8dd6d5f08 --- /dev/null +++ b/apps/svelte.dev/src/routes/packages/utils.ts @@ -0,0 +1,50 @@ +/** + * Formats a number with K, M, B, T suffixes + * + * @param num - The number to format + * @returns Formatted string representation of the number + * + * Examples: + * 437 -> 437 + * 4370 -> 4.3K + * 43700 -> 43K + * 437000 -> 437K + * 4370000 -> 4.3M + * 43700000 -> 43M + * 437000000 -> 437M + */ +export function format_number(num: number): string { + // Define thresholds and suffixes + const thresholds = [ + { value: 1e12, suffix: 'T' }, + { value: 1e9, suffix: 'B' }, + { value: 1e6, suffix: 'M' }, + { value: 1e3, suffix: 'K' } + ]; + + // Handle zero and negative numbers + if (num === 0) return '0'; + + const is_negative = num < 0; + const abs_num = Math.abs(num); + + // Find the appropriate threshold + for (const { value, suffix } of thresholds) { + if (abs_num >= value) { + // Calculate the divided value + const divided = abs_num / value; + + // Format with one decimal place if the first digit is less than 10 + const formatted = + divided < 10 + ? (Math.round(divided * 10) / 10).toFixed(1).replace(/\.0$/, '') + : Math.round(divided); + + // Return with proper sign and suffix + return `${is_negative ? '-' : ''}${formatted}${suffix}`; + } + } + + // If no threshold is met, return the number as is + return `${is_negative ? '-' : ''}${Math.round(abs_num)}`; +} diff --git a/packages/icons/icons/download.svg b/packages/icons/icons/download.svg new file mode 100644 index 0000000000..b46664180a --- /dev/null +++ b/packages/icons/icons/download.svg @@ -0,0 +1 @@ + diff --git a/packages/icons/icons/minus.svg b/packages/icons/icons/minus.svg new file mode 100644 index 0000000000..39316d686e --- /dev/null +++ b/packages/icons/icons/minus.svg @@ -0,0 +1 @@ + diff --git a/packages/icons/icons/npm.svg b/packages/icons/icons/npm.svg new file mode 100644 index 0000000000..c8dd82603b --- /dev/null +++ b/packages/icons/icons/npm.svg @@ -0,0 +1 @@ + diff --git a/packages/icons/icons/plus.svg b/packages/icons/icons/plus.svg new file mode 100644 index 0000000000..44adbb4b4b --- /dev/null +++ b/packages/icons/icons/plus.svg @@ -0,0 +1 @@ + diff --git a/packages/icons/icons/star.svg b/packages/icons/icons/star.svg new file mode 100644 index 0000000000..2ad2f5c7b6 --- /dev/null +++ b/packages/icons/icons/star.svg @@ -0,0 +1 @@ + diff --git a/packages/icons/icons/svelte-cutout.svg b/packages/icons/icons/svelte-cutout.svg new file mode 100644 index 0000000000..fd1b3a9488 --- /dev/null +++ b/packages/icons/icons/svelte-cutout.svg @@ -0,0 +1 @@ + diff --git a/packages/icons/icons/svelte.svg b/packages/icons/icons/svelte.svg new file mode 100644 index 0000000000..ae7e182a82 --- /dev/null +++ b/packages/icons/icons/svelte.svg @@ -0,0 +1 @@ + diff --git a/packages/icons/icons/typescript.svg b/packages/icons/icons/typescript.svg new file mode 100644 index 0000000000..8b3d389325 --- /dev/null +++ b/packages/icons/icons/typescript.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/logos/index.ts b/packages/logos/index.ts new file mode 100644 index 0000000000..f1e1c8f865 --- /dev/null +++ b/packages/logos/index.ts @@ -0,0 +1,11 @@ +const glob = import.meta.glob('./logos/*', { + import: 'default', + eager: true +}); + +export const logos: Record = Object.fromEntries( + Object.entries(glob).map(([key, value]) => [ + key.slice('./logos/'.length).replace(/\.(svg|png|jpg)/, ''), + value as string + ]) +); diff --git a/packages/logos/logos/devtools-json.svg b/packages/logos/logos/devtools-json.svg new file mode 100644 index 0000000000..d5320a7028 --- /dev/null +++ b/packages/logos/logos/devtools-json.svg @@ -0,0 +1 @@ + diff --git a/packages/logos/logos/drizzle.svg b/packages/logos/logos/drizzle.svg new file mode 100644 index 0000000000..de3ab6414c --- /dev/null +++ b/packages/logos/logos/drizzle.svg @@ -0,0 +1 @@ + diff --git a/packages/logos/logos/eslint.svg b/packages/logos/logos/eslint.svg new file mode 100644 index 0000000000..711420f425 --- /dev/null +++ b/packages/logos/logos/eslint.svg @@ -0,0 +1 @@ + diff --git a/packages/logos/logos/lucia.jpg b/packages/logos/logos/lucia.jpg new file mode 100644 index 0000000000..6193f2daee Binary files /dev/null and b/packages/logos/logos/lucia.jpg differ diff --git a/packages/logos/logos/mdsvex.png b/packages/logos/logos/mdsvex.png new file mode 100644 index 0000000000..0d7bbcf00b Binary files /dev/null and b/packages/logos/logos/mdsvex.png differ diff --git a/packages/logos/logos/paraglide.svg b/packages/logos/logos/paraglide.svg new file mode 100644 index 0000000000..d61da9b483 --- /dev/null +++ b/packages/logos/logos/paraglide.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/logos/logos/playwright.svg b/packages/logos/logos/playwright.svg new file mode 100644 index 0000000000..f55cf86fa7 --- /dev/null +++ b/packages/logos/logos/playwright.svg @@ -0,0 +1 @@ + diff --git a/packages/logos/logos/prettier.svg b/packages/logos/logos/prettier.svg new file mode 100644 index 0000000000..04229fb306 --- /dev/null +++ b/packages/logos/logos/prettier.svg @@ -0,0 +1 @@ + diff --git a/packages/logos/logos/storybook.svg b/packages/logos/logos/storybook.svg new file mode 100644 index 0000000000..4489abbe67 --- /dev/null +++ b/packages/logos/logos/storybook.svg @@ -0,0 +1 @@ +icon-storybook-default diff --git a/packages/logos/logos/tailwind.svg b/packages/logos/logos/tailwind.svg new file mode 100644 index 0000000000..8f8834329f --- /dev/null +++ b/packages/logos/logos/tailwind.svg @@ -0,0 +1 @@ + diff --git a/packages/logos/logos/vitest.svg b/packages/logos/logos/vitest.svg new file mode 100644 index 0000000000..670ab936ba --- /dev/null +++ b/packages/logos/logos/vitest.svg @@ -0,0 +1 @@ + diff --git a/packages/logos/package.json b/packages/logos/package.json new file mode 100644 index 0000000000..7aeaced9ab --- /dev/null +++ b/packages/logos/package.json @@ -0,0 +1,13 @@ +{ + "name": "logos", + "private": true, + "exports": { + ".": { + "default": "./index.ts" + }, + "./*": { + "types": "./types.d.ts", + "default": "./logos/*.svg" + } + } +} diff --git a/packages/logos/types.d.ts b/packages/logos/types.d.ts new file mode 100644 index 0000000000..63bbc09331 --- /dev/null +++ b/packages/logos/types.d.ts @@ -0,0 +1,2 @@ +declare const svg: string; +export default svg; diff --git a/packages/site-kit/src/lib/actions/utils.ts b/packages/site-kit/src/lib/actions/utils.ts index 513dd0f5e9..cabcf380e0 100644 --- a/packages/site-kit/src/lib/actions/utils.ts +++ b/packages/site-kit/src/lib/actions/utils.ts @@ -1,4 +1,6 @@ -export function fix_position(element: HTMLElement, fn: Function) { +import { tick } from 'svelte'; + +export async function fix_position(element: HTMLElement, fn: Function) { let scroll_parent: HTMLElement | null = element; while ((scroll_parent = scroll_parent.parentElement)) { @@ -9,6 +11,7 @@ export function fix_position(element: HTMLElement, fn: Function) { const top = element.getBoundingClientRect().top; fn(); + await tick(); const delta = element.getBoundingClientRect().top - top; if (delta !== 0) { diff --git a/packages/site-kit/src/lib/styles/utils/buttons.css b/packages/site-kit/src/lib/styles/utils/buttons.css index cca16ba466..a463dd84d3 100644 --- a/packages/site-kit/src/lib/styles/utils/buttons.css +++ b/packages/site-kit/src/lib/styles/utils/buttons.css @@ -68,7 +68,8 @@ button.icon, summary.icon, -button:has(> span.icon) { +button:has(> span.icon), +.button:has(> span.icon) { position: relative; width: 3.2rem; height: 3.2rem; @@ -77,6 +78,7 @@ button:has(> span.icon) { background-size: 2.3rem 2.3rem; } +.button > span.icon, button > span.icon { position: absolute; left: 0; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c31f57c991..1c39e19bd8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,6 +86,9 @@ importers: icons: specifier: workspace:* version: link:../../packages/icons + logos: + specifier: workspace:* + version: link:../../packages/logos port-authority: specifier: ^2.0.1 version: 2.0.1 @@ -207,6 +210,8 @@ importers: packages/icons: {} + packages/logos: {} + packages/repl: dependencies: '@codemirror/autocomplete':