├── src ├── global.d.ts ├── lib │ ├── _suspense-list │ │ ├── status.ts │ │ ├── util.ts │ │ ├── context.ts │ │ └── suspense-list.svelte │ ├── index.ts │ ├── _debounce.ts │ └── _suspense │ │ ├── context.svelte.ts │ │ └── suspense.svelte ├── routes │ ├── suspense-list │ │ ├── status.svelte │ │ ├── list.svelte │ │ └── +page.svelte │ ├── load-events │ │ ├── delayed.svelte │ │ └── +page.svelte │ ├── social │ │ ├── comments-skeleton.svelte │ │ ├── post-skeleton.svelte │ │ ├── img.svelte │ │ ├── global.css │ │ ├── post.svelte │ │ ├── content.svelte │ │ ├── +page.svelte │ │ ├── spinner.svelte │ │ ├── header.svelte │ │ ├── sidebar.svelte │ │ ├── comments.svelte │ │ ├── posts.svelte │ │ ├── friends.svelte │ │ ├── api.ts │ │ └── friend-card.svelte │ ├── apples │ │ ├── apple.svelte │ │ ├── grid.svelte │ │ ├── +page.svelte │ │ └── selector.svelte │ ├── interval │ │ ├── +page.svelte │ │ └── timer.svelte │ ├── albums │ │ ├── album-skeleton.svelte │ │ ├── +page.svelte │ │ ├── page-layout.svelte │ │ ├── loading.svelte │ │ ├── album-list.svelte │ │ └── album.svelte │ └── +page.svelte └── app.html ├── .husky ├── pre-commit ├── post-checkout └── post-merge ├── .gitignore ├── vite.config.js ├── tsconfig.json ├── .prettierrc ├── scripts ├── _util.js ├── prune-branches.js ├── post-checkout.js └── pre-commit.js ├── svelte.config.js ├── .eslintrc.cjs ├── .github └── workflows │ └── publish.yml ├── package.json ├── README.md └── pnpm-lock.yaml /src/global.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | node ./scripts/pre-commit.js 3 | -------------------------------------------------------------------------------- /.husky/post-checkout: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | node ./scripts/post-checkout.js $1 $2 3 | -------------------------------------------------------------------------------- /.husky/post-merge: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | node ./scripts/post-checkout.js ORIG_HEAD HEAD 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /dist 5 | /.svelte-kit 6 | /package 7 | -------------------------------------------------------------------------------- /src/lib/_suspense-list/status.ts: -------------------------------------------------------------------------------- 1 | export const enum STATUS { 2 | READY = 0, 3 | LOADING, 4 | HIDDEN, 5 | } 6 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite' 2 | 3 | /** @type {import('vite').UserConfig} */ 4 | export default { 5 | plugins: [sveltekit()], 6 | } 7 | -------------------------------------------------------------------------------- /src/lib/index.ts: -------------------------------------------------------------------------------- 1 | export { suspend } from './_suspense/context.svelte.js' 2 | export { default as Suspense } from './_suspense/suspense.svelte' 3 | export { default as SuspenseList } from './_suspense-list/suspense-list.svelte' 4 | -------------------------------------------------------------------------------- /src/routes/suspense-list/status.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
  • 9 | {state ? '✔️' : '⌛'} 10 |
  • 11 | -------------------------------------------------------------------------------- /src/routes/load-events/delayed.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |

    Delayed

    12 |

    This waited one second.

    13 | -------------------------------------------------------------------------------- /src/routes/social/comments-skeleton.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |

    6 | 7 | Loading comments... 8 |

    9 | 10 | 17 | -------------------------------------------------------------------------------- /src/routes/apples/apple.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | {#await suspend(timer())} 13 | 🍎 14 | {/await} 15 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
    %sveltekit.body%
    11 | 12 | 13 | -------------------------------------------------------------------------------- /src/routes/interval/+page.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |

    Interval

    7 | 8 | 9 | 10 | {#snippet failed()} 11 | ERROR 12 | {/snippet} 13 | 14 | {#snippet loading()} 15 | Fetching... 16 | {/snippet} 17 | 18 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "forceConsistentCasingInFileNames": true, 5 | "moduleResolution": "Bundler", 6 | "noUnusedLocals": true, 7 | "noUnusedParameters": true, 8 | "strictNullChecks": true, 9 | "resolveJsonModule": true, 10 | "skipLibCheck": true, 11 | "target": "es2022" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "prettier-plugin-svelte", 4 | "@trivago/prettier-plugin-sort-imports" 5 | ], 6 | "importOrder": [ 7 | "", 8 | "^\\w(.*)$", 9 | "^@(.*)$", 10 | "^\\$(.*)$", 11 | "^\\.(.*)$" 12 | ], 13 | "semi": false, 14 | "singleQuote": true, 15 | "svelteIndentScriptAndStyle": false, 16 | "trailingComma": "es5" 17 | } 18 | -------------------------------------------------------------------------------- /src/routes/social/post-skeleton.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
    6 | 7 |
    8 | 9 | 20 | -------------------------------------------------------------------------------- /src/lib/_debounce.ts: -------------------------------------------------------------------------------- 1 | import { tick } from 'svelte' 2 | 3 | export default function debounce unknown>( 4 | fn: Fn 5 | ) { 6 | let guard: unknown 7 | 8 | return async function (...args: Parameters) { 9 | const inner = {} 10 | guard = inner 11 | 12 | await tick() 13 | 14 | if (inner === guard) { 15 | fn(...args) 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/routes/social/img.svelte: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/routes/albums/album-skeleton.svelte: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | 5 | 25 | -------------------------------------------------------------------------------- /src/routes/social/global.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: rgb(250, 250, 250); 3 | font-family: 4 | system-ui, 5 | -apple-system, 6 | BlinkMacSystemFont, 7 | 'Segoe UI', 8 | Roboto, 9 | 'Helvetica Neue', 10 | Arial, 11 | 'Noto Sans', 12 | sans-serif, 13 | 'Apple Color Emoji', 14 | 'Segoe UI Emoji', 15 | 'Segoe UI Symbol', 16 | 'Noto Color Emoji'; 17 | margin: 0; 18 | } 19 | -------------------------------------------------------------------------------- /src/routes/social/post.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
    7 |

    {post.title}

    8 |

    {post.body}

    9 |
    10 | 11 | 25 | -------------------------------------------------------------------------------- /scripts/_util.js: -------------------------------------------------------------------------------- 1 | import { spawn } from 'cross-spawn' 2 | 3 | export async function run(cmd, args, pipe = false) { 4 | let output = '' 5 | 6 | const proc = spawn(cmd, args, pipe ? { stdio: 'inherit' } : undefined) 7 | 8 | proc.stdout?.on('data', (data) => { 9 | output += data 10 | }) 11 | 12 | return new Promise((resolve) => { 13 | proc.on('close', () => { 14 | resolve(output) 15 | }) 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto' 2 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://github.com/sveltejs/svelte-preprocess 7 | // for more information about preprocessors 8 | preprocess: vitePreprocess(), 9 | 10 | kit: { 11 | adapter: adapter(), 12 | }, 13 | } 14 | 15 | export default config 16 | -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 |

    Suspense Examples

    2 | 3 | 23 | -------------------------------------------------------------------------------- /src/routes/load-events/+page.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | console.log('Loaded Empty', element)}> 7 |

    Empty

    8 |

    Nothing here.

    9 |
    10 | 11 | console.log('Loaded Delayed', element)}> 12 | 13 | 14 | {#snippet loading()} 15 |

    Loading...

    16 | {/snippet} 17 |
    18 | -------------------------------------------------------------------------------- /scripts/prune-branches.js: -------------------------------------------------------------------------------- 1 | import { run } from './_util.js' 2 | 3 | const merged = await run('git', ['branch', '--merged', 'dev']) 4 | for (const line of merged.split('\n')) { 5 | // Never delete the active branch 6 | if (line.startsWith('*')) continue 7 | 8 | const branch = line.trim() 9 | if (!branch) continue 10 | // Never delete main 11 | if (branch === 'main') continue 12 | // Never delete dev 13 | if (branch === 'dev') continue 14 | 15 | await run('git', ['branch', '-d', branch], true) 16 | } 17 | -------------------------------------------------------------------------------- /scripts/post-checkout.js: -------------------------------------------------------------------------------- 1 | import { run } from './_util.js' 2 | 3 | const previous_branch = process.argv[2] 4 | const new_branch = process.argv[3] 5 | 6 | const changes = await run('git', [ 7 | 'diff-tree', 8 | '-r', 9 | '--name-only', 10 | '--no-commit-id', 11 | previous_branch, 12 | new_branch, 13 | ]) 14 | if (changes.includes('package.json')) { 15 | console.log( 16 | '📦 package-lock.json changed. Running pnpm install to bring your dependencies up to date.' 17 | ) 18 | await run('pnpm', ['install'], true) 19 | } 20 | -------------------------------------------------------------------------------- /src/lib/_suspense/context.svelte.ts: -------------------------------------------------------------------------------- 1 | import { getContext, setContext as set } from 'svelte' 2 | 3 | const key = Symbol() 4 | 5 | export type Suspend = (data: T) => T 6 | 7 | export function setContext(value: Suspend) { 8 | set(key, value) 9 | } 10 | 11 | export function suspend(data: T): T { 12 | const interal_suspend = getContext(key) 13 | if (!interal_suspend) { 14 | console.error('`suspend` called outside of a Suspense boundary') 15 | return data 16 | } 17 | 18 | return interal_suspend(data) 19 | } 20 | -------------------------------------------------------------------------------- /src/lib/_suspense-list/util.ts: -------------------------------------------------------------------------------- 1 | export function sortOnDocumentOrder(a: HTMLElement, b: HTMLElement) { 2 | if (a === b) { 3 | return 0 4 | } 5 | 6 | const position = a.compareDocumentPosition(b) 7 | 8 | if ( 9 | position & Node.DOCUMENT_POSITION_FOLLOWING || 10 | position & Node.DOCUMENT_POSITION_CONTAINED_BY 11 | ) { 12 | return -1 13 | } else if ( 14 | position & Node.DOCUMENT_POSITION_PRECEDING || 15 | position & Node.DOCUMENT_POSITION_CONTAINS 16 | ) { 17 | return 1 18 | } else { 19 | return 0 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/routes/apples/grid.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
    7 | {#each Array(2000) as _} 8 |
    9 | 10 | 11 | {#snippet loading()} 12 | ⌛ 13 | {/snippet} 14 | 15 |
    16 | {/each} 17 |
    18 | 19 | 28 | -------------------------------------------------------------------------------- /src/routes/interval/timer.svelte: -------------------------------------------------------------------------------- 1 | 20 | 21 | {#await suspend(data) then time} 22 | {time} 23 | {/await} 24 | -------------------------------------------------------------------------------- /src/routes/albums/+page.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | {#snippet loading()} 13 | 14 | {/snippet} 15 | 16 | {#snippet failed()} 17 |

    Error!

    18 | {/snippet} 19 |
    20 |
    21 | 22 | 29 | -------------------------------------------------------------------------------- /src/lib/_suspense-list/context.ts: -------------------------------------------------------------------------------- 1 | import { getContext as get, setContext as set } from 'svelte' 2 | import { STATUS } from './status.js' 3 | 4 | const key = {} 5 | 6 | export type SuspenseListContext = { 7 | status: STATUS 8 | } 9 | export type RegisterFunction = (data: { 10 | loaded: boolean 11 | }) => SuspenseListContext 12 | 13 | const mock: RegisterFunction = () => ({ status: STATUS.READY }) 14 | export function getSuspenseListContext() { 15 | const register = get(key) 16 | return register || mock 17 | } 18 | 19 | export function setSuspenseListContext(value?: RegisterFunction) { 20 | set(key, value) 21 | } 22 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: '@typescript-eslint/parser', 4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], 5 | plugins: ['svelte3', '@typescript-eslint'], 6 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 7 | settings: { 8 | 'svelte3/typescript': () => require('typescript'), 9 | }, 10 | rules: { 11 | '@typescript-eslint/explicit-module-boundary-types': 'off', 12 | }, 13 | parserOptions: { 14 | sourceType: 'module', 15 | ecmaVersion: 2019, 16 | }, 17 | env: { 18 | browser: true, 19 | es2017: true, 20 | node: true, 21 | }, 22 | } 23 | -------------------------------------------------------------------------------- /scripts/pre-commit.js: -------------------------------------------------------------------------------- 1 | import { extname } from 'path' 2 | import { run } from './_util.js' 3 | 4 | const EXTENSIONS = new Set([ 5 | '.css', 6 | '.html', 7 | '.js', 8 | '.json', 9 | '.md', 10 | '.svelte', 11 | '.ts', 12 | '.yaml', 13 | ]) 14 | 15 | console.log('🧱 Formatting files...') 16 | const changes = await run('git', [ 17 | 'diff', 18 | '--cached', 19 | '--name-only', 20 | '--diff-filter=ACM', 21 | ]) 22 | const files = changes 23 | .split('\n') 24 | .filter((filename) => EXTENSIONS.has(extname(filename))) 25 | if (files.length) { 26 | await run('pnpx', ['prettier', '--write', ...files], true) 27 | await run('git', ['add', ...files]) 28 | } 29 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v4 12 | 13 | - name: Use Node.js 20 14 | uses: actions/setup-node@v4 15 | with: 16 | node-version: 20 17 | registry-url: https://registry.npmjs.org/ 18 | 19 | - name: Install pnpm 20 | uses: pnpm/action-setup@v4 21 | 22 | - run: pnpm install --frozen-lockfile 23 | - run: pnpm run package 24 | - run: pnpm publish --access public --no-git-checks 25 | env: 26 | NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} 27 | -------------------------------------------------------------------------------- /src/routes/apples/+page.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 |

    {' Demo'}

    14 | 15 | 16 | 17 | {#if mode === 'without'} 18 | 19 | {/if} 20 | {#if mode === 'with'} 21 | 22 | 23 | 24 | {/if} 25 | {#if mode === 'collapse'} 26 | 27 | 28 | 29 | {/if} 30 | 31 | 36 | -------------------------------------------------------------------------------- /src/routes/social/content.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |
    12 | 13 | 14 | 15 | 16 | {#snippet loading()} 17 |
    18 | 19 | {#await friend} 20 | Loading Friend... 21 | {:then friend} 22 | Loading {friend.name}... 23 | {/await} 24 |
    25 | {/snippet} 26 |
    27 |
    28 | 29 | 34 | -------------------------------------------------------------------------------- /src/routes/apples/selector.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
      9 | {#each [['without', 'Without SuspenseList'], ['with', 'SuspenseList'], ['collapse', 'w/ collapse']] as [mode_, label]} 10 |
    • 11 | 14 |
    • 15 | {/each} 16 |
    17 | 18 | 40 | -------------------------------------------------------------------------------- /src/routes/albums/page-layout.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 |
    10 |

    Top 50 Albums from iTunes

    11 | 12 |
    13 | 14 | {#key refresh} 15 | {@render children()} 16 | {/key} 17 | 18 | 40 | -------------------------------------------------------------------------------- /src/routes/social/+page.svelte: -------------------------------------------------------------------------------- 1 | 17 | 18 | {#key $friend_id} 19 | 20 |
    21 | 22 |
    23 | 24 | 25 |
    26 | 27 | {/key} 28 | 29 | 39 | -------------------------------------------------------------------------------- /src/routes/suspense-list/list.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 |
      16 | {#each models as model} 17 |
    • 18 | 19 | 20 | 21 | {#snippet loading()} 22 | 📦 23 | {/snippet} 24 | 25 |
    • 26 | {/each} 27 |
    28 |
    29 | 30 | 39 | -------------------------------------------------------------------------------- /src/routes/social/spinner.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 45 | -------------------------------------------------------------------------------- /src/routes/albums/loading.svelte: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | 48 | -------------------------------------------------------------------------------- /src/routes/social/header.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | 10 | 15 | 16 | 17 | 25 |
    26 | 27 | 47 | -------------------------------------------------------------------------------- /src/routes/albums/album-list.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | {#await suspend(request) then albums} 14 | 15 |
      16 | {#each albums as album} 17 |
    • 18 | 19 | 20 | {#snippet loading()} 21 | 22 | {/snippet} 23 | 24 |
    • 25 | {/each} 26 |
    27 |
    28 | {/await} 29 | 30 | 41 | -------------------------------------------------------------------------------- /src/routes/social/sidebar.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 32 | 33 | 58 | -------------------------------------------------------------------------------- /src/routes/social/comments.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | {#await suspend(comments) then comments} 13 |

    {comments.length} replies

    14 | {#each comments as comment} 15 |
    16 | 17 |

    {comment.email}

    18 |

    {comment.name}.

    19 |
    20 | {/each} 21 | {/await} 22 | 23 | 52 | -------------------------------------------------------------------------------- /src/routes/social/posts.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 |
    13 | {#await posts} 14 | 15 | 16 | {:then posts} 17 | 18 | {#each posts as post} 19 | 20 |
    21 | 22 | 23 |
    24 | 25 | {#snippet loading()} 26 |
    27 | 28 | 29 |
    30 | {/snippet} 31 |
    32 | {/each} 33 |
    34 | {/await} 35 |
    36 | 37 | 55 | -------------------------------------------------------------------------------- /src/routes/social/friends.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | {#await suspend(friends) then friends} 11 |
      12 | {#each friends as friend} 13 |
    • 14 | 21 |
    • 22 | {/each} 23 |
    24 | {/await} 25 | 26 | 63 | -------------------------------------------------------------------------------- /src/routes/social/api.ts: -------------------------------------------------------------------------------- 1 | import { getContext, setContext } from 'svelte' 2 | 3 | const CONTEXT = {} 4 | const friends = get(`/users?_limit=${rand(6, 5)}`).then((friends) => { 5 | return friends.map(setAvatar) 6 | }) 7 | 8 | export function getResource() { 9 | return getContext(CONTEXT) 10 | } 11 | 12 | export function setResource(friend_id: number, friend_id_store) { 13 | const posts = get(`/posts/${friend_id}/posts?_limit=${rand(4, 4)}`, 1000) 14 | const friend = get(`/users/${friend_id}`, 500).then(setAvatar) 15 | 16 | const resource = { 17 | comments(post_id: number) { 18 | return get(`/posts/${post_id}/comments?_limit=${rand(1, 5)}`, 1500) 19 | }, 20 | friend: () => friend, 21 | friends: () => friends, 22 | posts: () => posts, 23 | friend_id: friend_id_store, 24 | } 25 | setContext(CONTEXT, resource) 26 | return resource 27 | } 28 | 29 | async function get(url: string, timeout = 0) { 30 | const response = await fetch(`https://jsonplaceholder.typicode.com` + url) 31 | const json = await response.json() 32 | await new Promise((resolve) => { 33 | setTimeout(resolve, rand(timeout, 1000)) 34 | }) 35 | return json 36 | } 37 | 38 | function rand(start: number, range: number) { 39 | return start + Math.floor(Math.random() * range) 40 | } 41 | 42 | function setAvatar(friend) { 43 | friend.avatar = `https://i.pravatar.cc/256?img=${friend.id + 4}` 44 | return friend 45 | } 46 | -------------------------------------------------------------------------------- /src/routes/albums/album.svelte: -------------------------------------------------------------------------------- 1 | 17 | 18 | 35 | 36 | 37 |
    38 | 39 |
    40 | {title} 41 | {artist} 42 |
    43 |
    44 |
    45 | 46 | 72 | -------------------------------------------------------------------------------- /src/routes/suspense-list/+page.svelte: -------------------------------------------------------------------------------- 1 | 40 | 41 |

    Stores

    42 |
      43 | {#each models as model} 44 | 45 | {/each} 46 |
    47 | 48 |

    Suspense List

    49 | 50 | 51 |

    Suspense List w/ Collapse

    52 | 53 | 54 |

    Suspense List w/ Final

    55 | 56 | 57 |

    Suspense List w/ Collapse & Final

    58 | 59 | 60 | 69 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@svelte-drama/suspense", 3 | "type": "module", 4 | "description": "Put Svelte in Suspense", 5 | "license": "0BSD", 6 | "packageManager": "pnpm@10.2.0", 7 | "version": "2.0.1", 8 | "sideEffects": false, 9 | "scripts": { 10 | "dev": "vite dev", 11 | "package": "svelte-kit sync && svelte-package && publint", 12 | "prepare": "husky", 13 | "prepublishOnly": "npm run package", 14 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 15 | "format": "prettier --plugin prettier-plugin-svelte --write ." 16 | }, 17 | "exports": { 18 | ".": { 19 | "types": "./dist/index.d.ts", 20 | "svelte": "./dist/index.js", 21 | "default": "./dist/index.js" 22 | } 23 | }, 24 | "files": [ 25 | "dist", 26 | "!dist/**/*.test.*", 27 | "!dist/**/*.spec.*" 28 | ], 29 | "peerDependencies": { 30 | "svelte": "^5.3.0" 31 | }, 32 | "devDependencies": { 33 | "@sveltejs/adapter-auto": "^6.0.0", 34 | "@sveltejs/kit": "^2.20.8", 35 | "@sveltejs/package": "^2.3.11", 36 | "@sveltejs/vite-plugin-svelte": "^5.0.3", 37 | "@trivago/prettier-plugin-sort-imports": "^5.2.2", 38 | "cross-spawn": "^7.0.6", 39 | "husky": "^9.1.7", 40 | "prettier": "^3.5.3", 41 | "prettier-plugin-svelte": "^3.3.3", 42 | "publint": "^0.3.12", 43 | "svelte": "^5.28.2", 44 | "svelte-check": "^4.1.7", 45 | "tslib": "^2.8.1", 46 | "typescript": "^5.8.3", 47 | "vite": "^6.3.4" 48 | }, 49 | "repository": { 50 | "type": "git", 51 | "url": "https://github.com/svelte-drama/suspense" 52 | }, 53 | "keywords": [ 54 | "svelte", 55 | "suspense" 56 | ], 57 | "svelte": "./dist/index.js", 58 | "types": "./dist/index.d.ts" 59 | } 60 | -------------------------------------------------------------------------------- /src/routes/social/friend-card.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | {#await suspend(friend) then friend} 10 |
    11 |
    15 | 16 |
    17 |
    18 |

    {friend.name}

    19 |
    {friend.email}
    20 |
    21 | 22 |
    23 | 24 |
    25 |
    {friend.website}
    26 |
    {friend.company.catchPhrase}
    27 |
    28 | {#await posts then posts} 29 | Has written {posts.length} posts 30 | {/await} 31 |
    32 |
    33 |
    34 | {/await} 35 | 36 | 97 | -------------------------------------------------------------------------------- /src/lib/_suspense-list/suspense-list.svelte: -------------------------------------------------------------------------------- 1 | 81 | 82 |
    83 | {@render children?.(!loaded)} 84 |
    85 | 86 | 91 | -------------------------------------------------------------------------------- /src/lib/_suspense/suspense.svelte: -------------------------------------------------------------------------------- 1 | 112 | 113 | 114 | {getAsyncError()} 115 | 116 | {#if isBrowser} 117 | 123 | {/if} 124 | 125 | {#if list.status === STATUS.HIDDEN} 126 | 127 | {:else if !loaded || list.status === STATUS.LOADING} 128 | {@render renderLoading?.()} 129 | {/if} 130 | 131 | {#snippet failed(error, reset)} 132 | {@render renderError?.(error as Error, () => { 133 | async_error = null 134 | reset() 135 | })} 136 | {/snippet} 137 | 138 | 139 | 144 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Suspense for Svelte 2 | 3 | This is a Svelte component that implements the core idea of React's ``. 4 | 5 | When requesting asynchronous data, a typical pattern is for a parent component to handle all fetching and then push data down to its children. This can become difficult as levels of nesting increase and add unnessecary amounts of complexity. `` instead lets its children, at an arbitrary nested depth, dictate when they are done loading. 6 | 7 | [See it in action](https://svelte.dev/repl/91183af6db654f2099806426ff3bbb4b) 8 | 9 | ## Installation 10 | 11 | ``` 12 | npm install --save @svelte-drama/suspense 13 | ``` 14 | 15 | ## `suspend` 16 | 17 | Child components need to register what data they depend on. `suspend` returns a function to to handle orchestration between this component and its nearest parent `` component. 18 | 19 | ```js 20 | suspend>(data: T) => T 21 | ``` 22 | 23 | Wrap a promise. This returns a promise, allowing it to be used as part of a promise chain. The containing `` component will display its `loading` state until the promise is resolved. If the promise is rejected, it will instead show the `error` state. 24 | 25 | ```js 26 | suspend(data: T) => T 27 | ``` 28 | 29 | Wrap a model using runes. `` will consider this resolved as long as `data` resolves to not `undefined`. This call should be contained within `$effect` or `$derived` in order to update as the underlying data updates. 30 | 31 | ## `` 32 | 33 | `` extends `` with a few additional properties: 34 | 35 | - _loading_: If there any pending requests, this slot will be displayed. 36 | - _onload_: Triggers when all components inside the `` block have finished loading. 37 | 38 | ```svelte 39 | 46 | 47 | console.error(e)} 49 | onload={() => console.log('loaded')} 50 | > 51 | {#snippet loading()} 52 |

    Loading...

    53 | {/snippet} 54 | {#snippet failed(error, reset)} 55 |

    Error: {error?.message || error}

    56 |

    57 | 58 |

    59 | {/snippet} 60 | 61 | {#snippet children(suspend)} 62 |

    My Component

    63 | {#await suspend(MyComponent) then MyComponent} 64 | 65 | {/await} 66 | {/snippet} 67 |
    68 | ``` 69 | 70 | ## `` 71 | 72 | `` orchestrates the loading of all child `` containers. It guarantees they will load in display order. This is useful to avoid multiple, distracting pop-ins of content or reflow of elements while the user is reading. 73 | 74 | - _collapse_: Boolean. Defaults to `false`. If `true`, only one loading state will be shown among the children. 75 | - _final_: Boolean. Defaults to `false`. If `true`, children will not resuspend if they have been displayed, regardless of the state of previous siblings. 76 | - _onload_: Triggers when all components inside the `` have finished loading. 77 | 78 | ```svelte 79 | 86 | 87 | 88 | {#snippet children(loading)} 89 | {#if loading} 90 |

    Fetching posts...

    91 | {/if} 92 | 93 | {#each posts as post} 94 | 95 | 96 | 97 | {#snippet loading()} 98 | 99 | {/snippet} 100 | 101 | {/each} 102 | {/snippet} 103 |
    104 | ``` 105 | 106 | ## Limitations 107 | 108 | - [Intro transitions](https://svelte.dev/docs/svelte-transition) will not work as expected on elements inside the default slot. Elements are rendered in a hidden container as soon as possible, which triggers these intro transitions prematurely. 109 | - SSR will only display the loading component. Implementing `` during SSR would require Svelte to support `async/await` during SSR. 110 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | .: 9 | devDependencies: 10 | '@sveltejs/adapter-auto': 11 | specifier: ^6.0.0 12 | version: 6.0.0(@sveltejs/kit@2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.4))(svelte@5.28.2)(vite@6.3.4)) 13 | '@sveltejs/kit': 14 | specifier: ^2.20.8 15 | version: 2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.4))(svelte@5.28.2)(vite@6.3.4) 16 | '@sveltejs/package': 17 | specifier: ^2.3.11 18 | version: 2.3.11(svelte@5.28.2)(typescript@5.8.3) 19 | '@sveltejs/vite-plugin-svelte': 20 | specifier: ^5.0.3 21 | version: 5.0.3(svelte@5.28.2)(vite@6.3.4) 22 | '@trivago/prettier-plugin-sort-imports': 23 | specifier: ^5.2.2 24 | version: 5.2.2(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.28.2))(prettier@3.5.3)(svelte@5.28.2) 25 | cross-spawn: 26 | specifier: ^7.0.6 27 | version: 7.0.6 28 | husky: 29 | specifier: ^9.1.7 30 | version: 9.1.7 31 | prettier: 32 | specifier: ^3.5.3 33 | version: 3.5.3 34 | prettier-plugin-svelte: 35 | specifier: ^3.3.3 36 | version: 3.3.3(prettier@3.5.3)(svelte@5.28.2) 37 | publint: 38 | specifier: ^0.3.12 39 | version: 0.3.12 40 | svelte: 41 | specifier: ^5.28.2 42 | version: 5.28.2 43 | svelte-check: 44 | specifier: ^4.1.7 45 | version: 4.1.7(picomatch@4.0.2)(svelte@5.28.2)(typescript@5.8.3) 46 | tslib: 47 | specifier: ^2.8.1 48 | version: 2.8.1 49 | typescript: 50 | specifier: ^5.8.3 51 | version: 5.8.3 52 | vite: 53 | specifier: ^6.3.4 54 | version: 6.3.4 55 | 56 | packages: 57 | '@ampproject/remapping@2.3.0': 58 | resolution: 59 | { 60 | integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, 61 | } 62 | engines: { node: '>=6.0.0' } 63 | 64 | '@babel/code-frame@7.27.1': 65 | resolution: 66 | { 67 | integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==, 68 | } 69 | engines: { node: '>=6.9.0' } 70 | 71 | '@babel/generator@7.27.1': 72 | resolution: 73 | { 74 | integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==, 75 | } 76 | engines: { node: '>=6.9.0' } 77 | 78 | '@babel/helper-string-parser@7.27.1': 79 | resolution: 80 | { 81 | integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, 82 | } 83 | engines: { node: '>=6.9.0' } 84 | 85 | '@babel/helper-validator-identifier@7.27.1': 86 | resolution: 87 | { 88 | integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==, 89 | } 90 | engines: { node: '>=6.9.0' } 91 | 92 | '@babel/parser@7.27.1': 93 | resolution: 94 | { 95 | integrity: sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==, 96 | } 97 | engines: { node: '>=6.0.0' } 98 | hasBin: true 99 | 100 | '@babel/template@7.27.1': 101 | resolution: 102 | { 103 | integrity: sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==, 104 | } 105 | engines: { node: '>=6.9.0' } 106 | 107 | '@babel/traverse@7.27.1': 108 | resolution: 109 | { 110 | integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==, 111 | } 112 | engines: { node: '>=6.9.0' } 113 | 114 | '@babel/types@7.27.1': 115 | resolution: 116 | { 117 | integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==, 118 | } 119 | engines: { node: '>=6.9.0' } 120 | 121 | '@esbuild/aix-ppc64@0.25.3': 122 | resolution: 123 | { 124 | integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==, 125 | } 126 | engines: { node: '>=18' } 127 | cpu: [ppc64] 128 | os: [aix] 129 | 130 | '@esbuild/android-arm64@0.25.3': 131 | resolution: 132 | { 133 | integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==, 134 | } 135 | engines: { node: '>=18' } 136 | cpu: [arm64] 137 | os: [android] 138 | 139 | '@esbuild/android-arm@0.25.3': 140 | resolution: 141 | { 142 | integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==, 143 | } 144 | engines: { node: '>=18' } 145 | cpu: [arm] 146 | os: [android] 147 | 148 | '@esbuild/android-x64@0.25.3': 149 | resolution: 150 | { 151 | integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==, 152 | } 153 | engines: { node: '>=18' } 154 | cpu: [x64] 155 | os: [android] 156 | 157 | '@esbuild/darwin-arm64@0.25.3': 158 | resolution: 159 | { 160 | integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==, 161 | } 162 | engines: { node: '>=18' } 163 | cpu: [arm64] 164 | os: [darwin] 165 | 166 | '@esbuild/darwin-x64@0.25.3': 167 | resolution: 168 | { 169 | integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==, 170 | } 171 | engines: { node: '>=18' } 172 | cpu: [x64] 173 | os: [darwin] 174 | 175 | '@esbuild/freebsd-arm64@0.25.3': 176 | resolution: 177 | { 178 | integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==, 179 | } 180 | engines: { node: '>=18' } 181 | cpu: [arm64] 182 | os: [freebsd] 183 | 184 | '@esbuild/freebsd-x64@0.25.3': 185 | resolution: 186 | { 187 | integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==, 188 | } 189 | engines: { node: '>=18' } 190 | cpu: [x64] 191 | os: [freebsd] 192 | 193 | '@esbuild/linux-arm64@0.25.3': 194 | resolution: 195 | { 196 | integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==, 197 | } 198 | engines: { node: '>=18' } 199 | cpu: [arm64] 200 | os: [linux] 201 | 202 | '@esbuild/linux-arm@0.25.3': 203 | resolution: 204 | { 205 | integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==, 206 | } 207 | engines: { node: '>=18' } 208 | cpu: [arm] 209 | os: [linux] 210 | 211 | '@esbuild/linux-ia32@0.25.3': 212 | resolution: 213 | { 214 | integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==, 215 | } 216 | engines: { node: '>=18' } 217 | cpu: [ia32] 218 | os: [linux] 219 | 220 | '@esbuild/linux-loong64@0.25.3': 221 | resolution: 222 | { 223 | integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==, 224 | } 225 | engines: { node: '>=18' } 226 | cpu: [loong64] 227 | os: [linux] 228 | 229 | '@esbuild/linux-mips64el@0.25.3': 230 | resolution: 231 | { 232 | integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==, 233 | } 234 | engines: { node: '>=18' } 235 | cpu: [mips64el] 236 | os: [linux] 237 | 238 | '@esbuild/linux-ppc64@0.25.3': 239 | resolution: 240 | { 241 | integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==, 242 | } 243 | engines: { node: '>=18' } 244 | cpu: [ppc64] 245 | os: [linux] 246 | 247 | '@esbuild/linux-riscv64@0.25.3': 248 | resolution: 249 | { 250 | integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==, 251 | } 252 | engines: { node: '>=18' } 253 | cpu: [riscv64] 254 | os: [linux] 255 | 256 | '@esbuild/linux-s390x@0.25.3': 257 | resolution: 258 | { 259 | integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==, 260 | } 261 | engines: { node: '>=18' } 262 | cpu: [s390x] 263 | os: [linux] 264 | 265 | '@esbuild/linux-x64@0.25.3': 266 | resolution: 267 | { 268 | integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==, 269 | } 270 | engines: { node: '>=18' } 271 | cpu: [x64] 272 | os: [linux] 273 | 274 | '@esbuild/netbsd-arm64@0.25.3': 275 | resolution: 276 | { 277 | integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==, 278 | } 279 | engines: { node: '>=18' } 280 | cpu: [arm64] 281 | os: [netbsd] 282 | 283 | '@esbuild/netbsd-x64@0.25.3': 284 | resolution: 285 | { 286 | integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==, 287 | } 288 | engines: { node: '>=18' } 289 | cpu: [x64] 290 | os: [netbsd] 291 | 292 | '@esbuild/openbsd-arm64@0.25.3': 293 | resolution: 294 | { 295 | integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==, 296 | } 297 | engines: { node: '>=18' } 298 | cpu: [arm64] 299 | os: [openbsd] 300 | 301 | '@esbuild/openbsd-x64@0.25.3': 302 | resolution: 303 | { 304 | integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==, 305 | } 306 | engines: { node: '>=18' } 307 | cpu: [x64] 308 | os: [openbsd] 309 | 310 | '@esbuild/sunos-x64@0.25.3': 311 | resolution: 312 | { 313 | integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==, 314 | } 315 | engines: { node: '>=18' } 316 | cpu: [x64] 317 | os: [sunos] 318 | 319 | '@esbuild/win32-arm64@0.25.3': 320 | resolution: 321 | { 322 | integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==, 323 | } 324 | engines: { node: '>=18' } 325 | cpu: [arm64] 326 | os: [win32] 327 | 328 | '@esbuild/win32-ia32@0.25.3': 329 | resolution: 330 | { 331 | integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==, 332 | } 333 | engines: { node: '>=18' } 334 | cpu: [ia32] 335 | os: [win32] 336 | 337 | '@esbuild/win32-x64@0.25.3': 338 | resolution: 339 | { 340 | integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==, 341 | } 342 | engines: { node: '>=18' } 343 | cpu: [x64] 344 | os: [win32] 345 | 346 | '@jridgewell/gen-mapping@0.3.8': 347 | resolution: 348 | { 349 | integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==, 350 | } 351 | engines: { node: '>=6.0.0' } 352 | 353 | '@jridgewell/resolve-uri@3.1.2': 354 | resolution: 355 | { 356 | integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, 357 | } 358 | engines: { node: '>=6.0.0' } 359 | 360 | '@jridgewell/set-array@1.2.1': 361 | resolution: 362 | { 363 | integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, 364 | } 365 | engines: { node: '>=6.0.0' } 366 | 367 | '@jridgewell/sourcemap-codec@1.5.0': 368 | resolution: 369 | { 370 | integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, 371 | } 372 | 373 | '@jridgewell/trace-mapping@0.3.25': 374 | resolution: 375 | { 376 | integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, 377 | } 378 | 379 | '@polka/url@1.0.0-next.29': 380 | resolution: 381 | { 382 | integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==, 383 | } 384 | 385 | '@publint/pack@0.1.2': 386 | resolution: 387 | { 388 | integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==, 389 | } 390 | engines: { node: '>=18' } 391 | 392 | '@rollup/rollup-android-arm-eabi@4.40.1': 393 | resolution: 394 | { 395 | integrity: sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==, 396 | } 397 | cpu: [arm] 398 | os: [android] 399 | 400 | '@rollup/rollup-android-arm64@4.40.1': 401 | resolution: 402 | { 403 | integrity: sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==, 404 | } 405 | cpu: [arm64] 406 | os: [android] 407 | 408 | '@rollup/rollup-darwin-arm64@4.40.1': 409 | resolution: 410 | { 411 | integrity: sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==, 412 | } 413 | cpu: [arm64] 414 | os: [darwin] 415 | 416 | '@rollup/rollup-darwin-x64@4.40.1': 417 | resolution: 418 | { 419 | integrity: sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==, 420 | } 421 | cpu: [x64] 422 | os: [darwin] 423 | 424 | '@rollup/rollup-freebsd-arm64@4.40.1': 425 | resolution: 426 | { 427 | integrity: sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==, 428 | } 429 | cpu: [arm64] 430 | os: [freebsd] 431 | 432 | '@rollup/rollup-freebsd-x64@4.40.1': 433 | resolution: 434 | { 435 | integrity: sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==, 436 | } 437 | cpu: [x64] 438 | os: [freebsd] 439 | 440 | '@rollup/rollup-linux-arm-gnueabihf@4.40.1': 441 | resolution: 442 | { 443 | integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==, 444 | } 445 | cpu: [arm] 446 | os: [linux] 447 | 448 | '@rollup/rollup-linux-arm-musleabihf@4.40.1': 449 | resolution: 450 | { 451 | integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==, 452 | } 453 | cpu: [arm] 454 | os: [linux] 455 | 456 | '@rollup/rollup-linux-arm64-gnu@4.40.1': 457 | resolution: 458 | { 459 | integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==, 460 | } 461 | cpu: [arm64] 462 | os: [linux] 463 | 464 | '@rollup/rollup-linux-arm64-musl@4.40.1': 465 | resolution: 466 | { 467 | integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==, 468 | } 469 | cpu: [arm64] 470 | os: [linux] 471 | 472 | '@rollup/rollup-linux-loongarch64-gnu@4.40.1': 473 | resolution: 474 | { 475 | integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==, 476 | } 477 | cpu: [loong64] 478 | os: [linux] 479 | 480 | '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': 481 | resolution: 482 | { 483 | integrity: sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==, 484 | } 485 | cpu: [ppc64] 486 | os: [linux] 487 | 488 | '@rollup/rollup-linux-riscv64-gnu@4.40.1': 489 | resolution: 490 | { 491 | integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==, 492 | } 493 | cpu: [riscv64] 494 | os: [linux] 495 | 496 | '@rollup/rollup-linux-riscv64-musl@4.40.1': 497 | resolution: 498 | { 499 | integrity: sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==, 500 | } 501 | cpu: [riscv64] 502 | os: [linux] 503 | 504 | '@rollup/rollup-linux-s390x-gnu@4.40.1': 505 | resolution: 506 | { 507 | integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==, 508 | } 509 | cpu: [s390x] 510 | os: [linux] 511 | 512 | '@rollup/rollup-linux-x64-gnu@4.40.1': 513 | resolution: 514 | { 515 | integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==, 516 | } 517 | cpu: [x64] 518 | os: [linux] 519 | 520 | '@rollup/rollup-linux-x64-musl@4.40.1': 521 | resolution: 522 | { 523 | integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==, 524 | } 525 | cpu: [x64] 526 | os: [linux] 527 | 528 | '@rollup/rollup-win32-arm64-msvc@4.40.1': 529 | resolution: 530 | { 531 | integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==, 532 | } 533 | cpu: [arm64] 534 | os: [win32] 535 | 536 | '@rollup/rollup-win32-ia32-msvc@4.40.1': 537 | resolution: 538 | { 539 | integrity: sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==, 540 | } 541 | cpu: [ia32] 542 | os: [win32] 543 | 544 | '@rollup/rollup-win32-x64-msvc@4.40.1': 545 | resolution: 546 | { 547 | integrity: sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==, 548 | } 549 | cpu: [x64] 550 | os: [win32] 551 | 552 | '@sveltejs/acorn-typescript@1.0.5': 553 | resolution: 554 | { 555 | integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==, 556 | } 557 | peerDependencies: 558 | acorn: ^8.9.0 559 | 560 | '@sveltejs/adapter-auto@6.0.0': 561 | resolution: 562 | { 563 | integrity: sha512-7mR2/G7vlXakaOj6QBSG9dwBfTgWjV+UnEMB5Z6Xu0ZbdXda6c0su1fNkg0ab0zlilSkloMA2NjCna02/DR7sA==, 564 | } 565 | peerDependencies: 566 | '@sveltejs/kit': ^2.0.0 567 | 568 | '@sveltejs/kit@2.20.8': 569 | resolution: 570 | { 571 | integrity: sha512-ep9qTxL7WALhfm0kFecL3VHeuNew8IccbYGqv5TqL/KSqWRKzEgDG8blNlIu1CkLTTua/kHjI+f5T8eCmWIxKw==, 572 | } 573 | engines: { node: '>=18.13' } 574 | hasBin: true 575 | peerDependencies: 576 | '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 577 | svelte: ^4.0.0 || ^5.0.0-next.0 578 | vite: ^5.0.3 || ^6.0.0 579 | 580 | '@sveltejs/package@2.3.11': 581 | resolution: 582 | { 583 | integrity: sha512-DSMt2U0XNAdoQBYksrmgQi5dKy7jUTVDJLiagS/iXF7AShjAmTbGJQKruBuT/FfYAWvNxfQTSjkXU8eAIjVeNg==, 584 | } 585 | engines: { node: ^16.14 || >=18 } 586 | hasBin: true 587 | peerDependencies: 588 | svelte: ^3.44.0 || ^4.0.0 || ^5.0.0-next.1 589 | 590 | '@sveltejs/vite-plugin-svelte-inspector@4.0.1': 591 | resolution: 592 | { 593 | integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==, 594 | } 595 | engines: { node: ^18.0.0 || ^20.0.0 || >=22 } 596 | peerDependencies: 597 | '@sveltejs/vite-plugin-svelte': ^5.0.0 598 | svelte: ^5.0.0 599 | vite: ^6.0.0 600 | 601 | '@sveltejs/vite-plugin-svelte@5.0.3': 602 | resolution: 603 | { 604 | integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==, 605 | } 606 | engines: { node: ^18.0.0 || ^20.0.0 || >=22 } 607 | peerDependencies: 608 | svelte: ^5.0.0 609 | vite: ^6.0.0 610 | 611 | '@trivago/prettier-plugin-sort-imports@5.2.2': 612 | resolution: 613 | { 614 | integrity: sha512-fYDQA9e6yTNmA13TLVSA+WMQRc5Bn/c0EUBditUHNfMMxN7M82c38b1kEggVE3pLpZ0FwkwJkUEKMiOi52JXFA==, 615 | } 616 | engines: { node: '>18.12' } 617 | peerDependencies: 618 | '@vue/compiler-sfc': 3.x 619 | prettier: 2.x - 3.x 620 | prettier-plugin-svelte: 3.x 621 | svelte: 4.x || 5.x 622 | peerDependenciesMeta: 623 | '@vue/compiler-sfc': 624 | optional: true 625 | prettier-plugin-svelte: 626 | optional: true 627 | svelte: 628 | optional: true 629 | 630 | '@types/cookie@0.6.0': 631 | resolution: 632 | { 633 | integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==, 634 | } 635 | 636 | '@types/estree@1.0.7': 637 | resolution: 638 | { 639 | integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==, 640 | } 641 | 642 | acorn@8.14.1: 643 | resolution: 644 | { 645 | integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==, 646 | } 647 | engines: { node: '>=0.4.0' } 648 | hasBin: true 649 | 650 | aria-query@5.3.2: 651 | resolution: 652 | { 653 | integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, 654 | } 655 | engines: { node: '>= 0.4' } 656 | 657 | axobject-query@4.1.0: 658 | resolution: 659 | { 660 | integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, 661 | } 662 | engines: { node: '>= 0.4' } 663 | 664 | chokidar@4.0.3: 665 | resolution: 666 | { 667 | integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, 668 | } 669 | engines: { node: '>= 14.16.0' } 670 | 671 | clsx@2.1.1: 672 | resolution: 673 | { 674 | integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, 675 | } 676 | engines: { node: '>=6' } 677 | 678 | cookie@0.6.0: 679 | resolution: 680 | { 681 | integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==, 682 | } 683 | engines: { node: '>= 0.6' } 684 | 685 | cross-spawn@7.0.6: 686 | resolution: 687 | { 688 | integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, 689 | } 690 | engines: { node: '>= 8' } 691 | 692 | debug@4.4.0: 693 | resolution: 694 | { 695 | integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, 696 | } 697 | engines: { node: '>=6.0' } 698 | peerDependencies: 699 | supports-color: '*' 700 | peerDependenciesMeta: 701 | supports-color: 702 | optional: true 703 | 704 | dedent-js@1.0.1: 705 | resolution: 706 | { 707 | integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==, 708 | } 709 | 710 | deepmerge@4.3.1: 711 | resolution: 712 | { 713 | integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, 714 | } 715 | engines: { node: '>=0.10.0' } 716 | 717 | devalue@5.1.1: 718 | resolution: 719 | { 720 | integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==, 721 | } 722 | 723 | esbuild@0.25.3: 724 | resolution: 725 | { 726 | integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==, 727 | } 728 | engines: { node: '>=18' } 729 | hasBin: true 730 | 731 | esm-env@1.2.2: 732 | resolution: 733 | { 734 | integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==, 735 | } 736 | 737 | esrap@1.4.6: 738 | resolution: 739 | { 740 | integrity: sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==, 741 | } 742 | 743 | fdir@6.4.4: 744 | resolution: 745 | { 746 | integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==, 747 | } 748 | peerDependencies: 749 | picomatch: ^3 || ^4 750 | peerDependenciesMeta: 751 | picomatch: 752 | optional: true 753 | 754 | fsevents@2.3.3: 755 | resolution: 756 | { 757 | integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, 758 | } 759 | engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } 760 | os: [darwin] 761 | 762 | globals@11.12.0: 763 | resolution: 764 | { 765 | integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, 766 | } 767 | engines: { node: '>=4' } 768 | 769 | husky@9.1.7: 770 | resolution: 771 | { 772 | integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==, 773 | } 774 | engines: { node: '>=18' } 775 | hasBin: true 776 | 777 | import-meta-resolve@4.1.0: 778 | resolution: 779 | { 780 | integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==, 781 | } 782 | 783 | is-reference@3.0.3: 784 | resolution: 785 | { 786 | integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==, 787 | } 788 | 789 | isexe@2.0.0: 790 | resolution: 791 | { 792 | integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, 793 | } 794 | 795 | javascript-natural-sort@0.7.1: 796 | resolution: 797 | { 798 | integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==, 799 | } 800 | 801 | js-tokens@4.0.0: 802 | resolution: 803 | { 804 | integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, 805 | } 806 | 807 | jsesc@3.1.0: 808 | resolution: 809 | { 810 | integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, 811 | } 812 | engines: { node: '>=6' } 813 | hasBin: true 814 | 815 | kleur@4.1.5: 816 | resolution: 817 | { 818 | integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, 819 | } 820 | engines: { node: '>=6' } 821 | 822 | locate-character@3.0.0: 823 | resolution: 824 | { 825 | integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==, 826 | } 827 | 828 | lodash@4.17.21: 829 | resolution: 830 | { 831 | integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, 832 | } 833 | 834 | lower-case@2.0.2: 835 | resolution: 836 | { 837 | integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, 838 | } 839 | 840 | magic-string@0.30.17: 841 | resolution: 842 | { 843 | integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==, 844 | } 845 | 846 | mri@1.2.0: 847 | resolution: 848 | { 849 | integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, 850 | } 851 | engines: { node: '>=4' } 852 | 853 | mrmime@2.0.1: 854 | resolution: 855 | { 856 | integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==, 857 | } 858 | engines: { node: '>=10' } 859 | 860 | ms@2.1.3: 861 | resolution: 862 | { 863 | integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, 864 | } 865 | 866 | nanoid@3.3.11: 867 | resolution: 868 | { 869 | integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, 870 | } 871 | engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } 872 | hasBin: true 873 | 874 | no-case@3.0.4: 875 | resolution: 876 | { 877 | integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, 878 | } 879 | 880 | package-manager-detector@1.2.0: 881 | resolution: 882 | { 883 | integrity: sha512-PutJepsOtsqVfUsxCzgTTpyXmiAgvKptIgY4th5eq5UXXFhj5PxfQ9hnGkypMeovpAvVshFRItoFHYO18TCOqA==, 884 | } 885 | 886 | pascal-case@3.1.2: 887 | resolution: 888 | { 889 | integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, 890 | } 891 | 892 | path-key@3.1.1: 893 | resolution: 894 | { 895 | integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, 896 | } 897 | engines: { node: '>=8' } 898 | 899 | picocolors@1.1.1: 900 | resolution: 901 | { 902 | integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, 903 | } 904 | 905 | picomatch@4.0.2: 906 | resolution: 907 | { 908 | integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, 909 | } 910 | engines: { node: '>=12' } 911 | 912 | postcss@8.5.3: 913 | resolution: 914 | { 915 | integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==, 916 | } 917 | engines: { node: ^10 || ^12 || >=14 } 918 | 919 | prettier-plugin-svelte@3.3.3: 920 | resolution: 921 | { 922 | integrity: sha512-yViK9zqQ+H2qZD1w/bH7W8i+bVfKrD8GIFjkFe4Thl6kCT9SlAsXVNmt3jCvQOCsnOhcvYgsoVlRV/Eu6x5nNw==, 923 | } 924 | peerDependencies: 925 | prettier: ^3.0.0 926 | svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 927 | 928 | prettier@3.5.3: 929 | resolution: 930 | { 931 | integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==, 932 | } 933 | engines: { node: '>=14' } 934 | hasBin: true 935 | 936 | publint@0.3.12: 937 | resolution: 938 | { 939 | integrity: sha512-1w3MMtL9iotBjm1mmXtG3Nk06wnq9UhGNRpQ2j6n1Zq7YAD6gnxMMZMIxlRPAydVjVbjSm+n0lhwqsD1m4LD5w==, 940 | } 941 | engines: { node: '>=18' } 942 | hasBin: true 943 | 944 | readdirp@4.1.2: 945 | resolution: 946 | { 947 | integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, 948 | } 949 | engines: { node: '>= 14.18.0' } 950 | 951 | rollup@4.40.1: 952 | resolution: 953 | { 954 | integrity: sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==, 955 | } 956 | engines: { node: '>=18.0.0', npm: '>=8.0.0' } 957 | hasBin: true 958 | 959 | sade@1.8.1: 960 | resolution: 961 | { 962 | integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==, 963 | } 964 | engines: { node: '>=6' } 965 | 966 | semver@7.7.1: 967 | resolution: 968 | { 969 | integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, 970 | } 971 | engines: { node: '>=10' } 972 | hasBin: true 973 | 974 | set-cookie-parser@2.7.1: 975 | resolution: 976 | { 977 | integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==, 978 | } 979 | 980 | shebang-command@2.0.0: 981 | resolution: 982 | { 983 | integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, 984 | } 985 | engines: { node: '>=8' } 986 | 987 | shebang-regex@3.0.0: 988 | resolution: 989 | { 990 | integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, 991 | } 992 | engines: { node: '>=8' } 993 | 994 | sirv@3.0.1: 995 | resolution: 996 | { 997 | integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==, 998 | } 999 | engines: { node: '>=18' } 1000 | 1001 | source-map-js@1.2.1: 1002 | resolution: 1003 | { 1004 | integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, 1005 | } 1006 | engines: { node: '>=0.10.0' } 1007 | 1008 | svelte-check@4.1.7: 1009 | resolution: 1010 | { 1011 | integrity: sha512-1jX4BzXrQJhC/Jt3SqYf6Ntu//vmfc6VWp07JkRfK2nn+22yIblspVUo96gzMkg0Zov8lQicxhxsMzOctwcMQQ==, 1012 | } 1013 | engines: { node: '>= 18.0.0' } 1014 | hasBin: true 1015 | peerDependencies: 1016 | svelte: ^4.0.0 || ^5.0.0-next.0 1017 | typescript: '>=5.0.0' 1018 | 1019 | svelte2tsx@0.7.37: 1020 | resolution: 1021 | { 1022 | integrity: sha512-uQCWibXwUNPGQBGTZP1axIpFGFHTXXN30/ppodLVXCnX23U1nzEhqiVtFSEQjtUK3pFVxPhdnfyxD6ikxMCzPQ==, 1023 | } 1024 | peerDependencies: 1025 | svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 1026 | typescript: ^4.9.4 || ^5.0.0 1027 | 1028 | svelte@5.28.2: 1029 | resolution: 1030 | { 1031 | integrity: sha512-FbWBxgWOpQfhKvoGJv/TFwzqb4EhJbwCD17dB0tEpQiw1XyUEKZJtgm4nA4xq3LLsMo7hu5UY/BOFmroAxKTMg==, 1032 | } 1033 | engines: { node: '>=18' } 1034 | 1035 | tinyglobby@0.2.13: 1036 | resolution: 1037 | { 1038 | integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==, 1039 | } 1040 | engines: { node: '>=12.0.0' } 1041 | 1042 | totalist@3.0.1: 1043 | resolution: 1044 | { 1045 | integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==, 1046 | } 1047 | engines: { node: '>=6' } 1048 | 1049 | tslib@2.8.1: 1050 | resolution: 1051 | { 1052 | integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, 1053 | } 1054 | 1055 | typescript@5.8.3: 1056 | resolution: 1057 | { 1058 | integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==, 1059 | } 1060 | engines: { node: '>=14.17' } 1061 | hasBin: true 1062 | 1063 | vite@6.3.4: 1064 | resolution: 1065 | { 1066 | integrity: sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==, 1067 | } 1068 | engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } 1069 | hasBin: true 1070 | peerDependencies: 1071 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1072 | jiti: '>=1.21.0' 1073 | less: '*' 1074 | lightningcss: ^1.21.0 1075 | sass: '*' 1076 | sass-embedded: '*' 1077 | stylus: '*' 1078 | sugarss: '*' 1079 | terser: ^5.16.0 1080 | tsx: ^4.8.1 1081 | yaml: ^2.4.2 1082 | peerDependenciesMeta: 1083 | '@types/node': 1084 | optional: true 1085 | jiti: 1086 | optional: true 1087 | less: 1088 | optional: true 1089 | lightningcss: 1090 | optional: true 1091 | sass: 1092 | optional: true 1093 | sass-embedded: 1094 | optional: true 1095 | stylus: 1096 | optional: true 1097 | sugarss: 1098 | optional: true 1099 | terser: 1100 | optional: true 1101 | tsx: 1102 | optional: true 1103 | yaml: 1104 | optional: true 1105 | 1106 | vitefu@1.0.6: 1107 | resolution: 1108 | { 1109 | integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==, 1110 | } 1111 | peerDependencies: 1112 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 1113 | peerDependenciesMeta: 1114 | vite: 1115 | optional: true 1116 | 1117 | which@2.0.2: 1118 | resolution: 1119 | { 1120 | integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, 1121 | } 1122 | engines: { node: '>= 8' } 1123 | hasBin: true 1124 | 1125 | zimmerframe@1.1.2: 1126 | resolution: 1127 | { 1128 | integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==, 1129 | } 1130 | 1131 | snapshots: 1132 | '@ampproject/remapping@2.3.0': 1133 | dependencies: 1134 | '@jridgewell/gen-mapping': 0.3.8 1135 | '@jridgewell/trace-mapping': 0.3.25 1136 | 1137 | '@babel/code-frame@7.27.1': 1138 | dependencies: 1139 | '@babel/helper-validator-identifier': 7.27.1 1140 | js-tokens: 4.0.0 1141 | picocolors: 1.1.1 1142 | 1143 | '@babel/generator@7.27.1': 1144 | dependencies: 1145 | '@babel/parser': 7.27.1 1146 | '@babel/types': 7.27.1 1147 | '@jridgewell/gen-mapping': 0.3.8 1148 | '@jridgewell/trace-mapping': 0.3.25 1149 | jsesc: 3.1.0 1150 | 1151 | '@babel/helper-string-parser@7.27.1': {} 1152 | 1153 | '@babel/helper-validator-identifier@7.27.1': {} 1154 | 1155 | '@babel/parser@7.27.1': 1156 | dependencies: 1157 | '@babel/types': 7.27.1 1158 | 1159 | '@babel/template@7.27.1': 1160 | dependencies: 1161 | '@babel/code-frame': 7.27.1 1162 | '@babel/parser': 7.27.1 1163 | '@babel/types': 7.27.1 1164 | 1165 | '@babel/traverse@7.27.1': 1166 | dependencies: 1167 | '@babel/code-frame': 7.27.1 1168 | '@babel/generator': 7.27.1 1169 | '@babel/parser': 7.27.1 1170 | '@babel/template': 7.27.1 1171 | '@babel/types': 7.27.1 1172 | debug: 4.4.0 1173 | globals: 11.12.0 1174 | transitivePeerDependencies: 1175 | - supports-color 1176 | 1177 | '@babel/types@7.27.1': 1178 | dependencies: 1179 | '@babel/helper-string-parser': 7.27.1 1180 | '@babel/helper-validator-identifier': 7.27.1 1181 | 1182 | '@esbuild/aix-ppc64@0.25.3': 1183 | optional: true 1184 | 1185 | '@esbuild/android-arm64@0.25.3': 1186 | optional: true 1187 | 1188 | '@esbuild/android-arm@0.25.3': 1189 | optional: true 1190 | 1191 | '@esbuild/android-x64@0.25.3': 1192 | optional: true 1193 | 1194 | '@esbuild/darwin-arm64@0.25.3': 1195 | optional: true 1196 | 1197 | '@esbuild/darwin-x64@0.25.3': 1198 | optional: true 1199 | 1200 | '@esbuild/freebsd-arm64@0.25.3': 1201 | optional: true 1202 | 1203 | '@esbuild/freebsd-x64@0.25.3': 1204 | optional: true 1205 | 1206 | '@esbuild/linux-arm64@0.25.3': 1207 | optional: true 1208 | 1209 | '@esbuild/linux-arm@0.25.3': 1210 | optional: true 1211 | 1212 | '@esbuild/linux-ia32@0.25.3': 1213 | optional: true 1214 | 1215 | '@esbuild/linux-loong64@0.25.3': 1216 | optional: true 1217 | 1218 | '@esbuild/linux-mips64el@0.25.3': 1219 | optional: true 1220 | 1221 | '@esbuild/linux-ppc64@0.25.3': 1222 | optional: true 1223 | 1224 | '@esbuild/linux-riscv64@0.25.3': 1225 | optional: true 1226 | 1227 | '@esbuild/linux-s390x@0.25.3': 1228 | optional: true 1229 | 1230 | '@esbuild/linux-x64@0.25.3': 1231 | optional: true 1232 | 1233 | '@esbuild/netbsd-arm64@0.25.3': 1234 | optional: true 1235 | 1236 | '@esbuild/netbsd-x64@0.25.3': 1237 | optional: true 1238 | 1239 | '@esbuild/openbsd-arm64@0.25.3': 1240 | optional: true 1241 | 1242 | '@esbuild/openbsd-x64@0.25.3': 1243 | optional: true 1244 | 1245 | '@esbuild/sunos-x64@0.25.3': 1246 | optional: true 1247 | 1248 | '@esbuild/win32-arm64@0.25.3': 1249 | optional: true 1250 | 1251 | '@esbuild/win32-ia32@0.25.3': 1252 | optional: true 1253 | 1254 | '@esbuild/win32-x64@0.25.3': 1255 | optional: true 1256 | 1257 | '@jridgewell/gen-mapping@0.3.8': 1258 | dependencies: 1259 | '@jridgewell/set-array': 1.2.1 1260 | '@jridgewell/sourcemap-codec': 1.5.0 1261 | '@jridgewell/trace-mapping': 0.3.25 1262 | 1263 | '@jridgewell/resolve-uri@3.1.2': {} 1264 | 1265 | '@jridgewell/set-array@1.2.1': {} 1266 | 1267 | '@jridgewell/sourcemap-codec@1.5.0': {} 1268 | 1269 | '@jridgewell/trace-mapping@0.3.25': 1270 | dependencies: 1271 | '@jridgewell/resolve-uri': 3.1.2 1272 | '@jridgewell/sourcemap-codec': 1.5.0 1273 | 1274 | '@polka/url@1.0.0-next.29': {} 1275 | 1276 | '@publint/pack@0.1.2': {} 1277 | 1278 | '@rollup/rollup-android-arm-eabi@4.40.1': 1279 | optional: true 1280 | 1281 | '@rollup/rollup-android-arm64@4.40.1': 1282 | optional: true 1283 | 1284 | '@rollup/rollup-darwin-arm64@4.40.1': 1285 | optional: true 1286 | 1287 | '@rollup/rollup-darwin-x64@4.40.1': 1288 | optional: true 1289 | 1290 | '@rollup/rollup-freebsd-arm64@4.40.1': 1291 | optional: true 1292 | 1293 | '@rollup/rollup-freebsd-x64@4.40.1': 1294 | optional: true 1295 | 1296 | '@rollup/rollup-linux-arm-gnueabihf@4.40.1': 1297 | optional: true 1298 | 1299 | '@rollup/rollup-linux-arm-musleabihf@4.40.1': 1300 | optional: true 1301 | 1302 | '@rollup/rollup-linux-arm64-gnu@4.40.1': 1303 | optional: true 1304 | 1305 | '@rollup/rollup-linux-arm64-musl@4.40.1': 1306 | optional: true 1307 | 1308 | '@rollup/rollup-linux-loongarch64-gnu@4.40.1': 1309 | optional: true 1310 | 1311 | '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': 1312 | optional: true 1313 | 1314 | '@rollup/rollup-linux-riscv64-gnu@4.40.1': 1315 | optional: true 1316 | 1317 | '@rollup/rollup-linux-riscv64-musl@4.40.1': 1318 | optional: true 1319 | 1320 | '@rollup/rollup-linux-s390x-gnu@4.40.1': 1321 | optional: true 1322 | 1323 | '@rollup/rollup-linux-x64-gnu@4.40.1': 1324 | optional: true 1325 | 1326 | '@rollup/rollup-linux-x64-musl@4.40.1': 1327 | optional: true 1328 | 1329 | '@rollup/rollup-win32-arm64-msvc@4.40.1': 1330 | optional: true 1331 | 1332 | '@rollup/rollup-win32-ia32-msvc@4.40.1': 1333 | optional: true 1334 | 1335 | '@rollup/rollup-win32-x64-msvc@4.40.1': 1336 | optional: true 1337 | 1338 | '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)': 1339 | dependencies: 1340 | acorn: 8.14.1 1341 | 1342 | '@sveltejs/adapter-auto@6.0.0(@sveltejs/kit@2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.4))(svelte@5.28.2)(vite@6.3.4))': 1343 | dependencies: 1344 | '@sveltejs/kit': 2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.4))(svelte@5.28.2)(vite@6.3.4) 1345 | import-meta-resolve: 4.1.0 1346 | 1347 | '@sveltejs/kit@2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.4))(svelte@5.28.2)(vite@6.3.4)': 1348 | dependencies: 1349 | '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.28.2)(vite@6.3.4) 1350 | '@types/cookie': 0.6.0 1351 | cookie: 0.6.0 1352 | devalue: 5.1.1 1353 | esm-env: 1.2.2 1354 | import-meta-resolve: 4.1.0 1355 | kleur: 4.1.5 1356 | magic-string: 0.30.17 1357 | mrmime: 2.0.1 1358 | sade: 1.8.1 1359 | set-cookie-parser: 2.7.1 1360 | sirv: 3.0.1 1361 | svelte: 5.28.2 1362 | vite: 6.3.4 1363 | 1364 | '@sveltejs/package@2.3.11(svelte@5.28.2)(typescript@5.8.3)': 1365 | dependencies: 1366 | chokidar: 4.0.3 1367 | kleur: 4.1.5 1368 | sade: 1.8.1 1369 | semver: 7.7.1 1370 | svelte: 5.28.2 1371 | svelte2tsx: 0.7.37(svelte@5.28.2)(typescript@5.8.3) 1372 | transitivePeerDependencies: 1373 | - typescript 1374 | 1375 | '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.4))(svelte@5.28.2)(vite@6.3.4)': 1376 | dependencies: 1377 | '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.28.2)(vite@6.3.4) 1378 | debug: 4.4.0 1379 | svelte: 5.28.2 1380 | vite: 6.3.4 1381 | transitivePeerDependencies: 1382 | - supports-color 1383 | 1384 | '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.4)': 1385 | dependencies: 1386 | '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.4))(svelte@5.28.2)(vite@6.3.4) 1387 | debug: 4.4.0 1388 | deepmerge: 4.3.1 1389 | kleur: 4.1.5 1390 | magic-string: 0.30.17 1391 | svelte: 5.28.2 1392 | vite: 6.3.4 1393 | vitefu: 1.0.6(vite@6.3.4) 1394 | transitivePeerDependencies: 1395 | - supports-color 1396 | 1397 | '@trivago/prettier-plugin-sort-imports@5.2.2(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.28.2))(prettier@3.5.3)(svelte@5.28.2)': 1398 | dependencies: 1399 | '@babel/generator': 7.27.1 1400 | '@babel/parser': 7.27.1 1401 | '@babel/traverse': 7.27.1 1402 | '@babel/types': 7.27.1 1403 | javascript-natural-sort: 0.7.1 1404 | lodash: 4.17.21 1405 | prettier: 3.5.3 1406 | optionalDependencies: 1407 | prettier-plugin-svelte: 3.3.3(prettier@3.5.3)(svelte@5.28.2) 1408 | svelte: 5.28.2 1409 | transitivePeerDependencies: 1410 | - supports-color 1411 | 1412 | '@types/cookie@0.6.0': {} 1413 | 1414 | '@types/estree@1.0.7': {} 1415 | 1416 | acorn@8.14.1: {} 1417 | 1418 | aria-query@5.3.2: {} 1419 | 1420 | axobject-query@4.1.0: {} 1421 | 1422 | chokidar@4.0.3: 1423 | dependencies: 1424 | readdirp: 4.1.2 1425 | 1426 | clsx@2.1.1: {} 1427 | 1428 | cookie@0.6.0: {} 1429 | 1430 | cross-spawn@7.0.6: 1431 | dependencies: 1432 | path-key: 3.1.1 1433 | shebang-command: 2.0.0 1434 | which: 2.0.2 1435 | 1436 | debug@4.4.0: 1437 | dependencies: 1438 | ms: 2.1.3 1439 | 1440 | dedent-js@1.0.1: {} 1441 | 1442 | deepmerge@4.3.1: {} 1443 | 1444 | devalue@5.1.1: {} 1445 | 1446 | esbuild@0.25.3: 1447 | optionalDependencies: 1448 | '@esbuild/aix-ppc64': 0.25.3 1449 | '@esbuild/android-arm': 0.25.3 1450 | '@esbuild/android-arm64': 0.25.3 1451 | '@esbuild/android-x64': 0.25.3 1452 | '@esbuild/darwin-arm64': 0.25.3 1453 | '@esbuild/darwin-x64': 0.25.3 1454 | '@esbuild/freebsd-arm64': 0.25.3 1455 | '@esbuild/freebsd-x64': 0.25.3 1456 | '@esbuild/linux-arm': 0.25.3 1457 | '@esbuild/linux-arm64': 0.25.3 1458 | '@esbuild/linux-ia32': 0.25.3 1459 | '@esbuild/linux-loong64': 0.25.3 1460 | '@esbuild/linux-mips64el': 0.25.3 1461 | '@esbuild/linux-ppc64': 0.25.3 1462 | '@esbuild/linux-riscv64': 0.25.3 1463 | '@esbuild/linux-s390x': 0.25.3 1464 | '@esbuild/linux-x64': 0.25.3 1465 | '@esbuild/netbsd-arm64': 0.25.3 1466 | '@esbuild/netbsd-x64': 0.25.3 1467 | '@esbuild/openbsd-arm64': 0.25.3 1468 | '@esbuild/openbsd-x64': 0.25.3 1469 | '@esbuild/sunos-x64': 0.25.3 1470 | '@esbuild/win32-arm64': 0.25.3 1471 | '@esbuild/win32-ia32': 0.25.3 1472 | '@esbuild/win32-x64': 0.25.3 1473 | 1474 | esm-env@1.2.2: {} 1475 | 1476 | esrap@1.4.6: 1477 | dependencies: 1478 | '@jridgewell/sourcemap-codec': 1.5.0 1479 | 1480 | fdir@6.4.4(picomatch@4.0.2): 1481 | optionalDependencies: 1482 | picomatch: 4.0.2 1483 | 1484 | fsevents@2.3.3: 1485 | optional: true 1486 | 1487 | globals@11.12.0: {} 1488 | 1489 | husky@9.1.7: {} 1490 | 1491 | import-meta-resolve@4.1.0: {} 1492 | 1493 | is-reference@3.0.3: 1494 | dependencies: 1495 | '@types/estree': 1.0.7 1496 | 1497 | isexe@2.0.0: {} 1498 | 1499 | javascript-natural-sort@0.7.1: {} 1500 | 1501 | js-tokens@4.0.0: {} 1502 | 1503 | jsesc@3.1.0: {} 1504 | 1505 | kleur@4.1.5: {} 1506 | 1507 | locate-character@3.0.0: {} 1508 | 1509 | lodash@4.17.21: {} 1510 | 1511 | lower-case@2.0.2: 1512 | dependencies: 1513 | tslib: 2.8.1 1514 | 1515 | magic-string@0.30.17: 1516 | dependencies: 1517 | '@jridgewell/sourcemap-codec': 1.5.0 1518 | 1519 | mri@1.2.0: {} 1520 | 1521 | mrmime@2.0.1: {} 1522 | 1523 | ms@2.1.3: {} 1524 | 1525 | nanoid@3.3.11: {} 1526 | 1527 | no-case@3.0.4: 1528 | dependencies: 1529 | lower-case: 2.0.2 1530 | tslib: 2.8.1 1531 | 1532 | package-manager-detector@1.2.0: {} 1533 | 1534 | pascal-case@3.1.2: 1535 | dependencies: 1536 | no-case: 3.0.4 1537 | tslib: 2.8.1 1538 | 1539 | path-key@3.1.1: {} 1540 | 1541 | picocolors@1.1.1: {} 1542 | 1543 | picomatch@4.0.2: {} 1544 | 1545 | postcss@8.5.3: 1546 | dependencies: 1547 | nanoid: 3.3.11 1548 | picocolors: 1.1.1 1549 | source-map-js: 1.2.1 1550 | 1551 | prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.28.2): 1552 | dependencies: 1553 | prettier: 3.5.3 1554 | svelte: 5.28.2 1555 | 1556 | prettier@3.5.3: {} 1557 | 1558 | publint@0.3.12: 1559 | dependencies: 1560 | '@publint/pack': 0.1.2 1561 | package-manager-detector: 1.2.0 1562 | picocolors: 1.1.1 1563 | sade: 1.8.1 1564 | 1565 | readdirp@4.1.2: {} 1566 | 1567 | rollup@4.40.1: 1568 | dependencies: 1569 | '@types/estree': 1.0.7 1570 | optionalDependencies: 1571 | '@rollup/rollup-android-arm-eabi': 4.40.1 1572 | '@rollup/rollup-android-arm64': 4.40.1 1573 | '@rollup/rollup-darwin-arm64': 4.40.1 1574 | '@rollup/rollup-darwin-x64': 4.40.1 1575 | '@rollup/rollup-freebsd-arm64': 4.40.1 1576 | '@rollup/rollup-freebsd-x64': 4.40.1 1577 | '@rollup/rollup-linux-arm-gnueabihf': 4.40.1 1578 | '@rollup/rollup-linux-arm-musleabihf': 4.40.1 1579 | '@rollup/rollup-linux-arm64-gnu': 4.40.1 1580 | '@rollup/rollup-linux-arm64-musl': 4.40.1 1581 | '@rollup/rollup-linux-loongarch64-gnu': 4.40.1 1582 | '@rollup/rollup-linux-powerpc64le-gnu': 4.40.1 1583 | '@rollup/rollup-linux-riscv64-gnu': 4.40.1 1584 | '@rollup/rollup-linux-riscv64-musl': 4.40.1 1585 | '@rollup/rollup-linux-s390x-gnu': 4.40.1 1586 | '@rollup/rollup-linux-x64-gnu': 4.40.1 1587 | '@rollup/rollup-linux-x64-musl': 4.40.1 1588 | '@rollup/rollup-win32-arm64-msvc': 4.40.1 1589 | '@rollup/rollup-win32-ia32-msvc': 4.40.1 1590 | '@rollup/rollup-win32-x64-msvc': 4.40.1 1591 | fsevents: 2.3.3 1592 | 1593 | sade@1.8.1: 1594 | dependencies: 1595 | mri: 1.2.0 1596 | 1597 | semver@7.7.1: {} 1598 | 1599 | set-cookie-parser@2.7.1: {} 1600 | 1601 | shebang-command@2.0.0: 1602 | dependencies: 1603 | shebang-regex: 3.0.0 1604 | 1605 | shebang-regex@3.0.0: {} 1606 | 1607 | sirv@3.0.1: 1608 | dependencies: 1609 | '@polka/url': 1.0.0-next.29 1610 | mrmime: 2.0.1 1611 | totalist: 3.0.1 1612 | 1613 | source-map-js@1.2.1: {} 1614 | 1615 | svelte-check@4.1.7(picomatch@4.0.2)(svelte@5.28.2)(typescript@5.8.3): 1616 | dependencies: 1617 | '@jridgewell/trace-mapping': 0.3.25 1618 | chokidar: 4.0.3 1619 | fdir: 6.4.4(picomatch@4.0.2) 1620 | picocolors: 1.1.1 1621 | sade: 1.8.1 1622 | svelte: 5.28.2 1623 | typescript: 5.8.3 1624 | transitivePeerDependencies: 1625 | - picomatch 1626 | 1627 | svelte2tsx@0.7.37(svelte@5.28.2)(typescript@5.8.3): 1628 | dependencies: 1629 | dedent-js: 1.0.1 1630 | pascal-case: 3.1.2 1631 | svelte: 5.28.2 1632 | typescript: 5.8.3 1633 | 1634 | svelte@5.28.2: 1635 | dependencies: 1636 | '@ampproject/remapping': 2.3.0 1637 | '@jridgewell/sourcemap-codec': 1.5.0 1638 | '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) 1639 | '@types/estree': 1.0.7 1640 | acorn: 8.14.1 1641 | aria-query: 5.3.2 1642 | axobject-query: 4.1.0 1643 | clsx: 2.1.1 1644 | esm-env: 1.2.2 1645 | esrap: 1.4.6 1646 | is-reference: 3.0.3 1647 | locate-character: 3.0.0 1648 | magic-string: 0.30.17 1649 | zimmerframe: 1.1.2 1650 | 1651 | tinyglobby@0.2.13: 1652 | dependencies: 1653 | fdir: 6.4.4(picomatch@4.0.2) 1654 | picomatch: 4.0.2 1655 | 1656 | totalist@3.0.1: {} 1657 | 1658 | tslib@2.8.1: {} 1659 | 1660 | typescript@5.8.3: {} 1661 | 1662 | vite@6.3.4: 1663 | dependencies: 1664 | esbuild: 0.25.3 1665 | fdir: 6.4.4(picomatch@4.0.2) 1666 | picomatch: 4.0.2 1667 | postcss: 8.5.3 1668 | rollup: 4.40.1 1669 | tinyglobby: 0.2.13 1670 | optionalDependencies: 1671 | fsevents: 2.3.3 1672 | 1673 | vitefu@1.0.6(vite@6.3.4): 1674 | optionalDependencies: 1675 | vite: 6.3.4 1676 | 1677 | which@2.0.2: 1678 | dependencies: 1679 | isexe: 2.0.0 1680 | 1681 | zimmerframe@1.1.2: {} 1682 | --------------------------------------------------------------------------------