├── .eslintignore ├── .eslintrc.cjs ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── Caddyfile ├── README.md ├── env.example ├── package.json ├── playwright.config.ts ├── pnpm-lock.yaml ├── postcss.config.cjs ├── src ├── app.css ├── app.d.ts ├── app.html ├── content │ ├── first-list-item.md │ ├── full-list.md │ ├── list.md │ ├── record.md │ └── user.md ├── hooks.server.ts ├── index.test.ts ├── lib │ ├── FirstListItem.svelte │ ├── FullList.svelte │ ├── List.svelte │ ├── Pagination.svelte │ ├── Record.svelte │ ├── User.svelte │ ├── index.ts │ └── stores.ts └── routes │ ├── +layout.svelte │ ├── +page.svelte │ ├── +page.ts │ ├── [slug] │ ├── +page.svelte │ └── +page.ts │ ├── intro.md │ ├── login │ ├── +page.server.ts │ └── +page.svelte │ ├── logout │ └── +page.server.ts │ └── secret │ ├── +page.md │ └── +page.server.ts ├── static └── favicon.png ├── svelte.config.js ├── tailwind.config.cjs ├── tests └── test.ts ├── tsconfig.json └── vite.config.js /.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: '@typescript-eslint/parser', 4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], 5 | plugins: ['svelte3', '@typescript-eslint'], 6 | ignorePatterns: ['*.cjs'], 7 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 8 | settings: { 9 | 'svelte3/typescript': () => require('typescript') 10 | }, 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020 14 | }, 15 | env: { 16 | browser: true, 17 | es2017: true, 18 | node: true 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | vite.config.js.timestamp-* 10 | vite.config.ts.timestamp-* 11 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "pluginSearchDirs": ["."], 8 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 9 | } 10 | -------------------------------------------------------------------------------- /Caddyfile: -------------------------------------------------------------------------------- 1 | svelte.localhost { 2 | reverse_proxy localhost:5173 3 | } 4 | 5 | # pb.localhost { 6 | # reverse_proxy localhost:8090 7 | # } 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # svelte-pocketbase 2 | 3 | > Hold up! This library is currently experimental, and in early 4 | > development. Be careful if you intend on using this in production. 5 | 6 | **Supercharge your Sveltekit + PocketBase project!** 7 | 8 | **Svelte-Pocketbase** is the perfect companion to your next Sveltekit + PocketBase project. This library provides declarative components that effortlessly query data from your PocketBase database. 9 | 10 | ## Getting Started 11 | 12 | ```bash 13 | # install svelte-pocketbase with pnpm, npm or yarn 14 | pnpm i -D svelte-pocketbase 15 | ``` 16 | 17 | ## PocketBase Store 18 | 19 | To get started, instantiate a new `pbStore` in a `+page.svelte` or `+layout.svelte`. 20 | 21 | ```typescript 22 | // src/+layout.svelte OR src/+page.svelte 23 | 24 | 31 | 32 | 33 | ``` 34 | 35 | The `pbStore` is the ultimate marriage of PocketBase and Svelte `Writable` magic! Simply create an instance of `pbStore` and you've got a PocketBase instance wrapped up in a shiny svelte store. Need to use it in your app? No problem! Just subscribe to `$pbStore` and you're good to go. 36 | 37 | ```typescript 38 | // src/+page.svelte 39 | 45 | 46 | {#await record} 47 | Loading... 48 | {:then data} 49 |
{JSON.stringify(data, null, 2)}
50 | {:catch error} 51 |

{error.message}

