├── .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 |
45 | Home
46 | Portfolio
47 | Our story
48 | Github
49 |
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 | Hello from modal!
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 | {isUserAuthenticated ? "Log out" : "Log in"}
379 |
380 |
381 | {#if isUserAuthenticated}
382 |
383 | Welcome!
384 | Log out
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 |
--------------------------------------------------------------------------------