├── .github └── workflows │ └── npm-publish.yml ├── .gitignore ├── .npmignore ├── .prettierrc ├── Announcement.md ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src ├── index.ts └── lib │ ├── components │ ├── Link.svelte │ └── Route.svelte │ ├── location.ts │ ├── options.ts │ ├── router.ts │ └── utils │ ├── createIdIssuer.ts │ ├── getPathSegments.ts │ ├── getPathWithoutBase.ts │ └── linkHandle.ts ├── svelte.config.js └── tsconfig.json /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created 2 | # For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages 3 | 4 | name: Publish to NPM 5 | 6 | on: 7 | release: 8 | types: [created] 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: actions/setup-node@v3 16 | with: 17 | node-version: 19 18 | - run: npm ci 19 | - run: npm run build 20 | 21 | publish-npm: 22 | needs: build 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v3 26 | - uses: actions/setup-node@v3 27 | with: 28 | node-version: 19 29 | registry-url: https://registry.npmjs.org/ 30 | - run: npm ci 31 | - run: npm publish 32 | env: 33 | NODE_AUTH_TOKEN: ${{secrets.npm_token}} 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .svelte-kit 2 | dist 3 | node_modules 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .github 2 | .svelte-kit 3 | node_modules 4 | src 5 | .prettierrc 6 | package-lock.json 7 | svelte.config.js 8 | tsconfig.json 9 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "semi": false, 4 | "singleQuote": true, 5 | "bracketSpacing": true, 6 | "printWidth": 128, 7 | "svelteSortOrder": "scripts-markup-styles" 8 | } 9 | -------------------------------------------------------------------------------- /Announcement.md: -------------------------------------------------------------------------------- 1 | # Svelte Micro v3 Announcement 2 | 3 | You probably have already heard that Svelte 5 is in development. 4 | This version will bring new features and improvements, as well as change many aspects of the current way of writing components. 5 | 6 | In light of the news, I'd like to make an announcement regarding the svelte-micro library. 7 | 8 | ## Version 2 9 | 10 | I believe that svelte-micro v2 is polished in the state it is in right now. 11 | The library works like clockwork, providing a minimalistic and flexible way to declare application routing. 12 | 13 | Therefore, the version 2 will not be rewritten for Svelte 5, only receiving maintenance updates. 14 | 15 | ## Version 3 16 | 17 | The version 3 will be rewritten to support Svelte 5. 18 | The architecture of the library will remain flexible and minimalist, as well as the library itself will remain lightweight. 19 | 20 | Considering new features and improvements of Svelte 5, some of them could be beneficial for the library, including: 21 | 22 | - Runes 23 | - Improved performance as the result of the transition to signals 24 | - The new `$props` rune makes the types more expressive 25 | - New slots and snippets 26 | - Makes it possible to implement dynamic path parameters in a convenient way 27 | - Potential use of snippets for things like exact path matches, fallback routes 28 | 29 | The new version will be released after the release of Svelte 5, currently without a specific timeframe. 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 ayndqy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Svelte Micro 2 | 3 | Light & reactive client-side router for Svelte 4 | 5 | [Announcement of svelte-micro v3](./Announcement.md) 6 | 7 | ## Table of content 8 | 9 | - [Installation](#installation) 10 | - [Example](#example) 11 | - [API](#api) 12 | - [Imports reference](#imports-reference) 13 | - [`router` object](#router-object) 14 | - [`options` store](#options-store) 15 | - [`path` store](#path-store) 16 | - [`query` store](#query-store) 17 | - [`hash` store](#hash-store) 18 | - [`Route` component](#route-component) 19 | - [`Link` component](#link-component) 20 | - [`linkHandle` action](#linkhandle-action) 21 | - [`getPathSegments` function](#getpathsegments-function) 22 | - [Tips](#tips) 23 | - [`path`, `query`, `hash` usage](#path-query-hash-usage) 24 | - [Scroll behavior control](#scroll-behavior-control) 25 | - [Redirect](#redirect) 26 | - [Guarded route](#guarded-route) 27 | 28 | ## Installation 29 | 30 | ``` 31 | npm i svelte-micro 32 | ``` 33 | 34 | ## Example 35 | 36 | ```svelte 37 | 40 | 41 | 42 | 43 | 44 | 50 | 51 | 52 | 53 |

Home page

54 |

Make yourself at home.

55 |
56 | 57 | 58 |

Portfolio

59 | 60 | 61 | 62 |

Portfolio main page

63 | Sites 64 | Apps 65 |
66 | 67 | 68 |

Sites

69 | Back to portfolio main page 70 |
71 | 72 | 73 |

Apps

74 | Back to portfolio main page 75 |
76 | 77 | 78 |

The route is not found in /portfolio

79 | Back to portfolio main page 80 |
81 |
82 | 83 | 84 |

Our story

85 |
86 | 87 | 88 |

The route is not found