52 | {/await} 53 | ``` 54 | 55 | This is a fair amount of boilerplate for simply retrieving a bit of data from your database. Instead, maybe try out one of the data retrieval components, like `Record`. These components handle all the tedious bits of querying and data retrieval, leaving you free to focus on more important things (like obsessively fine-tuning your Tailwind CSS config). 56 | 57 | ### Components 58 | 59 | - `Record` 60 | - `List` 61 | - `FullList` 62 | - `FirstListItem` 63 | 64 | Every data retrieval component receives a `collection` prop, and an optional `query` prop that can be used to sort and filter the results. Each component also contains an `error` slot that can be used to notify the user. 65 | 66 | ## Retrieving Data 67 | 68 | ### Individual Records by ID 69 | 70 | ```typescript 71 | 74 | 75 | 76 | Loading... 77 |
{JSON.stringify(record, null, 2)}
78 | {error} 79 |
80 | ``` 81 | 82 | The `Record` component is intended to retrieve single records from your database by their `RECORD_ID`. 83 | 84 | Simply pass in the name of the collection to the `collection` prop and a `RECORD_ID` to the `id` prop and let the component do the heavy lifting. 85 | 86 | You can also pass an `HTMLElement` into the `loading` slot in the event that your server is being naughty, and you need to keep your audience captivated with a fancy loading element. 87 | 88 | Want to access the data? No problem, just use the handy `let:record` directive. 89 | 90 | As an extra sprinkle of magic, there is no need to fuss about with `{ #await }` blocks. The `Record` component, along with all other data components handle the async action for you! 91 | 92 | ### Paginated Lists 93 | 94 | ```typescript 95 | 104 | 105 | 106 | {#each items as item} 107 |

{item.title}

108 | {/each} 109 | {#each pages as pageNumber} 110 | 111 | {/each} 112 |
{JSON.stringify(items, null, 2)}
113 | {error} 114 |
115 | ``` 116 | 117 | Need to retrieve a list of records from your PocketBase database? Check out the `List` component! You can easily paginate through your data just like you would with the `getList` function in the PocketBase JavaScript SDK. 118 | 119 | The component defaults to displaying 50 records per page, starting at page 1, but you can customize the current page and results per page to fit your needs using the `page` and `perPage` props. 120 | 121 | #### Declarative Pagination 122 | 123 | You can even break the `List` down even further using the `Pagination` helper to cut down on the { #each } blocks within your markup. Simply pass your items array into the `items`. The component will loop over any items in the array, and expose the individual item data via the `let:item` directive. 124 | 125 | You can also pass content to the `pages slot` provided that you also include a pages array to the `pages` prop. This is helpful if you want to have a list of pagination buttons. The `pages slot` is optional, since you may want to provide your own pagination navigation. 126 | 127 | ```typescript 128 | 138 | 139 | 140 | 141 |

{item.title}

142 | 143 |
144 | {error} 145 |
146 | ``` 147 | 148 | ### Full List 149 | 150 | ```typescript 151 | 154 | 155 | 156 | {#each records as record} 157 |

{record.title}

158 | {/each} 159 | {error} 160 |
161 | ``` 162 | 163 | If you want to retrieve all records from a collection as you would using the `getFullList` function, you can use the `FullList` component. 164 | 165 | By default, the component will return a `batch` of 100 records, but you are free to increase or decrease this to fit your specific needs. 166 | 167 | ### First Item Within a List 168 | 169 | ```typescript 170 | 173 | 174 | 178 |

{record.title}

179 | {error} 180 |
181 | ``` 182 | 183 | If you are looking to find that one specific record that matches a certain parameter, the `FirstListItem` component has got your back! Set the `collection` prop and provide a `filter`, and it will return the first record that fits the bill. It's like the `firstListItem` function, but without all the chaining. 184 | 185 | ## Conditional User Rendering 186 | 187 | ```typescript 188 | 191 | 192 | 193 |
194 |

Name: {user?.name}

195 |

Email: {user?.email}

196 |
197 |
198 |
  • Log in
  • 199 |
  • Register
  • 200 |
    201 |
    202 | 203 | ``` 204 | 205 | Need to show (or hide) certain parts of your UI based on a user's authentication status? Simply wrap any content you want to conditionally render with the `User` component, and it will only appear if there is a valid user object in the `authStore`. 206 | 207 | If you want a fallback element for signed-out users? Just assign it to the `signedout` slot. 208 | 209 | Also, if you want to render a placeholder during the loading phase, assign an element to the `loading slot` as we do for all other components. 210 | 211 | To access the user's data, just use the `let:user` directive to pass it down to any child elements. 212 | 213 | ### Protecting Specific Routes 214 | 215 | The User component is pretty sweet, but it is not a sufficient method for protecting critical areas of your application. If you need to protect specific routes, you should consider using a `hooks.server.(ts|js)` alongside `load` functions inside your `+page.server.(ts|js)`. 216 | 217 | To save you the hassle of looking it up yourself, I've included a few examples below that can help get you started. 218 | 219 | #### hooks.server.ts 220 | 221 | ```typescript 222 | // src/hooks.server.ts 223 | 224 | import { env } from '$env/dynamic/public'; 225 | import type { Handle } from '@sveltejs/kit'; 226 | import PocketBase from 'pocketbase'; 227 | 228 | export const handle: Handle = async ({ event, resolve }) => { 229 | event.locals.pb = new PocketBase(env.PUBLIC_POCKETBASE_URL); 230 | 231 | // Grab the cookie from request headers 232 | const cookie = event.request.headers.get('cookie'); 233 | 234 | // load the store data from the request cookie string 235 | event.locals.pb.authStore.loadFromCookie(cookie || ''); 236 | 237 | try { 238 | // get an up-to-date auth store state by verifying and refreshing 239 | // the loaded auth model (if any) 240 | event.locals.pb.authStore.isValid && (await event.locals.pb.collection('users').authRefresh()); 241 | } catch (_) { 242 | // clear the auth store on failed refresh 243 | event.locals.pb.authStore.clear(); 244 | } 245 | 246 | const response = await resolve(event); 247 | 248 | // send back the default 'pb_auth' cookie to the client with the 249 | // latest store state 250 | response.headers.set('set-cookie', event.locals.pb.authStore.exportToCookie()); 251 | 252 | return response; 253 | }; 254 | ``` 255 | 256 | #### +page.server.ts 257 | 258 | ```typescript 259 | // src/routes/protected-route/+page.server.ts 260 | 261 | import { redirect } from '@sveltejs/kit'; 262 | import type { PageServerLoad } from './$types'; 263 | 264 | export const load = (({ locals }) => { 265 | // check to see if the user is authenticated 266 | if (!locals.pb.authStore.isValid) { 267 | // if not, redirect them to "/login" 268 | throw redirect(303, '/login'); 269 | } 270 | }) satisfies PageServerLoad; 271 | ``` 272 | 273 | ## Contribute 274 | 275 | This library is still very much work-in-progress. As mentioned before, you may want to avoid using this in a production setting until things are a bit more polished. I hope to add additional features such as realtime features and CRUD helpers in the near future. 276 | 277 | Feel free to contribute to this project if you have ideas or suggestions for improvements. 278 | -------------------------------------------------------------------------------- /env.example: -------------------------------------------------------------------------------- 1 | PUBLIC_POCKETBASE_URL=http://127.0.0.1:8090 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-pocketbase", 3 | "version": "0.0.4", 4 | "author": "CREEK", 5 | "license": "MIT", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/creekdrops/svelte-pocketbase" 9 | }, 10 | "scripts": { 11 | "dev": "vite dev", 12 | "build": "svelte-kit sync && svelte-package", 13 | "prepublishOnly": "echo 'Did you mean to publish `./package/`, instead of `./`?' && exit 1", 14 | "test": "playwright test", 15 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 16 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 17 | "test:unit": "vitest", 18 | "lint": "prettier --plugin-search-dir . --check . && eslint .", 19 | "format": "prettier --plugin-search-dir . --write ." 20 | }, 21 | "devDependencies": { 22 | "@playwright/test": "^1.28.1", 23 | "@sveltejs/adapter-auto": "^1.0.0", 24 | "@sveltejs/kit": "^1.0.0", 25 | "@sveltejs/package": "^1.0.0", 26 | "@types/prismjs": "^1.26.0", 27 | "@typescript-eslint/eslint-plugin": "^5.45.0", 28 | "@typescript-eslint/parser": "^5.45.0", 29 | "autoprefixer": "^10.4.13", 30 | "daisyui": "^2.46.1", 31 | "eslint": "^8.28.0", 32 | "eslint-config-prettier": "^8.5.0", 33 | "eslint-plugin-svelte3": "^4.0.0", 34 | "mdsvex": "^0.9.8", 35 | "postcss": "^8.4.21", 36 | "prettier": "^2.8.0", 37 | "prettier-plugin-svelte": "^2.8.1", 38 | "prismjs": "^1.29.0", 39 | "svelte": "^3.54.0", 40 | "svelte-check": "^2.9.2", 41 | "tailwindcss": "^3.2.4", 42 | "tslib": "^2.4.1", 43 | "typescript": "^4.9.3", 44 | "vite": "^4.0.0", 45 | "vitest": "^0.25.3" 46 | }, 47 | "type": "module", 48 | "dependencies": { 49 | "pocketbase": "^0.9.1" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import type { PlaywrightTestConfig } from '@playwright/test'; 2 | 3 | const config: PlaywrightTestConfig = { 4 | webServer: { 5 | command: 'npm run build && npm run preview', 6 | port: 4173 7 | }, 8 | testDir: 'tests' 9 | }; 10 | 11 | export default config; 12 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@playwright/test': ^1.28.1 5 | '@sveltejs/adapter-auto': ^1.0.0 6 | '@sveltejs/kit': ^1.0.0 7 | '@sveltejs/package': ^1.0.0 8 | '@types/prismjs': ^1.26.0 9 | '@typescript-eslint/eslint-plugin': ^5.45.0 10 | '@typescript-eslint/parser': ^5.45.0 11 | autoprefixer: ^10.4.13 12 | daisyui: ^2.46.1 13 | eslint: ^8.28.0 14 | eslint-config-prettier: ^8.5.0 15 | eslint-plugin-svelte3: ^4.0.0 16 | mdsvex: ^0.9.8 17 | pocketbase: ^0.9.1 18 | postcss: ^8.4.21 19 | prettier: ^2.8.0 20 | prettier-plugin-svelte: ^2.8.1 21 | prismjs: ^1.29.0 22 | svelte: ^3.54.0 23 | svelte-check: ^2.9.2 24 | tailwindcss: ^3.2.4 25 | tslib: ^2.4.1 26 | typescript: ^4.9.3 27 | vite: ^4.0.0 28 | vitest: ^0.25.3 29 | 30 | dependencies: 31 | pocketbase: 0.9.1 32 | 33 | devDependencies: 34 | '@playwright/test': 1.29.1 35 | '@sveltejs/adapter-auto': 1.0.0_@sveltejs+kit@1.0.1 36 | '@sveltejs/kit': 1.0.1_svelte@3.55.0+vite@4.0.4 37 | '@sveltejs/package': 1.0.1_niwyv7xychq2ag6arq5eqxbomm 38 | '@types/prismjs': 1.26.0 39 | '@typescript-eslint/eslint-plugin': 5.48.0_k73wpmdolxikpyqun3p36akaaq 40 | '@typescript-eslint/parser': 5.48.0_iukboom6ndih5an6iafl45j2fe 41 | autoprefixer: 10.4.13_postcss@8.4.21 42 | daisyui: 2.46.1_gbtt6ss3tbiz4yjtvdr6fbrj44 43 | eslint: 8.31.0 44 | eslint-config-prettier: 8.6.0_eslint@8.31.0 45 | eslint-plugin-svelte3: 4.0.0_6go7qzsvzihesfwmyvq3tnl5qq 46 | mdsvex: 0.9.8_svelte@3.55.0 47 | postcss: 8.4.21 48 | prettier: 2.8.1 49 | prettier-plugin-svelte: 2.9.0_ajxj753sv7dbwexjherrch25ta 50 | prismjs: 1.29.0 51 | svelte: 3.55.0 52 | svelte-check: 2.10.3_77wbasr76lhjripnylrva3hecy 53 | tailwindcss: 3.2.4_postcss@8.4.21 54 | tslib: 2.4.1 55 | typescript: 4.9.4 56 | vite: 4.0.4 57 | vitest: 0.25.8 58 | 59 | packages: 60 | 61 | /@esbuild/android-arm/0.16.14: 62 | resolution: {integrity: sha512-u0rITLxFIeYAvtJXBQNhNuV4YZe+MD1YvIWT7Nicj8hZAtRVZk2PgNH6KclcKDVHz1ChLKXRfX7d7tkbQBUfrg==} 63 | engines: {node: '>=12'} 64 | cpu: [arm] 65 | os: [android] 66 | requiresBuild: true 67 | dev: true 68 | optional: true 69 | 70 | /@esbuild/android-arm64/0.16.14: 71 | resolution: {integrity: sha512-hTqB6Iq13pW4xaydeqQrs8vPntUnMjbkq+PgGiBMi69eYk74naG2ftHWqKnxn874kNrt5Or3rQ0PJutx2doJuQ==} 72 | engines: {node: '>=12'} 73 | cpu: [arm64] 74 | os: [android] 75 | requiresBuild: true 76 | dev: true 77 | optional: true 78 | 79 | /@esbuild/android-x64/0.16.14: 80 | resolution: {integrity: sha512-jir51K4J0K5Rt0KOcippjSNdOl7akKDVz5I6yrqdk4/m9y+rldGptQUF7qU4YpX8U61LtR+w2Tu2Ph+K/UaJOw==} 81 | engines: {node: '>=12'} 82 | cpu: [x64] 83 | os: [android] 84 | requiresBuild: true 85 | dev: true 86 | optional: true 87 | 88 | /@esbuild/darwin-arm64/0.16.14: 89 | resolution: {integrity: sha512-vrlaP81IuwPaw1fyX8fHCmivP3Gr73ojVEZy+oWJLAiZVcG8o8Phwun/XDnYIFUHxIoUnMFEpg9o38MIvlw8zw==} 90 | engines: {node: '>=12'} 91 | cpu: [arm64] 92 | os: [darwin] 93 | requiresBuild: true 94 | dev: true 95 | optional: true 96 | 97 | /@esbuild/darwin-x64/0.16.14: 98 | resolution: {integrity: sha512-KV1E01eC2hGYA2qzFDRCK4wdZCRUvMwCNcobgpiiOzp5QXpJBqFPdxI69j8vvzuU7oxFXDgANwEkXvpeQqyOyg==} 99 | engines: {node: '>=12'} 100 | cpu: [x64] 101 | os: [darwin] 102 | requiresBuild: true 103 | dev: true 104 | optional: true 105 | 106 | /@esbuild/freebsd-arm64/0.16.14: 107 | resolution: {integrity: sha512-xRM1RQsazSvL42BNa5XC7ytD4ZDp0ZyJcH7aB0SlYUcHexJUKiDNKR7dlRVlpt6W0DvoRPU2nWK/9/QWS4u2fw==} 108 | engines: {node: '>=12'} 109 | cpu: [arm64] 110 | os: [freebsd] 111 | requiresBuild: true 112 | dev: true 113 | optional: true 114 | 115 | /@esbuild/freebsd-x64/0.16.14: 116 | resolution: {integrity: sha512-7ALTAn6YRRf1O6fw9jmn0rWmOx3XfwDo7njGtjy1LXhDGUjTY/vohEPM3ii5MQ411vJv1r498EEx2aBQTJcrEw==} 117 | engines: {node: '>=12'} 118 | cpu: [x64] 119 | os: [freebsd] 120 | requiresBuild: true 121 | dev: true 122 | optional: true 123 | 124 | /@esbuild/linux-arm/0.16.14: 125 | resolution: {integrity: sha512-X6xULug66ulrr4IzrW7qq+eq9n4MtEyagdWvj4o4cmWr+JXOT47atjpDF9j5M2zHY0UQBmqnHhwl+tXpkpIb2w==} 126 | engines: {node: '>=12'} 127 | cpu: [arm] 128 | os: [linux] 129 | requiresBuild: true 130 | dev: true 131 | optional: true 132 | 133 | /@esbuild/linux-arm64/0.16.14: 134 | resolution: {integrity: sha512-TLh2OcbBUQcMYRH4GbiDkDZfZ4t1A3GgmeXY27dHSI6xrU7IkO00MGBiJySmEV6sH3Wa6pAN6UtaVL0DwkGW4Q==} 135 | engines: {node: '>=12'} 136 | cpu: [arm64] 137 | os: [linux] 138 | requiresBuild: true 139 | dev: true 140 | optional: true 141 | 142 | /@esbuild/linux-ia32/0.16.14: 143 | resolution: {integrity: sha512-oBZkcZ56UZDFCAfE3Fd/Jgy10EoS7Td77NzNGenM+HSY8BkdQAcI9VF9qgwdOLZ+tuftWD7UqZ26SAhtvA3XhA==} 144 | engines: {node: '>=12'} 145 | cpu: [ia32] 146 | os: [linux] 147 | requiresBuild: true 148 | dev: true 149 | optional: true 150 | 151 | /@esbuild/linux-loong64/0.16.14: 152 | resolution: {integrity: sha512-udz/aEHTcuHP+xdWOJmZ5C9RQXHfZd/EhCnTi1Hfay37zH3lBxn/fNs85LA9HlsniFw2zccgcbrrTMKk7Cn1Qg==} 153 | engines: {node: '>=12'} 154 | cpu: [loong64] 155 | os: [linux] 156 | requiresBuild: true 157 | dev: true 158 | optional: true 159 | 160 | /@esbuild/linux-mips64el/0.16.14: 161 | resolution: {integrity: sha512-kJ2iEnikUOdC1SiTGbH0fJUgpZwa0ITDTvj9EHf9lm3I0hZ4Yugsb3M6XSl696jVxrEocLe519/8CbSpQWFSrg==} 162 | engines: {node: '>=12'} 163 | cpu: [mips64el] 164 | os: [linux] 165 | requiresBuild: true 166 | dev: true 167 | optional: true 168 | 169 | /@esbuild/linux-ppc64/0.16.14: 170 | resolution: {integrity: sha512-kclKxvZvX5YhykwlJ/K9ljiY4THe5vXubXpWmr7q3Zu3WxKnUe1VOZmhkEZlqtnJx31GHPEV4SIG95IqTdfgfg==} 171 | engines: {node: '>=12'} 172 | cpu: [ppc64] 173 | os: [linux] 174 | requiresBuild: true 175 | dev: true 176 | optional: true 177 | 178 | /@esbuild/linux-riscv64/0.16.14: 179 | resolution: {integrity: sha512-fdwP9Dc+Kx/cZwp9T9kNqjAE/PQjfrxbio4rZ3XnC3cVvZBjuxpkiyu/tuCwt6SbAK5th6AYNjFdEV9kGC020A==} 180 | engines: {node: '>=12'} 181 | cpu: [riscv64] 182 | os: [linux] 183 | requiresBuild: true 184 | dev: true 185 | optional: true 186 | 187 | /@esbuild/linux-s390x/0.16.14: 188 | resolution: {integrity: sha512-++fw3P4fQk9nqvdzbANRqimKspL8pDCnSpXomyhV7V/ISha/BZIYvZwLBWVKp9CVWKwWPJ4ktsezuLIvlJRHqA==} 189 | engines: {node: '>=12'} 190 | cpu: [s390x] 191 | os: [linux] 192 | requiresBuild: true 193 | dev: true 194 | optional: true 195 | 196 | /@esbuild/linux-x64/0.16.14: 197 | resolution: {integrity: sha512-TomtswAuzBf2NnddlrS4W01Tv85RM9YtATB3OugY6On0PLM4Ksz5qvQKVAjtzPKoLgL1FiZtfc8mkZc4IgoMEA==} 198 | engines: {node: '>=12'} 199 | cpu: [x64] 200 | os: [linux] 201 | requiresBuild: true 202 | dev: true 203 | optional: true 204 | 205 | /@esbuild/netbsd-x64/0.16.14: 206 | resolution: {integrity: sha512-U06pfx8P5CqyoPNfqIJmnf+5/r4mJ1S62G4zE6eOjS59naQcxi6GnscUCPH3b+hRG0qdKoGX49RAyiqW+M9aSw==} 207 | engines: {node: '>=12'} 208 | cpu: [x64] 209 | os: [netbsd] 210 | requiresBuild: true 211 | dev: true 212 | optional: true 213 | 214 | /@esbuild/openbsd-x64/0.16.14: 215 | resolution: {integrity: sha512-/Jl8XVaWEZNu9rZw+n792GIBupQwHo6GDoapHSb/2xp/Ku28eK6QpR2O9cPBkzHH4OOoMH0LB6zg/qczJ5TTGg==} 216 | engines: {node: '>=12'} 217 | cpu: [x64] 218 | os: [openbsd] 219 | requiresBuild: true 220 | dev: true 221 | optional: true 222 | 223 | /@esbuild/sunos-x64/0.16.14: 224 | resolution: {integrity: sha512-2iI7D34uTbDn/TaSiUbEHz+fUa8KbN90vX5yYqo12QGpu6T8Jl+kxODsWuMCwoTVlqUpwfPV22nBbFPME9OPtw==} 225 | engines: {node: '>=12'} 226 | cpu: [x64] 227 | os: [sunos] 228 | requiresBuild: true 229 | dev: true 230 | optional: true 231 | 232 | /@esbuild/win32-arm64/0.16.14: 233 | resolution: {integrity: sha512-SjlM7AHmQVTiGBJE/nqauY1aDh80UBsXZ94g4g60CDkrDMseatiqALVcIuElg4ZSYzJs8hsg5W6zS2zLpZTVgg==} 234 | engines: {node: '>=12'} 235 | cpu: [arm64] 236 | os: [win32] 237 | requiresBuild: true 238 | dev: true 239 | optional: true 240 | 241 | /@esbuild/win32-ia32/0.16.14: 242 | resolution: {integrity: sha512-z06t5zqk8ak0Xom5HG81z2iOQ1hNWYsFQp3sczVLVx+dctWdgl80tNRyTbwjaFfui2vFO12dfE3trCTvA+HO4g==} 243 | engines: {node: '>=12'} 244 | cpu: [ia32] 245 | os: [win32] 246 | requiresBuild: true 247 | dev: true 248 | optional: true 249 | 250 | /@esbuild/win32-x64/0.16.14: 251 | resolution: {integrity: sha512-ED1UpWcM6lAbalbbQ9TrGqJh4Y9TaASUvu8bI/0mgJcxhSByJ6rbpgqRhxYMaQ682WfA71nxUreaTO7L275zrw==} 252 | engines: {node: '>=12'} 253 | cpu: [x64] 254 | os: [win32] 255 | requiresBuild: true 256 | dev: true 257 | optional: true 258 | 259 | /@eslint/eslintrc/1.4.1: 260 | resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} 261 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 262 | dependencies: 263 | ajv: 6.12.6 264 | debug: 4.3.4 265 | espree: 9.4.1 266 | globals: 13.19.0 267 | ignore: 5.2.4 268 | import-fresh: 3.3.0 269 | js-yaml: 4.1.0 270 | minimatch: 3.1.2 271 | strip-json-comments: 3.1.1 272 | transitivePeerDependencies: 273 | - supports-color 274 | dev: true 275 | 276 | /@humanwhocodes/config-array/0.11.8: 277 | resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} 278 | engines: {node: '>=10.10.0'} 279 | dependencies: 280 | '@humanwhocodes/object-schema': 1.2.1 281 | debug: 4.3.4 282 | minimatch: 3.1.2 283 | transitivePeerDependencies: 284 | - supports-color 285 | dev: true 286 | 287 | /@humanwhocodes/module-importer/1.0.1: 288 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 289 | engines: {node: '>=12.22'} 290 | dev: true 291 | 292 | /@humanwhocodes/object-schema/1.2.1: 293 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 294 | dev: true 295 | 296 | /@jridgewell/resolve-uri/3.1.0: 297 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 298 | engines: {node: '>=6.0.0'} 299 | dev: true 300 | 301 | /@jridgewell/sourcemap-codec/1.4.14: 302 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 303 | dev: true 304 | 305 | /@jridgewell/trace-mapping/0.3.17: 306 | resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} 307 | dependencies: 308 | '@jridgewell/resolve-uri': 3.1.0 309 | '@jridgewell/sourcemap-codec': 1.4.14 310 | dev: true 311 | 312 | /@nodelib/fs.scandir/2.1.5: 313 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 314 | engines: {node: '>= 8'} 315 | dependencies: 316 | '@nodelib/fs.stat': 2.0.5 317 | run-parallel: 1.2.0 318 | dev: true 319 | 320 | /@nodelib/fs.stat/2.0.5: 321 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 322 | engines: {node: '>= 8'} 323 | dev: true 324 | 325 | /@nodelib/fs.walk/1.2.8: 326 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 327 | engines: {node: '>= 8'} 328 | dependencies: 329 | '@nodelib/fs.scandir': 2.1.5 330 | fastq: 1.15.0 331 | dev: true 332 | 333 | /@playwright/test/1.29.1: 334 | resolution: {integrity: sha512-iQxk2DX5U9wOGV3+/Jh9OHPsw5H3mleUL2S4BgQuwtlAfK3PnKvn38m4Rg9zIViGHVW24opSm99HQm/UFLEy6w==} 335 | engines: {node: '>=14'} 336 | hasBin: true 337 | dependencies: 338 | '@types/node': 18.11.18 339 | playwright-core: 1.29.1 340 | dev: true 341 | 342 | /@polka/url/1.0.0-next.21: 343 | resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} 344 | dev: true 345 | 346 | /@sveltejs/adapter-auto/1.0.0_@sveltejs+kit@1.0.1: 347 | resolution: {integrity: sha512-yKyPvlLVua1bJ/42FrR3X041mFGdB4GzTZOAEoHUcNBRE5Mhx94+eqHpC3hNvAOiLEDcKfVO0ObyKSu7qldU+w==} 348 | peerDependencies: 349 | '@sveltejs/kit': ^1.0.0 350 | dependencies: 351 | '@sveltejs/kit': 1.0.1_svelte@3.55.0+vite@4.0.4 352 | import-meta-resolve: 2.2.0 353 | dev: true 354 | 355 | /@sveltejs/kit/1.0.1_svelte@3.55.0+vite@4.0.4: 356 | resolution: {integrity: sha512-C41aCaDjA7xoUdsrc/lSdU1059UdLPIRE1vEIRRynzpMujNgp82bTMHkDosb6vykH6LrLf3tT2w2/5NYQhKYGQ==} 357 | engines: {node: ^16.14 || >=18} 358 | hasBin: true 359 | requiresBuild: true 360 | peerDependencies: 361 | svelte: ^3.54.0 362 | vite: ^4.0.0 363 | dependencies: 364 | '@sveltejs/vite-plugin-svelte': 2.0.2_svelte@3.55.0+vite@4.0.4 365 | '@types/cookie': 0.5.1 366 | cookie: 0.5.0 367 | devalue: 4.2.0 368 | esm-env: 1.0.0 369 | kleur: 4.1.5 370 | magic-string: 0.27.0 371 | mime: 3.0.0 372 | sade: 1.8.1 373 | set-cookie-parser: 2.5.1 374 | sirv: 2.0.2 375 | svelte: 3.55.0 376 | tiny-glob: 0.2.9 377 | undici: 5.14.0 378 | vite: 4.0.4 379 | transitivePeerDependencies: 380 | - supports-color 381 | dev: true 382 | 383 | /@sveltejs/package/1.0.1_niwyv7xychq2ag6arq5eqxbomm: 384 | resolution: {integrity: sha512-iYoDz4AEJQUfdKUfBcwtYEGYkf4NMByQL3Sl2ESnu+IXsLNsHvhH0zUDhAmUmAgcrH8fVjiR7FuJeyh+7EQtiw==} 385 | engines: {node: ^16.14 || >=18} 386 | hasBin: true 387 | peerDependencies: 388 | svelte: ^3.44.0 389 | dependencies: 390 | chokidar: 3.5.3 391 | kleur: 4.1.5 392 | sade: 1.8.1 393 | svelte: 3.55.0 394 | svelte2tsx: 0.5.23_niwyv7xychq2ag6arq5eqxbomm 395 | transitivePeerDependencies: 396 | - typescript 397 | dev: true 398 | 399 | /@sveltejs/vite-plugin-svelte/2.0.2_svelte@3.55.0+vite@4.0.4: 400 | resolution: {integrity: sha512-xCEan0/NNpQuL0l5aS42FjwQ6wwskdxC3pW1OeFtEKNZwRg7Evro9lac9HesGP6TdFsTv2xMes5ASQVKbCacxg==} 401 | engines: {node: ^14.18.0 || >= 16} 402 | peerDependencies: 403 | svelte: ^3.54.0 404 | vite: ^4.0.0 405 | dependencies: 406 | debug: 4.3.4 407 | deepmerge: 4.2.2 408 | kleur: 4.1.5 409 | magic-string: 0.27.0 410 | svelte: 3.55.0 411 | svelte-hmr: 0.15.1_svelte@3.55.0 412 | vite: 4.0.4 413 | vitefu: 0.2.4_vite@4.0.4 414 | transitivePeerDependencies: 415 | - supports-color 416 | dev: true 417 | 418 | /@types/chai-subset/1.3.3: 419 | resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} 420 | dependencies: 421 | '@types/chai': 4.3.4 422 | dev: true 423 | 424 | /@types/chai/4.3.4: 425 | resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} 426 | dev: true 427 | 428 | /@types/cookie/0.5.1: 429 | resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} 430 | dev: true 431 | 432 | /@types/json-schema/7.0.11: 433 | resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} 434 | dev: true 435 | 436 | /@types/node/18.11.18: 437 | resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} 438 | dev: true 439 | 440 | /@types/prismjs/1.26.0: 441 | resolution: {integrity: sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==} 442 | dev: true 443 | 444 | /@types/pug/2.0.6: 445 | resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} 446 | dev: true 447 | 448 | /@types/sass/1.43.1: 449 | resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} 450 | dependencies: 451 | '@types/node': 18.11.18 452 | dev: true 453 | 454 | /@types/semver/7.3.13: 455 | resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} 456 | dev: true 457 | 458 | /@types/unist/2.0.6: 459 | resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} 460 | dev: true 461 | 462 | /@typescript-eslint/eslint-plugin/5.48.0_k73wpmdolxikpyqun3p36akaaq: 463 | resolution: {integrity: sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==} 464 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 465 | peerDependencies: 466 | '@typescript-eslint/parser': ^5.0.0 467 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 468 | typescript: '*' 469 | peerDependenciesMeta: 470 | typescript: 471 | optional: true 472 | dependencies: 473 | '@typescript-eslint/parser': 5.48.0_iukboom6ndih5an6iafl45j2fe 474 | '@typescript-eslint/scope-manager': 5.48.0 475 | '@typescript-eslint/type-utils': 5.48.0_iukboom6ndih5an6iafl45j2fe 476 | '@typescript-eslint/utils': 5.48.0_iukboom6ndih5an6iafl45j2fe 477 | debug: 4.3.4 478 | eslint: 8.31.0 479 | ignore: 5.2.4 480 | natural-compare-lite: 1.4.0 481 | regexpp: 3.2.0 482 | semver: 7.3.8 483 | tsutils: 3.21.0_typescript@4.9.4 484 | typescript: 4.9.4 485 | transitivePeerDependencies: 486 | - supports-color 487 | dev: true 488 | 489 | /@typescript-eslint/parser/5.48.0_iukboom6ndih5an6iafl45j2fe: 490 | resolution: {integrity: sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==} 491 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 492 | peerDependencies: 493 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 494 | typescript: '*' 495 | peerDependenciesMeta: 496 | typescript: 497 | optional: true 498 | dependencies: 499 | '@typescript-eslint/scope-manager': 5.48.0 500 | '@typescript-eslint/types': 5.48.0 501 | '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4 502 | debug: 4.3.4 503 | eslint: 8.31.0 504 | typescript: 4.9.4 505 | transitivePeerDependencies: 506 | - supports-color 507 | dev: true 508 | 509 | /@typescript-eslint/scope-manager/5.48.0: 510 | resolution: {integrity: sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==} 511 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 512 | dependencies: 513 | '@typescript-eslint/types': 5.48.0 514 | '@typescript-eslint/visitor-keys': 5.48.0 515 | dev: true 516 | 517 | /@typescript-eslint/type-utils/5.48.0_iukboom6ndih5an6iafl45j2fe: 518 | resolution: {integrity: sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==} 519 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 520 | peerDependencies: 521 | eslint: '*' 522 | typescript: '*' 523 | peerDependenciesMeta: 524 | typescript: 525 | optional: true 526 | dependencies: 527 | '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4 528 | '@typescript-eslint/utils': 5.48.0_iukboom6ndih5an6iafl45j2fe 529 | debug: 4.3.4 530 | eslint: 8.31.0 531 | tsutils: 3.21.0_typescript@4.9.4 532 | typescript: 4.9.4 533 | transitivePeerDependencies: 534 | - supports-color 535 | dev: true 536 | 537 | /@typescript-eslint/types/5.48.0: 538 | resolution: {integrity: sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==} 539 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 540 | dev: true 541 | 542 | /@typescript-eslint/typescript-estree/5.48.0_typescript@4.9.4: 543 | resolution: {integrity: sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==} 544 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 545 | peerDependencies: 546 | typescript: '*' 547 | peerDependenciesMeta: 548 | typescript: 549 | optional: true 550 | dependencies: 551 | '@typescript-eslint/types': 5.48.0 552 | '@typescript-eslint/visitor-keys': 5.48.0 553 | debug: 4.3.4 554 | globby: 11.1.0 555 | is-glob: 4.0.3 556 | semver: 7.3.8 557 | tsutils: 3.21.0_typescript@4.9.4 558 | typescript: 4.9.4 559 | transitivePeerDependencies: 560 | - supports-color 561 | dev: true 562 | 563 | /@typescript-eslint/utils/5.48.0_iukboom6ndih5an6iafl45j2fe: 564 | resolution: {integrity: sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==} 565 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 566 | peerDependencies: 567 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 568 | dependencies: 569 | '@types/json-schema': 7.0.11 570 | '@types/semver': 7.3.13 571 | '@typescript-eslint/scope-manager': 5.48.0 572 | '@typescript-eslint/types': 5.48.0 573 | '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4 574 | eslint: 8.31.0 575 | eslint-scope: 5.1.1 576 | eslint-utils: 3.0.0_eslint@8.31.0 577 | semver: 7.3.8 578 | transitivePeerDependencies: 579 | - supports-color 580 | - typescript 581 | dev: true 582 | 583 | /@typescript-eslint/visitor-keys/5.48.0: 584 | resolution: {integrity: sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==} 585 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 586 | dependencies: 587 | '@typescript-eslint/types': 5.48.0 588 | eslint-visitor-keys: 3.3.0 589 | dev: true 590 | 591 | /acorn-jsx/5.3.2_acorn@8.8.1: 592 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 593 | peerDependencies: 594 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 595 | dependencies: 596 | acorn: 8.8.1 597 | dev: true 598 | 599 | /acorn-node/1.8.2: 600 | resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} 601 | dependencies: 602 | acorn: 7.4.1 603 | acorn-walk: 7.2.0 604 | xtend: 4.0.2 605 | dev: true 606 | 607 | /acorn-walk/7.2.0: 608 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 609 | engines: {node: '>=0.4.0'} 610 | dev: true 611 | 612 | /acorn-walk/8.2.0: 613 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 614 | engines: {node: '>=0.4.0'} 615 | dev: true 616 | 617 | /acorn/7.4.1: 618 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 619 | engines: {node: '>=0.4.0'} 620 | hasBin: true 621 | dev: true 622 | 623 | /acorn/8.8.1: 624 | resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} 625 | engines: {node: '>=0.4.0'} 626 | hasBin: true 627 | dev: true 628 | 629 | /ajv/6.12.6: 630 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 631 | dependencies: 632 | fast-deep-equal: 3.1.3 633 | fast-json-stable-stringify: 2.1.0 634 | json-schema-traverse: 0.4.1 635 | uri-js: 4.4.1 636 | dev: true 637 | 638 | /ansi-regex/5.0.1: 639 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 640 | engines: {node: '>=8'} 641 | dev: true 642 | 643 | /ansi-styles/4.3.0: 644 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 645 | engines: {node: '>=8'} 646 | dependencies: 647 | color-convert: 2.0.1 648 | dev: true 649 | 650 | /anymatch/3.1.3: 651 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 652 | engines: {node: '>= 8'} 653 | dependencies: 654 | normalize-path: 3.0.0 655 | picomatch: 2.3.1 656 | dev: true 657 | 658 | /arg/5.0.2: 659 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 660 | dev: true 661 | 662 | /argparse/2.0.1: 663 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 664 | dev: true 665 | 666 | /array-union/2.1.0: 667 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 668 | engines: {node: '>=8'} 669 | dev: true 670 | 671 | /assertion-error/1.1.0: 672 | resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 673 | dev: true 674 | 675 | /autoprefixer/10.4.13_postcss@8.4.21: 676 | resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} 677 | engines: {node: ^10 || ^12 || >=14} 678 | hasBin: true 679 | peerDependencies: 680 | postcss: ^8.1.0 681 | dependencies: 682 | browserslist: 4.21.4 683 | caniuse-lite: 1.0.30001442 684 | fraction.js: 4.2.0 685 | normalize-range: 0.1.2 686 | picocolors: 1.0.0 687 | postcss: 8.4.21 688 | postcss-value-parser: 4.2.0 689 | dev: true 690 | 691 | /balanced-match/1.0.2: 692 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 693 | dev: true 694 | 695 | /binary-extensions/2.2.0: 696 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 697 | engines: {node: '>=8'} 698 | dev: true 699 | 700 | /brace-expansion/1.1.11: 701 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 702 | dependencies: 703 | balanced-match: 1.0.2 704 | concat-map: 0.0.1 705 | dev: true 706 | 707 | /braces/3.0.2: 708 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 709 | engines: {node: '>=8'} 710 | dependencies: 711 | fill-range: 7.0.1 712 | dev: true 713 | 714 | /browserslist/4.21.4: 715 | resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} 716 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 717 | hasBin: true 718 | dependencies: 719 | caniuse-lite: 1.0.30001442 720 | electron-to-chromium: 1.4.284 721 | node-releases: 2.0.8 722 | update-browserslist-db: 1.0.10_browserslist@4.21.4 723 | dev: true 724 | 725 | /buffer-crc32/0.2.13: 726 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 727 | dev: true 728 | 729 | /busboy/1.6.0: 730 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 731 | engines: {node: '>=10.16.0'} 732 | dependencies: 733 | streamsearch: 1.1.0 734 | dev: true 735 | 736 | /callsites/3.1.0: 737 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 738 | engines: {node: '>=6'} 739 | dev: true 740 | 741 | /camelcase-css/2.0.1: 742 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 743 | engines: {node: '>= 6'} 744 | dev: true 745 | 746 | /caniuse-lite/1.0.30001442: 747 | resolution: {integrity: sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==} 748 | dev: true 749 | 750 | /chai/4.3.7: 751 | resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} 752 | engines: {node: '>=4'} 753 | dependencies: 754 | assertion-error: 1.1.0 755 | check-error: 1.0.2 756 | deep-eql: 4.1.3 757 | get-func-name: 2.0.0 758 | loupe: 2.3.6 759 | pathval: 1.1.1 760 | type-detect: 4.0.8 761 | dev: true 762 | 763 | /chalk/4.1.2: 764 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 765 | engines: {node: '>=10'} 766 | dependencies: 767 | ansi-styles: 4.3.0 768 | supports-color: 7.2.0 769 | dev: true 770 | 771 | /check-error/1.0.2: 772 | resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} 773 | dev: true 774 | 775 | /chokidar/3.5.3: 776 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 777 | engines: {node: '>= 8.10.0'} 778 | dependencies: 779 | anymatch: 3.1.3 780 | braces: 3.0.2 781 | glob-parent: 5.1.2 782 | is-binary-path: 2.1.0 783 | is-glob: 4.0.3 784 | normalize-path: 3.0.0 785 | readdirp: 3.6.0 786 | optionalDependencies: 787 | fsevents: 2.3.2 788 | dev: true 789 | 790 | /color-convert/2.0.1: 791 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 792 | engines: {node: '>=7.0.0'} 793 | dependencies: 794 | color-name: 1.1.4 795 | dev: true 796 | 797 | /color-name/1.1.4: 798 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 799 | dev: true 800 | 801 | /color-string/1.9.1: 802 | resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 803 | dependencies: 804 | color-name: 1.1.4 805 | simple-swizzle: 0.2.2 806 | dev: true 807 | 808 | /color/4.2.3: 809 | resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} 810 | engines: {node: '>=12.5.0'} 811 | dependencies: 812 | color-convert: 2.0.1 813 | color-string: 1.9.1 814 | dev: true 815 | 816 | /concat-map/0.0.1: 817 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 818 | dev: true 819 | 820 | /cookie/0.5.0: 821 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 822 | engines: {node: '>= 0.6'} 823 | dev: true 824 | 825 | /cross-spawn/7.0.3: 826 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 827 | engines: {node: '>= 8'} 828 | dependencies: 829 | path-key: 3.1.1 830 | shebang-command: 2.0.0 831 | which: 2.0.2 832 | dev: true 833 | 834 | /css-selector-tokenizer/0.8.0: 835 | resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==} 836 | dependencies: 837 | cssesc: 3.0.0 838 | fastparse: 1.1.2 839 | dev: true 840 | 841 | /cssesc/3.0.0: 842 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 843 | engines: {node: '>=4'} 844 | hasBin: true 845 | dev: true 846 | 847 | /daisyui/2.46.1_gbtt6ss3tbiz4yjtvdr6fbrj44: 848 | resolution: {integrity: sha512-i59+nLuzzPAVOhNhot3KLtt6stfYeCIPXs9uiLcpXjykpqxHfBA3W6hQWOUWPMwfqhyQd0WKub3sydtPGjzLtA==} 849 | peerDependencies: 850 | autoprefixer: ^10.0.2 851 | postcss: ^8.1.6 852 | dependencies: 853 | autoprefixer: 10.4.13_postcss@8.4.21 854 | color: 4.2.3 855 | css-selector-tokenizer: 0.8.0 856 | postcss: 8.4.21 857 | postcss-js: 4.0.0_postcss@8.4.21 858 | tailwindcss: 3.2.4_postcss@8.4.21 859 | transitivePeerDependencies: 860 | - ts-node 861 | dev: true 862 | 863 | /debug/4.3.4: 864 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 865 | engines: {node: '>=6.0'} 866 | peerDependencies: 867 | supports-color: '*' 868 | peerDependenciesMeta: 869 | supports-color: 870 | optional: true 871 | dependencies: 872 | ms: 2.1.2 873 | dev: true 874 | 875 | /dedent-js/1.0.1: 876 | resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} 877 | dev: true 878 | 879 | /deep-eql/4.1.3: 880 | resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} 881 | engines: {node: '>=6'} 882 | dependencies: 883 | type-detect: 4.0.8 884 | dev: true 885 | 886 | /deep-is/0.1.4: 887 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 888 | dev: true 889 | 890 | /deepmerge/4.2.2: 891 | resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} 892 | engines: {node: '>=0.10.0'} 893 | dev: true 894 | 895 | /defined/1.0.1: 896 | resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} 897 | dev: true 898 | 899 | /detect-indent/6.1.0: 900 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 901 | engines: {node: '>=8'} 902 | dev: true 903 | 904 | /detective/5.2.1: 905 | resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} 906 | engines: {node: '>=0.8.0'} 907 | hasBin: true 908 | dependencies: 909 | acorn-node: 1.8.2 910 | defined: 1.0.1 911 | minimist: 1.2.7 912 | dev: true 913 | 914 | /devalue/4.2.0: 915 | resolution: {integrity: sha512-mbjoAaCL2qogBKgeFxFPOXAUsZchircF+B/79LD4sHH0+NHfYm8gZpQrskKDn5gENGt35+5OI1GUF7hLVnkPDw==} 916 | dev: true 917 | 918 | /didyoumean/1.2.2: 919 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 920 | dev: true 921 | 922 | /dir-glob/3.0.1: 923 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 924 | engines: {node: '>=8'} 925 | dependencies: 926 | path-type: 4.0.0 927 | dev: true 928 | 929 | /dlv/1.1.3: 930 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 931 | dev: true 932 | 933 | /doctrine/3.0.0: 934 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 935 | engines: {node: '>=6.0.0'} 936 | dependencies: 937 | esutils: 2.0.3 938 | dev: true 939 | 940 | /electron-to-chromium/1.4.284: 941 | resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} 942 | dev: true 943 | 944 | /es6-promise/3.3.1: 945 | resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} 946 | dev: true 947 | 948 | /esbuild/0.16.14: 949 | resolution: {integrity: sha512-6xAn3O6ZZyoxZAEkwfI9hw4cEqSr/o1ViJtnkvImVkblmUN65Md04o0S/7H1WNu1XGf1Cjij/on7VO4psIYjkw==} 950 | engines: {node: '>=12'} 951 | hasBin: true 952 | requiresBuild: true 953 | optionalDependencies: 954 | '@esbuild/android-arm': 0.16.14 955 | '@esbuild/android-arm64': 0.16.14 956 | '@esbuild/android-x64': 0.16.14 957 | '@esbuild/darwin-arm64': 0.16.14 958 | '@esbuild/darwin-x64': 0.16.14 959 | '@esbuild/freebsd-arm64': 0.16.14 960 | '@esbuild/freebsd-x64': 0.16.14 961 | '@esbuild/linux-arm': 0.16.14 962 | '@esbuild/linux-arm64': 0.16.14 963 | '@esbuild/linux-ia32': 0.16.14 964 | '@esbuild/linux-loong64': 0.16.14 965 | '@esbuild/linux-mips64el': 0.16.14 966 | '@esbuild/linux-ppc64': 0.16.14 967 | '@esbuild/linux-riscv64': 0.16.14 968 | '@esbuild/linux-s390x': 0.16.14 969 | '@esbuild/linux-x64': 0.16.14 970 | '@esbuild/netbsd-x64': 0.16.14 971 | '@esbuild/openbsd-x64': 0.16.14 972 | '@esbuild/sunos-x64': 0.16.14 973 | '@esbuild/win32-arm64': 0.16.14 974 | '@esbuild/win32-ia32': 0.16.14 975 | '@esbuild/win32-x64': 0.16.14 976 | dev: true 977 | 978 | /escalade/3.1.1: 979 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 980 | engines: {node: '>=6'} 981 | dev: true 982 | 983 | /escape-string-regexp/4.0.0: 984 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 985 | engines: {node: '>=10'} 986 | dev: true 987 | 988 | /eslint-config-prettier/8.6.0_eslint@8.31.0: 989 | resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} 990 | hasBin: true 991 | peerDependencies: 992 | eslint: '>=7.0.0' 993 | dependencies: 994 | eslint: 8.31.0 995 | dev: true 996 | 997 | /eslint-plugin-svelte3/4.0.0_6go7qzsvzihesfwmyvq3tnl5qq: 998 | resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==} 999 | peerDependencies: 1000 | eslint: '>=8.0.0' 1001 | svelte: ^3.2.0 1002 | dependencies: 1003 | eslint: 8.31.0 1004 | svelte: 3.55.0 1005 | dev: true 1006 | 1007 | /eslint-scope/5.1.1: 1008 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 1009 | engines: {node: '>=8.0.0'} 1010 | dependencies: 1011 | esrecurse: 4.3.0 1012 | estraverse: 4.3.0 1013 | dev: true 1014 | 1015 | /eslint-scope/7.1.1: 1016 | resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} 1017 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1018 | dependencies: 1019 | esrecurse: 4.3.0 1020 | estraverse: 5.3.0 1021 | dev: true 1022 | 1023 | /eslint-utils/3.0.0_eslint@8.31.0: 1024 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 1025 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 1026 | peerDependencies: 1027 | eslint: '>=5' 1028 | dependencies: 1029 | eslint: 8.31.0 1030 | eslint-visitor-keys: 2.1.0 1031 | dev: true 1032 | 1033 | /eslint-visitor-keys/2.1.0: 1034 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 1035 | engines: {node: '>=10'} 1036 | dev: true 1037 | 1038 | /eslint-visitor-keys/3.3.0: 1039 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 1040 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1041 | dev: true 1042 | 1043 | /eslint/8.31.0: 1044 | resolution: {integrity: sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==} 1045 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1046 | hasBin: true 1047 | dependencies: 1048 | '@eslint/eslintrc': 1.4.1 1049 | '@humanwhocodes/config-array': 0.11.8 1050 | '@humanwhocodes/module-importer': 1.0.1 1051 | '@nodelib/fs.walk': 1.2.8 1052 | ajv: 6.12.6 1053 | chalk: 4.1.2 1054 | cross-spawn: 7.0.3 1055 | debug: 4.3.4 1056 | doctrine: 3.0.0 1057 | escape-string-regexp: 4.0.0 1058 | eslint-scope: 7.1.1 1059 | eslint-utils: 3.0.0_eslint@8.31.0 1060 | eslint-visitor-keys: 3.3.0 1061 | espree: 9.4.1 1062 | esquery: 1.4.0 1063 | esutils: 2.0.3 1064 | fast-deep-equal: 3.1.3 1065 | file-entry-cache: 6.0.1 1066 | find-up: 5.0.0 1067 | glob-parent: 6.0.2 1068 | globals: 13.19.0 1069 | grapheme-splitter: 1.0.4 1070 | ignore: 5.2.4 1071 | import-fresh: 3.3.0 1072 | imurmurhash: 0.1.4 1073 | is-glob: 4.0.3 1074 | is-path-inside: 3.0.3 1075 | js-sdsl: 4.2.0 1076 | js-yaml: 4.1.0 1077 | json-stable-stringify-without-jsonify: 1.0.1 1078 | levn: 0.4.1 1079 | lodash.merge: 4.6.2 1080 | minimatch: 3.1.2 1081 | natural-compare: 1.4.0 1082 | optionator: 0.9.1 1083 | regexpp: 3.2.0 1084 | strip-ansi: 6.0.1 1085 | strip-json-comments: 3.1.1 1086 | text-table: 0.2.0 1087 | transitivePeerDependencies: 1088 | - supports-color 1089 | dev: true 1090 | 1091 | /esm-env/1.0.0: 1092 | resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} 1093 | dev: true 1094 | 1095 | /espree/9.4.1: 1096 | resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} 1097 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1098 | dependencies: 1099 | acorn: 8.8.1 1100 | acorn-jsx: 5.3.2_acorn@8.8.1 1101 | eslint-visitor-keys: 3.3.0 1102 | dev: true 1103 | 1104 | /esquery/1.4.0: 1105 | resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} 1106 | engines: {node: '>=0.10'} 1107 | dependencies: 1108 | estraverse: 5.3.0 1109 | dev: true 1110 | 1111 | /esrecurse/4.3.0: 1112 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1113 | engines: {node: '>=4.0'} 1114 | dependencies: 1115 | estraverse: 5.3.0 1116 | dev: true 1117 | 1118 | /estraverse/4.3.0: 1119 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 1120 | engines: {node: '>=4.0'} 1121 | dev: true 1122 | 1123 | /estraverse/5.3.0: 1124 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1125 | engines: {node: '>=4.0'} 1126 | dev: true 1127 | 1128 | /esutils/2.0.3: 1129 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1130 | engines: {node: '>=0.10.0'} 1131 | dev: true 1132 | 1133 | /fast-deep-equal/3.1.3: 1134 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1135 | dev: true 1136 | 1137 | /fast-glob/3.2.12: 1138 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 1139 | engines: {node: '>=8.6.0'} 1140 | dependencies: 1141 | '@nodelib/fs.stat': 2.0.5 1142 | '@nodelib/fs.walk': 1.2.8 1143 | glob-parent: 5.1.2 1144 | merge2: 1.4.1 1145 | micromatch: 4.0.5 1146 | dev: true 1147 | 1148 | /fast-json-stable-stringify/2.1.0: 1149 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1150 | dev: true 1151 | 1152 | /fast-levenshtein/2.0.6: 1153 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1154 | dev: true 1155 | 1156 | /fastparse/1.1.2: 1157 | resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} 1158 | dev: true 1159 | 1160 | /fastq/1.15.0: 1161 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1162 | dependencies: 1163 | reusify: 1.0.4 1164 | dev: true 1165 | 1166 | /file-entry-cache/6.0.1: 1167 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1168 | engines: {node: ^10.12.0 || >=12.0.0} 1169 | dependencies: 1170 | flat-cache: 3.0.4 1171 | dev: true 1172 | 1173 | /fill-range/7.0.1: 1174 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1175 | engines: {node: '>=8'} 1176 | dependencies: 1177 | to-regex-range: 5.0.1 1178 | dev: true 1179 | 1180 | /find-up/5.0.0: 1181 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1182 | engines: {node: '>=10'} 1183 | dependencies: 1184 | locate-path: 6.0.0 1185 | path-exists: 4.0.0 1186 | dev: true 1187 | 1188 | /flat-cache/3.0.4: 1189 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1190 | engines: {node: ^10.12.0 || >=12.0.0} 1191 | dependencies: 1192 | flatted: 3.2.7 1193 | rimraf: 3.0.2 1194 | dev: true 1195 | 1196 | /flatted/3.2.7: 1197 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1198 | dev: true 1199 | 1200 | /fraction.js/4.2.0: 1201 | resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} 1202 | dev: true 1203 | 1204 | /fs.realpath/1.0.0: 1205 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1206 | dev: true 1207 | 1208 | /fsevents/2.3.2: 1209 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1210 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1211 | os: [darwin] 1212 | requiresBuild: true 1213 | dev: true 1214 | optional: true 1215 | 1216 | /function-bind/1.1.1: 1217 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1218 | dev: true 1219 | 1220 | /get-func-name/2.0.0: 1221 | resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} 1222 | dev: true 1223 | 1224 | /glob-parent/5.1.2: 1225 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1226 | engines: {node: '>= 6'} 1227 | dependencies: 1228 | is-glob: 4.0.3 1229 | dev: true 1230 | 1231 | /glob-parent/6.0.2: 1232 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1233 | engines: {node: '>=10.13.0'} 1234 | dependencies: 1235 | is-glob: 4.0.3 1236 | dev: true 1237 | 1238 | /glob/7.2.3: 1239 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1240 | dependencies: 1241 | fs.realpath: 1.0.0 1242 | inflight: 1.0.6 1243 | inherits: 2.0.4 1244 | minimatch: 3.1.2 1245 | once: 1.4.0 1246 | path-is-absolute: 1.0.1 1247 | dev: true 1248 | 1249 | /globals/13.19.0: 1250 | resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} 1251 | engines: {node: '>=8'} 1252 | dependencies: 1253 | type-fest: 0.20.2 1254 | dev: true 1255 | 1256 | /globalyzer/0.1.0: 1257 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 1258 | dev: true 1259 | 1260 | /globby/11.1.0: 1261 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1262 | engines: {node: '>=10'} 1263 | dependencies: 1264 | array-union: 2.1.0 1265 | dir-glob: 3.0.1 1266 | fast-glob: 3.2.12 1267 | ignore: 5.2.4 1268 | merge2: 1.4.1 1269 | slash: 3.0.0 1270 | dev: true 1271 | 1272 | /globrex/0.1.2: 1273 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 1274 | dev: true 1275 | 1276 | /graceful-fs/4.2.10: 1277 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 1278 | dev: true 1279 | 1280 | /grapheme-splitter/1.0.4: 1281 | resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} 1282 | dev: true 1283 | 1284 | /has-flag/4.0.0: 1285 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1286 | engines: {node: '>=8'} 1287 | dev: true 1288 | 1289 | /has/1.0.3: 1290 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1291 | engines: {node: '>= 0.4.0'} 1292 | dependencies: 1293 | function-bind: 1.1.1 1294 | dev: true 1295 | 1296 | /ignore/5.2.4: 1297 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 1298 | engines: {node: '>= 4'} 1299 | dev: true 1300 | 1301 | /import-fresh/3.3.0: 1302 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1303 | engines: {node: '>=6'} 1304 | dependencies: 1305 | parent-module: 1.0.1 1306 | resolve-from: 4.0.0 1307 | dev: true 1308 | 1309 | /import-meta-resolve/2.2.0: 1310 | resolution: {integrity: sha512-CpPOtiCHxP9HdtDM5F45tNiAe66Cqlv3f5uHoJjt+KlaLrUh9/Wz9vepADZ78SlqEo62aDWZtj9ydMGXV+CPnw==} 1311 | dev: true 1312 | 1313 | /imurmurhash/0.1.4: 1314 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1315 | engines: {node: '>=0.8.19'} 1316 | dev: true 1317 | 1318 | /inflight/1.0.6: 1319 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1320 | dependencies: 1321 | once: 1.4.0 1322 | wrappy: 1.0.2 1323 | dev: true 1324 | 1325 | /inherits/2.0.4: 1326 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1327 | dev: true 1328 | 1329 | /is-arrayish/0.3.2: 1330 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 1331 | dev: true 1332 | 1333 | /is-binary-path/2.1.0: 1334 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1335 | engines: {node: '>=8'} 1336 | dependencies: 1337 | binary-extensions: 2.2.0 1338 | dev: true 1339 | 1340 | /is-core-module/2.11.0: 1341 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 1342 | dependencies: 1343 | has: 1.0.3 1344 | dev: true 1345 | 1346 | /is-extglob/2.1.1: 1347 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1348 | engines: {node: '>=0.10.0'} 1349 | dev: true 1350 | 1351 | /is-glob/4.0.3: 1352 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1353 | engines: {node: '>=0.10.0'} 1354 | dependencies: 1355 | is-extglob: 2.1.1 1356 | dev: true 1357 | 1358 | /is-number/7.0.0: 1359 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1360 | engines: {node: '>=0.12.0'} 1361 | dev: true 1362 | 1363 | /is-path-inside/3.0.3: 1364 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1365 | engines: {node: '>=8'} 1366 | dev: true 1367 | 1368 | /isexe/2.0.0: 1369 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1370 | dev: true 1371 | 1372 | /js-sdsl/4.2.0: 1373 | resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} 1374 | dev: true 1375 | 1376 | /js-yaml/4.1.0: 1377 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1378 | hasBin: true 1379 | dependencies: 1380 | argparse: 2.0.1 1381 | dev: true 1382 | 1383 | /json-schema-traverse/0.4.1: 1384 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1385 | dev: true 1386 | 1387 | /json-stable-stringify-without-jsonify/1.0.1: 1388 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1389 | dev: true 1390 | 1391 | /kleur/4.1.5: 1392 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 1393 | engines: {node: '>=6'} 1394 | dev: true 1395 | 1396 | /levn/0.4.1: 1397 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1398 | engines: {node: '>= 0.8.0'} 1399 | dependencies: 1400 | prelude-ls: 1.2.1 1401 | type-check: 0.4.0 1402 | dev: true 1403 | 1404 | /lilconfig/2.0.6: 1405 | resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} 1406 | engines: {node: '>=10'} 1407 | dev: true 1408 | 1409 | /local-pkg/0.4.2: 1410 | resolution: {integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==} 1411 | engines: {node: '>=14'} 1412 | dev: true 1413 | 1414 | /locate-path/6.0.0: 1415 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1416 | engines: {node: '>=10'} 1417 | dependencies: 1418 | p-locate: 5.0.0 1419 | dev: true 1420 | 1421 | /lodash.merge/4.6.2: 1422 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1423 | dev: true 1424 | 1425 | /loupe/2.3.6: 1426 | resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} 1427 | dependencies: 1428 | get-func-name: 2.0.0 1429 | dev: true 1430 | 1431 | /lower-case/2.0.2: 1432 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 1433 | dependencies: 1434 | tslib: 2.4.1 1435 | dev: true 1436 | 1437 | /lru-cache/6.0.0: 1438 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1439 | engines: {node: '>=10'} 1440 | dependencies: 1441 | yallist: 4.0.0 1442 | dev: true 1443 | 1444 | /magic-string/0.25.9: 1445 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 1446 | dependencies: 1447 | sourcemap-codec: 1.4.8 1448 | dev: true 1449 | 1450 | /magic-string/0.27.0: 1451 | resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} 1452 | engines: {node: '>=12'} 1453 | dependencies: 1454 | '@jridgewell/sourcemap-codec': 1.4.14 1455 | dev: true 1456 | 1457 | /mdsvex/0.9.8_svelte@3.55.0: 1458 | resolution: {integrity: sha512-5QvThjRKoKkGH00qdHxLZ5ROd80RgGiJvM2B9opeFreaiGFTLoKKFUgEBCslLrwM24cVGJLmIM3rR83OFDf3tQ==} 1459 | peerDependencies: 1460 | svelte: 3.x 1461 | dependencies: 1462 | '@types/unist': 2.0.6 1463 | prism-svelte: 0.4.7 1464 | prismjs: 1.29.0 1465 | svelte: 3.55.0 1466 | vfile-message: 2.0.4 1467 | dev: true 1468 | 1469 | /merge2/1.4.1: 1470 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1471 | engines: {node: '>= 8'} 1472 | dev: true 1473 | 1474 | /micromatch/4.0.5: 1475 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1476 | engines: {node: '>=8.6'} 1477 | dependencies: 1478 | braces: 3.0.2 1479 | picomatch: 2.3.1 1480 | dev: true 1481 | 1482 | /mime/3.0.0: 1483 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 1484 | engines: {node: '>=10.0.0'} 1485 | hasBin: true 1486 | dev: true 1487 | 1488 | /min-indent/1.0.1: 1489 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 1490 | engines: {node: '>=4'} 1491 | dev: true 1492 | 1493 | /minimatch/3.1.2: 1494 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1495 | dependencies: 1496 | brace-expansion: 1.1.11 1497 | dev: true 1498 | 1499 | /minimist/1.2.7: 1500 | resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} 1501 | dev: true 1502 | 1503 | /mkdirp/0.5.6: 1504 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1505 | hasBin: true 1506 | dependencies: 1507 | minimist: 1.2.7 1508 | dev: true 1509 | 1510 | /mri/1.2.0: 1511 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1512 | engines: {node: '>=4'} 1513 | dev: true 1514 | 1515 | /mrmime/1.0.1: 1516 | resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} 1517 | engines: {node: '>=10'} 1518 | dev: true 1519 | 1520 | /ms/2.1.2: 1521 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1522 | dev: true 1523 | 1524 | /nanoid/3.3.4: 1525 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 1526 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1527 | hasBin: true 1528 | dev: true 1529 | 1530 | /natural-compare-lite/1.4.0: 1531 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 1532 | dev: true 1533 | 1534 | /natural-compare/1.4.0: 1535 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1536 | dev: true 1537 | 1538 | /no-case/3.0.4: 1539 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 1540 | dependencies: 1541 | lower-case: 2.0.2 1542 | tslib: 2.4.1 1543 | dev: true 1544 | 1545 | /node-releases/2.0.8: 1546 | resolution: {integrity: sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==} 1547 | dev: true 1548 | 1549 | /normalize-path/3.0.0: 1550 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1551 | engines: {node: '>=0.10.0'} 1552 | dev: true 1553 | 1554 | /normalize-range/0.1.2: 1555 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1556 | engines: {node: '>=0.10.0'} 1557 | dev: true 1558 | 1559 | /object-hash/3.0.0: 1560 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1561 | engines: {node: '>= 6'} 1562 | dev: true 1563 | 1564 | /once/1.4.0: 1565 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1566 | dependencies: 1567 | wrappy: 1.0.2 1568 | dev: true 1569 | 1570 | /optionator/0.9.1: 1571 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 1572 | engines: {node: '>= 0.8.0'} 1573 | dependencies: 1574 | deep-is: 0.1.4 1575 | fast-levenshtein: 2.0.6 1576 | levn: 0.4.1 1577 | prelude-ls: 1.2.1 1578 | type-check: 0.4.0 1579 | word-wrap: 1.2.3 1580 | dev: true 1581 | 1582 | /p-limit/3.1.0: 1583 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1584 | engines: {node: '>=10'} 1585 | dependencies: 1586 | yocto-queue: 0.1.0 1587 | dev: true 1588 | 1589 | /p-locate/5.0.0: 1590 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1591 | engines: {node: '>=10'} 1592 | dependencies: 1593 | p-limit: 3.1.0 1594 | dev: true 1595 | 1596 | /parent-module/1.0.1: 1597 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1598 | engines: {node: '>=6'} 1599 | dependencies: 1600 | callsites: 3.1.0 1601 | dev: true 1602 | 1603 | /pascal-case/3.1.2: 1604 | resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} 1605 | dependencies: 1606 | no-case: 3.0.4 1607 | tslib: 2.4.1 1608 | dev: true 1609 | 1610 | /path-exists/4.0.0: 1611 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1612 | engines: {node: '>=8'} 1613 | dev: true 1614 | 1615 | /path-is-absolute/1.0.1: 1616 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1617 | engines: {node: '>=0.10.0'} 1618 | dev: true 1619 | 1620 | /path-key/3.1.1: 1621 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1622 | engines: {node: '>=8'} 1623 | dev: true 1624 | 1625 | /path-parse/1.0.7: 1626 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1627 | dev: true 1628 | 1629 | /path-type/4.0.0: 1630 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1631 | engines: {node: '>=8'} 1632 | dev: true 1633 | 1634 | /pathval/1.1.1: 1635 | resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 1636 | dev: true 1637 | 1638 | /picocolors/1.0.0: 1639 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1640 | dev: true 1641 | 1642 | /picomatch/2.3.1: 1643 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1644 | engines: {node: '>=8.6'} 1645 | dev: true 1646 | 1647 | /pify/2.3.0: 1648 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 1649 | engines: {node: '>=0.10.0'} 1650 | dev: true 1651 | 1652 | /playwright-core/1.29.1: 1653 | resolution: {integrity: sha512-20Ai3d+lMkWpI9YZYlxk8gxatfgax5STW8GaMozAHwigLiyiKQrdkt7gaoT9UQR8FIVDg6qVXs9IoZUQrDjIIg==} 1654 | engines: {node: '>=14'} 1655 | hasBin: true 1656 | dev: true 1657 | 1658 | /pocketbase/0.9.1: 1659 | resolution: {integrity: sha512-a9S/WHak+mgr3WI8bD2tz3lFVFzoy6ZgKTBlUXwIH4VLTKVU3JKeAKxqIFBF7av4qblmB+52tX8sWLS08Ftm/w==} 1660 | dev: false 1661 | 1662 | /postcss-import/14.1.0_postcss@8.4.21: 1663 | resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} 1664 | engines: {node: '>=10.0.0'} 1665 | peerDependencies: 1666 | postcss: ^8.0.0 1667 | dependencies: 1668 | postcss: 8.4.21 1669 | postcss-value-parser: 4.2.0 1670 | read-cache: 1.0.0 1671 | resolve: 1.22.1 1672 | dev: true 1673 | 1674 | /postcss-js/4.0.0_postcss@8.4.21: 1675 | resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} 1676 | engines: {node: ^12 || ^14 || >= 16} 1677 | peerDependencies: 1678 | postcss: ^8.3.3 1679 | dependencies: 1680 | camelcase-css: 2.0.1 1681 | postcss: 8.4.21 1682 | dev: true 1683 | 1684 | /postcss-load-config/3.1.4_postcss@8.4.21: 1685 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 1686 | engines: {node: '>= 10'} 1687 | peerDependencies: 1688 | postcss: '>=8.0.9' 1689 | ts-node: '>=9.0.0' 1690 | peerDependenciesMeta: 1691 | postcss: 1692 | optional: true 1693 | ts-node: 1694 | optional: true 1695 | dependencies: 1696 | lilconfig: 2.0.6 1697 | postcss: 8.4.21 1698 | yaml: 1.10.2 1699 | dev: true 1700 | 1701 | /postcss-nested/6.0.0_postcss@8.4.21: 1702 | resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} 1703 | engines: {node: '>=12.0'} 1704 | peerDependencies: 1705 | postcss: ^8.2.14 1706 | dependencies: 1707 | postcss: 8.4.21 1708 | postcss-selector-parser: 6.0.11 1709 | dev: true 1710 | 1711 | /postcss-selector-parser/6.0.11: 1712 | resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} 1713 | engines: {node: '>=4'} 1714 | dependencies: 1715 | cssesc: 3.0.0 1716 | util-deprecate: 1.0.2 1717 | dev: true 1718 | 1719 | /postcss-value-parser/4.2.0: 1720 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1721 | dev: true 1722 | 1723 | /postcss/8.4.21: 1724 | resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} 1725 | engines: {node: ^10 || ^12 || >=14} 1726 | dependencies: 1727 | nanoid: 3.3.4 1728 | picocolors: 1.0.0 1729 | source-map-js: 1.0.2 1730 | dev: true 1731 | 1732 | /prelude-ls/1.2.1: 1733 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1734 | engines: {node: '>= 0.8.0'} 1735 | dev: true 1736 | 1737 | /prettier-plugin-svelte/2.9.0_ajxj753sv7dbwexjherrch25ta: 1738 | resolution: {integrity: sha512-3doBi5NO4IVgaNPtwewvrgPpqAcvNv0NwJNflr76PIGgi9nf1oguQV1Hpdm9TI2ALIQVn/9iIwLpBO5UcD2Jiw==} 1739 | peerDependencies: 1740 | prettier: ^1.16.4 || ^2.0.0 1741 | svelte: ^3.2.0 1742 | dependencies: 1743 | prettier: 2.8.1 1744 | svelte: 3.55.0 1745 | dev: true 1746 | 1747 | /prettier/2.8.1: 1748 | resolution: {integrity: sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==} 1749 | engines: {node: '>=10.13.0'} 1750 | hasBin: true 1751 | dev: true 1752 | 1753 | /prism-svelte/0.4.7: 1754 | resolution: {integrity: sha512-yABh19CYbM24V7aS7TuPYRNMqthxwbvx6FF/Rw920YbyBWO3tnyPIqRMgHuSVsLmuHkkBS1Akyof463FVdkeDQ==} 1755 | dev: true 1756 | 1757 | /prismjs/1.29.0: 1758 | resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} 1759 | engines: {node: '>=6'} 1760 | dev: true 1761 | 1762 | /punycode/2.1.1: 1763 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 1764 | engines: {node: '>=6'} 1765 | dev: true 1766 | 1767 | /queue-microtask/1.2.3: 1768 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1769 | dev: true 1770 | 1771 | /quick-lru/5.1.1: 1772 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 1773 | engines: {node: '>=10'} 1774 | dev: true 1775 | 1776 | /read-cache/1.0.0: 1777 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 1778 | dependencies: 1779 | pify: 2.3.0 1780 | dev: true 1781 | 1782 | /readdirp/3.6.0: 1783 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1784 | engines: {node: '>=8.10.0'} 1785 | dependencies: 1786 | picomatch: 2.3.1 1787 | dev: true 1788 | 1789 | /regexpp/3.2.0: 1790 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 1791 | engines: {node: '>=8'} 1792 | dev: true 1793 | 1794 | /resolve-from/4.0.0: 1795 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1796 | engines: {node: '>=4'} 1797 | dev: true 1798 | 1799 | /resolve/1.22.1: 1800 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 1801 | hasBin: true 1802 | dependencies: 1803 | is-core-module: 2.11.0 1804 | path-parse: 1.0.7 1805 | supports-preserve-symlinks-flag: 1.0.0 1806 | dev: true 1807 | 1808 | /reusify/1.0.4: 1809 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1810 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1811 | dev: true 1812 | 1813 | /rimraf/2.7.1: 1814 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 1815 | hasBin: true 1816 | dependencies: 1817 | glob: 7.2.3 1818 | dev: true 1819 | 1820 | /rimraf/3.0.2: 1821 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1822 | hasBin: true 1823 | dependencies: 1824 | glob: 7.2.3 1825 | dev: true 1826 | 1827 | /rollup/3.9.1: 1828 | resolution: {integrity: sha512-GswCYHXftN8ZKGVgQhTFUJB/NBXxrRGgO2NCy6E8s1rwEJ4Q9/VttNqcYfEvx4dTo4j58YqdC3OVztPzlKSX8w==} 1829 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1830 | hasBin: true 1831 | optionalDependencies: 1832 | fsevents: 2.3.2 1833 | dev: true 1834 | 1835 | /run-parallel/1.2.0: 1836 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1837 | dependencies: 1838 | queue-microtask: 1.2.3 1839 | dev: true 1840 | 1841 | /sade/1.8.1: 1842 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 1843 | engines: {node: '>=6'} 1844 | dependencies: 1845 | mri: 1.2.0 1846 | dev: true 1847 | 1848 | /sander/0.5.1: 1849 | resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} 1850 | dependencies: 1851 | es6-promise: 3.3.1 1852 | graceful-fs: 4.2.10 1853 | mkdirp: 0.5.6 1854 | rimraf: 2.7.1 1855 | dev: true 1856 | 1857 | /semver/7.3.8: 1858 | resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} 1859 | engines: {node: '>=10'} 1860 | hasBin: true 1861 | dependencies: 1862 | lru-cache: 6.0.0 1863 | dev: true 1864 | 1865 | /set-cookie-parser/2.5.1: 1866 | resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} 1867 | dev: true 1868 | 1869 | /shebang-command/2.0.0: 1870 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1871 | engines: {node: '>=8'} 1872 | dependencies: 1873 | shebang-regex: 3.0.0 1874 | dev: true 1875 | 1876 | /shebang-regex/3.0.0: 1877 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1878 | engines: {node: '>=8'} 1879 | dev: true 1880 | 1881 | /simple-swizzle/0.2.2: 1882 | resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 1883 | dependencies: 1884 | is-arrayish: 0.3.2 1885 | dev: true 1886 | 1887 | /sirv/2.0.2: 1888 | resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==} 1889 | engines: {node: '>= 10'} 1890 | dependencies: 1891 | '@polka/url': 1.0.0-next.21 1892 | mrmime: 1.0.1 1893 | totalist: 3.0.0 1894 | dev: true 1895 | 1896 | /slash/3.0.0: 1897 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1898 | engines: {node: '>=8'} 1899 | dev: true 1900 | 1901 | /sorcery/0.10.0: 1902 | resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==} 1903 | hasBin: true 1904 | dependencies: 1905 | buffer-crc32: 0.2.13 1906 | minimist: 1.2.7 1907 | sander: 0.5.1 1908 | sourcemap-codec: 1.4.8 1909 | dev: true 1910 | 1911 | /source-map-js/1.0.2: 1912 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1913 | engines: {node: '>=0.10.0'} 1914 | dev: true 1915 | 1916 | /source-map/0.6.1: 1917 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1918 | engines: {node: '>=0.10.0'} 1919 | dev: true 1920 | 1921 | /sourcemap-codec/1.4.8: 1922 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1923 | deprecated: Please use @jridgewell/sourcemap-codec instead 1924 | dev: true 1925 | 1926 | /streamsearch/1.1.0: 1927 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 1928 | engines: {node: '>=10.0.0'} 1929 | dev: true 1930 | 1931 | /strip-ansi/6.0.1: 1932 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1933 | engines: {node: '>=8'} 1934 | dependencies: 1935 | ansi-regex: 5.0.1 1936 | dev: true 1937 | 1938 | /strip-indent/3.0.0: 1939 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 1940 | engines: {node: '>=8'} 1941 | dependencies: 1942 | min-indent: 1.0.1 1943 | dev: true 1944 | 1945 | /strip-json-comments/3.1.1: 1946 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1947 | engines: {node: '>=8'} 1948 | dev: true 1949 | 1950 | /strip-literal/1.0.0: 1951 | resolution: {integrity: sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==} 1952 | dependencies: 1953 | acorn: 8.8.1 1954 | dev: true 1955 | 1956 | /supports-color/7.2.0: 1957 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1958 | engines: {node: '>=8'} 1959 | dependencies: 1960 | has-flag: 4.0.0 1961 | dev: true 1962 | 1963 | /supports-preserve-symlinks-flag/1.0.0: 1964 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1965 | engines: {node: '>= 0.4'} 1966 | dev: true 1967 | 1968 | /svelte-check/2.10.3_77wbasr76lhjripnylrva3hecy: 1969 | resolution: {integrity: sha512-Nt1aWHTOKFReBpmJ1vPug0aGysqPwJh2seM1OvICfM2oeyaA62mOiy5EvkXhltGfhCcIQcq2LoE0l1CwcWPjlw==} 1970 | hasBin: true 1971 | peerDependencies: 1972 | svelte: ^3.24.0 1973 | dependencies: 1974 | '@jridgewell/trace-mapping': 0.3.17 1975 | chokidar: 3.5.3 1976 | fast-glob: 3.2.12 1977 | import-fresh: 3.3.0 1978 | picocolors: 1.0.0 1979 | sade: 1.8.1 1980 | svelte: 3.55.0 1981 | svelte-preprocess: 4.10.7_xue3rdxu6mzlha4hp67wl3d5yu 1982 | typescript: 4.9.4 1983 | transitivePeerDependencies: 1984 | - '@babel/core' 1985 | - coffeescript 1986 | - less 1987 | - node-sass 1988 | - postcss 1989 | - postcss-load-config 1990 | - pug 1991 | - sass 1992 | - stylus 1993 | - sugarss 1994 | dev: true 1995 | 1996 | /svelte-hmr/0.15.1_svelte@3.55.0: 1997 | resolution: {integrity: sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==} 1998 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 1999 | peerDependencies: 2000 | svelte: '>=3.19.0' 2001 | dependencies: 2002 | svelte: 3.55.0 2003 | dev: true 2004 | 2005 | /svelte-preprocess/4.10.7_xue3rdxu6mzlha4hp67wl3d5yu: 2006 | resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} 2007 | engines: {node: '>= 9.11.2'} 2008 | requiresBuild: true 2009 | peerDependencies: 2010 | '@babel/core': ^7.10.2 2011 | coffeescript: ^2.5.1 2012 | less: ^3.11.3 || ^4.0.0 2013 | node-sass: '*' 2014 | postcss: ^7 || ^8 2015 | postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 2016 | pug: ^3.0.0 2017 | sass: ^1.26.8 2018 | stylus: ^0.55.0 2019 | sugarss: ^2.0.0 2020 | svelte: ^3.23.0 2021 | typescript: ^3.9.5 || ^4.0.0 2022 | peerDependenciesMeta: 2023 | '@babel/core': 2024 | optional: true 2025 | coffeescript: 2026 | optional: true 2027 | less: 2028 | optional: true 2029 | node-sass: 2030 | optional: true 2031 | postcss: 2032 | optional: true 2033 | postcss-load-config: 2034 | optional: true 2035 | pug: 2036 | optional: true 2037 | sass: 2038 | optional: true 2039 | stylus: 2040 | optional: true 2041 | sugarss: 2042 | optional: true 2043 | typescript: 2044 | optional: true 2045 | dependencies: 2046 | '@types/pug': 2.0.6 2047 | '@types/sass': 1.43.1 2048 | detect-indent: 6.1.0 2049 | magic-string: 0.25.9 2050 | postcss: 8.4.21 2051 | sorcery: 0.10.0 2052 | strip-indent: 3.0.0 2053 | svelte: 3.55.0 2054 | typescript: 4.9.4 2055 | dev: true 2056 | 2057 | /svelte/3.55.0: 2058 | resolution: {integrity: sha512-uGu2FVMlOuey4JoKHKrpZFkoYyj0VLjJdz47zX5+gVK5odxHM40RVhar9/iK2YFRVxvfg9FkhfVlR0sjeIrOiA==} 2059 | engines: {node: '>= 8'} 2060 | dev: true 2061 | 2062 | /svelte2tsx/0.5.23_niwyv7xychq2ag6arq5eqxbomm: 2063 | resolution: {integrity: sha512-jYFnugTQRFmUpvLXPQrKzVYcW5ErT+0QCxg027Zx9BuvYefMZFuoBSTDYe7viPEFGrPPiLgT2m7f5n9khE7f7Q==} 2064 | peerDependencies: 2065 | svelte: ^3.24 2066 | typescript: ^4.1.2 2067 | dependencies: 2068 | dedent-js: 1.0.1 2069 | pascal-case: 3.1.2 2070 | svelte: 3.55.0 2071 | typescript: 4.9.4 2072 | dev: true 2073 | 2074 | /tailwindcss/3.2.4_postcss@8.4.21: 2075 | resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==} 2076 | engines: {node: '>=12.13.0'} 2077 | hasBin: true 2078 | peerDependencies: 2079 | postcss: ^8.0.9 2080 | dependencies: 2081 | arg: 5.0.2 2082 | chokidar: 3.5.3 2083 | color-name: 1.1.4 2084 | detective: 5.2.1 2085 | didyoumean: 1.2.2 2086 | dlv: 1.1.3 2087 | fast-glob: 3.2.12 2088 | glob-parent: 6.0.2 2089 | is-glob: 4.0.3 2090 | lilconfig: 2.0.6 2091 | micromatch: 4.0.5 2092 | normalize-path: 3.0.0 2093 | object-hash: 3.0.0 2094 | picocolors: 1.0.0 2095 | postcss: 8.4.21 2096 | postcss-import: 14.1.0_postcss@8.4.21 2097 | postcss-js: 4.0.0_postcss@8.4.21 2098 | postcss-load-config: 3.1.4_postcss@8.4.21 2099 | postcss-nested: 6.0.0_postcss@8.4.21 2100 | postcss-selector-parser: 6.0.11 2101 | postcss-value-parser: 4.2.0 2102 | quick-lru: 5.1.1 2103 | resolve: 1.22.1 2104 | transitivePeerDependencies: 2105 | - ts-node 2106 | dev: true 2107 | 2108 | /text-table/0.2.0: 2109 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2110 | dev: true 2111 | 2112 | /tiny-glob/0.2.9: 2113 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 2114 | dependencies: 2115 | globalyzer: 0.1.0 2116 | globrex: 0.1.2 2117 | dev: true 2118 | 2119 | /tinybench/2.3.1: 2120 | resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==} 2121 | dev: true 2122 | 2123 | /tinypool/0.3.0: 2124 | resolution: {integrity: sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==} 2125 | engines: {node: '>=14.0.0'} 2126 | dev: true 2127 | 2128 | /tinyspy/1.0.2: 2129 | resolution: {integrity: sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==} 2130 | engines: {node: '>=14.0.0'} 2131 | dev: true 2132 | 2133 | /to-regex-range/5.0.1: 2134 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2135 | engines: {node: '>=8.0'} 2136 | dependencies: 2137 | is-number: 7.0.0 2138 | dev: true 2139 | 2140 | /totalist/3.0.0: 2141 | resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==} 2142 | engines: {node: '>=6'} 2143 | dev: true 2144 | 2145 | /tslib/1.14.1: 2146 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 2147 | dev: true 2148 | 2149 | /tslib/2.4.1: 2150 | resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} 2151 | dev: true 2152 | 2153 | /tsutils/3.21.0_typescript@4.9.4: 2154 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 2155 | engines: {node: '>= 6'} 2156 | peerDependencies: 2157 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 2158 | dependencies: 2159 | tslib: 1.14.1 2160 | typescript: 4.9.4 2161 | dev: true 2162 | 2163 | /type-check/0.4.0: 2164 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2165 | engines: {node: '>= 0.8.0'} 2166 | dependencies: 2167 | prelude-ls: 1.2.1 2168 | dev: true 2169 | 2170 | /type-detect/4.0.8: 2171 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 2172 | engines: {node: '>=4'} 2173 | dev: true 2174 | 2175 | /type-fest/0.20.2: 2176 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2177 | engines: {node: '>=10'} 2178 | dev: true 2179 | 2180 | /typescript/4.9.4: 2181 | resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} 2182 | engines: {node: '>=4.2.0'} 2183 | hasBin: true 2184 | dev: true 2185 | 2186 | /undici/5.14.0: 2187 | resolution: {integrity: sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ==} 2188 | engines: {node: '>=12.18'} 2189 | dependencies: 2190 | busboy: 1.6.0 2191 | dev: true 2192 | 2193 | /unist-util-stringify-position/2.0.3: 2194 | resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} 2195 | dependencies: 2196 | '@types/unist': 2.0.6 2197 | dev: true 2198 | 2199 | /update-browserslist-db/1.0.10_browserslist@4.21.4: 2200 | resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} 2201 | hasBin: true 2202 | peerDependencies: 2203 | browserslist: '>= 4.21.0' 2204 | dependencies: 2205 | browserslist: 4.21.4 2206 | escalade: 3.1.1 2207 | picocolors: 1.0.0 2208 | dev: true 2209 | 2210 | /uri-js/4.4.1: 2211 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2212 | dependencies: 2213 | punycode: 2.1.1 2214 | dev: true 2215 | 2216 | /util-deprecate/1.0.2: 2217 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2218 | dev: true 2219 | 2220 | /vfile-message/2.0.4: 2221 | resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} 2222 | dependencies: 2223 | '@types/unist': 2.0.6 2224 | unist-util-stringify-position: 2.0.3 2225 | dev: true 2226 | 2227 | /vite/4.0.4: 2228 | resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==} 2229 | engines: {node: ^14.18.0 || >=16.0.0} 2230 | hasBin: true 2231 | peerDependencies: 2232 | '@types/node': '>= 14' 2233 | less: '*' 2234 | sass: '*' 2235 | stylus: '*' 2236 | sugarss: '*' 2237 | terser: ^5.4.0 2238 | peerDependenciesMeta: 2239 | '@types/node': 2240 | optional: true 2241 | less: 2242 | optional: true 2243 | sass: 2244 | optional: true 2245 | stylus: 2246 | optional: true 2247 | sugarss: 2248 | optional: true 2249 | terser: 2250 | optional: true 2251 | dependencies: 2252 | esbuild: 0.16.14 2253 | postcss: 8.4.21 2254 | resolve: 1.22.1 2255 | rollup: 3.9.1 2256 | optionalDependencies: 2257 | fsevents: 2.3.2 2258 | dev: true 2259 | 2260 | /vite/4.0.4_@types+node@18.11.18: 2261 | resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==} 2262 | engines: {node: ^14.18.0 || >=16.0.0} 2263 | hasBin: true 2264 | peerDependencies: 2265 | '@types/node': '>= 14' 2266 | less: '*' 2267 | sass: '*' 2268 | stylus: '*' 2269 | sugarss: '*' 2270 | terser: ^5.4.0 2271 | peerDependenciesMeta: 2272 | '@types/node': 2273 | optional: true 2274 | less: 2275 | optional: true 2276 | sass: 2277 | optional: true 2278 | stylus: 2279 | optional: true 2280 | sugarss: 2281 | optional: true 2282 | terser: 2283 | optional: true 2284 | dependencies: 2285 | '@types/node': 18.11.18 2286 | esbuild: 0.16.14 2287 | postcss: 8.4.21 2288 | resolve: 1.22.1 2289 | rollup: 3.9.1 2290 | optionalDependencies: 2291 | fsevents: 2.3.2 2292 | dev: true 2293 | 2294 | /vitefu/0.2.4_vite@4.0.4: 2295 | resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} 2296 | peerDependencies: 2297 | vite: ^3.0.0 || ^4.0.0 2298 | peerDependenciesMeta: 2299 | vite: 2300 | optional: true 2301 | dependencies: 2302 | vite: 4.0.4 2303 | dev: true 2304 | 2305 | /vitest/0.25.8: 2306 | resolution: {integrity: sha512-X75TApG2wZTJn299E/TIYevr4E9/nBo1sUtZzn0Ci5oK8qnpZAZyhwg0qCeMSakGIWtc6oRwcQFyFfW14aOFWg==} 2307 | engines: {node: '>=v14.16.0'} 2308 | hasBin: true 2309 | peerDependencies: 2310 | '@edge-runtime/vm': '*' 2311 | '@vitest/browser': '*' 2312 | '@vitest/ui': '*' 2313 | happy-dom: '*' 2314 | jsdom: '*' 2315 | peerDependenciesMeta: 2316 | '@edge-runtime/vm': 2317 | optional: true 2318 | '@vitest/browser': 2319 | optional: true 2320 | '@vitest/ui': 2321 | optional: true 2322 | happy-dom: 2323 | optional: true 2324 | jsdom: 2325 | optional: true 2326 | dependencies: 2327 | '@types/chai': 4.3.4 2328 | '@types/chai-subset': 1.3.3 2329 | '@types/node': 18.11.18 2330 | acorn: 8.8.1 2331 | acorn-walk: 8.2.0 2332 | chai: 4.3.7 2333 | debug: 4.3.4 2334 | local-pkg: 0.4.2 2335 | source-map: 0.6.1 2336 | strip-literal: 1.0.0 2337 | tinybench: 2.3.1 2338 | tinypool: 0.3.0 2339 | tinyspy: 1.0.2 2340 | vite: 4.0.4_@types+node@18.11.18 2341 | transitivePeerDependencies: 2342 | - less 2343 | - sass 2344 | - stylus 2345 | - sugarss 2346 | - supports-color 2347 | - terser 2348 | dev: true 2349 | 2350 | /which/2.0.2: 2351 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2352 | engines: {node: '>= 8'} 2353 | hasBin: true 2354 | dependencies: 2355 | isexe: 2.0.0 2356 | dev: true 2357 | 2358 | /word-wrap/1.2.3: 2359 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 2360 | engines: {node: '>=0.10.0'} 2361 | dev: true 2362 | 2363 | /wrappy/1.0.2: 2364 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2365 | dev: true 2366 | 2367 | /xtend/4.0.2: 2368 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 2369 | engines: {node: '>=0.4'} 2370 | dev: true 2371 | 2372 | /yallist/4.0.0: 2373 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2374 | dev: true 2375 | 2376 | /yaml/1.10.2: 2377 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 2378 | engines: {node: '>= 6'} 2379 | dev: true 2380 | 2381 | /yocto-queue/0.1.0: 2382 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2383 | engines: {node: '>=10'} 2384 | dev: true 2385 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [require('tailwindcss'), require('autoprefixer')] 3 | }; 4 | -------------------------------------------------------------------------------- /src/app.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | h1 { 6 | @apply text-4xl font-bold my-8; 7 | } 8 | h2 { 9 | @apply text-3xl font-bold my-8; 10 | } 11 | h3 { 12 | @apply text-2xl font-bold my-8; 13 | } 14 | p { 15 | @apply text-xl my-8 leading-10; 16 | } 17 | blockquote { 18 | @apply bg-base-300 rounded-md py-1 px-8 my-8; 19 | } 20 | pre { 21 | @apply bg-base-300 rounded-md p-12 my-8; 22 | } 23 | code { 24 | @apply bg-base-300 rounded-sm p-2 text-sm; 25 | } 26 | pre > code { 27 | @apply bg-transparent; 28 | } 29 | 30 | ul { 31 | @apply bg-base-300 rounded-md px-8 py-4; 32 | } 33 | 34 | a { 35 | @apply text-primary text-xl font-semibold hover:text-secondary-focus transition-all duration-300; 36 | } 37 | 38 | /** 39 | * General 40 | */ 41 | pre[class*='language-'], 42 | code[class*='language-'] { 43 | color: #e0e0e0; 44 | font-size: 13px; 45 | text-shadow: none; 46 | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; 47 | direction: ltr; 48 | text-align: left; 49 | white-space: pre; 50 | word-spacing: normal; 51 | word-break: normal; 52 | line-height: 2; 53 | -moz-tab-size: 4; 54 | -o-tab-size: 4; 55 | tab-size: 4; 56 | -webkit-hyphens: none; 57 | -moz-hyphens: none; 58 | -ms-hyphens: none; 59 | hyphens: none; 60 | } 61 | pre[class*='language-']::selection, 62 | code[class*='language-']::selection, 63 | pre[class*='language-']::mozselection, 64 | code[class*='language-']::mozselection { 65 | text-shadow: none; 66 | background: #b3d4fc; 67 | } 68 | @media print { 69 | pre[class*='language-'], 70 | code[class*='language-'] { 71 | text-shadow: none; 72 | } 73 | } 74 | pre[class*='language-'] { 75 | padding: 1em; 76 | margin: 0.5em 0; 77 | overflow: auto; 78 | background: #1f242d; 79 | } 80 | :not(pre) > code[class*='language-'] { 81 | padding: 0.1em 0.3em; 82 | border-radius: 0.3em; 83 | color: #ffffff; 84 | background: #1f242d; 85 | } 86 | /** 87 | * Tokens 88 | */ 89 | .namespace { 90 | opacity: 0.7; 91 | } 92 | .token.comment, 93 | .token.prolog, 94 | .token.doctype, 95 | .token.cdata { 96 | color: #93a1a1; 97 | } 98 | .token.punctuation { 99 | color: #999999; 100 | } 101 | .token.property, 102 | .token.tag, 103 | .token.boolean, 104 | .token.number, 105 | .token.constant, 106 | .token.symbol, 107 | .token.deleted { 108 | color: #eb0f88; 109 | } 110 | .token.selector, 111 | .token.attr-name, 112 | .token.string, 113 | .token.char, 114 | .token.builtin, 115 | .token.inserted { 116 | color: #31aaa8; 117 | } 118 | .token.operator, 119 | .token.entity, 120 | .token.url, 121 | .language-css .token.string, 122 | .style .token.string { 123 | color: #b2d4fc; 124 | background: #1f242d; 125 | } 126 | .token.atrule, 127 | .token.attr-value, 128 | .token.keyword { 129 | color: #b2d4fc; 130 | } 131 | .token.function { 132 | color: #dd4a68; 133 | } 134 | .token.regex, 135 | .token.important, 136 | .token.variable { 137 | color: #ee9900; 138 | } 139 | .token.important, 140 | .token.bold { 141 | font-weight: bold; 142 | } 143 | .token.italic { 144 | font-style: italic; 145 | } 146 | .token.entity { 147 | cursor: help; 148 | } 149 | /********************************************************* 150 | * Line highlighting 151 | */ 152 | pre[data-line] { 153 | position: relative; 154 | } 155 | pre[class*='language-'] > code[class*='language-'] { 156 | position: relative; 157 | z-index: 1; 158 | } 159 | .line-highlight { 160 | position: absolute; 161 | left: 0; 162 | right: 0; 163 | padding: inherit 0; 164 | margin-top: 1em; 165 | background: #3c4558; 166 | box-shadow: inset 5px 0 0 #b2d4fc; 167 | z-index: 0; 168 | pointer-events: none; 169 | line-height: inherit; 170 | white-space: pre; 171 | } 172 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | // and what to do when importing types 4 | import PocketBase, { Admin } from 'pocketbase'; 5 | 6 | declare global { 7 | declare namespace App { 8 | // interface Error {} 9 | interface Locals { 10 | pb: PocketBase; 11 | user: Record | Admin | null; 12 | } 13 | // interface PageData {} 14 | // interface Platform {} 15 | } 16 | declare module '*.md' { 17 | export const metadata: { 18 | title?: string; 19 | prevUrl?: string; 20 | prevButton?: string; 21 | nextUrl?: string; 22 | nextButton?: string; 23 | }; 24 | const content: ConstructorOfATypedSvelteComponent; 25 | export default content 26 | }; 27 | } 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
    %sveltekit.body%
    11 | 12 | 13 | -------------------------------------------------------------------------------- /src/content/first-list-item.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: First List Item 3 | prevUrl: '/full-list' 4 | prevButton: 'Full List' 5 | nextUrl: '/user' 6 | nextButton: 'User' 7 | --- 8 | 9 | # { title } 10 | 11 | If you are looking to find that one specific record that matches a certain parameter, the `FirstListItem` component has got your back! Set the `collection` prop and provide a `filter`, and it will return the first record that fits the bill. It's like the `firstListItem` function, but without all the chaining. 12 | 13 | ```typescript 14 | 17 | 18 | 22 |

    {record.title}

    23 | {error} 24 |
    25 | ``` 26 | -------------------------------------------------------------------------------- /src/content/full-list.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Full List 3 | prevUrl: '/list' 4 | prevButton: 'List' 5 | nextUrl: '/first-list-item' 6 | nextButton: 'First List Item' 7 | --- 8 | 9 | # { title } 10 | 11 | If you want to retrieve all records from a collection as you would using the `getFullList` function, you can use the `FullList` component. 12 | 13 | By default, the component will return a `batch` of 100 records, but you are free to increase or decrease this to fit your specific needs. 14 | 15 | ```typescript 16 | 19 | 20 | 21 | {#each records as record} 22 |

    {record.title}

    23 | {/each} 24 | {error} 25 |
    26 | ``` 27 | -------------------------------------------------------------------------------- /src/content/list.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: List 3 | prevUrl: '/record' 4 | prevButton: 'Record' 5 | nextUrl: '/full-list' 6 | nextButton: 'Full List' 7 | --- 8 | 9 | # { title } 10 | 11 | Need to retrieve a list of records from your PocketBase database? Check out the `List` component! You can easily paginate through your data just like you would with the `getList` function in the PocketBase JavaScript SDK. 12 | 13 | The component defaults to displaying 50 records per page, starting at page 1, but you can customize the current page and results per page to fit your needs using the `page` and `perPage` props. 14 | 15 | **Example** 16 | 17 | ```typescript 18 | 27 | 28 | 29 | {#each items as item} 30 |

    {item.title}

    31 | {/each} 32 | {#each pages as pageNumber} 33 | 34 | {/each} 35 |
    {JSON.stringify(items, null, 2)}
    36 | {error} 37 |
    38 | 39 | ``` 40 | 41 | ## Declarative Pagination 42 | 43 | You can even break the `List` down even further using the `Pagination` helper to cut down on the `{#each}` blocks within your markup. Simply pass your items array into the `items`. The component will loop over any items in the array, and expose the individual item data via the `let:item` directive. 44 | 45 | You can also pass content to the `pages slot` provided that you also include a pages array to the `pages` prop. This is helpful if you want to have a list of pagination buttons. The `pages slot` is optional, since you may want to provide your own pagination navigation. 46 | 47 | **Example** 48 | 49 | ```typescript 50 | 60 | 61 | 62 | 63 |

    {item.title}

    64 | 65 |
    66 | {error} 67 |
    68 | ``` 69 | -------------------------------------------------------------------------------- /src/content/record.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Record 3 | prevUrl: '/' 4 | prevButton: 'Intro' 5 | nextUrl: '/list' 6 | nextButton: 'List' 7 | --- 8 | 9 | # Record 10 | 11 | ```typescript 12 | 15 | 16 | 17 | Loading... 18 |
    {JSON.stringify(record, null, 2)}
    19 | {error} 20 |
    21 | ``` 22 | 23 | The `Record` component is intended to retrieve single records from your database by their `RECORD_ID`. 24 | 25 | Simply pass in the name of the collection to the `collection` prop and a `RECORD_ID` to the `id` prop and let the component do the heavy lifting. 26 | 27 | You can also pass an `HTMLElement` into the `loading` slot in the event that your server is being naughty, and you need to keep your audience captivated with a fancy loading element. 28 | 29 | Want to access the data? No problem, just use the handy `let:record` directive. 30 | 31 | As an extra sprinkle of magic, there is no need to fuss about with `{ #await }` blocks. The `Record` component, along with all other data components handle the async action for you! 32 | -------------------------------------------------------------------------------- /src/content/user.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: User 3 | prevUrl: '/first-list-item' 4 | prevButton: 'First List Item' 5 | --- 6 | 7 | # { title } 8 | 9 | Need to show (or hide) certain parts of your UI based on a user's authentication status? Simply wrap any content you want to conditionally render with the `User` component, and it will only appear if there is a valid user object in the `authStore`. 10 | 11 | If you want a fallback element for signed-out users? Just assign it to the `signedout` slot. 12 | 13 | Also, if you want to render a placeholder during the loading phase, assign an element to the `loading` slot as we do for all other components. 14 | 15 | To access the user's data, just use the `let:user` directive to pass it down to any child elements. 16 | 17 | ```typescript 18 | 21 | 22 | 23 |
    24 |

    Name: {user?.name}

    25 |

    Email: {user?.email}

    26 |
    27 |
    28 |
  • Log in
  • 29 |
  • Register
  • 30 |
    31 |
    32 | 33 | ``` 34 | 35 | ## Protecting Specific Routes 36 | 37 | The User component is pretty sweet, but it is not a sufficient method for protecting critical areas of your application. If you need to protect specific routes, you should consider using a `hooks.server.(ts|js)` alongside `load` functions inside your `+page.server.(ts|js)`. 38 | 39 | To save you the hassle of looking it up yourself, I've included a few examples below that can help get you started. 40 | 41 | ### hooks.server.ts 42 | 43 | ```typescript 44 | // src/hooks.server.ts 45 | 46 | import { env } from '$env/dynamic/public'; 47 | import type { Handle } from '@sveltejs/kit'; 48 | import PocketBase from 'pocketbase'; 49 | 50 | export const handle: Handle = async ({ event, resolve }) => { 51 | event.locals.pb = new PocketBase(env.PUBLIC_POCKETBASE_URL); 52 | 53 | // Grab the cookie from request headers 54 | const cookie = event.request.headers.get('cookie'); 55 | 56 | // load the store data from the request cookie string 57 | event.locals.pb.authStore.loadFromCookie(cookie || ''); 58 | 59 | try { 60 | // get an up-to-date auth store state by verifying and refreshing the loaded auth model (if any) 61 | event.locals.pb.authStore.isValid && (await event.locals.pb.collection('users').authRefresh()); 62 | } catch (_) { 63 | // clear the auth store on failed refresh 64 | event.locals.pb.authStore.clear(); 65 | } 66 | 67 | const response = await resolve(event); 68 | 69 | // send back the default 'pb_auth' cookie to the client with the latest store state 70 | response.headers.set('set-cookie', event.locals.pb.authStore.exportToCookie()); 71 | 72 | return response; 73 | }; 74 | ``` 75 | 76 | ### +page.server.ts 77 | 78 | ```typescript 79 | // src/routes/protected-route/+page.server.ts 80 | 81 | import { redirect } from '@sveltejs/kit'; 82 | import type { PageServerLoad } from './$types'; 83 | 84 | export const load = (({ locals }) => { 85 | // check to see if the user is authenticated 86 | if (!locals.pb.authStore.isValid) { 87 | // if not, redirect them to "/login" 88 | throw redirect(303, '/login'); 89 | } 90 | }) satisfies PageServerLoad; 91 | ``` 92 | -------------------------------------------------------------------------------- /src/hooks.server.ts: -------------------------------------------------------------------------------- 1 | import { env } from "$env/dynamic/public"; 2 | import type { Handle } from '@sveltejs/kit'; 3 | import PocketBase from "pocketbase"; 4 | 5 | export const handle: Handle = async ({ event, resolve }) => { 6 | event.locals.pb = new PocketBase(env.PUBLIC_POCKETBASE_URL) 7 | 8 | // Grab the cookie from request headers 9 | const cookie = event.request.headers.get('cookie') 10 | 11 | // load the store data from the request cookie string 12 | event.locals.pb.authStore.loadFromCookie(cookie || ''); 13 | 14 | try { 15 | // get an up-to-date auth store state by verifying and refreshing the loaded auth model (if any) 16 | event.locals.pb.authStore.isValid && (await event.locals.pb.collection('users').authRefresh()); 17 | } catch (_) { 18 | // clear the auth store on failed refresh 19 | event.locals.pb.authStore.clear(); 20 | } 21 | 22 | const response = await resolve(event); 23 | 24 | // send back the default 'pb_auth' cookie to the client with the latest store state 25 | response.headers.set('set-cookie', event.locals.pb.authStore.exportToCookie({httpOnly: false, secure: false})); 26 | 27 | return response; 28 | }; 29 | -------------------------------------------------------------------------------- /src/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | 3 | describe('sum test', () => { 4 | it('adds 1 + 2 to equal 3', () => { 5 | expect(1 + 2).toBe(3); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /src/lib/FirstListItem.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | {#await record then data} 13 | {#if !data} 14 | 15 | {/if} 16 | 17 | {:catch error} 18 | 19 | {/await} 20 | -------------------------------------------------------------------------------- /src/lib/FullList.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | {#await records then data} 13 | {#if !data} 14 | 15 | {/if} 16 | 17 | {:catch error} 18 | 19 | {/await} 20 | -------------------------------------------------------------------------------- /src/lib/List.svelte: -------------------------------------------------------------------------------- 1 | 20 | 21 | {#await resultList then data} 22 | {#if !data} 23 | 24 | {/if} 25 | 26 | {:catch error} 27 | 28 | {/await} 29 | -------------------------------------------------------------------------------- /src/lib/Pagination.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | {#each items as item} 9 | 10 | {/each} 11 | {#if pages && $$slots.pages} 12 | {#each pages as pageNumber} 13 | 14 | {/each} 15 | {/if} 16 | -------------------------------------------------------------------------------- /src/lib/Record.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | {#await record then data} 13 | {#if !data} 14 | 15 | {/if} 16 | 17 | {:catch error} 18 | 19 | {/await} 20 | -------------------------------------------------------------------------------- /src/lib/User.svelte: -------------------------------------------------------------------------------- 1 | 24 | 25 | {#if mounted} 26 | {#if $pbStore.authStore.isValid && $user} 27 | 28 | {:else} 29 | 30 | {/if} 31 | {:else} 32 | 33 | {/if} 34 | -------------------------------------------------------------------------------- /src/lib/index.ts: -------------------------------------------------------------------------------- 1 | import FirstListItem from './FirstListItem.svelte'; 2 | import FullList from './FullList.svelte'; 3 | import List from './List.svelte'; 4 | import Pagination from './Pagination.svelte'; 5 | import Record from './Record.svelte'; 6 | import { pbStore } from './stores'; 7 | import User from './User.svelte'; 8 | 9 | export { FirstListItem, FullList, List, Pagination, Record, User, pbStore }; 10 | -------------------------------------------------------------------------------- /src/lib/stores.ts: -------------------------------------------------------------------------------- 1 | import { browser } from '$app/environment'; 2 | import PocketBase, { BaseAuthStore } from 'pocketbase'; 3 | import { writable } from 'svelte/store'; 4 | 5 | function createPbStore( 6 | baseUrl?: string | undefined, 7 | authStore?: BaseAuthStore | null | undefined, 8 | lang?: string | undefined 9 | ) { 10 | const store = writable(); 11 | 12 | function set( 13 | baseUrl?: string | undefined, 14 | authStore?: BaseAuthStore | null | undefined, 15 | lang?: string | undefined 16 | ) { 17 | const pb = new PocketBase(baseUrl, authStore, lang); 18 | 19 | if (browser) { 20 | pb.authStore.loadFromCookie(document.cookie); 21 | } 22 | store.set(pb); 23 | } 24 | 25 | set(baseUrl, authStore, lang); 26 | 27 | return { 28 | subscribe: store.subscribe, 29 | set 30 | }; 31 | } 32 | 33 | export const pbStore = createPbStore(); 34 | -------------------------------------------------------------------------------- /src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 | 71 | 72 |
    73 | 74 |
    75 | -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | {data.metadata?.title || 'Component'} 8 | 9 | 10 |
    11 |
    12 | This library is in early development. Be careful if you intend on using it in a production 13 | environment. 14 |
    15 | 16 | 19 |
    20 | -------------------------------------------------------------------------------- /src/routes/+page.ts: -------------------------------------------------------------------------------- 1 | import type { PageData } from "./$types"; 2 | 3 | 4 | export const load = (async () => { 5 | const post = await import(`./intro.md`); 6 | const { metadata } = post; 7 | const content = post.default; 8 | 9 | return { 10 | content, 11 | metadata 12 | }; 13 | }) satisfies PageData; 14 | -------------------------------------------------------------------------------- /src/routes/[slug]/+page.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | {data.metadata?.title || 'Component'} 8 | 9 | 10 |
    11 | 12 |
    13 |
    14 | {#if data.metadata?.prevUrl && data.metadata?.prevButton} 15 | {data.metadata?.prevButton} 16 | {/if} 17 | {#if data.metadata?.nextUrl && data.metadata?.nextButton} 18 | {data.metadata?.nextButton} 19 | {/if} 20 |
    21 | -------------------------------------------------------------------------------- /src/routes/[slug]/+page.ts: -------------------------------------------------------------------------------- 1 | import type { PageLoad } from './$types'; 2 | 3 | export const load = (async ({params}) => { 4 | const post = await import(`../../content/${params.slug}.md`); 5 | const { metadata } = post; 6 | const content = post.default; 7 | 8 | return { 9 | content, 10 | metadata 11 | }; 12 | }) satisfies PageLoad; 13 | -------------------------------------------------------------------------------- /src/routes/intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Svelte-PocketBase 3 | nextUrl: '/record' 4 | nextButton: 'Record' 5 | --- 6 | 7 | # {title} 8 | 9 | **Supercharge your Sveltekit + PocketBase project!** 10 | 11 | **Svelte-Pocketbase** is the perfect companion to your next Sveltekit + PocketBase project. This library provides declarative components that effortlessly query data from your PocketBase database. 12 | 13 | ## Getting Started 14 | 15 | ```bash 16 | # install svelte-pocketbase with pnpm, npm or yarn 17 | 18 | pnpm i -D svelte-pocketbase 19 | ``` 20 | 21 | ## PocketBase Store 22 | 23 | To get started, instantiate a new `pbStore` in a `+page.svelte` or `+layout.svelte`. 24 | 25 | ```javascript 26 | // src/+layout.svelte OR src/+page.svelte 27 | 34 | 35 | 36 | ``` 37 | 38 | The `pbStore` is the ultimate marriage of PocketBase and Svelte `Writable` magic! Simply create an instance of `pbStore` and you've got a PocketBase instance wrapped up in a shiny svelte store. Need to use it in your app? No problem! Just subscribe to `$pbStore` and you're good to go. 39 | 40 | ```typescript 41 | // src/+page.svelte 42 | 48 | 49 | {#await record} 50 | Loading... 51 | {:then data} 52 |
    {JSON.stringify(data, null, 2)}
    53 | {:catch error} 54 |

    {error.message}

    55 | {/await} 56 | ``` 57 | 58 | This is a fair amount of boilerplate for simply retrieving a bit of data from your database. Instead, maybe try out one of the data retrieval components, like `Record`. These components handle all the tedious bits of querying and data retrieval, leaving you free to focus on more important things (like obsessively fine-tuning your Tailwind CSS config). 59 | 60 | ### Data Retrieval Components 61 | 62 | - [Record](/record) 63 | - [List](/list) 64 | - [FullList](/full-list) 65 | - [FirstListItem](/first-list-item) 66 | 67 | Every data retrieval component receives a `collection` prop, and an optional `query` prop that can be used to sort and filter the results. Each component also contains an `error` slot that can be used to notify the user. 68 | -------------------------------------------------------------------------------- /src/routes/login/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit'; 2 | import type { Actions, PageServerLoad } from './$types'; 3 | 4 | export const load = (({ locals }) => { 5 | if (locals.pb.authStore.isValid) { 6 | throw redirect(303, '/'); 7 | } 8 | }) satisfies PageServerLoad; 9 | 10 | export const actions: Actions = { 11 | default: async ({ locals, request }) => { 12 | const data = Object.fromEntries(await request.formData()) as { 13 | email: string; 14 | password: string; 15 | }; 16 | 17 | try { 18 | await locals.pb.collection('users').authWithPassword(data.email, data.password); 19 | } catch (e) { 20 | console.error(e); 21 | throw e; 22 | } 23 | 24 | throw redirect(303, request.url.replace(/.+\?origin=(.+)/g, '/$1')); 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /src/routes/login/+page.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
    { 10 | return async ({ result }) => { 11 | $pbStore.authStore.loadFromCookie(document.cookie); 12 | await applyAction(result); 13 | }; 14 | }} 15 | > 16 |

    Log in

    17 |

    18 | To demonstrate the login functionality, login with test@example.com and 19 | test123456 as the password. 20 |

    21 |
    22 | 28 | 34 | 35 |
    36 |
    37 | -------------------------------------------------------------------------------- /src/routes/logout/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit'; 2 | import type { Actions } from './$types'; 3 | 4 | export const actions: Actions = { 5 | default: async ({ locals }) => { 6 | locals.pb.authStore.clear(); 7 | locals.user = null; 8 | throw redirect(303, '/'); 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /src/routes/secret/+page.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'Protected Route' 3 | --- 4 | 5 | # Protected Route 6 | 7 | This route uses a combination of `hooks` and `+page.server.(t|s)`. Here is an example of how you can implement this in your app. 8 | 9 | ### hooks.server.ts 10 | 11 | ```typescript 12 | // src/hooks.server.ts 13 | 14 | import { env } from '$env/dynamic/public'; 15 | import type { Handle } from '@sveltejs/kit'; 16 | import PocketBase from 'pocketbase'; 17 | 18 | export const handle: Handle = async ({ event, resolve }) => { 19 | event.locals.pb = new PocketBase(env.PUBLIC_POCKETBASE_URL); 20 | 21 | // Grab the cookie from request headers 22 | const cookie = event.request.headers.get('cookie'); 23 | 24 | // load the store data from the request cookie string 25 | event.locals.pb.authStore.loadFromCookie(cookie || ''); 26 | 27 | try { 28 | // get an up-to-date auth store state by verifying and refreshing the loaded auth model (if any) 29 | event.locals.pb.authStore.isValid && (await event.locals.pb.collection('users').authRefresh()); 30 | } catch (_) { 31 | // clear the auth store on failed refresh 32 | event.locals.pb.authStore.clear(); 33 | } 34 | 35 | const response = await resolve(event); 36 | 37 | // send back the default 'pb_auth' cookie to the client with the latest store state 38 | response.headers.set('set-cookie', event.locals.pb.authStore.exportToCookie()); 39 | 40 | return response; 41 | }; 42 | ``` 43 | 44 | ### +page.server.ts 45 | 46 | ```typescript 47 | // src/routes/protected-route/+page.server.ts 48 | 49 | import { redirect } from '@sveltejs/kit'; 50 | import type { PageServerLoad } from './$types'; 51 | 52 | export const load = (({ locals }) => { 53 | // check to see if the user is authenticated 54 | if (!locals.pb.authStore.isValid) { 55 | // if not, redirect them to "/login" 56 | throw redirect(303, '/login'); 57 | } 58 | }) satisfies PageServerLoad; 59 | ``` 60 | -------------------------------------------------------------------------------- /src/routes/secret/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit'; 2 | import type { PageServerLoad } from './$types'; 3 | 4 | export const load = (({ locals }) => { 5 | 6 | if (!locals.pb.authStore.isValid) { 7 | throw redirect(303, '/login?origin=secret'); 8 | } 9 | }) satisfies PageServerLoad; 10 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creekdrops/svelte-pocketbase/3f309a960d17609f059e32fcb2b1ebb6874692e1/static/favicon.png -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import { mdsvex } from 'mdsvex'; 2 | import adapter from '@sveltejs/adapter-auto'; 3 | import { vitePreprocess } from '@sveltejs/kit/vite'; 4 | 5 | /** @type {import('@sveltejs/kit').Config} */ 6 | const config = { 7 | extensions: ['.svelte', '.md'], 8 | preprocess: [vitePreprocess(), mdsvex({ extensions: ['.md'] })], 9 | kit: { 10 | adapter: adapter() 11 | } 12 | }; 13 | 14 | export default config; 15 | -------------------------------------------------------------------------------- /tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: ['./src/routes/**/*.{svelte,js,ts,md}'], 3 | plugins: [require('daisyui')] 4 | }; 5 | -------------------------------------------------------------------------------- /tests/test.ts: -------------------------------------------------------------------------------- 1 | import { expect, test } from '@playwright/test'; 2 | 3 | test('index page has expected h1', async ({ page }) => { 4 | await page.goto('/'); 5 | expect(await page.textContent('h1')).toBe('Welcome to SvelteKit'); 6 | }); 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true 12 | } 13 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 14 | // 15 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 16 | // from the referenced tsconfig.json - TypeScript does not merge them in 17 | } 18 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | 3 | /** @type {import('vite').UserConfig} */ 4 | const config = { 5 | plugins: [sveltekit()], 6 | test: { 7 | include: ['src/**/*.{test,spec}.{js,ts}'] 8 | } 9 | }; 10 | 11 | export default config; 12 | --------------------------------------------------------------------------------