89 | Back to home 90 |
91 |
92 | ``` 93 | 94 | This code shows the capabilities of the `svelte-micro` routing system.\ 95 | Spend a minute analyzing this example to understand the approach. 96 | 97 | For advanced examples see the [Tips](#tips) section. 98 | 99 | ## API 100 | 101 | ### Imports reference 102 | 103 | | Entity | Related imports | 104 | | ------------------------------------------------------- | ------------------------------------------------------------------------- | 105 | | [`router` object](#router-object) | `import { router, type Router } from 'svelte-micro'` | 106 | | [`options` store](#options-store) | `import { options, type OptionsStore, type Options } from 'svelte-micro'` | 107 | | [`path` store](#path-store) | `import { path, type PathStore, type Path } from 'svelte-micro'` | 108 | | [`query` store](#query-store) | `import { query, type QueryStore, type Query } from 'svelte-micro'` | 109 | | [`hash` store](#hash-store) | `import { hash, type HashStore, type Hash } from 'svelte-micro'` | 110 | | [`Route` component](#route-component) | `import { Route } from 'svelte-micro'` | 111 | | [`Link` component](#link-component) | `import { Link } from 'svelte-micro'` | 112 | | [`linkHandle` action](#linkhandle-action) | `import { linkHandle, type LinkHandle } from 'svelte-micro'` | 113 | | [`getPathSegments` function](#getpathsegments-function) | `import { getPathSegments, type GetPathSegments } from 'svelte-micro'` | 114 | 115 | ### `router` object 116 | 117 | #### Type definition 118 | 119 | ```typescript 120 | type Router = { 121 | go: (delta?: number) => void 122 | push: (url?: string | URL | null, state?: any) => void 123 | replace: (url?: string | URL | null, state?: any) => void 124 | } 125 | ``` 126 | 127 | #### Description 128 | 129 | The `router` object is an object whose methods allow to manipulate history. 130 | 131 | - `router.go`\ 132 | Move on `delta` steps through the history. 133 | 134 | - `router.push`\ 135 | Push new `url` and [`state`](https://developer.mozilla.org/en-US/docs/Web/API/History/state) to the history. 136 | 137 | - `router.replace`\ 138 | Replace current `url` and [`state`](https://developer.mozilla.org/en-US/docs/Web/API/History/state) in the history. 139 | 140 | ### `options` store 141 | 142 | #### Type definition 143 | 144 | ```typescript 145 | type OptionsStore = { 146 | subscribe: import('svelte/store').Readable['subscribe'] 147 | set: (changedOptions: Partial) => void 148 | } 149 | ``` 150 | 151 | ```typescript 152 | type Options = { 153 | mode: 'window' | 'hash' 154 | basePath: null | string 155 | } 156 | ``` 157 | 158 | #### Description 159 | 160 | The `options` store provides `subscribe` and `set` methods to access and modify router options. 161 | 162 | - `$options.mode`\ 163 | Default: `'window'`\ 164 | Set the `mode` for the router. 165 | 166 | - `$options.basePath`\ 167 | Default: `null`\ 168 | Set the `basePath` for the router.\ 169 | If a `basePath` value is not found at the beginning of `$path`, the router will continue to operate properly, ignoring the `basePath` option for this state of `$path`. Be aware that if `mode` is set to `'hash'`, the router will try to find the `basePath` value in the hash location fragment, since the hash location fragment is already separated from the path location fragment. 170 | 171 | ### `path` store 172 | 173 | #### Type definition 174 | 175 | ```typescript 176 | type Path = string 177 | ``` 178 | 179 | ```typescript 180 | type PathStore = import('svelte/store').Readable 181 | ``` 182 | 183 | #### Description 184 | 185 | The store which contains current path. 186 | 187 | ### `query` store 188 | 189 | #### Type definition 190 | 191 | ```typescript 192 | type Query = string 193 | ``` 194 | 195 | ```typescript 196 | type QueryStore = import('svelte/store').Readable 197 | ``` 198 | 199 | #### Description 200 | 201 | The store which contains current query. 202 | 203 | ### `hash` store 204 | 205 | #### Type definition 206 | 207 | ```typescript 208 | type Hash = string 209 | ``` 210 | 211 | ```typescript 212 | type HashStore = import('svelte/store').Readable 213 | ``` 214 | 215 | #### Description 216 | 217 | The store which contains current hash. 218 | 219 | ### `Route` component 220 | 221 | #### Type definition 222 | 223 | ```svelte 224 | 228 | 229 | ``` 230 | 231 | #### Description 232 | 233 | The `Route` component defines a route. The props of `Route` are reactive. A nested `Route` component works in context of its parental `Route` component, so you don't need to define its full `path`. 234 | 235 | - `fallback`\ 236 | Default: `{false}` 237 | The property which defines if the route is fallback. A fallback route is active when there is no active routes on its depth. 238 | 239 | - `path`\ 240 | Default: `'/'` 241 | The property which defines route path. `path` must start from `'/'`. 242 | 243 | The top-level (root) `Route` must have `path` equal to `'/'` and `fallback` equal to `false`.\ 244 | These values are set by default, so you can leave them unchanged (see [Example](#example) section). 245 | 246 | ### `Link` component 247 | 248 | #### Type definition 249 | 250 | ```svelte 251 | 255 | 256 | ``` 257 | 258 | #### Description 259 | 260 | The `` component is built on top of [`linkHandle`](#linkhandle-action) and should be used for the internal application navigation.\ 261 | It automatically prevents the window from refreshing. 262 | 263 | - `href`\ 264 | Default: `'/'` 265 | The property which defines link href. 266 | 267 | - `{...restProps}`\ 268 | Any other property is attached on the inner `a` element. 269 | 270 | If the [`basePath` option](#options-store) isn't set to `null`, the `` component will append the `basePath` value to the `href` attribute.\ 271 | If the [`mode` option](#options-store) is set to `"hash"`, the `` component will append a `#` to the beginning of the `href` attribute. 272 | 273 | ### `linkHandle` action 274 | 275 | #### Type definition 276 | 277 | ```typescript 278 | type LinkHandle = import('svelte/action').Action 279 | ``` 280 | 281 | #### Description 282 | 283 | The `linkHandle` action prevents window from refreshing when the click event occurs on a handled `a[href]` element.\ 284 | `linkHandle` can be applied on a parental element to handle nested `a[href]` elements. 285 | 286 | `linkHandle` ignores an `a[href]` element if: 287 | 288 | - `a[href]` has `data-handle-ignore` attribute 289 | - `a[href]` has `target` attribute which isn't equal to `'_self'` 290 | - `a[href]` has external href (`new URL(href).origin !== document.location.origin`) 291 | - `(event.ctrlKey || event.metaKey || event.altKey || event.shiftKey) === true` during the click event 292 | 293 | ### `getPathSegments` function 294 | 295 | #### Type definition 296 | 297 | ```typescript 298 | export type GetPathSegments = (path: string) => string[] 299 | ``` 300 | 301 | #### Description 302 | 303 | The `getPathSegments` function divides `path` into segments. 304 | 305 | For example: `getPathSegments('/about-us/story') => ['/about-us', '/story']`. 306 | 307 | ## Tips 308 | 309 | ### `path`, `query`, `hash` usage 310 | 311 | ```svelte 312 | 322 | 323 | 324 | {text} 325 | 326 | 327 | {#if $hash === '#modal'} 328 | 329 | {/if} 330 | ``` 331 | 332 | ### Scroll behavior control 333 | 334 | ```javascript 335 | import { path } from 'svelte-micro' 336 | 337 | // Disable browser scroll behavior control 338 | if ('scrollRestoration' in history) { 339 | history.scrollRestoration = 'manual' 340 | } 341 | 342 | // On path change reset scroll position 343 | path.subscribe(() => window.scrollTo(0, 0)) 344 | ``` 345 | 346 | By default `svelte-micro` doesn't control scroll behavior, but it's easy to do on your own. 347 | 348 | ### Redirect 349 | 350 | ```svelte 351 | 354 | 355 | 356 | 357 | {router.replace('/redirect-target')} 358 | 359 | 360 | 361 |

You have been redirected

362 |
363 |
364 | ``` 365 | 366 | ### Guarded route 367 | 368 | ```svelte 369 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | {#if isUserAuthenticated} 382 | 383 |

Welcome!

384 | 385 |
386 | {/if} 387 |
388 | ``` 389 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-micro", 3 | "version": "2.5.7", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "svelte-micro", 9 | "version": "2.5.7", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@sveltejs/kit": "^2.5.0", 13 | "@sveltejs/package": "^2.3.0", 14 | "tslib": "^2.6.0", 15 | "typescript": "^5.5.0" 16 | }, 17 | "peerDependencies": { 18 | "svelte": "^3.54.0 || ^4.0.0" 19 | } 20 | }, 21 | "node_modules/@ampproject/remapping": { 22 | "version": "2.3.0", 23 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 24 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 25 | "license": "Apache-2.0", 26 | "peer": true, 27 | "dependencies": { 28 | "@jridgewell/gen-mapping": "^0.3.5", 29 | "@jridgewell/trace-mapping": "^0.3.24" 30 | }, 31 | "engines": { 32 | "node": ">=6.0.0" 33 | } 34 | }, 35 | "node_modules/@esbuild/aix-ppc64": { 36 | "version": "0.21.5", 37 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 38 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 39 | "cpu": [ 40 | "ppc64" 41 | ], 42 | "dev": true, 43 | "license": "MIT", 44 | "optional": true, 45 | "os": [ 46 | "aix" 47 | ], 48 | "peer": true, 49 | "engines": { 50 | "node": ">=12" 51 | } 52 | }, 53 | "node_modules/@esbuild/android-arm": { 54 | "version": "0.21.5", 55 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 56 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 57 | "cpu": [ 58 | "arm" 59 | ], 60 | "dev": true, 61 | "license": "MIT", 62 | "optional": true, 63 | "os": [ 64 | "android" 65 | ], 66 | "peer": true, 67 | "engines": { 68 | "node": ">=12" 69 | } 70 | }, 71 | "node_modules/@esbuild/android-arm64": { 72 | "version": "0.21.5", 73 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 74 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 75 | "cpu": [ 76 | "arm64" 77 | ], 78 | "dev": true, 79 | "license": "MIT", 80 | "optional": true, 81 | "os": [ 82 | "android" 83 | ], 84 | "peer": true, 85 | "engines": { 86 | "node": ">=12" 87 | } 88 | }, 89 | "node_modules/@esbuild/android-x64": { 90 | "version": "0.21.5", 91 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 92 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 93 | "cpu": [ 94 | "x64" 95 | ], 96 | "dev": true, 97 | "license": "MIT", 98 | "optional": true, 99 | "os": [ 100 | "android" 101 | ], 102 | "peer": true, 103 | "engines": { 104 | "node": ">=12" 105 | } 106 | }, 107 | "node_modules/@esbuild/darwin-arm64": { 108 | "version": "0.21.5", 109 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 110 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 111 | "cpu": [ 112 | "arm64" 113 | ], 114 | "dev": true, 115 | "license": "MIT", 116 | "optional": true, 117 | "os": [ 118 | "darwin" 119 | ], 120 | "peer": true, 121 | "engines": { 122 | "node": ">=12" 123 | } 124 | }, 125 | "node_modules/@esbuild/darwin-x64": { 126 | "version": "0.21.5", 127 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 128 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 129 | "cpu": [ 130 | "x64" 131 | ], 132 | "dev": true, 133 | "license": "MIT", 134 | "optional": true, 135 | "os": [ 136 | "darwin" 137 | ], 138 | "peer": true, 139 | "engines": { 140 | "node": ">=12" 141 | } 142 | }, 143 | "node_modules/@esbuild/freebsd-arm64": { 144 | "version": "0.21.5", 145 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 146 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 147 | "cpu": [ 148 | "arm64" 149 | ], 150 | "dev": true, 151 | "license": "MIT", 152 | "optional": true, 153 | "os": [ 154 | "freebsd" 155 | ], 156 | "peer": true, 157 | "engines": { 158 | "node": ">=12" 159 | } 160 | }, 161 | "node_modules/@esbuild/freebsd-x64": { 162 | "version": "0.21.5", 163 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 164 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 165 | "cpu": [ 166 | "x64" 167 | ], 168 | "dev": true, 169 | "license": "MIT", 170 | "optional": true, 171 | "os": [ 172 | "freebsd" 173 | ], 174 | "peer": true, 175 | "engines": { 176 | "node": ">=12" 177 | } 178 | }, 179 | "node_modules/@esbuild/linux-arm": { 180 | "version": "0.21.5", 181 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 182 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 183 | "cpu": [ 184 | "arm" 185 | ], 186 | "dev": true, 187 | "license": "MIT", 188 | "optional": true, 189 | "os": [ 190 | "linux" 191 | ], 192 | "peer": true, 193 | "engines": { 194 | "node": ">=12" 195 | } 196 | }, 197 | "node_modules/@esbuild/linux-arm64": { 198 | "version": "0.21.5", 199 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 200 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 201 | "cpu": [ 202 | "arm64" 203 | ], 204 | "dev": true, 205 | "license": "MIT", 206 | "optional": true, 207 | "os": [ 208 | "linux" 209 | ], 210 | "peer": true, 211 | "engines": { 212 | "node": ">=12" 213 | } 214 | }, 215 | "node_modules/@esbuild/linux-ia32": { 216 | "version": "0.21.5", 217 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 218 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 219 | "cpu": [ 220 | "ia32" 221 | ], 222 | "dev": true, 223 | "license": "MIT", 224 | "optional": true, 225 | "os": [ 226 | "linux" 227 | ], 228 | "peer": true, 229 | "engines": { 230 | "node": ">=12" 231 | } 232 | }, 233 | "node_modules/@esbuild/linux-loong64": { 234 | "version": "0.21.5", 235 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 236 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 237 | "cpu": [ 238 | "loong64" 239 | ], 240 | "dev": true, 241 | "license": "MIT", 242 | "optional": true, 243 | "os": [ 244 | "linux" 245 | ], 246 | "peer": true, 247 | "engines": { 248 | "node": ">=12" 249 | } 250 | }, 251 | "node_modules/@esbuild/linux-mips64el": { 252 | "version": "0.21.5", 253 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 254 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 255 | "cpu": [ 256 | "mips64el" 257 | ], 258 | "dev": true, 259 | "license": "MIT", 260 | "optional": true, 261 | "os": [ 262 | "linux" 263 | ], 264 | "peer": true, 265 | "engines": { 266 | "node": ">=12" 267 | } 268 | }, 269 | "node_modules/@esbuild/linux-ppc64": { 270 | "version": "0.21.5", 271 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 272 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 273 | "cpu": [ 274 | "ppc64" 275 | ], 276 | "dev": true, 277 | "license": "MIT", 278 | "optional": true, 279 | "os": [ 280 | "linux" 281 | ], 282 | "peer": true, 283 | "engines": { 284 | "node": ">=12" 285 | } 286 | }, 287 | "node_modules/@esbuild/linux-riscv64": { 288 | "version": "0.21.5", 289 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 290 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 291 | "cpu": [ 292 | "riscv64" 293 | ], 294 | "dev": true, 295 | "license": "MIT", 296 | "optional": true, 297 | "os": [ 298 | "linux" 299 | ], 300 | "peer": true, 301 | "engines": { 302 | "node": ">=12" 303 | } 304 | }, 305 | "node_modules/@esbuild/linux-s390x": { 306 | "version": "0.21.5", 307 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 308 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 309 | "cpu": [ 310 | "s390x" 311 | ], 312 | "dev": true, 313 | "license": "MIT", 314 | "optional": true, 315 | "os": [ 316 | "linux" 317 | ], 318 | "peer": true, 319 | "engines": { 320 | "node": ">=12" 321 | } 322 | }, 323 | "node_modules/@esbuild/linux-x64": { 324 | "version": "0.21.5", 325 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 326 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 327 | "cpu": [ 328 | "x64" 329 | ], 330 | "dev": true, 331 | "license": "MIT", 332 | "optional": true, 333 | "os": [ 334 | "linux" 335 | ], 336 | "peer": true, 337 | "engines": { 338 | "node": ">=12" 339 | } 340 | }, 341 | "node_modules/@esbuild/netbsd-x64": { 342 | "version": "0.21.5", 343 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 344 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 345 | "cpu": [ 346 | "x64" 347 | ], 348 | "dev": true, 349 | "license": "MIT", 350 | "optional": true, 351 | "os": [ 352 | "netbsd" 353 | ], 354 | "peer": true, 355 | "engines": { 356 | "node": ">=12" 357 | } 358 | }, 359 | "node_modules/@esbuild/openbsd-x64": { 360 | "version": "0.21.5", 361 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 362 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 363 | "cpu": [ 364 | "x64" 365 | ], 366 | "dev": true, 367 | "license": "MIT", 368 | "optional": true, 369 | "os": [ 370 | "openbsd" 371 | ], 372 | "peer": true, 373 | "engines": { 374 | "node": ">=12" 375 | } 376 | }, 377 | "node_modules/@esbuild/sunos-x64": { 378 | "version": "0.21.5", 379 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 380 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 381 | "cpu": [ 382 | "x64" 383 | ], 384 | "dev": true, 385 | "license": "MIT", 386 | "optional": true, 387 | "os": [ 388 | "sunos" 389 | ], 390 | "peer": true, 391 | "engines": { 392 | "node": ">=12" 393 | } 394 | }, 395 | "node_modules/@esbuild/win32-arm64": { 396 | "version": "0.21.5", 397 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 398 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 399 | "cpu": [ 400 | "arm64" 401 | ], 402 | "dev": true, 403 | "license": "MIT", 404 | "optional": true, 405 | "os": [ 406 | "win32" 407 | ], 408 | "peer": true, 409 | "engines": { 410 | "node": ">=12" 411 | } 412 | }, 413 | "node_modules/@esbuild/win32-ia32": { 414 | "version": "0.21.5", 415 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 416 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 417 | "cpu": [ 418 | "ia32" 419 | ], 420 | "dev": true, 421 | "license": "MIT", 422 | "optional": true, 423 | "os": [ 424 | "win32" 425 | ], 426 | "peer": true, 427 | "engines": { 428 | "node": ">=12" 429 | } 430 | }, 431 | "node_modules/@esbuild/win32-x64": { 432 | "version": "0.21.5", 433 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 434 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 435 | "cpu": [ 436 | "x64" 437 | ], 438 | "dev": true, 439 | "license": "MIT", 440 | "optional": true, 441 | "os": [ 442 | "win32" 443 | ], 444 | "peer": true, 445 | "engines": { 446 | "node": ">=12" 447 | } 448 | }, 449 | "node_modules/@jridgewell/gen-mapping": { 450 | "version": "0.3.5", 451 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 452 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 453 | "license": "MIT", 454 | "peer": true, 455 | "dependencies": { 456 | "@jridgewell/set-array": "^1.2.1", 457 | "@jridgewell/sourcemap-codec": "^1.4.10", 458 | "@jridgewell/trace-mapping": "^0.3.24" 459 | }, 460 | "engines": { 461 | "node": ">=6.0.0" 462 | } 463 | }, 464 | "node_modules/@jridgewell/resolve-uri": { 465 | "version": "3.1.2", 466 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 467 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 468 | "license": "MIT", 469 | "peer": true, 470 | "engines": { 471 | "node": ">=6.0.0" 472 | } 473 | }, 474 | "node_modules/@jridgewell/set-array": { 475 | "version": "1.2.1", 476 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 477 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 478 | "license": "MIT", 479 | "peer": true, 480 | "engines": { 481 | "node": ">=6.0.0" 482 | } 483 | }, 484 | "node_modules/@jridgewell/sourcemap-codec": { 485 | "version": "1.5.0", 486 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 487 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 488 | "license": "MIT" 489 | }, 490 | "node_modules/@jridgewell/trace-mapping": { 491 | "version": "0.3.25", 492 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 493 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 494 | "license": "MIT", 495 | "peer": true, 496 | "dependencies": { 497 | "@jridgewell/resolve-uri": "^3.1.0", 498 | "@jridgewell/sourcemap-codec": "^1.4.14" 499 | } 500 | }, 501 | "node_modules/@polka/url": { 502 | "version": "1.0.0-next.28", 503 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", 504 | "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", 505 | "dev": true 506 | }, 507 | "node_modules/@rollup/rollup-android-arm-eabi": { 508 | "version": "4.22.4", 509 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", 510 | "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", 511 | "cpu": [ 512 | "arm" 513 | ], 514 | "dev": true, 515 | "optional": true, 516 | "os": [ 517 | "android" 518 | ], 519 | "peer": true 520 | }, 521 | "node_modules/@rollup/rollup-android-arm64": { 522 | "version": "4.22.4", 523 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", 524 | "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", 525 | "cpu": [ 526 | "arm64" 527 | ], 528 | "dev": true, 529 | "optional": true, 530 | "os": [ 531 | "android" 532 | ], 533 | "peer": true 534 | }, 535 | "node_modules/@rollup/rollup-darwin-arm64": { 536 | "version": "4.22.4", 537 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", 538 | "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", 539 | "cpu": [ 540 | "arm64" 541 | ], 542 | "dev": true, 543 | "optional": true, 544 | "os": [ 545 | "darwin" 546 | ], 547 | "peer": true 548 | }, 549 | "node_modules/@rollup/rollup-darwin-x64": { 550 | "version": "4.22.4", 551 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", 552 | "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", 553 | "cpu": [ 554 | "x64" 555 | ], 556 | "dev": true, 557 | "optional": true, 558 | "os": [ 559 | "darwin" 560 | ], 561 | "peer": true 562 | }, 563 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 564 | "version": "4.22.4", 565 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", 566 | "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", 567 | "cpu": [ 568 | "arm" 569 | ], 570 | "dev": true, 571 | "optional": true, 572 | "os": [ 573 | "linux" 574 | ], 575 | "peer": true 576 | }, 577 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 578 | "version": "4.22.4", 579 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", 580 | "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", 581 | "cpu": [ 582 | "arm" 583 | ], 584 | "dev": true, 585 | "optional": true, 586 | "os": [ 587 | "linux" 588 | ], 589 | "peer": true 590 | }, 591 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 592 | "version": "4.22.4", 593 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", 594 | "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", 595 | "cpu": [ 596 | "arm64" 597 | ], 598 | "dev": true, 599 | "optional": true, 600 | "os": [ 601 | "linux" 602 | ], 603 | "peer": true 604 | }, 605 | "node_modules/@rollup/rollup-linux-arm64-musl": { 606 | "version": "4.22.4", 607 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", 608 | "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", 609 | "cpu": [ 610 | "arm64" 611 | ], 612 | "dev": true, 613 | "optional": true, 614 | "os": [ 615 | "linux" 616 | ], 617 | "peer": true 618 | }, 619 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 620 | "version": "4.22.4", 621 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", 622 | "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", 623 | "cpu": [ 624 | "ppc64" 625 | ], 626 | "dev": true, 627 | "optional": true, 628 | "os": [ 629 | "linux" 630 | ], 631 | "peer": true 632 | }, 633 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 634 | "version": "4.22.4", 635 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", 636 | "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", 637 | "cpu": [ 638 | "riscv64" 639 | ], 640 | "dev": true, 641 | "optional": true, 642 | "os": [ 643 | "linux" 644 | ], 645 | "peer": true 646 | }, 647 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 648 | "version": "4.22.4", 649 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", 650 | "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", 651 | "cpu": [ 652 | "s390x" 653 | ], 654 | "dev": true, 655 | "optional": true, 656 | "os": [ 657 | "linux" 658 | ], 659 | "peer": true 660 | }, 661 | "node_modules/@rollup/rollup-linux-x64-gnu": { 662 | "version": "4.22.4", 663 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", 664 | "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", 665 | "cpu": [ 666 | "x64" 667 | ], 668 | "dev": true, 669 | "optional": true, 670 | "os": [ 671 | "linux" 672 | ], 673 | "peer": true 674 | }, 675 | "node_modules/@rollup/rollup-linux-x64-musl": { 676 | "version": "4.22.4", 677 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", 678 | "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", 679 | "cpu": [ 680 | "x64" 681 | ], 682 | "dev": true, 683 | "optional": true, 684 | "os": [ 685 | "linux" 686 | ], 687 | "peer": true 688 | }, 689 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 690 | "version": "4.22.4", 691 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", 692 | "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", 693 | "cpu": [ 694 | "arm64" 695 | ], 696 | "dev": true, 697 | "optional": true, 698 | "os": [ 699 | "win32" 700 | ], 701 | "peer": true 702 | }, 703 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 704 | "version": "4.22.4", 705 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", 706 | "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", 707 | "cpu": [ 708 | "ia32" 709 | ], 710 | "dev": true, 711 | "optional": true, 712 | "os": [ 713 | "win32" 714 | ], 715 | "peer": true 716 | }, 717 | "node_modules/@rollup/rollup-win32-x64-msvc": { 718 | "version": "4.22.4", 719 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", 720 | "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", 721 | "cpu": [ 722 | "x64" 723 | ], 724 | "dev": true, 725 | "optional": true, 726 | "os": [ 727 | "win32" 728 | ], 729 | "peer": true 730 | }, 731 | "node_modules/@sveltejs/kit": { 732 | "version": "2.8.3", 733 | "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.8.3.tgz", 734 | "integrity": "sha512-DVBVwugfzzn0SxKA+eAmKqcZ7aHZROCHxH7/pyrOi+HLtQ721eEsctGb9MkhEuqj6q/9S/OFYdn37vdxzFPdvw==", 735 | "dev": true, 736 | "hasInstallScript": true, 737 | "dependencies": { 738 | "@types/cookie": "^0.6.0", 739 | "cookie": "^0.6.0", 740 | "devalue": "^5.1.0", 741 | "esm-env": "^1.0.0", 742 | "import-meta-resolve": "^4.1.0", 743 | "kleur": "^4.1.5", 744 | "magic-string": "^0.30.5", 745 | "mrmime": "^2.0.0", 746 | "sade": "^1.8.1", 747 | "set-cookie-parser": "^2.6.0", 748 | "sirv": "^3.0.0", 749 | "tiny-glob": "^0.2.9" 750 | }, 751 | "bin": { 752 | "svelte-kit": "svelte-kit.js" 753 | }, 754 | "engines": { 755 | "node": ">=18.13" 756 | }, 757 | "peerDependencies": { 758 | "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1", 759 | "svelte": "^4.0.0 || ^5.0.0-next.0", 760 | "vite": "^5.0.3" 761 | } 762 | }, 763 | "node_modules/@sveltejs/package": { 764 | "version": "2.3.2", 765 | "resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-2.3.2.tgz", 766 | "integrity": "sha512-6M8/Te7iXRG7SiH92wugqfyoJpuepjn78L433LnXicUeMso9M/N4vdL9DPK3MfTkVVY4klhNRptVqme3p4oZWA==", 767 | "dev": true, 768 | "license": "MIT", 769 | "dependencies": { 770 | "chokidar": "^3.6.0", 771 | "kleur": "^4.1.5", 772 | "sade": "^1.8.1", 773 | "semver": "^7.5.4", 774 | "svelte2tsx": "~0.7.0" 775 | }, 776 | "bin": { 777 | "svelte-package": "svelte-package.js" 778 | }, 779 | "engines": { 780 | "node": "^16.14 || >=18" 781 | }, 782 | "peerDependencies": { 783 | "svelte": "^3.44.0 || ^4.0.0 || ^5.0.0-next.1" 784 | } 785 | }, 786 | "node_modules/@sveltejs/vite-plugin-svelte": { 787 | "version": "3.1.1", 788 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.1.tgz", 789 | "integrity": "sha512-rimpFEAboBBHIlzISibg94iP09k/KYdHgVhJlcsTfn7KMBhc70jFX/GRWkRdFCc2fdnk+4+Bdfej23cMDnJS6A==", 790 | "dev": true, 791 | "license": "MIT", 792 | "peer": true, 793 | "dependencies": { 794 | "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0", 795 | "debug": "^4.3.4", 796 | "deepmerge": "^4.3.1", 797 | "kleur": "^4.1.5", 798 | "magic-string": "^0.30.10", 799 | "svelte-hmr": "^0.16.0", 800 | "vitefu": "^0.2.5" 801 | }, 802 | "engines": { 803 | "node": "^18.0.0 || >=20" 804 | }, 805 | "peerDependencies": { 806 | "svelte": "^4.0.0 || ^5.0.0-next.0", 807 | "vite": "^5.0.0" 808 | } 809 | }, 810 | "node_modules/@sveltejs/vite-plugin-svelte-inspector": { 811 | "version": "2.1.0", 812 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", 813 | "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", 814 | "dev": true, 815 | "license": "MIT", 816 | "peer": true, 817 | "dependencies": { 818 | "debug": "^4.3.4" 819 | }, 820 | "engines": { 821 | "node": "^18.0.0 || >=20" 822 | }, 823 | "peerDependencies": { 824 | "@sveltejs/vite-plugin-svelte": "^3.0.0", 825 | "svelte": "^4.0.0 || ^5.0.0-next.0", 826 | "vite": "^5.0.0" 827 | } 828 | }, 829 | "node_modules/@types/cookie": { 830 | "version": "0.6.0", 831 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", 832 | "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", 833 | "dev": true, 834 | "license": "MIT" 835 | }, 836 | "node_modules/@types/estree": { 837 | "version": "1.0.5", 838 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 839 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 840 | "license": "MIT", 841 | "peer": true 842 | }, 843 | "node_modules/acorn": { 844 | "version": "8.12.1", 845 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", 846 | "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", 847 | "license": "MIT", 848 | "peer": true, 849 | "bin": { 850 | "acorn": "bin/acorn" 851 | }, 852 | "engines": { 853 | "node": ">=0.4.0" 854 | } 855 | }, 856 | "node_modules/anymatch": { 857 | "version": "3.1.3", 858 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 859 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 860 | "dev": true, 861 | "license": "ISC", 862 | "dependencies": { 863 | "normalize-path": "^3.0.0", 864 | "picomatch": "^2.0.4" 865 | }, 866 | "engines": { 867 | "node": ">= 8" 868 | } 869 | }, 870 | "node_modules/aria-query": { 871 | "version": "5.3.0", 872 | "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", 873 | "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", 874 | "license": "Apache-2.0", 875 | "peer": true, 876 | "dependencies": { 877 | "dequal": "^2.0.3" 878 | } 879 | }, 880 | "node_modules/axobject-query": { 881 | "version": "4.0.0", 882 | "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", 883 | "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", 884 | "license": "Apache-2.0", 885 | "peer": true, 886 | "dependencies": { 887 | "dequal": "^2.0.3" 888 | } 889 | }, 890 | "node_modules/binary-extensions": { 891 | "version": "2.3.0", 892 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 893 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 894 | "dev": true, 895 | "license": "MIT", 896 | "engines": { 897 | "node": ">=8" 898 | }, 899 | "funding": { 900 | "url": "https://github.com/sponsors/sindresorhus" 901 | } 902 | }, 903 | "node_modules/braces": { 904 | "version": "3.0.3", 905 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 906 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 907 | "dev": true, 908 | "license": "MIT", 909 | "dependencies": { 910 | "fill-range": "^7.1.1" 911 | }, 912 | "engines": { 913 | "node": ">=8" 914 | } 915 | }, 916 | "node_modules/chokidar": { 917 | "version": "3.6.0", 918 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 919 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 920 | "dev": true, 921 | "license": "MIT", 922 | "dependencies": { 923 | "anymatch": "~3.1.2", 924 | "braces": "~3.0.2", 925 | "glob-parent": "~5.1.2", 926 | "is-binary-path": "~2.1.0", 927 | "is-glob": "~4.0.1", 928 | "normalize-path": "~3.0.0", 929 | "readdirp": "~3.6.0" 930 | }, 931 | "engines": { 932 | "node": ">= 8.10.0" 933 | }, 934 | "funding": { 935 | "url": "https://paulmillr.com/funding/" 936 | }, 937 | "optionalDependencies": { 938 | "fsevents": "~2.3.2" 939 | } 940 | }, 941 | "node_modules/code-red": { 942 | "version": "1.0.4", 943 | "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", 944 | "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", 945 | "license": "MIT", 946 | "peer": true, 947 | "dependencies": { 948 | "@jridgewell/sourcemap-codec": "^1.4.15", 949 | "@types/estree": "^1.0.1", 950 | "acorn": "^8.10.0", 951 | "estree-walker": "^3.0.3", 952 | "periscopic": "^3.1.0" 953 | } 954 | }, 955 | "node_modules/cookie": { 956 | "version": "0.6.0", 957 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 958 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 959 | "dev": true, 960 | "license": "MIT", 961 | "engines": { 962 | "node": ">= 0.6" 963 | } 964 | }, 965 | "node_modules/css-tree": { 966 | "version": "2.3.1", 967 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", 968 | "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", 969 | "license": "MIT", 970 | "peer": true, 971 | "dependencies": { 972 | "mdn-data": "2.0.30", 973 | "source-map-js": "^1.0.1" 974 | }, 975 | "engines": { 976 | "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" 977 | } 978 | }, 979 | "node_modules/debug": { 980 | "version": "4.3.5", 981 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 982 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 983 | "dev": true, 984 | "license": "MIT", 985 | "peer": true, 986 | "dependencies": { 987 | "ms": "2.1.2" 988 | }, 989 | "engines": { 990 | "node": ">=6.0" 991 | }, 992 | "peerDependenciesMeta": { 993 | "supports-color": { 994 | "optional": true 995 | } 996 | } 997 | }, 998 | "node_modules/dedent-js": { 999 | "version": "1.0.1", 1000 | "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", 1001 | "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==", 1002 | "dev": true, 1003 | "license": "MIT" 1004 | }, 1005 | "node_modules/deepmerge": { 1006 | "version": "4.3.1", 1007 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 1008 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 1009 | "dev": true, 1010 | "license": "MIT", 1011 | "peer": true, 1012 | "engines": { 1013 | "node": ">=0.10.0" 1014 | } 1015 | }, 1016 | "node_modules/dequal": { 1017 | "version": "2.0.3", 1018 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 1019 | "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 1020 | "license": "MIT", 1021 | "peer": true, 1022 | "engines": { 1023 | "node": ">=6" 1024 | } 1025 | }, 1026 | "node_modules/devalue": { 1027 | "version": "5.1.1", 1028 | "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", 1029 | "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==", 1030 | "dev": true 1031 | }, 1032 | "node_modules/esbuild": { 1033 | "version": "0.21.5", 1034 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 1035 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 1036 | "dev": true, 1037 | "hasInstallScript": true, 1038 | "license": "MIT", 1039 | "peer": true, 1040 | "bin": { 1041 | "esbuild": "bin/esbuild" 1042 | }, 1043 | "engines": { 1044 | "node": ">=12" 1045 | }, 1046 | "optionalDependencies": { 1047 | "@esbuild/aix-ppc64": "0.21.5", 1048 | "@esbuild/android-arm": "0.21.5", 1049 | "@esbuild/android-arm64": "0.21.5", 1050 | "@esbuild/android-x64": "0.21.5", 1051 | "@esbuild/darwin-arm64": "0.21.5", 1052 | "@esbuild/darwin-x64": "0.21.5", 1053 | "@esbuild/freebsd-arm64": "0.21.5", 1054 | "@esbuild/freebsd-x64": "0.21.5", 1055 | "@esbuild/linux-arm": "0.21.5", 1056 | "@esbuild/linux-arm64": "0.21.5", 1057 | "@esbuild/linux-ia32": "0.21.5", 1058 | "@esbuild/linux-loong64": "0.21.5", 1059 | "@esbuild/linux-mips64el": "0.21.5", 1060 | "@esbuild/linux-ppc64": "0.21.5", 1061 | "@esbuild/linux-riscv64": "0.21.5", 1062 | "@esbuild/linux-s390x": "0.21.5", 1063 | "@esbuild/linux-x64": "0.21.5", 1064 | "@esbuild/netbsd-x64": "0.21.5", 1065 | "@esbuild/openbsd-x64": "0.21.5", 1066 | "@esbuild/sunos-x64": "0.21.5", 1067 | "@esbuild/win32-arm64": "0.21.5", 1068 | "@esbuild/win32-ia32": "0.21.5", 1069 | "@esbuild/win32-x64": "0.21.5" 1070 | } 1071 | }, 1072 | "node_modules/esm-env": { 1073 | "version": "1.0.0", 1074 | "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", 1075 | "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", 1076 | "dev": true, 1077 | "license": "MIT" 1078 | }, 1079 | "node_modules/estree-walker": { 1080 | "version": "3.0.3", 1081 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 1082 | "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 1083 | "license": "MIT", 1084 | "peer": true, 1085 | "dependencies": { 1086 | "@types/estree": "^1.0.0" 1087 | } 1088 | }, 1089 | "node_modules/fill-range": { 1090 | "version": "7.1.1", 1091 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1092 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1093 | "dev": true, 1094 | "license": "MIT", 1095 | "dependencies": { 1096 | "to-regex-range": "^5.0.1" 1097 | }, 1098 | "engines": { 1099 | "node": ">=8" 1100 | } 1101 | }, 1102 | "node_modules/fsevents": { 1103 | "version": "2.3.3", 1104 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1105 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1106 | "dev": true, 1107 | "hasInstallScript": true, 1108 | "license": "MIT", 1109 | "optional": true, 1110 | "os": [ 1111 | "darwin" 1112 | ], 1113 | "engines": { 1114 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1115 | } 1116 | }, 1117 | "node_modules/glob-parent": { 1118 | "version": "5.1.2", 1119 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1120 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1121 | "dev": true, 1122 | "license": "ISC", 1123 | "dependencies": { 1124 | "is-glob": "^4.0.1" 1125 | }, 1126 | "engines": { 1127 | "node": ">= 6" 1128 | } 1129 | }, 1130 | "node_modules/globalyzer": { 1131 | "version": "0.1.0", 1132 | "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", 1133 | "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", 1134 | "dev": true, 1135 | "license": "MIT" 1136 | }, 1137 | "node_modules/globrex": { 1138 | "version": "0.1.2", 1139 | "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", 1140 | "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", 1141 | "dev": true, 1142 | "license": "MIT" 1143 | }, 1144 | "node_modules/import-meta-resolve": { 1145 | "version": "4.1.0", 1146 | "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", 1147 | "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", 1148 | "dev": true, 1149 | "license": "MIT", 1150 | "funding": { 1151 | "type": "github", 1152 | "url": "https://github.com/sponsors/wooorm" 1153 | } 1154 | }, 1155 | "node_modules/is-binary-path": { 1156 | "version": "2.1.0", 1157 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1158 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1159 | "dev": true, 1160 | "license": "MIT", 1161 | "dependencies": { 1162 | "binary-extensions": "^2.0.0" 1163 | }, 1164 | "engines": { 1165 | "node": ">=8" 1166 | } 1167 | }, 1168 | "node_modules/is-extglob": { 1169 | "version": "2.1.1", 1170 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1171 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1172 | "dev": true, 1173 | "license": "MIT", 1174 | "engines": { 1175 | "node": ">=0.10.0" 1176 | } 1177 | }, 1178 | "node_modules/is-glob": { 1179 | "version": "4.0.3", 1180 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1181 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1182 | "dev": true, 1183 | "license": "MIT", 1184 | "dependencies": { 1185 | "is-extglob": "^2.1.1" 1186 | }, 1187 | "engines": { 1188 | "node": ">=0.10.0" 1189 | } 1190 | }, 1191 | "node_modules/is-number": { 1192 | "version": "7.0.0", 1193 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1194 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1195 | "dev": true, 1196 | "license": "MIT", 1197 | "engines": { 1198 | "node": ">=0.12.0" 1199 | } 1200 | }, 1201 | "node_modules/is-reference": { 1202 | "version": "3.0.2", 1203 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", 1204 | "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", 1205 | "license": "MIT", 1206 | "peer": true, 1207 | "dependencies": { 1208 | "@types/estree": "*" 1209 | } 1210 | }, 1211 | "node_modules/kleur": { 1212 | "version": "4.1.5", 1213 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 1214 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 1215 | "dev": true, 1216 | "license": "MIT", 1217 | "engines": { 1218 | "node": ">=6" 1219 | } 1220 | }, 1221 | "node_modules/locate-character": { 1222 | "version": "3.0.0", 1223 | "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", 1224 | "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", 1225 | "license": "MIT", 1226 | "peer": true 1227 | }, 1228 | "node_modules/lower-case": { 1229 | "version": "2.0.2", 1230 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 1231 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 1232 | "dev": true, 1233 | "license": "MIT", 1234 | "dependencies": { 1235 | "tslib": "^2.0.3" 1236 | } 1237 | }, 1238 | "node_modules/magic-string": { 1239 | "version": "0.30.10", 1240 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", 1241 | "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", 1242 | "license": "MIT", 1243 | "dependencies": { 1244 | "@jridgewell/sourcemap-codec": "^1.4.15" 1245 | } 1246 | }, 1247 | "node_modules/mdn-data": { 1248 | "version": "2.0.30", 1249 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", 1250 | "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", 1251 | "license": "CC0-1.0", 1252 | "peer": true 1253 | }, 1254 | "node_modules/mri": { 1255 | "version": "1.2.0", 1256 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 1257 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 1258 | "dev": true, 1259 | "license": "MIT", 1260 | "engines": { 1261 | "node": ">=4" 1262 | } 1263 | }, 1264 | "node_modules/mrmime": { 1265 | "version": "2.0.0", 1266 | "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", 1267 | "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", 1268 | "dev": true, 1269 | "engines": { 1270 | "node": ">=10" 1271 | } 1272 | }, 1273 | "node_modules/ms": { 1274 | "version": "2.1.2", 1275 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1276 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1277 | "dev": true, 1278 | "license": "MIT", 1279 | "peer": true 1280 | }, 1281 | "node_modules/nanoid": { 1282 | "version": "3.3.7", 1283 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1284 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 1285 | "dev": true, 1286 | "funding": [ 1287 | { 1288 | "type": "github", 1289 | "url": "https://github.com/sponsors/ai" 1290 | } 1291 | ], 1292 | "peer": true, 1293 | "bin": { 1294 | "nanoid": "bin/nanoid.cjs" 1295 | }, 1296 | "engines": { 1297 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1298 | } 1299 | }, 1300 | "node_modules/no-case": { 1301 | "version": "3.0.4", 1302 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 1303 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 1304 | "dev": true, 1305 | "license": "MIT", 1306 | "dependencies": { 1307 | "lower-case": "^2.0.2", 1308 | "tslib": "^2.0.3" 1309 | } 1310 | }, 1311 | "node_modules/normalize-path": { 1312 | "version": "3.0.0", 1313 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1314 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1315 | "dev": true, 1316 | "license": "MIT", 1317 | "engines": { 1318 | "node": ">=0.10.0" 1319 | } 1320 | }, 1321 | "node_modules/pascal-case": { 1322 | "version": "3.1.2", 1323 | "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", 1324 | "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", 1325 | "dev": true, 1326 | "license": "MIT", 1327 | "dependencies": { 1328 | "no-case": "^3.0.4", 1329 | "tslib": "^2.0.3" 1330 | } 1331 | }, 1332 | "node_modules/periscopic": { 1333 | "version": "3.1.0", 1334 | "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", 1335 | "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", 1336 | "license": "MIT", 1337 | "peer": true, 1338 | "dependencies": { 1339 | "@types/estree": "^1.0.0", 1340 | "estree-walker": "^3.0.0", 1341 | "is-reference": "^3.0.0" 1342 | } 1343 | }, 1344 | "node_modules/picocolors": { 1345 | "version": "1.1.0", 1346 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", 1347 | "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", 1348 | "dev": true, 1349 | "peer": true 1350 | }, 1351 | "node_modules/picomatch": { 1352 | "version": "2.3.1", 1353 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1354 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1355 | "dev": true, 1356 | "license": "MIT", 1357 | "engines": { 1358 | "node": ">=8.6" 1359 | }, 1360 | "funding": { 1361 | "url": "https://github.com/sponsors/jonschlinkert" 1362 | } 1363 | }, 1364 | "node_modules/postcss": { 1365 | "version": "8.4.47", 1366 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", 1367 | "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", 1368 | "dev": true, 1369 | "funding": [ 1370 | { 1371 | "type": "opencollective", 1372 | "url": "https://opencollective.com/postcss/" 1373 | }, 1374 | { 1375 | "type": "tidelift", 1376 | "url": "https://tidelift.com/funding/github/npm/postcss" 1377 | }, 1378 | { 1379 | "type": "github", 1380 | "url": "https://github.com/sponsors/ai" 1381 | } 1382 | ], 1383 | "peer": true, 1384 | "dependencies": { 1385 | "nanoid": "^3.3.7", 1386 | "picocolors": "^1.1.0", 1387 | "source-map-js": "^1.2.1" 1388 | }, 1389 | "engines": { 1390 | "node": "^10 || ^12 || >=14" 1391 | } 1392 | }, 1393 | "node_modules/readdirp": { 1394 | "version": "3.6.0", 1395 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1396 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1397 | "dev": true, 1398 | "license": "MIT", 1399 | "dependencies": { 1400 | "picomatch": "^2.2.1" 1401 | }, 1402 | "engines": { 1403 | "node": ">=8.10.0" 1404 | } 1405 | }, 1406 | "node_modules/rollup": { 1407 | "version": "4.22.4", 1408 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", 1409 | "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", 1410 | "dev": true, 1411 | "peer": true, 1412 | "dependencies": { 1413 | "@types/estree": "1.0.5" 1414 | }, 1415 | "bin": { 1416 | "rollup": "dist/bin/rollup" 1417 | }, 1418 | "engines": { 1419 | "node": ">=18.0.0", 1420 | "npm": ">=8.0.0" 1421 | }, 1422 | "optionalDependencies": { 1423 | "@rollup/rollup-android-arm-eabi": "4.22.4", 1424 | "@rollup/rollup-android-arm64": "4.22.4", 1425 | "@rollup/rollup-darwin-arm64": "4.22.4", 1426 | "@rollup/rollup-darwin-x64": "4.22.4", 1427 | "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", 1428 | "@rollup/rollup-linux-arm-musleabihf": "4.22.4", 1429 | "@rollup/rollup-linux-arm64-gnu": "4.22.4", 1430 | "@rollup/rollup-linux-arm64-musl": "4.22.4", 1431 | "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", 1432 | "@rollup/rollup-linux-riscv64-gnu": "4.22.4", 1433 | "@rollup/rollup-linux-s390x-gnu": "4.22.4", 1434 | "@rollup/rollup-linux-x64-gnu": "4.22.4", 1435 | "@rollup/rollup-linux-x64-musl": "4.22.4", 1436 | "@rollup/rollup-win32-arm64-msvc": "4.22.4", 1437 | "@rollup/rollup-win32-ia32-msvc": "4.22.4", 1438 | "@rollup/rollup-win32-x64-msvc": "4.22.4", 1439 | "fsevents": "~2.3.2" 1440 | } 1441 | }, 1442 | "node_modules/sade": { 1443 | "version": "1.8.1", 1444 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 1445 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 1446 | "dev": true, 1447 | "license": "MIT", 1448 | "dependencies": { 1449 | "mri": "^1.1.0" 1450 | }, 1451 | "engines": { 1452 | "node": ">=6" 1453 | } 1454 | }, 1455 | "node_modules/semver": { 1456 | "version": "7.6.2", 1457 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", 1458 | "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", 1459 | "dev": true, 1460 | "license": "ISC", 1461 | "bin": { 1462 | "semver": "bin/semver.js" 1463 | }, 1464 | "engines": { 1465 | "node": ">=10" 1466 | } 1467 | }, 1468 | "node_modules/set-cookie-parser": { 1469 | "version": "2.6.0", 1470 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", 1471 | "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", 1472 | "dev": true, 1473 | "license": "MIT" 1474 | }, 1475 | "node_modules/sirv": { 1476 | "version": "3.0.0", 1477 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", 1478 | "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", 1479 | "dev": true, 1480 | "dependencies": { 1481 | "@polka/url": "^1.0.0-next.24", 1482 | "mrmime": "^2.0.0", 1483 | "totalist": "^3.0.0" 1484 | }, 1485 | "engines": { 1486 | "node": ">=18" 1487 | } 1488 | }, 1489 | "node_modules/source-map-js": { 1490 | "version": "1.2.1", 1491 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1492 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1493 | "peer": true, 1494 | "engines": { 1495 | "node": ">=0.10.0" 1496 | } 1497 | }, 1498 | "node_modules/svelte": { 1499 | "version": "4.2.19", 1500 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", 1501 | "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", 1502 | "peer": true, 1503 | "dependencies": { 1504 | "@ampproject/remapping": "^2.2.1", 1505 | "@jridgewell/sourcemap-codec": "^1.4.15", 1506 | "@jridgewell/trace-mapping": "^0.3.18", 1507 | "@types/estree": "^1.0.1", 1508 | "acorn": "^8.9.0", 1509 | "aria-query": "^5.3.0", 1510 | "axobject-query": "^4.0.0", 1511 | "code-red": "^1.0.3", 1512 | "css-tree": "^2.3.1", 1513 | "estree-walker": "^3.0.3", 1514 | "is-reference": "^3.0.1", 1515 | "locate-character": "^3.0.0", 1516 | "magic-string": "^0.30.4", 1517 | "periscopic": "^3.1.0" 1518 | }, 1519 | "engines": { 1520 | "node": ">=16" 1521 | } 1522 | }, 1523 | "node_modules/svelte-hmr": { 1524 | "version": "0.16.0", 1525 | "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", 1526 | "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", 1527 | "dev": true, 1528 | "license": "ISC", 1529 | "peer": true, 1530 | "engines": { 1531 | "node": "^12.20 || ^14.13.1 || >= 16" 1532 | }, 1533 | "peerDependencies": { 1534 | "svelte": "^3.19.0 || ^4.0.0" 1535 | } 1536 | }, 1537 | "node_modules/svelte2tsx": { 1538 | "version": "0.7.13", 1539 | "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.13.tgz", 1540 | "integrity": "sha512-aObZ93/kGAiLXA/I/kP+x9FriZM+GboB/ReOIGmLNbVGEd2xC+aTCppm3mk1cc9I/z60VQf7b2QDxC3jOXu3yw==", 1541 | "dev": true, 1542 | "license": "MIT", 1543 | "dependencies": { 1544 | "dedent-js": "^1.0.1", 1545 | "pascal-case": "^3.1.1" 1546 | }, 1547 | "peerDependencies": { 1548 | "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", 1549 | "typescript": "^4.9.4 || ^5.0.0" 1550 | } 1551 | }, 1552 | "node_modules/tiny-glob": { 1553 | "version": "0.2.9", 1554 | "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", 1555 | "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", 1556 | "dev": true, 1557 | "license": "MIT", 1558 | "dependencies": { 1559 | "globalyzer": "0.1.0", 1560 | "globrex": "^0.1.2" 1561 | } 1562 | }, 1563 | "node_modules/to-regex-range": { 1564 | "version": "5.0.1", 1565 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1566 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1567 | "dev": true, 1568 | "license": "MIT", 1569 | "dependencies": { 1570 | "is-number": "^7.0.0" 1571 | }, 1572 | "engines": { 1573 | "node": ">=8.0" 1574 | } 1575 | }, 1576 | "node_modules/totalist": { 1577 | "version": "3.0.1", 1578 | "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", 1579 | "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", 1580 | "dev": true, 1581 | "engines": { 1582 | "node": ">=6" 1583 | } 1584 | }, 1585 | "node_modules/tslib": { 1586 | "version": "2.6.3", 1587 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", 1588 | "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", 1589 | "dev": true, 1590 | "license": "0BSD" 1591 | }, 1592 | "node_modules/typescript": { 1593 | "version": "5.5.3", 1594 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", 1595 | "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", 1596 | "dev": true, 1597 | "license": "Apache-2.0", 1598 | "bin": { 1599 | "tsc": "bin/tsc", 1600 | "tsserver": "bin/tsserver" 1601 | }, 1602 | "engines": { 1603 | "node": ">=14.17" 1604 | } 1605 | }, 1606 | "node_modules/vite": { 1607 | "version": "5.4.18", 1608 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.18.tgz", 1609 | "integrity": "sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==", 1610 | "dev": true, 1611 | "license": "MIT", 1612 | "peer": true, 1613 | "dependencies": { 1614 | "esbuild": "^0.21.3", 1615 | "postcss": "^8.4.43", 1616 | "rollup": "^4.20.0" 1617 | }, 1618 | "bin": { 1619 | "vite": "bin/vite.js" 1620 | }, 1621 | "engines": { 1622 | "node": "^18.0.0 || >=20.0.0" 1623 | }, 1624 | "funding": { 1625 | "url": "https://github.com/vitejs/vite?sponsor=1" 1626 | }, 1627 | "optionalDependencies": { 1628 | "fsevents": "~2.3.3" 1629 | }, 1630 | "peerDependencies": { 1631 | "@types/node": "^18.0.0 || >=20.0.0", 1632 | "less": "*", 1633 | "lightningcss": "^1.21.0", 1634 | "sass": "*", 1635 | "sass-embedded": "*", 1636 | "stylus": "*", 1637 | "sugarss": "*", 1638 | "terser": "^5.4.0" 1639 | }, 1640 | "peerDependenciesMeta": { 1641 | "@types/node": { 1642 | "optional": true 1643 | }, 1644 | "less": { 1645 | "optional": true 1646 | }, 1647 | "lightningcss": { 1648 | "optional": true 1649 | }, 1650 | "sass": { 1651 | "optional": true 1652 | }, 1653 | "sass-embedded": { 1654 | "optional": true 1655 | }, 1656 | "stylus": { 1657 | "optional": true 1658 | }, 1659 | "sugarss": { 1660 | "optional": true 1661 | }, 1662 | "terser": { 1663 | "optional": true 1664 | } 1665 | } 1666 | }, 1667 | "node_modules/vitefu": { 1668 | "version": "0.2.5", 1669 | "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", 1670 | "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", 1671 | "dev": true, 1672 | "license": "MIT", 1673 | "peer": true, 1674 | "peerDependencies": { 1675 | "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" 1676 | }, 1677 | "peerDependenciesMeta": { 1678 | "vite": { 1679 | "optional": true 1680 | } 1681 | } 1682 | } 1683 | } 1684 | } 1685 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-micro", 3 | "version": "2.5.7", 4 | "description": "Light & reactive router for Svelte", 5 | "author": "ayndqy", 6 | "license": "MIT", 7 | "homepage": "https://github.com/ayndqy/svelte-micro#readme", 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/ayndqy/svelte-micro.git" 11 | }, 12 | "bugs": { 13 | "url": "https://github.com/ayndqy/svelte-micro/issues" 14 | }, 15 | "keywords": [ 16 | "svelte", 17 | "router" 18 | ], 19 | "type": "module", 20 | "main": "./dist/index.js", 21 | "svelte": "./dist/index.js", 22 | "types": "./dist/index.d.ts", 23 | "exports": { 24 | "./package.json": "./package.json", 25 | ".": { 26 | "types": "./dist/index.d.ts", 27 | "default": "./dist/index.js", 28 | "svelte": "./dist/index.js" 29 | } 30 | }, 31 | "scripts": { 32 | "build": "npx svelte-kit sync && npx svelte-package --input ./src --output ./dist --types", 33 | "prepublishOnly": "npm run build" 34 | }, 35 | "peerDependencies": { 36 | "svelte": "^3.54.0 || ^4.0.0" 37 | }, 38 | "devDependencies": { 39 | "@sveltejs/kit": "^2.5.0", 40 | "@sveltejs/package": "^2.3.0", 41 | "tslib": "^2.6.0", 42 | "typescript": "^5.5.0" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { router, type Router } from './lib/router' 2 | export { options, type OptionsStore, type Options } from './lib/options' 3 | export { path, type PathStore, type Path } from './lib/location' 4 | export { query, type QueryStore, type Query } from './lib/location' 5 | export { hash, type HashStore, type Hash } from './lib/location' 6 | export { default as Route } from './lib/components/Route.svelte' 7 | export { default as Link } from './lib/components/Link.svelte' 8 | export { linkHandle, type LinkHandle } from './lib/utils/linkHandle' 9 | export { getPathSegments, type GetPathSegments } from './lib/utils/getPathSegments' 10 | -------------------------------------------------------------------------------- /src/lib/components/Link.svelte: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/lib/components/Route.svelte: -------------------------------------------------------------------------------- 1 | 2 | 3 | 98 | 99 | 122 | 123 | {#if isRouteActive(getPathWithoutBase($globalPath, $options.basePath), $route, $contextNestedRoutes)} 124 | 125 | {/if} 126 | -------------------------------------------------------------------------------- /src/lib/location.ts: -------------------------------------------------------------------------------- 1 | import { readable, derived, type Readable } from 'svelte/store' 2 | import { options } from './options' 3 | 4 | export type Path = string 5 | export type Query = string 6 | export type Hash = string 7 | 8 | type Location = { 9 | path: Path 10 | query: Query 11 | hash: Hash 12 | } 13 | 14 | const parseLocation = (fragment: string): Location => { 15 | const pathMatch = fragment.match(/^(\/[^?#]*)?/) 16 | const queryMatch = fragment.match(/\?([^#]*)?/) 17 | const hashMatch = fragment.match(/#(.*)?/) 18 | 19 | return { 20 | path: pathMatch?.[1] || '/', 21 | query: queryMatch?.[1] ? `?${queryMatch?.[1]}` : '', 22 | hash: hashMatch?.[1] ? `#${hashMatch?.[1]}` : '', 23 | } 24 | } 25 | 26 | const getWindowLocation = (): Location => { 27 | const { pathname, search, hash } = document.location 28 | return { path: pathname, query: search, hash: hash } 29 | } 30 | 31 | const getHashLocation = (): Location => { 32 | let hashFragment = document.location.hash.substring(1) 33 | if (hashFragment[0] !== '/') hashFragment = '/' + hashFragment 34 | return parseLocation(hashFragment) 35 | } 36 | 37 | const windowLocation = readable(getWindowLocation(), (set) => { 38 | const handler = () => set(getWindowLocation()) 39 | window.addEventListener('popstate', handler) 40 | return () => window.removeEventListener('popstate', handler) 41 | }) 42 | 43 | const hashLocation = readable(getHashLocation(), (set) => { 44 | const handler = () => set(getHashLocation()) 45 | window.addEventListener('hashchange', handler) 46 | return () => window.removeEventListener('hashchange', handler) 47 | }) 48 | 49 | const selectedLocation: Readable = derived( 50 | [options, windowLocation, hashLocation], 51 | ([$options, $windowLocation, $hashLocation], set) => { 52 | if ($options.mode === 'window') set($windowLocation) 53 | if ($options.mode === 'hash') set($hashLocation) 54 | } 55 | ) 56 | 57 | export type PathStore = Readable 58 | export type QueryStore = Readable 59 | export type HashStore = Readable 60 | 61 | export const path: PathStore = derived(selectedLocation, ($location) => $location.path) 62 | export const query: QueryStore = derived(selectedLocation, ($location) => $location.query) 63 | export const hash: HashStore = derived(selectedLocation, ($location) => $location.hash) 64 | -------------------------------------------------------------------------------- /src/lib/options.ts: -------------------------------------------------------------------------------- 1 | import { writable, type Readable } from 'svelte/store' 2 | 3 | export type Options = { 4 | mode: 'window' | 'hash' 5 | basePath: null | string 6 | } 7 | 8 | export type OptionsStore = { 9 | subscribe: Readable['subscribe'] 10 | set: (changedOptions: Partial) => void 11 | } 12 | 13 | const createOptions = (initialValues: Options): OptionsStore => { 14 | const { subscribe, update } = writable(initialValues) 15 | 16 | return { 17 | subscribe, 18 | 19 | set: (changedOptions = {}) => { 20 | update((options) => Object.assign(options, changedOptions)) 21 | }, 22 | } 23 | } 24 | 25 | export const options = createOptions({ 26 | mode: 'window', 27 | basePath: null, 28 | }) 29 | -------------------------------------------------------------------------------- /src/lib/router.ts: -------------------------------------------------------------------------------- 1 | import { get } from 'svelte/store' 2 | import { options, type Options } from './options' 3 | 4 | const dispatchLocationChange = (mode: Options['mode'] = get(options).mode): void => { 5 | let type: string = 'popstate' 6 | 7 | if (mode === 'window') type = 'popstate' 8 | if (mode === 'hash') type = 'hashchange' 9 | 10 | window.dispatchEvent(new Event(type)) 11 | } 12 | 13 | export type Router = { 14 | go: (delta?: number) => void 15 | push: (url?: string | URL | null, state?: any) => void 16 | replace: (url?: string | URL | null, state?: any) => void 17 | } 18 | 19 | export const router: Router = { 20 | go: (delta: number = 0) => { 21 | history.go(delta) 22 | dispatchLocationChange() 23 | }, 24 | 25 | push: (url, state = null) => { 26 | history.pushState(state, '', url) 27 | dispatchLocationChange() 28 | }, 29 | 30 | replace: (url, state = null) => { 31 | history.replaceState(state, '', url) 32 | dispatchLocationChange() 33 | }, 34 | } 35 | -------------------------------------------------------------------------------- /src/lib/utils/createIdIssuer.ts: -------------------------------------------------------------------------------- 1 | export type CreateIdIssuer = () => () => number 2 | 3 | export const createIdIssuer: CreateIdIssuer = () => { 4 | let id = 0 5 | return () => id++ 6 | } 7 | -------------------------------------------------------------------------------- /src/lib/utils/getPathSegments.ts: -------------------------------------------------------------------------------- 1 | export type GetPathSegments = (path: string) => string[] 2 | 3 | export const getPathSegments: GetPathSegments = (path) => { 4 | return path.split(/(?=\/)/) 5 | } 6 | -------------------------------------------------------------------------------- /src/lib/utils/getPathWithoutBase.ts: -------------------------------------------------------------------------------- 1 | export type GetPathWithoutBase = (path: string, basePath: string | null) => string 2 | 3 | export const getPathWithoutBase: GetPathWithoutBase = (path, basePath) => { 4 | if (basePath === null) return path 5 | return path.startsWith(basePath) ? path.slice(basePath.length) : path 6 | } 7 | -------------------------------------------------------------------------------- /src/lib/utils/linkHandle.ts: -------------------------------------------------------------------------------- 1 | import type { Action } from 'svelte/action' 2 | import { router } from '../router' 3 | 4 | export const linkClickHandler = (event: MouseEvent): boolean | void => { 5 | const target = (event.target as HTMLElement)?.closest('a[href]') as HTMLAnchorElement 6 | const href = target?.href 7 | 8 | if (target === null || href === null) return true 9 | 10 | const isIgnored = ['', 'true'].includes(target.getAttribute('data-handle-ignore') ?? 'false') 11 | const isTargetNonSelf = (target.getAttribute('target') ?? '_self') !== '_self' 12 | const isKeyPressed = event.metaKey || event.ctrlKey || event.altKey || event.shiftKey 13 | const isExternalOrigin = new URL(href).origin !== document.location.origin 14 | 15 | if (isIgnored || isTargetNonSelf || isKeyPressed || isExternalOrigin) return true 16 | 17 | href === document.location.href ? router.replace(href) : router.push(href) 18 | event.preventDefault() 19 | } 20 | 21 | export type LinkHandle = Action 22 | 23 | export const linkHandle: LinkHandle = (node) => { 24 | node.addEventListener('click', linkClickHandler) 25 | 26 | return { 27 | destroy: () => { 28 | node.removeEventListener('click', linkClickHandler) 29 | }, 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' 2 | 3 | /** @type {import('@sveltejs/kit').Config} */ 4 | const config = { 5 | preprocess: vitePreprocess(), 6 | } 7 | 8 | export default config 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | 4 | "compilerOptions": { 5 | "strict": true, 6 | "forceConsistentCasingInFileNames": true 7 | } 8 | } 9 | --------------------------------------------------------------------------------