[READ-ONLY] Mirror of https://github.com/mrgnw/editable-cv.
0

Configure Feed

Select the types of activity you want to include in your feed.

Init.

author
michael
date (Apr 4, 2023, 11:46 PM +0200) commit 1b95cabe
+10177
+13
.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
+15
.eslintrc.cjs
··· 1 + module.exports = { 2 + root: true, 3 + extends: ['eslint:recommended', 'prettier'], 4 + plugins: ['svelte3'], 5 + overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 6 + parserOptions: { 7 + sourceType: 'module', 8 + ecmaVersion: 2020 9 + }, 10 + env: { 11 + browser: true, 12 + es2017: true, 13 + node: true 14 + } 15 + };
+10
.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-*
+1
.npmrc
··· 1 + engine-strict=true
+13
.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
+16
.prettierrc
··· 1 + { 2 + "tabWidth": 2, 3 + "singleQuote": true, 4 + "trailingComma": "none", 5 + "printWidth": 100, 6 + "arrowParens": "avoid", 7 + "svelteSortOrder": "options-scripts-markup-styles", 8 + "svelteStrictMode": false, 9 + "svelteIndentScriptAndStyle": true, 10 + "plugins": ["prettier-plugin-svelte"], 11 + "pluginSearchDirs": ["."], 12 + "overrides": [ 13 + { "files": "*.svelte", "options": { "parser": "svelte" } }, 14 + { "files": "*.css", "options": { "singleQuote": false } } 15 + ] 16 + }
+1
Procfile
··· 1 + web: node build/index.js
+116
README.md
··· 1 + # editable-website 2 + 3 + A SvelteKit template that allows you to code a **completely custom website**, while allowing non-technical people to **make edits** to the content by simply logging in with a secure admin password. 4 + 5 + Check out the demo at [editable.website](https://editable.website). 6 + 7 + ## But why? 8 + 9 + It's a dynamic website, but light as a feather compared to building on top of a CMS. It makes editing content self-explanatory. 10 + 11 + ## Step 0 - Requirements 12 + 13 + - Node.js 16+ or compatible JavaScript runtime 14 + - Postgres 14+ 15 + - MinIO or other S3-compatible storage solution 16 + 17 + ## Step 1 - Development setup 18 + 19 + This is a full-fledged webapp you want adjust to your own needs. So please **create a copy** or fork of the source code and rename the project accordingly. Then check out your own copy. 20 + 21 + ```bash 22 + git clone https://github.com/your-user/your-website.git 23 + cd your-website 24 + ``` 25 + 26 + Create a `.env` file and set the folllowing environment variables pointing to your development database and MinIO instance. 27 + 28 + ```bash 29 + VITE_DB_URL=postgresql://$USER@localhost:5432/editable-website 30 + VITE_S3_ACCESS_KEY=000000000000000000 31 + VITE_S3_SECRET_ACCESS_KEY=00000000000000000000000000000000000000 32 + VITE_S3_ENDPOINT=https://minio.ew-dev-assets--000000000000.addon.code.run 33 + VITE_S3_BUCKET=editable-website 34 + VITE_ASSET_PATH=https://minio.ew-dev-assets--000000000000.addon.code.run/editable-website 35 + VITE_ADMIN_PASSWORD=00000000000000000000000000000000000000 36 + ``` 37 + 38 + Seed the database: 39 + 40 + ```bash 41 + psql -h localhost -U $USER -d editable-website -a -f sql/schema.sql 42 + ``` 43 + 44 + Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 45 + 46 + ```bash 47 + npm run dev 48 + ``` 49 + 50 + To create and test a production version of your app: 51 + 52 + ```bash 53 + npm run build 54 + ``` 55 + 56 + You can preview the production build with `npm run preview`. 57 + 58 + ## Step 2 - Making changes to your website 59 + 60 + You can literally do everything that SvelteKit allows you to do. Below is the source code for the /imprint page, which has a `<PlainText>` title and `<RichText>` content. 61 + 62 + ```svelte 63 + <svelte:head> 64 + <title>Imprint</title> 65 + </svelte:head> 66 + 67 + {#if showUserMenu} 68 + <Modal on:close={() => (showUserMenu = false)}> 69 + <div class="w-full flex flex-col space-y-4 p-4 sm:p-6"> 70 + <PrimaryButton on:click={toggleEdit}>Edit page</PrimaryButton> 71 + <LoginMenu {currentUser} /> 72 + </div> 73 + </Modal> 74 + {/if} 75 + 76 + {#if editable} 77 + <EditorToolbar on:cancel={initOrReset} on:save={savePage} /> 78 + {/if} 79 + 80 + <WebsiteNav bind:showUserMenu {currentUser} bind:editable /> 81 + 82 + <div class="py-12 sm:py-24"> 83 + <div class="max-w-screen-md mx-auto px-6 md:text-xl"> 84 + <h1 class="text-4xl md:text-7xl font-bold pb-8"> 85 + <PlainText {editable} bind:content={title} /> 86 + </h1> 87 + <div class="prose md:prose-xl pb-12 sm:pb-24"> 88 + <RichText multiLine {editable} bind:content={imprint} /> 89 + </div> 90 + </div> 91 + </div> 92 + 93 + <Footer counter="/imprint" /> 94 + ``` 95 + 96 + To see the full picture, open [src/routes/imprint/+page.svelte](src/routes/imprint/%2Bpage.svelte) and [src/routes/imprint/+page.server.js](src/routes/imprint/%2Bpage.server.js). 97 + 98 + Please use this as a starting point for new pages you want to add to your website. `editable-website` is not a widget-library on purpose. Instead you are encouraged to inspect and adjust all source code, including the [schema](./src/lib/prosemirrorSchemas.js) for the editors. I want you to be in control of everything. No behind-the-scene magic. 99 + 100 + ## Step 3 - Making changes to the content 101 + 102 + Just navigate to `http://127.0.0.1:5173/login` and enter your secure admin password (`VITE_ADMIN_PASSWORD`). Now you see an additional ellipsis menu, which will provide you an "Edit page" or "Edit post" option for all pages that you have set up as "editable". 103 + 104 + ## Step 4 - Deployment 105 + 106 + I will describe the steps to deploy to [Northflank](https://northflank.com/) (which I am using). I recommend to assign 0.2 vCPU and 512MB RAM to each resource (~ $17/month) but you can go lower to save some costs or higher if you expect your site to have significant traffic. 107 + 108 + 1. Create instances for Postgres 14 and MinIO through the Northflank user interface. 109 + 110 + 2. Create a combined service, select the Heroku buildpack and assign the environment variables as they are exposed by the Postgres and MinIO addons. Use the same environment variables during the build step and runtime (yes you have to type them twice). 111 + 112 + You can deploy your editable website anywhere else as well. For instance if you'd like to go the "Serverless" path, you can deploy on Vercel, and use NeonDB (or DigitalOcean with Connection Pooling activated). You may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. 113 + 114 + ## Step 5 - Get in touch 115 + 116 + If you have questions or need help (with development or deployment), send me an email (michael@letsken.com) and suggest a few slots where you have time for a 30 minute chat (I'm based in Austria GMT+1).
+6194
package-lock.json
··· 1 + { 2 + "name": "editable-website", 3 + "version": "0.0.1", 4 + "lockfileVersion": 2, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "editable-website", 9 + "version": "0.0.1", 10 + "dependencies": { 11 + "@fontsource/jost": "^4.5.13", 12 + "@sveltejs/adapter-node": "^1.2.3", 13 + "aws-sdk": "^2.1350.0", 14 + "camelcase-keys": "^8.0.2", 15 + "pg-promise": "^11.4.3", 16 + "prosemirror-commands": "^1.5.0", 17 + "prosemirror-dropcursor": "^1.6.1", 18 + "prosemirror-example-setup": "^1.2.1", 19 + "prosemirror-gapcursor": "^1.3.1", 20 + "prosemirror-history": "^1.3.0", 21 + "prosemirror-inputrules": "^1.2.0", 22 + "prosemirror-keymap": "^1.2.0", 23 + "prosemirror-model": "^1.19.0", 24 + "prosemirror-schema-basic": "^1.2.1", 25 + "prosemirror-schema-list": "^1.2.2", 26 + "prosemirror-state": "^1.4.2", 27 + "prosemirror-view": "^1.30.1", 28 + "slugify": "^1.6.5" 29 + }, 30 + "devDependencies": { 31 + "@sveltejs/adapter-auto": "^2.0.0", 32 + "@sveltejs/kit": "^1.5.3", 33 + "@tailwindcss/forms": "^0.5.3", 34 + "@tailwindcss/typography": "^0.5.9", 35 + "autoprefixer": "^10.4.14", 36 + "eslint": "^8.28.0", 37 + "eslint-config-prettier": "^8.5.0", 38 + "eslint-plugin-svelte3": "^4.0.0", 39 + "postcss": "^8.4.21", 40 + "prettier": "^2.8.0", 41 + "prettier-plugin-svelte": "^2.8.1", 42 + "svelte": "^3.54.0", 43 + "tailwindcss": "^3.3.1", 44 + "vite": "^4.2.0" 45 + } 46 + }, 47 + "node_modules/@esbuild/android-arm": { 48 + "version": "0.17.15", 49 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", 50 + "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", 51 + "cpu": [ 52 + "arm" 53 + ], 54 + "optional": true, 55 + "os": [ 56 + "android" 57 + ], 58 + "engines": { 59 + "node": ">=12" 60 + } 61 + }, 62 + "node_modules/@esbuild/android-arm64": { 63 + "version": "0.17.15", 64 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", 65 + "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", 66 + "cpu": [ 67 + "arm64" 68 + ], 69 + "optional": true, 70 + "os": [ 71 + "android" 72 + ], 73 + "engines": { 74 + "node": ">=12" 75 + } 76 + }, 77 + "node_modules/@esbuild/android-x64": { 78 + "version": "0.17.15", 79 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", 80 + "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", 81 + "cpu": [ 82 + "x64" 83 + ], 84 + "optional": true, 85 + "os": [ 86 + "android" 87 + ], 88 + "engines": { 89 + "node": ">=12" 90 + } 91 + }, 92 + "node_modules/@esbuild/darwin-arm64": { 93 + "version": "0.17.15", 94 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", 95 + "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", 96 + "cpu": [ 97 + "arm64" 98 + ], 99 + "optional": true, 100 + "os": [ 101 + "darwin" 102 + ], 103 + "engines": { 104 + "node": ">=12" 105 + } 106 + }, 107 + "node_modules/@esbuild/darwin-x64": { 108 + "version": "0.17.15", 109 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", 110 + "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", 111 + "cpu": [ 112 + "x64" 113 + ], 114 + "optional": true, 115 + "os": [ 116 + "darwin" 117 + ], 118 + "engines": { 119 + "node": ">=12" 120 + } 121 + }, 122 + "node_modules/@esbuild/freebsd-arm64": { 123 + "version": "0.17.15", 124 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", 125 + "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", 126 + "cpu": [ 127 + "arm64" 128 + ], 129 + "optional": true, 130 + "os": [ 131 + "freebsd" 132 + ], 133 + "engines": { 134 + "node": ">=12" 135 + } 136 + }, 137 + "node_modules/@esbuild/freebsd-x64": { 138 + "version": "0.17.15", 139 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", 140 + "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", 141 + "cpu": [ 142 + "x64" 143 + ], 144 + "optional": true, 145 + "os": [ 146 + "freebsd" 147 + ], 148 + "engines": { 149 + "node": ">=12" 150 + } 151 + }, 152 + "node_modules/@esbuild/linux-arm": { 153 + "version": "0.17.15", 154 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", 155 + "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", 156 + "cpu": [ 157 + "arm" 158 + ], 159 + "optional": true, 160 + "os": [ 161 + "linux" 162 + ], 163 + "engines": { 164 + "node": ">=12" 165 + } 166 + }, 167 + "node_modules/@esbuild/linux-arm64": { 168 + "version": "0.17.15", 169 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", 170 + "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", 171 + "cpu": [ 172 + "arm64" 173 + ], 174 + "optional": true, 175 + "os": [ 176 + "linux" 177 + ], 178 + "engines": { 179 + "node": ">=12" 180 + } 181 + }, 182 + "node_modules/@esbuild/linux-ia32": { 183 + "version": "0.17.15", 184 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", 185 + "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", 186 + "cpu": [ 187 + "ia32" 188 + ], 189 + "optional": true, 190 + "os": [ 191 + "linux" 192 + ], 193 + "engines": { 194 + "node": ">=12" 195 + } 196 + }, 197 + "node_modules/@esbuild/linux-loong64": { 198 + "version": "0.17.15", 199 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", 200 + "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", 201 + "cpu": [ 202 + "loong64" 203 + ], 204 + "optional": true, 205 + "os": [ 206 + "linux" 207 + ], 208 + "engines": { 209 + "node": ">=12" 210 + } 211 + }, 212 + "node_modules/@esbuild/linux-mips64el": { 213 + "version": "0.17.15", 214 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", 215 + "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", 216 + "cpu": [ 217 + "mips64el" 218 + ], 219 + "optional": true, 220 + "os": [ 221 + "linux" 222 + ], 223 + "engines": { 224 + "node": ">=12" 225 + } 226 + }, 227 + "node_modules/@esbuild/linux-ppc64": { 228 + "version": "0.17.15", 229 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", 230 + "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", 231 + "cpu": [ 232 + "ppc64" 233 + ], 234 + "optional": true, 235 + "os": [ 236 + "linux" 237 + ], 238 + "engines": { 239 + "node": ">=12" 240 + } 241 + }, 242 + "node_modules/@esbuild/linux-riscv64": { 243 + "version": "0.17.15", 244 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", 245 + "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", 246 + "cpu": [ 247 + "riscv64" 248 + ], 249 + "optional": true, 250 + "os": [ 251 + "linux" 252 + ], 253 + "engines": { 254 + "node": ">=12" 255 + } 256 + }, 257 + "node_modules/@esbuild/linux-s390x": { 258 + "version": "0.17.15", 259 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", 260 + "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", 261 + "cpu": [ 262 + "s390x" 263 + ], 264 + "optional": true, 265 + "os": [ 266 + "linux" 267 + ], 268 + "engines": { 269 + "node": ">=12" 270 + } 271 + }, 272 + "node_modules/@esbuild/linux-x64": { 273 + "version": "0.17.15", 274 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", 275 + "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", 276 + "cpu": [ 277 + "x64" 278 + ], 279 + "optional": true, 280 + "os": [ 281 + "linux" 282 + ], 283 + "engines": { 284 + "node": ">=12" 285 + } 286 + }, 287 + "node_modules/@esbuild/netbsd-x64": { 288 + "version": "0.17.15", 289 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", 290 + "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", 291 + "cpu": [ 292 + "x64" 293 + ], 294 + "optional": true, 295 + "os": [ 296 + "netbsd" 297 + ], 298 + "engines": { 299 + "node": ">=12" 300 + } 301 + }, 302 + "node_modules/@esbuild/openbsd-x64": { 303 + "version": "0.17.15", 304 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", 305 + "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", 306 + "cpu": [ 307 + "x64" 308 + ], 309 + "optional": true, 310 + "os": [ 311 + "openbsd" 312 + ], 313 + "engines": { 314 + "node": ">=12" 315 + } 316 + }, 317 + "node_modules/@esbuild/sunos-x64": { 318 + "version": "0.17.15", 319 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", 320 + "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", 321 + "cpu": [ 322 + "x64" 323 + ], 324 + "optional": true, 325 + "os": [ 326 + "sunos" 327 + ], 328 + "engines": { 329 + "node": ">=12" 330 + } 331 + }, 332 + "node_modules/@esbuild/win32-arm64": { 333 + "version": "0.17.15", 334 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", 335 + "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", 336 + "cpu": [ 337 + "arm64" 338 + ], 339 + "optional": true, 340 + "os": [ 341 + "win32" 342 + ], 343 + "engines": { 344 + "node": ">=12" 345 + } 346 + }, 347 + "node_modules/@esbuild/win32-ia32": { 348 + "version": "0.17.15", 349 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", 350 + "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", 351 + "cpu": [ 352 + "ia32" 353 + ], 354 + "optional": true, 355 + "os": [ 356 + "win32" 357 + ], 358 + "engines": { 359 + "node": ">=12" 360 + } 361 + }, 362 + "node_modules/@esbuild/win32-x64": { 363 + "version": "0.17.15", 364 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", 365 + "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", 366 + "cpu": [ 367 + "x64" 368 + ], 369 + "optional": true, 370 + "os": [ 371 + "win32" 372 + ], 373 + "engines": { 374 + "node": ">=12" 375 + } 376 + }, 377 + "node_modules/@eslint/eslintrc": { 378 + "version": "1.4.1", 379 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", 380 + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", 381 + "dev": true, 382 + "dependencies": { 383 + "ajv": "^6.12.4", 384 + "debug": "^4.3.2", 385 + "espree": "^9.4.0", 386 + "globals": "^13.19.0", 387 + "ignore": "^5.2.0", 388 + "import-fresh": "^3.2.1", 389 + "js-yaml": "^4.1.0", 390 + "minimatch": "^3.1.2", 391 + "strip-json-comments": "^3.1.1" 392 + }, 393 + "engines": { 394 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 395 + }, 396 + "funding": { 397 + "url": "https://opencollective.com/eslint" 398 + } 399 + }, 400 + "node_modules/@fontsource/jost": { 401 + "version": "4.5.13", 402 + "resolved": "https://registry.npmjs.org/@fontsource/jost/-/jost-4.5.13.tgz", 403 + "integrity": "sha512-StvM74Eny5ZkioanZ3JV6RgjTfMnB7mGde1SVoJGUrudxGPCp6kRXRm4CgwgJYarDzLt+jSPESLufHhRVemjrA==" 404 + }, 405 + "node_modules/@humanwhocodes/config-array": { 406 + "version": "0.11.8", 407 + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", 408 + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", 409 + "dev": true, 410 + "dependencies": { 411 + "@humanwhocodes/object-schema": "^1.2.1", 412 + "debug": "^4.1.1", 413 + "minimatch": "^3.0.5" 414 + }, 415 + "engines": { 416 + "node": ">=10.10.0" 417 + } 418 + }, 419 + "node_modules/@humanwhocodes/module-importer": { 420 + "version": "1.0.1", 421 + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 422 + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 423 + "dev": true, 424 + "engines": { 425 + "node": ">=12.22" 426 + }, 427 + "funding": { 428 + "type": "github", 429 + "url": "https://github.com/sponsors/nzakas" 430 + } 431 + }, 432 + "node_modules/@humanwhocodes/object-schema": { 433 + "version": "1.2.1", 434 + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 435 + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 436 + "dev": true 437 + }, 438 + "node_modules/@jridgewell/sourcemap-codec": { 439 + "version": "1.4.14", 440 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 441 + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" 442 + }, 443 + "node_modules/@nodelib/fs.scandir": { 444 + "version": "2.1.5", 445 + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 446 + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 447 + "dev": true, 448 + "dependencies": { 449 + "@nodelib/fs.stat": "2.0.5", 450 + "run-parallel": "^1.1.9" 451 + }, 452 + "engines": { 453 + "node": ">= 8" 454 + } 455 + }, 456 + "node_modules/@nodelib/fs.stat": { 457 + "version": "2.0.5", 458 + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 459 + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 460 + "dev": true, 461 + "engines": { 462 + "node": ">= 8" 463 + } 464 + }, 465 + "node_modules/@nodelib/fs.walk": { 466 + "version": "1.2.8", 467 + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 468 + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 469 + "dev": true, 470 + "dependencies": { 471 + "@nodelib/fs.scandir": "2.1.5", 472 + "fastq": "^1.6.0" 473 + }, 474 + "engines": { 475 + "node": ">= 8" 476 + } 477 + }, 478 + "node_modules/@polka/url": { 479 + "version": "1.0.0-next.21", 480 + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", 481 + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" 482 + }, 483 + "node_modules/@rollup/plugin-commonjs": { 484 + "version": "24.0.1", 485 + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz", 486 + "integrity": "sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==", 487 + "dependencies": { 488 + "@rollup/pluginutils": "^5.0.1", 489 + "commondir": "^1.0.1", 490 + "estree-walker": "^2.0.2", 491 + "glob": "^8.0.3", 492 + "is-reference": "1.2.1", 493 + "magic-string": "^0.27.0" 494 + }, 495 + "engines": { 496 + "node": ">=14.0.0" 497 + }, 498 + "peerDependencies": { 499 + "rollup": "^2.68.0||^3.0.0" 500 + }, 501 + "peerDependenciesMeta": { 502 + "rollup": { 503 + "optional": true 504 + } 505 + } 506 + }, 507 + "node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion": { 508 + "version": "2.0.1", 509 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 510 + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 511 + "dependencies": { 512 + "balanced-match": "^1.0.0" 513 + } 514 + }, 515 + "node_modules/@rollup/plugin-commonjs/node_modules/glob": { 516 + "version": "8.1.0", 517 + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 518 + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 519 + "dependencies": { 520 + "fs.realpath": "^1.0.0", 521 + "inflight": "^1.0.4", 522 + "inherits": "2", 523 + "minimatch": "^5.0.1", 524 + "once": "^1.3.0" 525 + }, 526 + "engines": { 527 + "node": ">=12" 528 + }, 529 + "funding": { 530 + "url": "https://github.com/sponsors/isaacs" 531 + } 532 + }, 533 + "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { 534 + "version": "5.1.6", 535 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 536 + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 537 + "dependencies": { 538 + "brace-expansion": "^2.0.1" 539 + }, 540 + "engines": { 541 + "node": ">=10" 542 + } 543 + }, 544 + "node_modules/@rollup/plugin-json": { 545 + "version": "6.0.0", 546 + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", 547 + "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==", 548 + "dependencies": { 549 + "@rollup/pluginutils": "^5.0.1" 550 + }, 551 + "engines": { 552 + "node": ">=14.0.0" 553 + }, 554 + "peerDependencies": { 555 + "rollup": "^1.20.0||^2.0.0||^3.0.0" 556 + }, 557 + "peerDependenciesMeta": { 558 + "rollup": { 559 + "optional": true 560 + } 561 + } 562 + }, 563 + "node_modules/@rollup/plugin-node-resolve": { 564 + "version": "15.0.1", 565 + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz", 566 + "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==", 567 + "dependencies": { 568 + "@rollup/pluginutils": "^5.0.1", 569 + "@types/resolve": "1.20.2", 570 + "deepmerge": "^4.2.2", 571 + "is-builtin-module": "^3.2.0", 572 + "is-module": "^1.0.0", 573 + "resolve": "^1.22.1" 574 + }, 575 + "engines": { 576 + "node": ">=14.0.0" 577 + }, 578 + "peerDependencies": { 579 + "rollup": "^2.78.0||^3.0.0" 580 + }, 581 + "peerDependenciesMeta": { 582 + "rollup": { 583 + "optional": true 584 + } 585 + } 586 + }, 587 + "node_modules/@rollup/pluginutils": { 588 + "version": "5.0.2", 589 + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", 590 + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", 591 + "dependencies": { 592 + "@types/estree": "^1.0.0", 593 + "estree-walker": "^2.0.2", 594 + "picomatch": "^2.3.1" 595 + }, 596 + "engines": { 597 + "node": ">=14.0.0" 598 + }, 599 + "peerDependencies": { 600 + "rollup": "^1.20.0||^2.0.0||^3.0.0" 601 + }, 602 + "peerDependenciesMeta": { 603 + "rollup": { 604 + "optional": true 605 + } 606 + } 607 + }, 608 + "node_modules/@sveltejs/adapter-auto": { 609 + "version": "2.0.0", 610 + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.0.0.tgz", 611 + "integrity": "sha512-b+gkHFZgD771kgV3aO4avHFd7y1zhmMYy9i6xOK7m/rwmwaRO8gnF5zBc0Rgca80B2PMU1bKNxyBTHA14OzUAQ==", 612 + "dev": true, 613 + "dependencies": { 614 + "import-meta-resolve": "^2.2.0" 615 + }, 616 + "peerDependencies": { 617 + "@sveltejs/kit": "^1.0.0" 618 + } 619 + }, 620 + "node_modules/@sveltejs/adapter-node": { 621 + "version": "1.2.3", 622 + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-1.2.3.tgz", 623 + "integrity": "sha512-Fv6NyVpVWYA63KRaV6dDjcU8ytcWFiUr0siJOoHl+oWy5WHNEuRiJOUdiZzYbZo8MmvFaCoxHkTgPrVQhpqaRA==", 624 + "dependencies": { 625 + "@rollup/plugin-commonjs": "^24.0.0", 626 + "@rollup/plugin-json": "^6.0.0", 627 + "@rollup/plugin-node-resolve": "^15.0.1", 628 + "rollup": "^3.7.0" 629 + }, 630 + "peerDependencies": { 631 + "@sveltejs/kit": "^1.0.0" 632 + } 633 + }, 634 + "node_modules/@sveltejs/kit": { 635 + "version": "1.10.0", 636 + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.10.0.tgz", 637 + "integrity": "sha512-0P35zHrByfbF3Ym3RdQL+RvzgsCDSyO3imSwuZ67XAD5HoCQFF3a8Mhh0V3sObz3rc5aJd4Qn82UpAihJqZ6gQ==", 638 + "hasInstallScript": true, 639 + "dependencies": { 640 + "@sveltejs/vite-plugin-svelte": "^2.0.0", 641 + "@types/cookie": "^0.5.1", 642 + "cookie": "^0.5.0", 643 + "devalue": "^4.3.0", 644 + "esm-env": "^1.0.0", 645 + "kleur": "^4.1.5", 646 + "magic-string": "^0.30.0", 647 + "mime": "^3.0.0", 648 + "sade": "^1.8.1", 649 + "set-cookie-parser": "^2.5.1", 650 + "sirv": "^2.0.2", 651 + "tiny-glob": "^0.2.9", 652 + "undici": "5.20.0" 653 + }, 654 + "bin": { 655 + "svelte-kit": "svelte-kit.js" 656 + }, 657 + "engines": { 658 + "node": "^16.14 || >=18" 659 + }, 660 + "peerDependencies": { 661 + "svelte": "^3.54.0", 662 + "vite": "^4.0.0" 663 + } 664 + }, 665 + "node_modules/@sveltejs/kit/node_modules/magic-string": { 666 + "version": "0.30.0", 667 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", 668 + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", 669 + "dependencies": { 670 + "@jridgewell/sourcemap-codec": "^1.4.13" 671 + }, 672 + "engines": { 673 + "node": ">=12" 674 + } 675 + }, 676 + "node_modules/@sveltejs/vite-plugin-svelte": { 677 + "version": "2.0.2", 678 + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.0.2.tgz", 679 + "integrity": "sha512-xCEan0/NNpQuL0l5aS42FjwQ6wwskdxC3pW1OeFtEKNZwRg7Evro9lac9HesGP6TdFsTv2xMes5ASQVKbCacxg==", 680 + "dependencies": { 681 + "debug": "^4.3.4", 682 + "deepmerge": "^4.2.2", 683 + "kleur": "^4.1.5", 684 + "magic-string": "^0.27.0", 685 + "svelte-hmr": "^0.15.1", 686 + "vitefu": "^0.2.3" 687 + }, 688 + "engines": { 689 + "node": "^14.18.0 || >= 16" 690 + }, 691 + "peerDependencies": { 692 + "svelte": "^3.54.0", 693 + "vite": "^4.0.0" 694 + } 695 + }, 696 + "node_modules/@tailwindcss/forms": { 697 + "version": "0.5.3", 698 + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", 699 + "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", 700 + "dev": true, 701 + "dependencies": { 702 + "mini-svg-data-uri": "^1.2.3" 703 + }, 704 + "peerDependencies": { 705 + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" 706 + } 707 + }, 708 + "node_modules/@tailwindcss/typography": { 709 + "version": "0.5.9", 710 + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.9.tgz", 711 + "integrity": "sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==", 712 + "dev": true, 713 + "dependencies": { 714 + "lodash.castarray": "^4.4.0", 715 + "lodash.isplainobject": "^4.0.6", 716 + "lodash.merge": "^4.6.2", 717 + "postcss-selector-parser": "6.0.10" 718 + }, 719 + "peerDependencies": { 720 + "tailwindcss": ">=3.0.0 || insiders" 721 + } 722 + }, 723 + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { 724 + "version": "6.0.10", 725 + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", 726 + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", 727 + "dev": true, 728 + "dependencies": { 729 + "cssesc": "^3.0.0", 730 + "util-deprecate": "^1.0.2" 731 + }, 732 + "engines": { 733 + "node": ">=4" 734 + } 735 + }, 736 + "node_modules/@types/cookie": { 737 + "version": "0.5.1", 738 + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", 739 + "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==" 740 + }, 741 + "node_modules/@types/estree": { 742 + "version": "1.0.0", 743 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", 744 + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" 745 + }, 746 + "node_modules/@types/resolve": { 747 + "version": "1.20.2", 748 + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", 749 + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" 750 + }, 751 + "node_modules/acorn": { 752 + "version": "8.8.2", 753 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 754 + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 755 + "dev": true, 756 + "bin": { 757 + "acorn": "bin/acorn" 758 + }, 759 + "engines": { 760 + "node": ">=0.4.0" 761 + } 762 + }, 763 + "node_modules/acorn-jsx": { 764 + "version": "5.3.2", 765 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 766 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 767 + "dev": true, 768 + "peerDependencies": { 769 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 770 + } 771 + }, 772 + "node_modules/ajv": { 773 + "version": "6.12.6", 774 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 775 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 776 + "dev": true, 777 + "dependencies": { 778 + "fast-deep-equal": "^3.1.1", 779 + "fast-json-stable-stringify": "^2.0.0", 780 + "json-schema-traverse": "^0.4.1", 781 + "uri-js": "^4.2.2" 782 + }, 783 + "funding": { 784 + "type": "github", 785 + "url": "https://github.com/sponsors/epoberezkin" 786 + } 787 + }, 788 + "node_modules/ansi-regex": { 789 + "version": "5.0.1", 790 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 791 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 792 + "dev": true, 793 + "engines": { 794 + "node": ">=8" 795 + } 796 + }, 797 + "node_modules/ansi-styles": { 798 + "version": "4.3.0", 799 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 800 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 801 + "dev": true, 802 + "dependencies": { 803 + "color-convert": "^2.0.1" 804 + }, 805 + "engines": { 806 + "node": ">=8" 807 + }, 808 + "funding": { 809 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 810 + } 811 + }, 812 + "node_modules/any-promise": { 813 + "version": "1.3.0", 814 + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 815 + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 816 + "dev": true 817 + }, 818 + "node_modules/anymatch": { 819 + "version": "3.1.3", 820 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 821 + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 822 + "dev": true, 823 + "dependencies": { 824 + "normalize-path": "^3.0.0", 825 + "picomatch": "^2.0.4" 826 + }, 827 + "engines": { 828 + "node": ">= 8" 829 + } 830 + }, 831 + "node_modules/arg": { 832 + "version": "5.0.2", 833 + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 834 + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 835 + "dev": true 836 + }, 837 + "node_modules/argparse": { 838 + "version": "2.0.1", 839 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 840 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 841 + "dev": true 842 + }, 843 + "node_modules/assert-options": { 844 + "version": "0.8.1", 845 + "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.8.1.tgz", 846 + "integrity": "sha512-5lNGRB5g5i2bGIzb+J1QQE1iKU/WEMVBReFIc5pPDWjcPj23otPL0eI6PB2v7QPi0qU6Mhym5D3y0ZiSIOf3GA==", 847 + "engines": { 848 + "node": ">=10.0.0" 849 + } 850 + }, 851 + "node_modules/autoprefixer": { 852 + "version": "10.4.14", 853 + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", 854 + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", 855 + "dev": true, 856 + "funding": [ 857 + { 858 + "type": "opencollective", 859 + "url": "https://opencollective.com/postcss/" 860 + }, 861 + { 862 + "type": "tidelift", 863 + "url": "https://tidelift.com/funding/github/npm/autoprefixer" 864 + } 865 + ], 866 + "dependencies": { 867 + "browserslist": "^4.21.5", 868 + "caniuse-lite": "^1.0.30001464", 869 + "fraction.js": "^4.2.0", 870 + "normalize-range": "^0.1.2", 871 + "picocolors": "^1.0.0", 872 + "postcss-value-parser": "^4.2.0" 873 + }, 874 + "bin": { 875 + "autoprefixer": "bin/autoprefixer" 876 + }, 877 + "engines": { 878 + "node": "^10 || ^12 || >=14" 879 + }, 880 + "peerDependencies": { 881 + "postcss": "^8.1.0" 882 + } 883 + }, 884 + "node_modules/available-typed-arrays": { 885 + "version": "1.0.5", 886 + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 887 + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 888 + "engines": { 889 + "node": ">= 0.4" 890 + }, 891 + "funding": { 892 + "url": "https://github.com/sponsors/ljharb" 893 + } 894 + }, 895 + "node_modules/aws-sdk": { 896 + "version": "2.1350.0", 897 + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1350.0.tgz", 898 + "integrity": "sha512-b0BHug2iCtIsKgstj3FEyZYZCv8RZnie5vUQzkw0rr581Z6DOcJof7gGn19E6mPQp1l4j0d274SjvdFQS4JCMw==", 899 + "dependencies": { 900 + "buffer": "4.9.2", 901 + "events": "1.1.1", 902 + "ieee754": "1.1.13", 903 + "jmespath": "0.16.0", 904 + "querystring": "0.2.0", 905 + "sax": "1.2.1", 906 + "url": "0.10.3", 907 + "util": "^0.12.4", 908 + "uuid": "8.0.0", 909 + "xml2js": "0.4.19" 910 + }, 911 + "engines": { 912 + "node": ">= 10.0.0" 913 + } 914 + }, 915 + "node_modules/balanced-match": { 916 + "version": "1.0.2", 917 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 918 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 919 + }, 920 + "node_modules/base64-js": { 921 + "version": "1.5.1", 922 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 923 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 924 + "funding": [ 925 + { 926 + "type": "github", 927 + "url": "https://github.com/sponsors/feross" 928 + }, 929 + { 930 + "type": "patreon", 931 + "url": "https://www.patreon.com/feross" 932 + }, 933 + { 934 + "type": "consulting", 935 + "url": "https://feross.org/support" 936 + } 937 + ] 938 + }, 939 + "node_modules/binary-extensions": { 940 + "version": "2.2.0", 941 + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 942 + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 943 + "dev": true, 944 + "engines": { 945 + "node": ">=8" 946 + } 947 + }, 948 + "node_modules/brace-expansion": { 949 + "version": "1.1.11", 950 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 951 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 952 + "dev": true, 953 + "dependencies": { 954 + "balanced-match": "^1.0.0", 955 + "concat-map": "0.0.1" 956 + } 957 + }, 958 + "node_modules/braces": { 959 + "version": "3.0.2", 960 + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 961 + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 962 + "dev": true, 963 + "dependencies": { 964 + "fill-range": "^7.0.1" 965 + }, 966 + "engines": { 967 + "node": ">=8" 968 + } 969 + }, 970 + "node_modules/browserslist": { 971 + "version": "4.21.5", 972 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", 973 + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", 974 + "dev": true, 975 + "funding": [ 976 + { 977 + "type": "opencollective", 978 + "url": "https://opencollective.com/browserslist" 979 + }, 980 + { 981 + "type": "tidelift", 982 + "url": "https://tidelift.com/funding/github/npm/browserslist" 983 + } 984 + ], 985 + "dependencies": { 986 + "caniuse-lite": "^1.0.30001449", 987 + "electron-to-chromium": "^1.4.284", 988 + "node-releases": "^2.0.8", 989 + "update-browserslist-db": "^1.0.10" 990 + }, 991 + "bin": { 992 + "browserslist": "cli.js" 993 + }, 994 + "engines": { 995 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 996 + } 997 + }, 998 + "node_modules/buffer": { 999 + "version": "4.9.2", 1000 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 1001 + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 1002 + "dependencies": { 1003 + "base64-js": "^1.0.2", 1004 + "ieee754": "^1.1.4", 1005 + "isarray": "^1.0.0" 1006 + } 1007 + }, 1008 + "node_modules/buffer-writer": { 1009 + "version": "2.0.0", 1010 + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", 1011 + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", 1012 + "engines": { 1013 + "node": ">=4" 1014 + } 1015 + }, 1016 + "node_modules/builtin-modules": { 1017 + "version": "3.3.0", 1018 + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", 1019 + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", 1020 + "engines": { 1021 + "node": ">=6" 1022 + }, 1023 + "funding": { 1024 + "url": "https://github.com/sponsors/sindresorhus" 1025 + } 1026 + }, 1027 + "node_modules/busboy": { 1028 + "version": "1.6.0", 1029 + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 1030 + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 1031 + "dependencies": { 1032 + "streamsearch": "^1.1.0" 1033 + }, 1034 + "engines": { 1035 + "node": ">=10.16.0" 1036 + } 1037 + }, 1038 + "node_modules/call-bind": { 1039 + "version": "1.0.2", 1040 + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1041 + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1042 + "dependencies": { 1043 + "function-bind": "^1.1.1", 1044 + "get-intrinsic": "^1.0.2" 1045 + }, 1046 + "funding": { 1047 + "url": "https://github.com/sponsors/ljharb" 1048 + } 1049 + }, 1050 + "node_modules/callsites": { 1051 + "version": "3.1.0", 1052 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1053 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1054 + "dev": true, 1055 + "engines": { 1056 + "node": ">=6" 1057 + } 1058 + }, 1059 + "node_modules/camelcase": { 1060 + "version": "7.0.1", 1061 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", 1062 + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", 1063 + "engines": { 1064 + "node": ">=14.16" 1065 + }, 1066 + "funding": { 1067 + "url": "https://github.com/sponsors/sindresorhus" 1068 + } 1069 + }, 1070 + "node_modules/camelcase-css": { 1071 + "version": "2.0.1", 1072 + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 1073 + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 1074 + "dev": true, 1075 + "engines": { 1076 + "node": ">= 6" 1077 + } 1078 + }, 1079 + "node_modules/camelcase-keys": { 1080 + "version": "8.0.2", 1081 + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-8.0.2.tgz", 1082 + "integrity": "sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==", 1083 + "dependencies": { 1084 + "camelcase": "^7.0.0", 1085 + "map-obj": "^4.3.0", 1086 + "quick-lru": "^6.1.1", 1087 + "type-fest": "^2.13.0" 1088 + }, 1089 + "engines": { 1090 + "node": ">=14.16" 1091 + }, 1092 + "funding": { 1093 + "url": "https://github.com/sponsors/sindresorhus" 1094 + } 1095 + }, 1096 + "node_modules/camelcase-keys/node_modules/quick-lru": { 1097 + "version": "6.1.1", 1098 + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", 1099 + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", 1100 + "engines": { 1101 + "node": ">=12" 1102 + }, 1103 + "funding": { 1104 + "url": "https://github.com/sponsors/sindresorhus" 1105 + } 1106 + }, 1107 + "node_modules/camelcase-keys/node_modules/type-fest": { 1108 + "version": "2.19.0", 1109 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", 1110 + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", 1111 + "engines": { 1112 + "node": ">=12.20" 1113 + }, 1114 + "funding": { 1115 + "url": "https://github.com/sponsors/sindresorhus" 1116 + } 1117 + }, 1118 + "node_modules/caniuse-lite": { 1119 + "version": "1.0.30001473", 1120 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001473.tgz", 1121 + "integrity": "sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==", 1122 + "dev": true, 1123 + "funding": [ 1124 + { 1125 + "type": "opencollective", 1126 + "url": "https://opencollective.com/browserslist" 1127 + }, 1128 + { 1129 + "type": "tidelift", 1130 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1131 + }, 1132 + { 1133 + "type": "github", 1134 + "url": "https://github.com/sponsors/ai" 1135 + } 1136 + ] 1137 + }, 1138 + "node_modules/chalk": { 1139 + "version": "4.1.2", 1140 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1141 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1142 + "dev": true, 1143 + "dependencies": { 1144 + "ansi-styles": "^4.1.0", 1145 + "supports-color": "^7.1.0" 1146 + }, 1147 + "engines": { 1148 + "node": ">=10" 1149 + }, 1150 + "funding": { 1151 + "url": "https://github.com/chalk/chalk?sponsor=1" 1152 + } 1153 + }, 1154 + "node_modules/chokidar": { 1155 + "version": "3.5.3", 1156 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1157 + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1158 + "dev": true, 1159 + "funding": [ 1160 + { 1161 + "type": "individual", 1162 + "url": "https://paulmillr.com/funding/" 1163 + } 1164 + ], 1165 + "dependencies": { 1166 + "anymatch": "~3.1.2", 1167 + "braces": "~3.0.2", 1168 + "glob-parent": "~5.1.2", 1169 + "is-binary-path": "~2.1.0", 1170 + "is-glob": "~4.0.1", 1171 + "normalize-path": "~3.0.0", 1172 + "readdirp": "~3.6.0" 1173 + }, 1174 + "engines": { 1175 + "node": ">= 8.10.0" 1176 + }, 1177 + "optionalDependencies": { 1178 + "fsevents": "~2.3.2" 1179 + } 1180 + }, 1181 + "node_modules/chokidar/node_modules/glob-parent": { 1182 + "version": "5.1.2", 1183 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1184 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1185 + "dev": true, 1186 + "dependencies": { 1187 + "is-glob": "^4.0.1" 1188 + }, 1189 + "engines": { 1190 + "node": ">= 6" 1191 + } 1192 + }, 1193 + "node_modules/color-convert": { 1194 + "version": "2.0.1", 1195 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1196 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1197 + "dev": true, 1198 + "dependencies": { 1199 + "color-name": "~1.1.4" 1200 + }, 1201 + "engines": { 1202 + "node": ">=7.0.0" 1203 + } 1204 + }, 1205 + "node_modules/color-name": { 1206 + "version": "1.1.4", 1207 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1208 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1209 + "dev": true 1210 + }, 1211 + "node_modules/commander": { 1212 + "version": "4.1.1", 1213 + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 1214 + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 1215 + "dev": true, 1216 + "engines": { 1217 + "node": ">= 6" 1218 + } 1219 + }, 1220 + "node_modules/commondir": { 1221 + "version": "1.0.1", 1222 + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 1223 + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" 1224 + }, 1225 + "node_modules/concat-map": { 1226 + "version": "0.0.1", 1227 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1228 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1229 + "dev": true 1230 + }, 1231 + "node_modules/cookie": { 1232 + "version": "0.5.0", 1233 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 1234 + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 1235 + "engines": { 1236 + "node": ">= 0.6" 1237 + } 1238 + }, 1239 + "node_modules/crelt": { 1240 + "version": "1.0.5", 1241 + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz", 1242 + "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==" 1243 + }, 1244 + "node_modules/cross-spawn": { 1245 + "version": "7.0.3", 1246 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1247 + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1248 + "dev": true, 1249 + "dependencies": { 1250 + "path-key": "^3.1.0", 1251 + "shebang-command": "^2.0.0", 1252 + "which": "^2.0.1" 1253 + }, 1254 + "engines": { 1255 + "node": ">= 8" 1256 + } 1257 + }, 1258 + "node_modules/cssesc": { 1259 + "version": "3.0.0", 1260 + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 1261 + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 1262 + "dev": true, 1263 + "bin": { 1264 + "cssesc": "bin/cssesc" 1265 + }, 1266 + "engines": { 1267 + "node": ">=4" 1268 + } 1269 + }, 1270 + "node_modules/debug": { 1271 + "version": "4.3.4", 1272 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1273 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1274 + "dependencies": { 1275 + "ms": "2.1.2" 1276 + }, 1277 + "engines": { 1278 + "node": ">=6.0" 1279 + }, 1280 + "peerDependenciesMeta": { 1281 + "supports-color": { 1282 + "optional": true 1283 + } 1284 + } 1285 + }, 1286 + "node_modules/deep-is": { 1287 + "version": "0.1.4", 1288 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1289 + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1290 + "dev": true 1291 + }, 1292 + "node_modules/deepmerge": { 1293 + "version": "4.3.0", 1294 + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", 1295 + "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", 1296 + "engines": { 1297 + "node": ">=0.10.0" 1298 + } 1299 + }, 1300 + "node_modules/devalue": { 1301 + "version": "4.3.0", 1302 + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz", 1303 + "integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==" 1304 + }, 1305 + "node_modules/didyoumean": { 1306 + "version": "1.2.2", 1307 + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 1308 + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 1309 + "dev": true 1310 + }, 1311 + "node_modules/dlv": { 1312 + "version": "1.1.3", 1313 + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 1314 + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 1315 + "dev": true 1316 + }, 1317 + "node_modules/doctrine": { 1318 + "version": "3.0.0", 1319 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1320 + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1321 + "dev": true, 1322 + "dependencies": { 1323 + "esutils": "^2.0.2" 1324 + }, 1325 + "engines": { 1326 + "node": ">=6.0.0" 1327 + } 1328 + }, 1329 + "node_modules/electron-to-chromium": { 1330 + "version": "1.4.286", 1331 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz", 1332 + "integrity": "sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==", 1333 + "dev": true 1334 + }, 1335 + "node_modules/esbuild": { 1336 + "version": "0.17.15", 1337 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", 1338 + "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", 1339 + "hasInstallScript": true, 1340 + "bin": { 1341 + "esbuild": "bin/esbuild" 1342 + }, 1343 + "engines": { 1344 + "node": ">=12" 1345 + }, 1346 + "optionalDependencies": { 1347 + "@esbuild/android-arm": "0.17.15", 1348 + "@esbuild/android-arm64": "0.17.15", 1349 + "@esbuild/android-x64": "0.17.15", 1350 + "@esbuild/darwin-arm64": "0.17.15", 1351 + "@esbuild/darwin-x64": "0.17.15", 1352 + "@esbuild/freebsd-arm64": "0.17.15", 1353 + "@esbuild/freebsd-x64": "0.17.15", 1354 + "@esbuild/linux-arm": "0.17.15", 1355 + "@esbuild/linux-arm64": "0.17.15", 1356 + "@esbuild/linux-ia32": "0.17.15", 1357 + "@esbuild/linux-loong64": "0.17.15", 1358 + "@esbuild/linux-mips64el": "0.17.15", 1359 + "@esbuild/linux-ppc64": "0.17.15", 1360 + "@esbuild/linux-riscv64": "0.17.15", 1361 + "@esbuild/linux-s390x": "0.17.15", 1362 + "@esbuild/linux-x64": "0.17.15", 1363 + "@esbuild/netbsd-x64": "0.17.15", 1364 + "@esbuild/openbsd-x64": "0.17.15", 1365 + "@esbuild/sunos-x64": "0.17.15", 1366 + "@esbuild/win32-arm64": "0.17.15", 1367 + "@esbuild/win32-ia32": "0.17.15", 1368 + "@esbuild/win32-x64": "0.17.15" 1369 + } 1370 + }, 1371 + "node_modules/escalade": { 1372 + "version": "3.1.1", 1373 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1374 + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1375 + "dev": true, 1376 + "engines": { 1377 + "node": ">=6" 1378 + } 1379 + }, 1380 + "node_modules/escape-string-regexp": { 1381 + "version": "4.0.0", 1382 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1383 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1384 + "dev": true, 1385 + "engines": { 1386 + "node": ">=10" 1387 + }, 1388 + "funding": { 1389 + "url": "https://github.com/sponsors/sindresorhus" 1390 + } 1391 + }, 1392 + "node_modules/eslint": { 1393 + "version": "8.33.0", 1394 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", 1395 + "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", 1396 + "dev": true, 1397 + "dependencies": { 1398 + "@eslint/eslintrc": "^1.4.1", 1399 + "@humanwhocodes/config-array": "^0.11.8", 1400 + "@humanwhocodes/module-importer": "^1.0.1", 1401 + "@nodelib/fs.walk": "^1.2.8", 1402 + "ajv": "^6.10.0", 1403 + "chalk": "^4.0.0", 1404 + "cross-spawn": "^7.0.2", 1405 + "debug": "^4.3.2", 1406 + "doctrine": "^3.0.0", 1407 + "escape-string-regexp": "^4.0.0", 1408 + "eslint-scope": "^7.1.1", 1409 + "eslint-utils": "^3.0.0", 1410 + "eslint-visitor-keys": "^3.3.0", 1411 + "espree": "^9.4.0", 1412 + "esquery": "^1.4.0", 1413 + "esutils": "^2.0.2", 1414 + "fast-deep-equal": "^3.1.3", 1415 + "file-entry-cache": "^6.0.1", 1416 + "find-up": "^5.0.0", 1417 + "glob-parent": "^6.0.2", 1418 + "globals": "^13.19.0", 1419 + "grapheme-splitter": "^1.0.4", 1420 + "ignore": "^5.2.0", 1421 + "import-fresh": "^3.0.0", 1422 + "imurmurhash": "^0.1.4", 1423 + "is-glob": "^4.0.0", 1424 + "is-path-inside": "^3.0.3", 1425 + "js-sdsl": "^4.1.4", 1426 + "js-yaml": "^4.1.0", 1427 + "json-stable-stringify-without-jsonify": "^1.0.1", 1428 + "levn": "^0.4.1", 1429 + "lodash.merge": "^4.6.2", 1430 + "minimatch": "^3.1.2", 1431 + "natural-compare": "^1.4.0", 1432 + "optionator": "^0.9.1", 1433 + "regexpp": "^3.2.0", 1434 + "strip-ansi": "^6.0.1", 1435 + "strip-json-comments": "^3.1.0", 1436 + "text-table": "^0.2.0" 1437 + }, 1438 + "bin": { 1439 + "eslint": "bin/eslint.js" 1440 + }, 1441 + "engines": { 1442 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1443 + }, 1444 + "funding": { 1445 + "url": "https://opencollective.com/eslint" 1446 + } 1447 + }, 1448 + "node_modules/eslint-config-prettier": { 1449 + "version": "8.6.0", 1450 + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", 1451 + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", 1452 + "dev": true, 1453 + "bin": { 1454 + "eslint-config-prettier": "bin/cli.js" 1455 + }, 1456 + "peerDependencies": { 1457 + "eslint": ">=7.0.0" 1458 + } 1459 + }, 1460 + "node_modules/eslint-plugin-svelte3": { 1461 + "version": "4.0.0", 1462 + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte3/-/eslint-plugin-svelte3-4.0.0.tgz", 1463 + "integrity": "sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==", 1464 + "dev": true, 1465 + "peerDependencies": { 1466 + "eslint": ">=8.0.0", 1467 + "svelte": "^3.2.0" 1468 + } 1469 + }, 1470 + "node_modules/eslint-scope": { 1471 + "version": "7.1.1", 1472 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 1473 + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 1474 + "dev": true, 1475 + "dependencies": { 1476 + "esrecurse": "^4.3.0", 1477 + "estraverse": "^5.2.0" 1478 + }, 1479 + "engines": { 1480 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1481 + } 1482 + }, 1483 + "node_modules/eslint-utils": { 1484 + "version": "3.0.0", 1485 + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 1486 + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 1487 + "dev": true, 1488 + "dependencies": { 1489 + "eslint-visitor-keys": "^2.0.0" 1490 + }, 1491 + "engines": { 1492 + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 1493 + }, 1494 + "funding": { 1495 + "url": "https://github.com/sponsors/mysticatea" 1496 + }, 1497 + "peerDependencies": { 1498 + "eslint": ">=5" 1499 + } 1500 + }, 1501 + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 1502 + "version": "2.1.0", 1503 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 1504 + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 1505 + "dev": true, 1506 + "engines": { 1507 + "node": ">=10" 1508 + } 1509 + }, 1510 + "node_modules/eslint-visitor-keys": { 1511 + "version": "3.3.0", 1512 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 1513 + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 1514 + "dev": true, 1515 + "engines": { 1516 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1517 + } 1518 + }, 1519 + "node_modules/esm-env": { 1520 + "version": "1.0.0", 1521 + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", 1522 + "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==" 1523 + }, 1524 + "node_modules/espree": { 1525 + "version": "9.4.1", 1526 + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", 1527 + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", 1528 + "dev": true, 1529 + "dependencies": { 1530 + "acorn": "^8.8.0", 1531 + "acorn-jsx": "^5.3.2", 1532 + "eslint-visitor-keys": "^3.3.0" 1533 + }, 1534 + "engines": { 1535 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1536 + }, 1537 + "funding": { 1538 + "url": "https://opencollective.com/eslint" 1539 + } 1540 + }, 1541 + "node_modules/esquery": { 1542 + "version": "1.4.0", 1543 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 1544 + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 1545 + "dev": true, 1546 + "dependencies": { 1547 + "estraverse": "^5.1.0" 1548 + }, 1549 + "engines": { 1550 + "node": ">=0.10" 1551 + } 1552 + }, 1553 + "node_modules/esrecurse": { 1554 + "version": "4.3.0", 1555 + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1556 + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1557 + "dev": true, 1558 + "dependencies": { 1559 + "estraverse": "^5.2.0" 1560 + }, 1561 + "engines": { 1562 + "node": ">=4.0" 1563 + } 1564 + }, 1565 + "node_modules/estraverse": { 1566 + "version": "5.3.0", 1567 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1568 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1569 + "dev": true, 1570 + "engines": { 1571 + "node": ">=4.0" 1572 + } 1573 + }, 1574 + "node_modules/estree-walker": { 1575 + "version": "2.0.2", 1576 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1577 + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 1578 + }, 1579 + "node_modules/esutils": { 1580 + "version": "2.0.3", 1581 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1582 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1583 + "dev": true, 1584 + "engines": { 1585 + "node": ">=0.10.0" 1586 + } 1587 + }, 1588 + "node_modules/events": { 1589 + "version": "1.1.1", 1590 + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 1591 + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", 1592 + "engines": { 1593 + "node": ">=0.4.x" 1594 + } 1595 + }, 1596 + "node_modules/fast-deep-equal": { 1597 + "version": "3.1.3", 1598 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1599 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1600 + "dev": true 1601 + }, 1602 + "node_modules/fast-glob": { 1603 + "version": "3.2.12", 1604 + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 1605 + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 1606 + "dev": true, 1607 + "dependencies": { 1608 + "@nodelib/fs.stat": "^2.0.2", 1609 + "@nodelib/fs.walk": "^1.2.3", 1610 + "glob-parent": "^5.1.2", 1611 + "merge2": "^1.3.0", 1612 + "micromatch": "^4.0.4" 1613 + }, 1614 + "engines": { 1615 + "node": ">=8.6.0" 1616 + } 1617 + }, 1618 + "node_modules/fast-glob/node_modules/glob-parent": { 1619 + "version": "5.1.2", 1620 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1621 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1622 + "dev": true, 1623 + "dependencies": { 1624 + "is-glob": "^4.0.1" 1625 + }, 1626 + "engines": { 1627 + "node": ">= 6" 1628 + } 1629 + }, 1630 + "node_modules/fast-json-stable-stringify": { 1631 + "version": "2.1.0", 1632 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1633 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1634 + "dev": true 1635 + }, 1636 + "node_modules/fast-levenshtein": { 1637 + "version": "2.0.6", 1638 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1639 + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1640 + "dev": true 1641 + }, 1642 + "node_modules/fastq": { 1643 + "version": "1.15.0", 1644 + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 1645 + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 1646 + "dev": true, 1647 + "dependencies": { 1648 + "reusify": "^1.0.4" 1649 + } 1650 + }, 1651 + "node_modules/file-entry-cache": { 1652 + "version": "6.0.1", 1653 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1654 + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1655 + "dev": true, 1656 + "dependencies": { 1657 + "flat-cache": "^3.0.4" 1658 + }, 1659 + "engines": { 1660 + "node": "^10.12.0 || >=12.0.0" 1661 + } 1662 + }, 1663 + "node_modules/fill-range": { 1664 + "version": "7.0.1", 1665 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1666 + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1667 + "dev": true, 1668 + "dependencies": { 1669 + "to-regex-range": "^5.0.1" 1670 + }, 1671 + "engines": { 1672 + "node": ">=8" 1673 + } 1674 + }, 1675 + "node_modules/find-up": { 1676 + "version": "5.0.0", 1677 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1678 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1679 + "dev": true, 1680 + "dependencies": { 1681 + "locate-path": "^6.0.0", 1682 + "path-exists": "^4.0.0" 1683 + }, 1684 + "engines": { 1685 + "node": ">=10" 1686 + }, 1687 + "funding": { 1688 + "url": "https://github.com/sponsors/sindresorhus" 1689 + } 1690 + }, 1691 + "node_modules/flat-cache": { 1692 + "version": "3.0.4", 1693 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1694 + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1695 + "dev": true, 1696 + "dependencies": { 1697 + "flatted": "^3.1.0", 1698 + "rimraf": "^3.0.2" 1699 + }, 1700 + "engines": { 1701 + "node": "^10.12.0 || >=12.0.0" 1702 + } 1703 + }, 1704 + "node_modules/flatted": { 1705 + "version": "3.2.7", 1706 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 1707 + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 1708 + "dev": true 1709 + }, 1710 + "node_modules/for-each": { 1711 + "version": "0.3.3", 1712 + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 1713 + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 1714 + "dependencies": { 1715 + "is-callable": "^1.1.3" 1716 + } 1717 + }, 1718 + "node_modules/fraction.js": { 1719 + "version": "4.2.0", 1720 + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 1721 + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", 1722 + "dev": true, 1723 + "engines": { 1724 + "node": "*" 1725 + }, 1726 + "funding": { 1727 + "type": "patreon", 1728 + "url": "https://www.patreon.com/infusion" 1729 + } 1730 + }, 1731 + "node_modules/fs.realpath": { 1732 + "version": "1.0.0", 1733 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1734 + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 1735 + }, 1736 + "node_modules/fsevents": { 1737 + "version": "2.3.2", 1738 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1739 + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1740 + "hasInstallScript": true, 1741 + "optional": true, 1742 + "os": [ 1743 + "darwin" 1744 + ], 1745 + "engines": { 1746 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1747 + } 1748 + }, 1749 + "node_modules/function-bind": { 1750 + "version": "1.1.1", 1751 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1752 + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1753 + }, 1754 + "node_modules/get-intrinsic": { 1755 + "version": "1.2.0", 1756 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 1757 + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 1758 + "dependencies": { 1759 + "function-bind": "^1.1.1", 1760 + "has": "^1.0.3", 1761 + "has-symbols": "^1.0.3" 1762 + }, 1763 + "funding": { 1764 + "url": "https://github.com/sponsors/ljharb" 1765 + } 1766 + }, 1767 + "node_modules/glob": { 1768 + "version": "7.2.3", 1769 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1770 + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1771 + "dev": true, 1772 + "dependencies": { 1773 + "fs.realpath": "^1.0.0", 1774 + "inflight": "^1.0.4", 1775 + "inherits": "2", 1776 + "minimatch": "^3.1.1", 1777 + "once": "^1.3.0", 1778 + "path-is-absolute": "^1.0.0" 1779 + }, 1780 + "engines": { 1781 + "node": "*" 1782 + }, 1783 + "funding": { 1784 + "url": "https://github.com/sponsors/isaacs" 1785 + } 1786 + }, 1787 + "node_modules/glob-parent": { 1788 + "version": "6.0.2", 1789 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1790 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1791 + "dev": true, 1792 + "dependencies": { 1793 + "is-glob": "^4.0.3" 1794 + }, 1795 + "engines": { 1796 + "node": ">=10.13.0" 1797 + } 1798 + }, 1799 + "node_modules/globals": { 1800 + "version": "13.20.0", 1801 + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", 1802 + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", 1803 + "dev": true, 1804 + "dependencies": { 1805 + "type-fest": "^0.20.2" 1806 + }, 1807 + "engines": { 1808 + "node": ">=8" 1809 + }, 1810 + "funding": { 1811 + "url": "https://github.com/sponsors/sindresorhus" 1812 + } 1813 + }, 1814 + "node_modules/globalyzer": { 1815 + "version": "0.1.0", 1816 + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", 1817 + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" 1818 + }, 1819 + "node_modules/globrex": { 1820 + "version": "0.1.2", 1821 + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", 1822 + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" 1823 + }, 1824 + "node_modules/gopd": { 1825 + "version": "1.0.1", 1826 + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1827 + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1828 + "dependencies": { 1829 + "get-intrinsic": "^1.1.3" 1830 + }, 1831 + "funding": { 1832 + "url": "https://github.com/sponsors/ljharb" 1833 + } 1834 + }, 1835 + "node_modules/grapheme-splitter": { 1836 + "version": "1.0.4", 1837 + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 1838 + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 1839 + "dev": true 1840 + }, 1841 + "node_modules/has": { 1842 + "version": "1.0.3", 1843 + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1844 + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1845 + "dependencies": { 1846 + "function-bind": "^1.1.1" 1847 + }, 1848 + "engines": { 1849 + "node": ">= 0.4.0" 1850 + } 1851 + }, 1852 + "node_modules/has-flag": { 1853 + "version": "4.0.0", 1854 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1855 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1856 + "dev": true, 1857 + "engines": { 1858 + "node": ">=8" 1859 + } 1860 + }, 1861 + "node_modules/has-symbols": { 1862 + "version": "1.0.3", 1863 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1864 + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1865 + "engines": { 1866 + "node": ">= 0.4" 1867 + }, 1868 + "funding": { 1869 + "url": "https://github.com/sponsors/ljharb" 1870 + } 1871 + }, 1872 + "node_modules/has-tostringtag": { 1873 + "version": "1.0.0", 1874 + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 1875 + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 1876 + "dependencies": { 1877 + "has-symbols": "^1.0.2" 1878 + }, 1879 + "engines": { 1880 + "node": ">= 0.4" 1881 + }, 1882 + "funding": { 1883 + "url": "https://github.com/sponsors/ljharb" 1884 + } 1885 + }, 1886 + "node_modules/ieee754": { 1887 + "version": "1.1.13", 1888 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 1889 + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 1890 + }, 1891 + "node_modules/ignore": { 1892 + "version": "5.2.4", 1893 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 1894 + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 1895 + "dev": true, 1896 + "engines": { 1897 + "node": ">= 4" 1898 + } 1899 + }, 1900 + "node_modules/import-fresh": { 1901 + "version": "3.3.0", 1902 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1903 + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1904 + "dev": true, 1905 + "dependencies": { 1906 + "parent-module": "^1.0.0", 1907 + "resolve-from": "^4.0.0" 1908 + }, 1909 + "engines": { 1910 + "node": ">=6" 1911 + }, 1912 + "funding": { 1913 + "url": "https://github.com/sponsors/sindresorhus" 1914 + } 1915 + }, 1916 + "node_modules/import-meta-resolve": { 1917 + "version": "2.2.1", 1918 + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.1.tgz", 1919 + "integrity": "sha512-C6lLL7EJPY44kBvA80gq4uMsVFw5x3oSKfuMl1cuZ2RkI5+UJqQXgn+6hlUew0y4ig7Ypt4CObAAIzU53Nfpuw==", 1920 + "dev": true, 1921 + "funding": { 1922 + "type": "github", 1923 + "url": "https://github.com/sponsors/wooorm" 1924 + } 1925 + }, 1926 + "node_modules/imurmurhash": { 1927 + "version": "0.1.4", 1928 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1929 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1930 + "dev": true, 1931 + "engines": { 1932 + "node": ">=0.8.19" 1933 + } 1934 + }, 1935 + "node_modules/inflight": { 1936 + "version": "1.0.6", 1937 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1938 + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1939 + "dependencies": { 1940 + "once": "^1.3.0", 1941 + "wrappy": "1" 1942 + } 1943 + }, 1944 + "node_modules/inherits": { 1945 + "version": "2.0.4", 1946 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1947 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1948 + }, 1949 + "node_modules/is-arguments": { 1950 + "version": "1.1.1", 1951 + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 1952 + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 1953 + "dependencies": { 1954 + "call-bind": "^1.0.2", 1955 + "has-tostringtag": "^1.0.0" 1956 + }, 1957 + "engines": { 1958 + "node": ">= 0.4" 1959 + }, 1960 + "funding": { 1961 + "url": "https://github.com/sponsors/ljharb" 1962 + } 1963 + }, 1964 + "node_modules/is-binary-path": { 1965 + "version": "2.1.0", 1966 + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1967 + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1968 + "dev": true, 1969 + "dependencies": { 1970 + "binary-extensions": "^2.0.0" 1971 + }, 1972 + "engines": { 1973 + "node": ">=8" 1974 + } 1975 + }, 1976 + "node_modules/is-builtin-module": { 1977 + "version": "3.2.1", 1978 + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", 1979 + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", 1980 + "dependencies": { 1981 + "builtin-modules": "^3.3.0" 1982 + }, 1983 + "engines": { 1984 + "node": ">=6" 1985 + }, 1986 + "funding": { 1987 + "url": "https://github.com/sponsors/sindresorhus" 1988 + } 1989 + }, 1990 + "node_modules/is-callable": { 1991 + "version": "1.2.7", 1992 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 1993 + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 1994 + "engines": { 1995 + "node": ">= 0.4" 1996 + }, 1997 + "funding": { 1998 + "url": "https://github.com/sponsors/ljharb" 1999 + } 2000 + }, 2001 + "node_modules/is-core-module": { 2002 + "version": "2.11.0", 2003 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 2004 + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 2005 + "dependencies": { 2006 + "has": "^1.0.3" 2007 + }, 2008 + "funding": { 2009 + "url": "https://github.com/sponsors/ljharb" 2010 + } 2011 + }, 2012 + "node_modules/is-extglob": { 2013 + "version": "2.1.1", 2014 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2015 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2016 + "dev": true, 2017 + "engines": { 2018 + "node": ">=0.10.0" 2019 + } 2020 + }, 2021 + "node_modules/is-generator-function": { 2022 + "version": "1.0.10", 2023 + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", 2024 + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", 2025 + "dependencies": { 2026 + "has-tostringtag": "^1.0.0" 2027 + }, 2028 + "engines": { 2029 + "node": ">= 0.4" 2030 + }, 2031 + "funding": { 2032 + "url": "https://github.com/sponsors/ljharb" 2033 + } 2034 + }, 2035 + "node_modules/is-glob": { 2036 + "version": "4.0.3", 2037 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2038 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2039 + "dev": true, 2040 + "dependencies": { 2041 + "is-extglob": "^2.1.1" 2042 + }, 2043 + "engines": { 2044 + "node": ">=0.10.0" 2045 + } 2046 + }, 2047 + "node_modules/is-module": { 2048 + "version": "1.0.0", 2049 + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 2050 + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" 2051 + }, 2052 + "node_modules/is-number": { 2053 + "version": "7.0.0", 2054 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2055 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2056 + "dev": true, 2057 + "engines": { 2058 + "node": ">=0.12.0" 2059 + } 2060 + }, 2061 + "node_modules/is-path-inside": { 2062 + "version": "3.0.3", 2063 + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 2064 + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 2065 + "dev": true, 2066 + "engines": { 2067 + "node": ">=8" 2068 + } 2069 + }, 2070 + "node_modules/is-reference": { 2071 + "version": "1.2.1", 2072 + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", 2073 + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", 2074 + "dependencies": { 2075 + "@types/estree": "*" 2076 + } 2077 + }, 2078 + "node_modules/is-typed-array": { 2079 + "version": "1.1.10", 2080 + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", 2081 + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", 2082 + "dependencies": { 2083 + "available-typed-arrays": "^1.0.5", 2084 + "call-bind": "^1.0.2", 2085 + "for-each": "^0.3.3", 2086 + "gopd": "^1.0.1", 2087 + "has-tostringtag": "^1.0.0" 2088 + }, 2089 + "engines": { 2090 + "node": ">= 0.4" 2091 + }, 2092 + "funding": { 2093 + "url": "https://github.com/sponsors/ljharb" 2094 + } 2095 + }, 2096 + "node_modules/isarray": { 2097 + "version": "1.0.0", 2098 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2099 + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 2100 + }, 2101 + "node_modules/isexe": { 2102 + "version": "2.0.0", 2103 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2104 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2105 + "dev": true 2106 + }, 2107 + "node_modules/jiti": { 2108 + "version": "1.18.2", 2109 + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", 2110 + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", 2111 + "dev": true, 2112 + "bin": { 2113 + "jiti": "bin/jiti.js" 2114 + } 2115 + }, 2116 + "node_modules/jmespath": { 2117 + "version": "0.16.0", 2118 + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", 2119 + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", 2120 + "engines": { 2121 + "node": ">= 0.6.0" 2122 + } 2123 + }, 2124 + "node_modules/js-sdsl": { 2125 + "version": "4.3.0", 2126 + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", 2127 + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", 2128 + "dev": true, 2129 + "funding": { 2130 + "type": "opencollective", 2131 + "url": "https://opencollective.com/js-sdsl" 2132 + } 2133 + }, 2134 + "node_modules/js-yaml": { 2135 + "version": "4.1.0", 2136 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2137 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2138 + "dev": true, 2139 + "dependencies": { 2140 + "argparse": "^2.0.1" 2141 + }, 2142 + "bin": { 2143 + "js-yaml": "bin/js-yaml.js" 2144 + } 2145 + }, 2146 + "node_modules/json-schema-traverse": { 2147 + "version": "0.4.1", 2148 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2149 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2150 + "dev": true 2151 + }, 2152 + "node_modules/json-stable-stringify-without-jsonify": { 2153 + "version": "1.0.1", 2154 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2155 + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2156 + "dev": true 2157 + }, 2158 + "node_modules/kleur": { 2159 + "version": "4.1.5", 2160 + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 2161 + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 2162 + "engines": { 2163 + "node": ">=6" 2164 + } 2165 + }, 2166 + "node_modules/levn": { 2167 + "version": "0.4.1", 2168 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2169 + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2170 + "dev": true, 2171 + "dependencies": { 2172 + "prelude-ls": "^1.2.1", 2173 + "type-check": "~0.4.0" 2174 + }, 2175 + "engines": { 2176 + "node": ">= 0.8.0" 2177 + } 2178 + }, 2179 + "node_modules/lilconfig": { 2180 + "version": "2.0.6", 2181 + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", 2182 + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", 2183 + "dev": true, 2184 + "engines": { 2185 + "node": ">=10" 2186 + } 2187 + }, 2188 + "node_modules/lines-and-columns": { 2189 + "version": "1.2.4", 2190 + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 2191 + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 2192 + "dev": true 2193 + }, 2194 + "node_modules/locate-path": { 2195 + "version": "6.0.0", 2196 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2197 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2198 + "dev": true, 2199 + "dependencies": { 2200 + "p-locate": "^5.0.0" 2201 + }, 2202 + "engines": { 2203 + "node": ">=10" 2204 + }, 2205 + "funding": { 2206 + "url": "https://github.com/sponsors/sindresorhus" 2207 + } 2208 + }, 2209 + "node_modules/lodash.castarray": { 2210 + "version": "4.4.0", 2211 + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", 2212 + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", 2213 + "dev": true 2214 + }, 2215 + "node_modules/lodash.isplainobject": { 2216 + "version": "4.0.6", 2217 + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 2218 + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", 2219 + "dev": true 2220 + }, 2221 + "node_modules/lodash.merge": { 2222 + "version": "4.6.2", 2223 + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2224 + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2225 + "dev": true 2226 + }, 2227 + "node_modules/magic-string": { 2228 + "version": "0.27.0", 2229 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", 2230 + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", 2231 + "dependencies": { 2232 + "@jridgewell/sourcemap-codec": "^1.4.13" 2233 + }, 2234 + "engines": { 2235 + "node": ">=12" 2236 + } 2237 + }, 2238 + "node_modules/map-obj": { 2239 + "version": "4.3.0", 2240 + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", 2241 + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", 2242 + "engines": { 2243 + "node": ">=8" 2244 + }, 2245 + "funding": { 2246 + "url": "https://github.com/sponsors/sindresorhus" 2247 + } 2248 + }, 2249 + "node_modules/merge2": { 2250 + "version": "1.4.1", 2251 + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2252 + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2253 + "dev": true, 2254 + "engines": { 2255 + "node": ">= 8" 2256 + } 2257 + }, 2258 + "node_modules/micromatch": { 2259 + "version": "4.0.5", 2260 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 2261 + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 2262 + "dev": true, 2263 + "dependencies": { 2264 + "braces": "^3.0.2", 2265 + "picomatch": "^2.3.1" 2266 + }, 2267 + "engines": { 2268 + "node": ">=8.6" 2269 + } 2270 + }, 2271 + "node_modules/mime": { 2272 + "version": "3.0.0", 2273 + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 2274 + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 2275 + "bin": { 2276 + "mime": "cli.js" 2277 + }, 2278 + "engines": { 2279 + "node": ">=10.0.0" 2280 + } 2281 + }, 2282 + "node_modules/mini-svg-data-uri": { 2283 + "version": "1.4.4", 2284 + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", 2285 + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", 2286 + "dev": true, 2287 + "bin": { 2288 + "mini-svg-data-uri": "cli.js" 2289 + } 2290 + }, 2291 + "node_modules/minimatch": { 2292 + "version": "3.1.2", 2293 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2294 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2295 + "dev": true, 2296 + "dependencies": { 2297 + "brace-expansion": "^1.1.7" 2298 + }, 2299 + "engines": { 2300 + "node": "*" 2301 + } 2302 + }, 2303 + "node_modules/mri": { 2304 + "version": "1.2.0", 2305 + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 2306 + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 2307 + "engines": { 2308 + "node": ">=4" 2309 + } 2310 + }, 2311 + "node_modules/mrmime": { 2312 + "version": "1.0.1", 2313 + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", 2314 + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", 2315 + "engines": { 2316 + "node": ">=10" 2317 + } 2318 + }, 2319 + "node_modules/ms": { 2320 + "version": "2.1.2", 2321 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2322 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2323 + }, 2324 + "node_modules/mz": { 2325 + "version": "2.7.0", 2326 + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 2327 + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 2328 + "dev": true, 2329 + "dependencies": { 2330 + "any-promise": "^1.0.0", 2331 + "object-assign": "^4.0.1", 2332 + "thenify-all": "^1.0.0" 2333 + } 2334 + }, 2335 + "node_modules/nanoid": { 2336 + "version": "3.3.4", 2337 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 2338 + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 2339 + "bin": { 2340 + "nanoid": "bin/nanoid.cjs" 2341 + }, 2342 + "engines": { 2343 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2344 + } 2345 + }, 2346 + "node_modules/natural-compare": { 2347 + "version": "1.4.0", 2348 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2349 + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2350 + "dev": true 2351 + }, 2352 + "node_modules/node-releases": { 2353 + "version": "2.0.10", 2354 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", 2355 + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", 2356 + "dev": true 2357 + }, 2358 + "node_modules/normalize-path": { 2359 + "version": "3.0.0", 2360 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2361 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2362 + "dev": true, 2363 + "engines": { 2364 + "node": ">=0.10.0" 2365 + } 2366 + }, 2367 + "node_modules/normalize-range": { 2368 + "version": "0.1.2", 2369 + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 2370 + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 2371 + "dev": true, 2372 + "engines": { 2373 + "node": ">=0.10.0" 2374 + } 2375 + }, 2376 + "node_modules/object-assign": { 2377 + "version": "4.1.1", 2378 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2379 + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2380 + "dev": true, 2381 + "engines": { 2382 + "node": ">=0.10.0" 2383 + } 2384 + }, 2385 + "node_modules/object-hash": { 2386 + "version": "3.0.0", 2387 + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 2388 + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 2389 + "dev": true, 2390 + "engines": { 2391 + "node": ">= 6" 2392 + } 2393 + }, 2394 + "node_modules/once": { 2395 + "version": "1.4.0", 2396 + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2397 + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2398 + "dependencies": { 2399 + "wrappy": "1" 2400 + } 2401 + }, 2402 + "node_modules/optionator": { 2403 + "version": "0.9.1", 2404 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 2405 + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 2406 + "dev": true, 2407 + "dependencies": { 2408 + "deep-is": "^0.1.3", 2409 + "fast-levenshtein": "^2.0.6", 2410 + "levn": "^0.4.1", 2411 + "prelude-ls": "^1.2.1", 2412 + "type-check": "^0.4.0", 2413 + "word-wrap": "^1.2.3" 2414 + }, 2415 + "engines": { 2416 + "node": ">= 0.8.0" 2417 + } 2418 + }, 2419 + "node_modules/orderedmap": { 2420 + "version": "2.1.0", 2421 + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.0.tgz", 2422 + "integrity": "sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA==" 2423 + }, 2424 + "node_modules/p-limit": { 2425 + "version": "3.1.0", 2426 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2427 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2428 + "dev": true, 2429 + "dependencies": { 2430 + "yocto-queue": "^0.1.0" 2431 + }, 2432 + "engines": { 2433 + "node": ">=10" 2434 + }, 2435 + "funding": { 2436 + "url": "https://github.com/sponsors/sindresorhus" 2437 + } 2438 + }, 2439 + "node_modules/p-locate": { 2440 + "version": "5.0.0", 2441 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2442 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2443 + "dev": true, 2444 + "dependencies": { 2445 + "p-limit": "^3.0.2" 2446 + }, 2447 + "engines": { 2448 + "node": ">=10" 2449 + }, 2450 + "funding": { 2451 + "url": "https://github.com/sponsors/sindresorhus" 2452 + } 2453 + }, 2454 + "node_modules/packet-reader": { 2455 + "version": "1.0.0", 2456 + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", 2457 + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" 2458 + }, 2459 + "node_modules/parent-module": { 2460 + "version": "1.0.1", 2461 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2462 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2463 + "dev": true, 2464 + "dependencies": { 2465 + "callsites": "^3.0.0" 2466 + }, 2467 + "engines": { 2468 + "node": ">=6" 2469 + } 2470 + }, 2471 + "node_modules/path-exists": { 2472 + "version": "4.0.0", 2473 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2474 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2475 + "dev": true, 2476 + "engines": { 2477 + "node": ">=8" 2478 + } 2479 + }, 2480 + "node_modules/path-is-absolute": { 2481 + "version": "1.0.1", 2482 + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2483 + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2484 + "dev": true, 2485 + "engines": { 2486 + "node": ">=0.10.0" 2487 + } 2488 + }, 2489 + "node_modules/path-key": { 2490 + "version": "3.1.1", 2491 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2492 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2493 + "dev": true, 2494 + "engines": { 2495 + "node": ">=8" 2496 + } 2497 + }, 2498 + "node_modules/path-parse": { 2499 + "version": "1.0.7", 2500 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2501 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 2502 + }, 2503 + "node_modules/pg": { 2504 + "version": "8.10.0", 2505 + "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", 2506 + "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", 2507 + "dependencies": { 2508 + "buffer-writer": "2.0.0", 2509 + "packet-reader": "1.0.0", 2510 + "pg-connection-string": "^2.5.0", 2511 + "pg-pool": "^3.6.0", 2512 + "pg-protocol": "^1.6.0", 2513 + "pg-types": "^2.1.0", 2514 + "pgpass": "1.x" 2515 + }, 2516 + "engines": { 2517 + "node": ">= 8.0.0" 2518 + }, 2519 + "peerDependencies": { 2520 + "pg-native": ">=3.0.1" 2521 + }, 2522 + "peerDependenciesMeta": { 2523 + "pg-native": { 2524 + "optional": true 2525 + } 2526 + } 2527 + }, 2528 + "node_modules/pg-connection-string": { 2529 + "version": "2.5.0", 2530 + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 2531 + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 2532 + }, 2533 + "node_modules/pg-int8": { 2534 + "version": "1.0.1", 2535 + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 2536 + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", 2537 + "engines": { 2538 + "node": ">=4.0.0" 2539 + } 2540 + }, 2541 + "node_modules/pg-minify": { 2542 + "version": "1.6.3", 2543 + "resolved": "https://registry.npmjs.org/pg-minify/-/pg-minify-1.6.3.tgz", 2544 + "integrity": "sha512-NoSsPqXxbkD8RIe+peQCqiea4QzXgosdTKY8p7PsbbGsh2F8TifDj/vJxfuR8qJwNYrijdSs7uf0tAe6WOyCsQ==", 2545 + "engines": { 2546 + "node": ">=12.0.0" 2547 + } 2548 + }, 2549 + "node_modules/pg-pool": { 2550 + "version": "3.6.0", 2551 + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", 2552 + "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", 2553 + "peerDependencies": { 2554 + "pg": ">=8.0" 2555 + } 2556 + }, 2557 + "node_modules/pg-promise": { 2558 + "version": "11.4.3", 2559 + "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-11.4.3.tgz", 2560 + "integrity": "sha512-b4wuukB+pkrLRZ53Z+3L9IONlIhOUSM/VlLQV2SnQzNJPJmDZj6ticgcMtZMDanAUEj+zX1FJOBrSpSR9TumXg==", 2561 + "dependencies": { 2562 + "assert-options": "0.8.1", 2563 + "pg": "8.10.0", 2564 + "pg-minify": "1.6.3", 2565 + "spex": "3.3.0" 2566 + }, 2567 + "engines": { 2568 + "node": ">=14.0" 2569 + } 2570 + }, 2571 + "node_modules/pg-protocol": { 2572 + "version": "1.6.0", 2573 + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", 2574 + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" 2575 + }, 2576 + "node_modules/pg-types": { 2577 + "version": "2.2.0", 2578 + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 2579 + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 2580 + "dependencies": { 2581 + "pg-int8": "1.0.1", 2582 + "postgres-array": "~2.0.0", 2583 + "postgres-bytea": "~1.0.0", 2584 + "postgres-date": "~1.0.4", 2585 + "postgres-interval": "^1.1.0" 2586 + }, 2587 + "engines": { 2588 + "node": ">=4" 2589 + } 2590 + }, 2591 + "node_modules/pgpass": { 2592 + "version": "1.0.5", 2593 + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 2594 + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 2595 + "dependencies": { 2596 + "split2": "^4.1.0" 2597 + } 2598 + }, 2599 + "node_modules/picocolors": { 2600 + "version": "1.0.0", 2601 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2602 + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 2603 + }, 2604 + "node_modules/picomatch": { 2605 + "version": "2.3.1", 2606 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2607 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2608 + "engines": { 2609 + "node": ">=8.6" 2610 + }, 2611 + "funding": { 2612 + "url": "https://github.com/sponsors/jonschlinkert" 2613 + } 2614 + }, 2615 + "node_modules/pify": { 2616 + "version": "2.3.0", 2617 + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2618 + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 2619 + "dev": true, 2620 + "engines": { 2621 + "node": ">=0.10.0" 2622 + } 2623 + }, 2624 + "node_modules/pirates": { 2625 + "version": "4.0.5", 2626 + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", 2627 + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", 2628 + "dev": true, 2629 + "engines": { 2630 + "node": ">= 6" 2631 + } 2632 + }, 2633 + "node_modules/postcss": { 2634 + "version": "8.4.21", 2635 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", 2636 + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", 2637 + "funding": [ 2638 + { 2639 + "type": "opencollective", 2640 + "url": "https://opencollective.com/postcss/" 2641 + }, 2642 + { 2643 + "type": "tidelift", 2644 + "url": "https://tidelift.com/funding/github/npm/postcss" 2645 + } 2646 + ], 2647 + "dependencies": { 2648 + "nanoid": "^3.3.4", 2649 + "picocolors": "^1.0.0", 2650 + "source-map-js": "^1.0.2" 2651 + }, 2652 + "engines": { 2653 + "node": "^10 || ^12 || >=14" 2654 + } 2655 + }, 2656 + "node_modules/postcss-import": { 2657 + "version": "14.1.0", 2658 + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", 2659 + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", 2660 + "dev": true, 2661 + "dependencies": { 2662 + "postcss-value-parser": "^4.0.0", 2663 + "read-cache": "^1.0.0", 2664 + "resolve": "^1.1.7" 2665 + }, 2666 + "engines": { 2667 + "node": ">=10.0.0" 2668 + }, 2669 + "peerDependencies": { 2670 + "postcss": "^8.0.0" 2671 + } 2672 + }, 2673 + "node_modules/postcss-js": { 2674 + "version": "4.0.0", 2675 + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 2676 + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 2677 + "dev": true, 2678 + "dependencies": { 2679 + "camelcase-css": "^2.0.1" 2680 + }, 2681 + "engines": { 2682 + "node": "^12 || ^14 || >= 16" 2683 + }, 2684 + "funding": { 2685 + "type": "opencollective", 2686 + "url": "https://opencollective.com/postcss/" 2687 + }, 2688 + "peerDependencies": { 2689 + "postcss": "^8.3.3" 2690 + } 2691 + }, 2692 + "node_modules/postcss-load-config": { 2693 + "version": "3.1.4", 2694 + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 2695 + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 2696 + "dev": true, 2697 + "dependencies": { 2698 + "lilconfig": "^2.0.5", 2699 + "yaml": "^1.10.2" 2700 + }, 2701 + "engines": { 2702 + "node": ">= 10" 2703 + }, 2704 + "funding": { 2705 + "type": "opencollective", 2706 + "url": "https://opencollective.com/postcss/" 2707 + }, 2708 + "peerDependencies": { 2709 + "postcss": ">=8.0.9", 2710 + "ts-node": ">=9.0.0" 2711 + }, 2712 + "peerDependenciesMeta": { 2713 + "postcss": { 2714 + "optional": true 2715 + }, 2716 + "ts-node": { 2717 + "optional": true 2718 + } 2719 + } 2720 + }, 2721 + "node_modules/postcss-nested": { 2722 + "version": "6.0.0", 2723 + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", 2724 + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", 2725 + "dev": true, 2726 + "dependencies": { 2727 + "postcss-selector-parser": "^6.0.10" 2728 + }, 2729 + "engines": { 2730 + "node": ">=12.0" 2731 + }, 2732 + "funding": { 2733 + "type": "opencollective", 2734 + "url": "https://opencollective.com/postcss/" 2735 + }, 2736 + "peerDependencies": { 2737 + "postcss": "^8.2.14" 2738 + } 2739 + }, 2740 + "node_modules/postcss-selector-parser": { 2741 + "version": "6.0.11", 2742 + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", 2743 + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", 2744 + "dev": true, 2745 + "dependencies": { 2746 + "cssesc": "^3.0.0", 2747 + "util-deprecate": "^1.0.2" 2748 + }, 2749 + "engines": { 2750 + "node": ">=4" 2751 + } 2752 + }, 2753 + "node_modules/postcss-value-parser": { 2754 + "version": "4.2.0", 2755 + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 2756 + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 2757 + "dev": true 2758 + }, 2759 + "node_modules/postgres-array": { 2760 + "version": "2.0.0", 2761 + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 2762 + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", 2763 + "engines": { 2764 + "node": ">=4" 2765 + } 2766 + }, 2767 + "node_modules/postgres-bytea": { 2768 + "version": "1.0.0", 2769 + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 2770 + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", 2771 + "engines": { 2772 + "node": ">=0.10.0" 2773 + } 2774 + }, 2775 + "node_modules/postgres-date": { 2776 + "version": "1.0.7", 2777 + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 2778 + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", 2779 + "engines": { 2780 + "node": ">=0.10.0" 2781 + } 2782 + }, 2783 + "node_modules/postgres-interval": { 2784 + "version": "1.2.0", 2785 + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 2786 + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 2787 + "dependencies": { 2788 + "xtend": "^4.0.0" 2789 + }, 2790 + "engines": { 2791 + "node": ">=0.10.0" 2792 + } 2793 + }, 2794 + "node_modules/prelude-ls": { 2795 + "version": "1.2.1", 2796 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2797 + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2798 + "dev": true, 2799 + "engines": { 2800 + "node": ">= 0.8.0" 2801 + } 2802 + }, 2803 + "node_modules/prettier": { 2804 + "version": "2.8.3", 2805 + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz", 2806 + "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==", 2807 + "dev": true, 2808 + "bin": { 2809 + "prettier": "bin-prettier.js" 2810 + }, 2811 + "engines": { 2812 + "node": ">=10.13.0" 2813 + }, 2814 + "funding": { 2815 + "url": "https://github.com/prettier/prettier?sponsor=1" 2816 + } 2817 + }, 2818 + "node_modules/prettier-plugin-svelte": { 2819 + "version": "2.9.0", 2820 + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.9.0.tgz", 2821 + "integrity": "sha512-3doBi5NO4IVgaNPtwewvrgPpqAcvNv0NwJNflr76PIGgi9nf1oguQV1Hpdm9TI2ALIQVn/9iIwLpBO5UcD2Jiw==", 2822 + "dev": true, 2823 + "peerDependencies": { 2824 + "prettier": "^1.16.4 || ^2.0.0", 2825 + "svelte": "^3.2.0" 2826 + } 2827 + }, 2828 + "node_modules/prosemirror-commands": { 2829 + "version": "1.5.0", 2830 + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.0.tgz", 2831 + "integrity": "sha512-zL0Fxbj3fh71GPNHn5YdYgYGX2aU2XLecZYk2ekEF0oOD259HcXtM+96VjPVi5o3h4sGUdDfEEhGiREXW6U+4A==", 2832 + "dependencies": { 2833 + "prosemirror-model": "^1.0.0", 2834 + "prosemirror-state": "^1.0.0", 2835 + "prosemirror-transform": "^1.0.0" 2836 + } 2837 + }, 2838 + "node_modules/prosemirror-dropcursor": { 2839 + "version": "1.6.1", 2840 + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.6.1.tgz", 2841 + "integrity": "sha512-LtyqQpkIknaT7NnZl3vDr3TpkNcG4ABvGRXx37XJ8tJNUGtcrZBh40A0344rDwlRTfUEmynQS/grUsoSWz+HgA==", 2842 + "dependencies": { 2843 + "prosemirror-state": "^1.0.0", 2844 + "prosemirror-transform": "^1.1.0", 2845 + "prosemirror-view": "^1.1.0" 2846 + } 2847 + }, 2848 + "node_modules/prosemirror-example-setup": { 2849 + "version": "1.2.1", 2850 + "resolved": "https://registry.npmjs.org/prosemirror-example-setup/-/prosemirror-example-setup-1.2.1.tgz", 2851 + "integrity": "sha512-sxFBVjxP+Mgd7sPigjN4QenrEn8e1vgX/YWsB+Bv6nPZf9Eakx7TDdjLPs+7v/iCXFqCdRX7C20LcYdUQhvWpA==", 2852 + "dependencies": { 2853 + "prosemirror-commands": "^1.0.0", 2854 + "prosemirror-dropcursor": "^1.0.0", 2855 + "prosemirror-gapcursor": "^1.0.0", 2856 + "prosemirror-history": "^1.0.0", 2857 + "prosemirror-inputrules": "^1.0.0", 2858 + "prosemirror-keymap": "^1.0.0", 2859 + "prosemirror-menu": "^1.0.0", 2860 + "prosemirror-schema-list": "^1.0.0", 2861 + "prosemirror-state": "^1.0.0" 2862 + } 2863 + }, 2864 + "node_modules/prosemirror-gapcursor": { 2865 + "version": "1.3.1", 2866 + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.1.tgz", 2867 + "integrity": "sha512-GKTeE7ZoMsx5uVfc51/ouwMFPq0o8YrZ7Hx4jTF4EeGbXxBveUV8CGv46mSHuBBeXGmvu50guoV2kSnOeZZnUA==", 2868 + "dependencies": { 2869 + "prosemirror-keymap": "^1.0.0", 2870 + "prosemirror-model": "^1.0.0", 2871 + "prosemirror-state": "^1.0.0", 2872 + "prosemirror-view": "^1.0.0" 2873 + } 2874 + }, 2875 + "node_modules/prosemirror-history": { 2876 + "version": "1.3.0", 2877 + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.0.tgz", 2878 + "integrity": "sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA==", 2879 + "dependencies": { 2880 + "prosemirror-state": "^1.2.2", 2881 + "prosemirror-transform": "^1.0.0", 2882 + "rope-sequence": "^1.3.0" 2883 + } 2884 + }, 2885 + "node_modules/prosemirror-inputrules": { 2886 + "version": "1.2.0", 2887 + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.2.0.tgz", 2888 + "integrity": "sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ==", 2889 + "dependencies": { 2890 + "prosemirror-state": "^1.0.0", 2891 + "prosemirror-transform": "^1.0.0" 2892 + } 2893 + }, 2894 + "node_modules/prosemirror-keymap": { 2895 + "version": "1.2.0", 2896 + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz", 2897 + "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==", 2898 + "dependencies": { 2899 + "prosemirror-state": "^1.0.0", 2900 + "w3c-keyname": "^2.2.0" 2901 + } 2902 + }, 2903 + "node_modules/prosemirror-menu": { 2904 + "version": "1.2.1", 2905 + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.1.tgz", 2906 + "integrity": "sha512-sBirXxVfHalZO4f1ZS63WzewINK4182+7dOmoMeBkqYO8wqMBvBS7wQuwVOHnkMWPEh0+N0LJ856KYUN+vFkmQ==", 2907 + "dependencies": { 2908 + "crelt": "^1.0.0", 2909 + "prosemirror-commands": "^1.0.0", 2910 + "prosemirror-history": "^1.0.0", 2911 + "prosemirror-state": "^1.0.0" 2912 + } 2913 + }, 2914 + "node_modules/prosemirror-model": { 2915 + "version": "1.19.0", 2916 + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.0.tgz", 2917 + "integrity": "sha512-/CvFGJnwc41EJSfDkQLly1cAJJJmBpZwwUJtwZPTjY2RqZJfM8HVbCreOY/jti8wTRbVyjagcylyGoeJH/g/3w==", 2918 + "dependencies": { 2919 + "orderedmap": "^2.0.0" 2920 + } 2921 + }, 2922 + "node_modules/prosemirror-schema-basic": { 2923 + "version": "1.2.1", 2924 + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.1.tgz", 2925 + "integrity": "sha512-vYBdIHsYKSDIqYmPBC7lnwk9DsKn8PnVqK97pMYP5MLEDFqWIX75JiaJTzndBii4bRuNqhC2UfDOfM3FKhlBHg==", 2926 + "dependencies": { 2927 + "prosemirror-model": "^1.19.0" 2928 + } 2929 + }, 2930 + "node_modules/prosemirror-schema-list": { 2931 + "version": "1.2.2", 2932 + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.2.2.tgz", 2933 + "integrity": "sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w==", 2934 + "dependencies": { 2935 + "prosemirror-model": "^1.0.0", 2936 + "prosemirror-state": "^1.0.0", 2937 + "prosemirror-transform": "^1.0.0" 2938 + } 2939 + }, 2940 + "node_modules/prosemirror-state": { 2941 + "version": "1.4.2", 2942 + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.2.tgz", 2943 + "integrity": "sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ==", 2944 + "dependencies": { 2945 + "prosemirror-model": "^1.0.0", 2946 + "prosemirror-transform": "^1.0.0", 2947 + "prosemirror-view": "^1.27.0" 2948 + } 2949 + }, 2950 + "node_modules/prosemirror-transform": { 2951 + "version": "1.7.1", 2952 + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.7.1.tgz", 2953 + "integrity": "sha512-VteoifAfpt46z0yEt6Fc73A5OID9t/y2QIeR5MgxEwTuitadEunD/V0c9jQW8ziT8pbFM54uTzRLJ/nLuQjMxg==", 2954 + "dependencies": { 2955 + "prosemirror-model": "^1.0.0" 2956 + } 2957 + }, 2958 + "node_modules/prosemirror-view": { 2959 + "version": "1.30.1", 2960 + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.30.1.tgz", 2961 + "integrity": "sha512-pZUfr7lICJkEY7XwzldAKrkflZDeIvnbfuu2RIS01N5NwJmR/dfZzDzJRzhb3SM2QtT/bM8b4Nnib8X3MGpAhA==", 2962 + "dependencies": { 2963 + "prosemirror-model": "^1.16.0", 2964 + "prosemirror-state": "^1.0.0", 2965 + "prosemirror-transform": "^1.1.0" 2966 + } 2967 + }, 2968 + "node_modules/punycode": { 2969 + "version": "2.3.0", 2970 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 2971 + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 2972 + "dev": true, 2973 + "engines": { 2974 + "node": ">=6" 2975 + } 2976 + }, 2977 + "node_modules/querystring": { 2978 + "version": "0.2.0", 2979 + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 2980 + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", 2981 + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", 2982 + "engines": { 2983 + "node": ">=0.4.x" 2984 + } 2985 + }, 2986 + "node_modules/queue-microtask": { 2987 + "version": "1.2.3", 2988 + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2989 + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2990 + "dev": true, 2991 + "funding": [ 2992 + { 2993 + "type": "github", 2994 + "url": "https://github.com/sponsors/feross" 2995 + }, 2996 + { 2997 + "type": "patreon", 2998 + "url": "https://www.patreon.com/feross" 2999 + }, 3000 + { 3001 + "type": "consulting", 3002 + "url": "https://feross.org/support" 3003 + } 3004 + ] 3005 + }, 3006 + "node_modules/quick-lru": { 3007 + "version": "5.1.1", 3008 + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 3009 + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 3010 + "dev": true, 3011 + "engines": { 3012 + "node": ">=10" 3013 + }, 3014 + "funding": { 3015 + "url": "https://github.com/sponsors/sindresorhus" 3016 + } 3017 + }, 3018 + "node_modules/read-cache": { 3019 + "version": "1.0.0", 3020 + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 3021 + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 3022 + "dev": true, 3023 + "dependencies": { 3024 + "pify": "^2.3.0" 3025 + } 3026 + }, 3027 + "node_modules/readdirp": { 3028 + "version": "3.6.0", 3029 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 3030 + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 3031 + "dev": true, 3032 + "dependencies": { 3033 + "picomatch": "^2.2.1" 3034 + }, 3035 + "engines": { 3036 + "node": ">=8.10.0" 3037 + } 3038 + }, 3039 + "node_modules/regexpp": { 3040 + "version": "3.2.0", 3041 + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 3042 + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 3043 + "dev": true, 3044 + "engines": { 3045 + "node": ">=8" 3046 + }, 3047 + "funding": { 3048 + "url": "https://github.com/sponsors/mysticatea" 3049 + } 3050 + }, 3051 + "node_modules/resolve": { 3052 + "version": "1.22.1", 3053 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 3054 + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 3055 + "dependencies": { 3056 + "is-core-module": "^2.9.0", 3057 + "path-parse": "^1.0.7", 3058 + "supports-preserve-symlinks-flag": "^1.0.0" 3059 + }, 3060 + "bin": { 3061 + "resolve": "bin/resolve" 3062 + }, 3063 + "funding": { 3064 + "url": "https://github.com/sponsors/ljharb" 3065 + } 3066 + }, 3067 + "node_modules/resolve-from": { 3068 + "version": "4.0.0", 3069 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 3070 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 3071 + "dev": true, 3072 + "engines": { 3073 + "node": ">=4" 3074 + } 3075 + }, 3076 + "node_modules/reusify": { 3077 + "version": "1.0.4", 3078 + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 3079 + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 3080 + "dev": true, 3081 + "engines": { 3082 + "iojs": ">=1.0.0", 3083 + "node": ">=0.10.0" 3084 + } 3085 + }, 3086 + "node_modules/rimraf": { 3087 + "version": "3.0.2", 3088 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 3089 + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 3090 + "dev": true, 3091 + "dependencies": { 3092 + "glob": "^7.1.3" 3093 + }, 3094 + "bin": { 3095 + "rimraf": "bin.js" 3096 + }, 3097 + "funding": { 3098 + "url": "https://github.com/sponsors/isaacs" 3099 + } 3100 + }, 3101 + "node_modules/rollup": { 3102 + "version": "3.20.2", 3103 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", 3104 + "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", 3105 + "bin": { 3106 + "rollup": "dist/bin/rollup" 3107 + }, 3108 + "engines": { 3109 + "node": ">=14.18.0", 3110 + "npm": ">=8.0.0" 3111 + }, 3112 + "optionalDependencies": { 3113 + "fsevents": "~2.3.2" 3114 + } 3115 + }, 3116 + "node_modules/rope-sequence": { 3117 + "version": "1.3.3", 3118 + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.3.tgz", 3119 + "integrity": "sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==" 3120 + }, 3121 + "node_modules/run-parallel": { 3122 + "version": "1.2.0", 3123 + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 3124 + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 3125 + "dev": true, 3126 + "funding": [ 3127 + { 3128 + "type": "github", 3129 + "url": "https://github.com/sponsors/feross" 3130 + }, 3131 + { 3132 + "type": "patreon", 3133 + "url": "https://www.patreon.com/feross" 3134 + }, 3135 + { 3136 + "type": "consulting", 3137 + "url": "https://feross.org/support" 3138 + } 3139 + ], 3140 + "dependencies": { 3141 + "queue-microtask": "^1.2.2" 3142 + } 3143 + }, 3144 + "node_modules/sade": { 3145 + "version": "1.8.1", 3146 + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 3147 + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 3148 + "dependencies": { 3149 + "mri": "^1.1.0" 3150 + }, 3151 + "engines": { 3152 + "node": ">=6" 3153 + } 3154 + }, 3155 + "node_modules/sax": { 3156 + "version": "1.2.1", 3157 + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 3158 + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" 3159 + }, 3160 + "node_modules/set-cookie-parser": { 3161 + "version": "2.5.1", 3162 + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", 3163 + "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==" 3164 + }, 3165 + "node_modules/shebang-command": { 3166 + "version": "2.0.0", 3167 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3168 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3169 + "dev": true, 3170 + "dependencies": { 3171 + "shebang-regex": "^3.0.0" 3172 + }, 3173 + "engines": { 3174 + "node": ">=8" 3175 + } 3176 + }, 3177 + "node_modules/shebang-regex": { 3178 + "version": "3.0.0", 3179 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3180 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3181 + "dev": true, 3182 + "engines": { 3183 + "node": ">=8" 3184 + } 3185 + }, 3186 + "node_modules/sirv": { 3187 + "version": "2.0.2", 3188 + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", 3189 + "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==", 3190 + "dependencies": { 3191 + "@polka/url": "^1.0.0-next.20", 3192 + "mrmime": "^1.0.0", 3193 + "totalist": "^3.0.0" 3194 + }, 3195 + "engines": { 3196 + "node": ">= 10" 3197 + } 3198 + }, 3199 + "node_modules/slugify": { 3200 + "version": "1.6.5", 3201 + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", 3202 + "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==", 3203 + "engines": { 3204 + "node": ">=8.0.0" 3205 + } 3206 + }, 3207 + "node_modules/source-map-js": { 3208 + "version": "1.0.2", 3209 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 3210 + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 3211 + "engines": { 3212 + "node": ">=0.10.0" 3213 + } 3214 + }, 3215 + "node_modules/spex": { 3216 + "version": "3.3.0", 3217 + "resolved": "https://registry.npmjs.org/spex/-/spex-3.3.0.tgz", 3218 + "integrity": "sha512-VNiXjFp6R4ldPbVRYbpxlD35yRHceecVXlct1J4/X80KuuPnW2AXMq3sGwhnJOhKkUsOxAT6nRGfGE5pocVw5w==", 3219 + "engines": { 3220 + "node": ">=10.0.0" 3221 + } 3222 + }, 3223 + "node_modules/split2": { 3224 + "version": "4.2.0", 3225 + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 3226 + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", 3227 + "engines": { 3228 + "node": ">= 10.x" 3229 + } 3230 + }, 3231 + "node_modules/streamsearch": { 3232 + "version": "1.1.0", 3233 + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 3234 + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 3235 + "engines": { 3236 + "node": ">=10.0.0" 3237 + } 3238 + }, 3239 + "node_modules/strip-ansi": { 3240 + "version": "6.0.1", 3241 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3242 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3243 + "dev": true, 3244 + "dependencies": { 3245 + "ansi-regex": "^5.0.1" 3246 + }, 3247 + "engines": { 3248 + "node": ">=8" 3249 + } 3250 + }, 3251 + "node_modules/strip-json-comments": { 3252 + "version": "3.1.1", 3253 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3254 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3255 + "dev": true, 3256 + "engines": { 3257 + "node": ">=8" 3258 + }, 3259 + "funding": { 3260 + "url": "https://github.com/sponsors/sindresorhus" 3261 + } 3262 + }, 3263 + "node_modules/sucrase": { 3264 + "version": "3.31.0", 3265 + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.31.0.tgz", 3266 + "integrity": "sha512-6QsHnkqyVEzYcaiHsOKkzOtOgdJcb8i54x6AV2hDwyZcY9ZyykGZVw6L/YN98xC0evwTP6utsWWrKRaa8QlfEQ==", 3267 + "dev": true, 3268 + "dependencies": { 3269 + "commander": "^4.0.0", 3270 + "glob": "7.1.6", 3271 + "lines-and-columns": "^1.1.6", 3272 + "mz": "^2.7.0", 3273 + "pirates": "^4.0.1", 3274 + "ts-interface-checker": "^0.1.9" 3275 + }, 3276 + "bin": { 3277 + "sucrase": "bin/sucrase", 3278 + "sucrase-node": "bin/sucrase-node" 3279 + }, 3280 + "engines": { 3281 + "node": ">=8" 3282 + } 3283 + }, 3284 + "node_modules/sucrase/node_modules/glob": { 3285 + "version": "7.1.6", 3286 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 3287 + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 3288 + "dev": true, 3289 + "dependencies": { 3290 + "fs.realpath": "^1.0.0", 3291 + "inflight": "^1.0.4", 3292 + "inherits": "2", 3293 + "minimatch": "^3.0.4", 3294 + "once": "^1.3.0", 3295 + "path-is-absolute": "^1.0.0" 3296 + }, 3297 + "engines": { 3298 + "node": "*" 3299 + }, 3300 + "funding": { 3301 + "url": "https://github.com/sponsors/isaacs" 3302 + } 3303 + }, 3304 + "node_modules/supports-color": { 3305 + "version": "7.2.0", 3306 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3307 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3308 + "dev": true, 3309 + "dependencies": { 3310 + "has-flag": "^4.0.0" 3311 + }, 3312 + "engines": { 3313 + "node": ">=8" 3314 + } 3315 + }, 3316 + "node_modules/supports-preserve-symlinks-flag": { 3317 + "version": "1.0.0", 3318 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3319 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 3320 + "engines": { 3321 + "node": ">= 0.4" 3322 + }, 3323 + "funding": { 3324 + "url": "https://github.com/sponsors/ljharb" 3325 + } 3326 + }, 3327 + "node_modules/svelte": { 3328 + "version": "3.55.1", 3329 + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.55.1.tgz", 3330 + "integrity": "sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ==", 3331 + "engines": { 3332 + "node": ">= 8" 3333 + } 3334 + }, 3335 + "node_modules/svelte-hmr": { 3336 + "version": "0.15.1", 3337 + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", 3338 + "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", 3339 + "engines": { 3340 + "node": "^12.20 || ^14.13.1 || >= 16" 3341 + }, 3342 + "peerDependencies": { 3343 + "svelte": ">=3.19.0" 3344 + } 3345 + }, 3346 + "node_modules/tailwindcss": { 3347 + "version": "3.3.1", 3348 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.1.tgz", 3349 + "integrity": "sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==", 3350 + "dev": true, 3351 + "dependencies": { 3352 + "arg": "^5.0.2", 3353 + "chokidar": "^3.5.3", 3354 + "color-name": "^1.1.4", 3355 + "didyoumean": "^1.2.2", 3356 + "dlv": "^1.1.3", 3357 + "fast-glob": "^3.2.12", 3358 + "glob-parent": "^6.0.2", 3359 + "is-glob": "^4.0.3", 3360 + "jiti": "^1.17.2", 3361 + "lilconfig": "^2.0.6", 3362 + "micromatch": "^4.0.5", 3363 + "normalize-path": "^3.0.0", 3364 + "object-hash": "^3.0.0", 3365 + "picocolors": "^1.0.0", 3366 + "postcss": "^8.0.9", 3367 + "postcss-import": "^14.1.0", 3368 + "postcss-js": "^4.0.0", 3369 + "postcss-load-config": "^3.1.4", 3370 + "postcss-nested": "6.0.0", 3371 + "postcss-selector-parser": "^6.0.11", 3372 + "postcss-value-parser": "^4.2.0", 3373 + "quick-lru": "^5.1.1", 3374 + "resolve": "^1.22.1", 3375 + "sucrase": "^3.29.0" 3376 + }, 3377 + "bin": { 3378 + "tailwind": "lib/cli.js", 3379 + "tailwindcss": "lib/cli.js" 3380 + }, 3381 + "engines": { 3382 + "node": ">=12.13.0" 3383 + }, 3384 + "peerDependencies": { 3385 + "postcss": "^8.0.9" 3386 + } 3387 + }, 3388 + "node_modules/text-table": { 3389 + "version": "0.2.0", 3390 + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 3391 + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 3392 + "dev": true 3393 + }, 3394 + "node_modules/thenify": { 3395 + "version": "3.3.1", 3396 + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 3397 + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 3398 + "dev": true, 3399 + "dependencies": { 3400 + "any-promise": "^1.0.0" 3401 + } 3402 + }, 3403 + "node_modules/thenify-all": { 3404 + "version": "1.6.0", 3405 + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 3406 + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 3407 + "dev": true, 3408 + "dependencies": { 3409 + "thenify": ">= 3.1.0 < 4" 3410 + }, 3411 + "engines": { 3412 + "node": ">=0.8" 3413 + } 3414 + }, 3415 + "node_modules/tiny-glob": { 3416 + "version": "0.2.9", 3417 + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", 3418 + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", 3419 + "dependencies": { 3420 + "globalyzer": "0.1.0", 3421 + "globrex": "^0.1.2" 3422 + } 3423 + }, 3424 + "node_modules/to-regex-range": { 3425 + "version": "5.0.1", 3426 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3427 + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3428 + "dev": true, 3429 + "dependencies": { 3430 + "is-number": "^7.0.0" 3431 + }, 3432 + "engines": { 3433 + "node": ">=8.0" 3434 + } 3435 + }, 3436 + "node_modules/totalist": { 3437 + "version": "3.0.0", 3438 + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", 3439 + "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==", 3440 + "engines": { 3441 + "node": ">=6" 3442 + } 3443 + }, 3444 + "node_modules/ts-interface-checker": { 3445 + "version": "0.1.13", 3446 + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 3447 + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 3448 + "dev": true 3449 + }, 3450 + "node_modules/type-check": { 3451 + "version": "0.4.0", 3452 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 3453 + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 3454 + "dev": true, 3455 + "dependencies": { 3456 + "prelude-ls": "^1.2.1" 3457 + }, 3458 + "engines": { 3459 + "node": ">= 0.8.0" 3460 + } 3461 + }, 3462 + "node_modules/type-fest": { 3463 + "version": "0.20.2", 3464 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 3465 + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 3466 + "dev": true, 3467 + "engines": { 3468 + "node": ">=10" 3469 + }, 3470 + "funding": { 3471 + "url": "https://github.com/sponsors/sindresorhus" 3472 + } 3473 + }, 3474 + "node_modules/undici": { 3475 + "version": "5.20.0", 3476 + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", 3477 + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", 3478 + "dependencies": { 3479 + "busboy": "^1.6.0" 3480 + }, 3481 + "engines": { 3482 + "node": ">=12.18" 3483 + } 3484 + }, 3485 + "node_modules/update-browserslist-db": { 3486 + "version": "1.0.10", 3487 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 3488 + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 3489 + "dev": true, 3490 + "funding": [ 3491 + { 3492 + "type": "opencollective", 3493 + "url": "https://opencollective.com/browserslist" 3494 + }, 3495 + { 3496 + "type": "tidelift", 3497 + "url": "https://tidelift.com/funding/github/npm/browserslist" 3498 + } 3499 + ], 3500 + "dependencies": { 3501 + "escalade": "^3.1.1", 3502 + "picocolors": "^1.0.0" 3503 + }, 3504 + "bin": { 3505 + "browserslist-lint": "cli.js" 3506 + }, 3507 + "peerDependencies": { 3508 + "browserslist": ">= 4.21.0" 3509 + } 3510 + }, 3511 + "node_modules/uri-js": { 3512 + "version": "4.4.1", 3513 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3514 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3515 + "dev": true, 3516 + "dependencies": { 3517 + "punycode": "^2.1.0" 3518 + } 3519 + }, 3520 + "node_modules/url": { 3521 + "version": "0.10.3", 3522 + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 3523 + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", 3524 + "dependencies": { 3525 + "punycode": "1.3.2", 3526 + "querystring": "0.2.0" 3527 + } 3528 + }, 3529 + "node_modules/url/node_modules/punycode": { 3530 + "version": "1.3.2", 3531 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 3532 + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" 3533 + }, 3534 + "node_modules/util": { 3535 + "version": "0.12.5", 3536 + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", 3537 + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", 3538 + "dependencies": { 3539 + "inherits": "^2.0.3", 3540 + "is-arguments": "^1.0.4", 3541 + "is-generator-function": "^1.0.7", 3542 + "is-typed-array": "^1.1.3", 3543 + "which-typed-array": "^1.1.2" 3544 + } 3545 + }, 3546 + "node_modules/util-deprecate": { 3547 + "version": "1.0.2", 3548 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3549 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 3550 + "dev": true 3551 + }, 3552 + "node_modules/uuid": { 3553 + "version": "8.0.0", 3554 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", 3555 + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", 3556 + "bin": { 3557 + "uuid": "dist/bin/uuid" 3558 + } 3559 + }, 3560 + "node_modules/vite": { 3561 + "version": "4.2.1", 3562 + "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", 3563 + "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", 3564 + "dependencies": { 3565 + "esbuild": "^0.17.5", 3566 + "postcss": "^8.4.21", 3567 + "resolve": "^1.22.1", 3568 + "rollup": "^3.18.0" 3569 + }, 3570 + "bin": { 3571 + "vite": "bin/vite.js" 3572 + }, 3573 + "engines": { 3574 + "node": "^14.18.0 || >=16.0.0" 3575 + }, 3576 + "optionalDependencies": { 3577 + "fsevents": "~2.3.2" 3578 + }, 3579 + "peerDependencies": { 3580 + "@types/node": ">= 14", 3581 + "less": "*", 3582 + "sass": "*", 3583 + "stylus": "*", 3584 + "sugarss": "*", 3585 + "terser": "^5.4.0" 3586 + }, 3587 + "peerDependenciesMeta": { 3588 + "@types/node": { 3589 + "optional": true 3590 + }, 3591 + "less": { 3592 + "optional": true 3593 + }, 3594 + "sass": { 3595 + "optional": true 3596 + }, 3597 + "stylus": { 3598 + "optional": true 3599 + }, 3600 + "sugarss": { 3601 + "optional": true 3602 + }, 3603 + "terser": { 3604 + "optional": true 3605 + } 3606 + } 3607 + }, 3608 + "node_modules/vitefu": { 3609 + "version": "0.2.4", 3610 + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", 3611 + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", 3612 + "peerDependencies": { 3613 + "vite": "^3.0.0 || ^4.0.0" 3614 + }, 3615 + "peerDependenciesMeta": { 3616 + "vite": { 3617 + "optional": true 3618 + } 3619 + } 3620 + }, 3621 + "node_modules/w3c-keyname": { 3622 + "version": "2.2.6", 3623 + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", 3624 + "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" 3625 + }, 3626 + "node_modules/which": { 3627 + "version": "2.0.2", 3628 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3629 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3630 + "dev": true, 3631 + "dependencies": { 3632 + "isexe": "^2.0.0" 3633 + }, 3634 + "bin": { 3635 + "node-which": "bin/node-which" 3636 + }, 3637 + "engines": { 3638 + "node": ">= 8" 3639 + } 3640 + }, 3641 + "node_modules/which-typed-array": { 3642 + "version": "1.1.9", 3643 + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", 3644 + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", 3645 + "dependencies": { 3646 + "available-typed-arrays": "^1.0.5", 3647 + "call-bind": "^1.0.2", 3648 + "for-each": "^0.3.3", 3649 + "gopd": "^1.0.1", 3650 + "has-tostringtag": "^1.0.0", 3651 + "is-typed-array": "^1.1.10" 3652 + }, 3653 + "engines": { 3654 + "node": ">= 0.4" 3655 + }, 3656 + "funding": { 3657 + "url": "https://github.com/sponsors/ljharb" 3658 + } 3659 + }, 3660 + "node_modules/word-wrap": { 3661 + "version": "1.2.3", 3662 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 3663 + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 3664 + "dev": true, 3665 + "engines": { 3666 + "node": ">=0.10.0" 3667 + } 3668 + }, 3669 + "node_modules/wrappy": { 3670 + "version": "1.0.2", 3671 + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3672 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 3673 + }, 3674 + "node_modules/xml2js": { 3675 + "version": "0.4.19", 3676 + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 3677 + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 3678 + "dependencies": { 3679 + "sax": ">=0.6.0", 3680 + "xmlbuilder": "~9.0.1" 3681 + } 3682 + }, 3683 + "node_modules/xmlbuilder": { 3684 + "version": "9.0.7", 3685 + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 3686 + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", 3687 + "engines": { 3688 + "node": ">=4.0" 3689 + } 3690 + }, 3691 + "node_modules/xtend": { 3692 + "version": "4.0.2", 3693 + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3694 + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 3695 + "engines": { 3696 + "node": ">=0.4" 3697 + } 3698 + }, 3699 + "node_modules/yaml": { 3700 + "version": "1.10.2", 3701 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 3702 + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 3703 + "dev": true, 3704 + "engines": { 3705 + "node": ">= 6" 3706 + } 3707 + }, 3708 + "node_modules/yocto-queue": { 3709 + "version": "0.1.0", 3710 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3711 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3712 + "dev": true, 3713 + "engines": { 3714 + "node": ">=10" 3715 + }, 3716 + "funding": { 3717 + "url": "https://github.com/sponsors/sindresorhus" 3718 + } 3719 + } 3720 + }, 3721 + "dependencies": { 3722 + "@esbuild/android-arm": { 3723 + "version": "0.17.15", 3724 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", 3725 + "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", 3726 + "optional": true 3727 + }, 3728 + "@esbuild/android-arm64": { 3729 + "version": "0.17.15", 3730 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", 3731 + "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", 3732 + "optional": true 3733 + }, 3734 + "@esbuild/android-x64": { 3735 + "version": "0.17.15", 3736 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", 3737 + "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", 3738 + "optional": true 3739 + }, 3740 + "@esbuild/darwin-arm64": { 3741 + "version": "0.17.15", 3742 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", 3743 + "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", 3744 + "optional": true 3745 + }, 3746 + "@esbuild/darwin-x64": { 3747 + "version": "0.17.15", 3748 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", 3749 + "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", 3750 + "optional": true 3751 + }, 3752 + "@esbuild/freebsd-arm64": { 3753 + "version": "0.17.15", 3754 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", 3755 + "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", 3756 + "optional": true 3757 + }, 3758 + "@esbuild/freebsd-x64": { 3759 + "version": "0.17.15", 3760 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", 3761 + "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", 3762 + "optional": true 3763 + }, 3764 + "@esbuild/linux-arm": { 3765 + "version": "0.17.15", 3766 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", 3767 + "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", 3768 + "optional": true 3769 + }, 3770 + "@esbuild/linux-arm64": { 3771 + "version": "0.17.15", 3772 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", 3773 + "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", 3774 + "optional": true 3775 + }, 3776 + "@esbuild/linux-ia32": { 3777 + "version": "0.17.15", 3778 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", 3779 + "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", 3780 + "optional": true 3781 + }, 3782 + "@esbuild/linux-loong64": { 3783 + "version": "0.17.15", 3784 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", 3785 + "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", 3786 + "optional": true 3787 + }, 3788 + "@esbuild/linux-mips64el": { 3789 + "version": "0.17.15", 3790 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", 3791 + "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", 3792 + "optional": true 3793 + }, 3794 + "@esbuild/linux-ppc64": { 3795 + "version": "0.17.15", 3796 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", 3797 + "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", 3798 + "optional": true 3799 + }, 3800 + "@esbuild/linux-riscv64": { 3801 + "version": "0.17.15", 3802 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", 3803 + "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", 3804 + "optional": true 3805 + }, 3806 + "@esbuild/linux-s390x": { 3807 + "version": "0.17.15", 3808 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", 3809 + "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", 3810 + "optional": true 3811 + }, 3812 + "@esbuild/linux-x64": { 3813 + "version": "0.17.15", 3814 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", 3815 + "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", 3816 + "optional": true 3817 + }, 3818 + "@esbuild/netbsd-x64": { 3819 + "version": "0.17.15", 3820 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", 3821 + "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", 3822 + "optional": true 3823 + }, 3824 + "@esbuild/openbsd-x64": { 3825 + "version": "0.17.15", 3826 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", 3827 + "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", 3828 + "optional": true 3829 + }, 3830 + "@esbuild/sunos-x64": { 3831 + "version": "0.17.15", 3832 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", 3833 + "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", 3834 + "optional": true 3835 + }, 3836 + "@esbuild/win32-arm64": { 3837 + "version": "0.17.15", 3838 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", 3839 + "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", 3840 + "optional": true 3841 + }, 3842 + "@esbuild/win32-ia32": { 3843 + "version": "0.17.15", 3844 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", 3845 + "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", 3846 + "optional": true 3847 + }, 3848 + "@esbuild/win32-x64": { 3849 + "version": "0.17.15", 3850 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", 3851 + "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", 3852 + "optional": true 3853 + }, 3854 + "@eslint/eslintrc": { 3855 + "version": "1.4.1", 3856 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", 3857 + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", 3858 + "dev": true, 3859 + "requires": { 3860 + "ajv": "^6.12.4", 3861 + "debug": "^4.3.2", 3862 + "espree": "^9.4.0", 3863 + "globals": "^13.19.0", 3864 + "ignore": "^5.2.0", 3865 + "import-fresh": "^3.2.1", 3866 + "js-yaml": "^4.1.0", 3867 + "minimatch": "^3.1.2", 3868 + "strip-json-comments": "^3.1.1" 3869 + } 3870 + }, 3871 + "@fontsource/jost": { 3872 + "version": "4.5.13", 3873 + "resolved": "https://registry.npmjs.org/@fontsource/jost/-/jost-4.5.13.tgz", 3874 + "integrity": "sha512-StvM74Eny5ZkioanZ3JV6RgjTfMnB7mGde1SVoJGUrudxGPCp6kRXRm4CgwgJYarDzLt+jSPESLufHhRVemjrA==" 3875 + }, 3876 + "@humanwhocodes/config-array": { 3877 + "version": "0.11.8", 3878 + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", 3879 + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", 3880 + "dev": true, 3881 + "requires": { 3882 + "@humanwhocodes/object-schema": "^1.2.1", 3883 + "debug": "^4.1.1", 3884 + "minimatch": "^3.0.5" 3885 + } 3886 + }, 3887 + "@humanwhocodes/module-importer": { 3888 + "version": "1.0.1", 3889 + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 3890 + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 3891 + "dev": true 3892 + }, 3893 + "@humanwhocodes/object-schema": { 3894 + "version": "1.2.1", 3895 + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 3896 + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 3897 + "dev": true 3898 + }, 3899 + "@jridgewell/sourcemap-codec": { 3900 + "version": "1.4.14", 3901 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 3902 + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" 3903 + }, 3904 + "@nodelib/fs.scandir": { 3905 + "version": "2.1.5", 3906 + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 3907 + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 3908 + "dev": true, 3909 + "requires": { 3910 + "@nodelib/fs.stat": "2.0.5", 3911 + "run-parallel": "^1.1.9" 3912 + } 3913 + }, 3914 + "@nodelib/fs.stat": { 3915 + "version": "2.0.5", 3916 + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 3917 + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 3918 + "dev": true 3919 + }, 3920 + "@nodelib/fs.walk": { 3921 + "version": "1.2.8", 3922 + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 3923 + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 3924 + "dev": true, 3925 + "requires": { 3926 + "@nodelib/fs.scandir": "2.1.5", 3927 + "fastq": "^1.6.0" 3928 + } 3929 + }, 3930 + "@polka/url": { 3931 + "version": "1.0.0-next.21", 3932 + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", 3933 + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" 3934 + }, 3935 + "@rollup/plugin-commonjs": { 3936 + "version": "24.0.1", 3937 + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz", 3938 + "integrity": "sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==", 3939 + "requires": { 3940 + "@rollup/pluginutils": "^5.0.1", 3941 + "commondir": "^1.0.1", 3942 + "estree-walker": "^2.0.2", 3943 + "glob": "^8.0.3", 3944 + "is-reference": "1.2.1", 3945 + "magic-string": "^0.27.0" 3946 + }, 3947 + "dependencies": { 3948 + "brace-expansion": { 3949 + "version": "2.0.1", 3950 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 3951 + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 3952 + "requires": { 3953 + "balanced-match": "^1.0.0" 3954 + } 3955 + }, 3956 + "glob": { 3957 + "version": "8.1.0", 3958 + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 3959 + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 3960 + "requires": { 3961 + "fs.realpath": "^1.0.0", 3962 + "inflight": "^1.0.4", 3963 + "inherits": "2", 3964 + "minimatch": "^5.0.1", 3965 + "once": "^1.3.0" 3966 + } 3967 + }, 3968 + "minimatch": { 3969 + "version": "5.1.6", 3970 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 3971 + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 3972 + "requires": { 3973 + "brace-expansion": "^2.0.1" 3974 + } 3975 + } 3976 + } 3977 + }, 3978 + "@rollup/plugin-json": { 3979 + "version": "6.0.0", 3980 + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", 3981 + "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==", 3982 + "requires": { 3983 + "@rollup/pluginutils": "^5.0.1" 3984 + } 3985 + }, 3986 + "@rollup/plugin-node-resolve": { 3987 + "version": "15.0.1", 3988 + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz", 3989 + "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==", 3990 + "requires": { 3991 + "@rollup/pluginutils": "^5.0.1", 3992 + "@types/resolve": "1.20.2", 3993 + "deepmerge": "^4.2.2", 3994 + "is-builtin-module": "^3.2.0", 3995 + "is-module": "^1.0.0", 3996 + "resolve": "^1.22.1" 3997 + } 3998 + }, 3999 + "@rollup/pluginutils": { 4000 + "version": "5.0.2", 4001 + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", 4002 + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", 4003 + "requires": { 4004 + "@types/estree": "^1.0.0", 4005 + "estree-walker": "^2.0.2", 4006 + "picomatch": "^2.3.1" 4007 + } 4008 + }, 4009 + "@sveltejs/adapter-auto": { 4010 + "version": "2.0.0", 4011 + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.0.0.tgz", 4012 + "integrity": "sha512-b+gkHFZgD771kgV3aO4avHFd7y1zhmMYy9i6xOK7m/rwmwaRO8gnF5zBc0Rgca80B2PMU1bKNxyBTHA14OzUAQ==", 4013 + "dev": true, 4014 + "requires": { 4015 + "import-meta-resolve": "^2.2.0" 4016 + } 4017 + }, 4018 + "@sveltejs/adapter-node": { 4019 + "version": "1.2.3", 4020 + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-1.2.3.tgz", 4021 + "integrity": "sha512-Fv6NyVpVWYA63KRaV6dDjcU8ytcWFiUr0siJOoHl+oWy5WHNEuRiJOUdiZzYbZo8MmvFaCoxHkTgPrVQhpqaRA==", 4022 + "requires": { 4023 + "@rollup/plugin-commonjs": "^24.0.0", 4024 + "@rollup/plugin-json": "^6.0.0", 4025 + "@rollup/plugin-node-resolve": "^15.0.1", 4026 + "rollup": "^3.7.0" 4027 + } 4028 + }, 4029 + "@sveltejs/kit": { 4030 + "version": "1.10.0", 4031 + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.10.0.tgz", 4032 + "integrity": "sha512-0P35zHrByfbF3Ym3RdQL+RvzgsCDSyO3imSwuZ67XAD5HoCQFF3a8Mhh0V3sObz3rc5aJd4Qn82UpAihJqZ6gQ==", 4033 + "requires": { 4034 + "@sveltejs/vite-plugin-svelte": "^2.0.0", 4035 + "@types/cookie": "^0.5.1", 4036 + "cookie": "^0.5.0", 4037 + "devalue": "^4.3.0", 4038 + "esm-env": "^1.0.0", 4039 + "kleur": "^4.1.5", 4040 + "magic-string": "^0.30.0", 4041 + "mime": "^3.0.0", 4042 + "sade": "^1.8.1", 4043 + "set-cookie-parser": "^2.5.1", 4044 + "sirv": "^2.0.2", 4045 + "tiny-glob": "^0.2.9", 4046 + "undici": "5.20.0" 4047 + }, 4048 + "dependencies": { 4049 + "magic-string": { 4050 + "version": "0.30.0", 4051 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", 4052 + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", 4053 + "requires": { 4054 + "@jridgewell/sourcemap-codec": "^1.4.13" 4055 + } 4056 + } 4057 + } 4058 + }, 4059 + "@sveltejs/vite-plugin-svelte": { 4060 + "version": "2.0.2", 4061 + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.0.2.tgz", 4062 + "integrity": "sha512-xCEan0/NNpQuL0l5aS42FjwQ6wwskdxC3pW1OeFtEKNZwRg7Evro9lac9HesGP6TdFsTv2xMes5ASQVKbCacxg==", 4063 + "requires": { 4064 + "debug": "^4.3.4", 4065 + "deepmerge": "^4.2.2", 4066 + "kleur": "^4.1.5", 4067 + "magic-string": "^0.27.0", 4068 + "svelte-hmr": "^0.15.1", 4069 + "vitefu": "^0.2.3" 4070 + } 4071 + }, 4072 + "@tailwindcss/forms": { 4073 + "version": "0.5.3", 4074 + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", 4075 + "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", 4076 + "dev": true, 4077 + "requires": { 4078 + "mini-svg-data-uri": "^1.2.3" 4079 + } 4080 + }, 4081 + "@tailwindcss/typography": { 4082 + "version": "0.5.9", 4083 + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.9.tgz", 4084 + "integrity": "sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==", 4085 + "dev": true, 4086 + "requires": { 4087 + "lodash.castarray": "^4.4.0", 4088 + "lodash.isplainobject": "^4.0.6", 4089 + "lodash.merge": "^4.6.2", 4090 + "postcss-selector-parser": "6.0.10" 4091 + }, 4092 + "dependencies": { 4093 + "postcss-selector-parser": { 4094 + "version": "6.0.10", 4095 + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", 4096 + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", 4097 + "dev": true, 4098 + "requires": { 4099 + "cssesc": "^3.0.0", 4100 + "util-deprecate": "^1.0.2" 4101 + } 4102 + } 4103 + } 4104 + }, 4105 + "@types/cookie": { 4106 + "version": "0.5.1", 4107 + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", 4108 + "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==" 4109 + }, 4110 + "@types/estree": { 4111 + "version": "1.0.0", 4112 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", 4113 + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" 4114 + }, 4115 + "@types/resolve": { 4116 + "version": "1.20.2", 4117 + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", 4118 + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" 4119 + }, 4120 + "acorn": { 4121 + "version": "8.8.2", 4122 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 4123 + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 4124 + "dev": true 4125 + }, 4126 + "acorn-jsx": { 4127 + "version": "5.3.2", 4128 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 4129 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 4130 + "dev": true, 4131 + "requires": {} 4132 + }, 4133 + "ajv": { 4134 + "version": "6.12.6", 4135 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 4136 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 4137 + "dev": true, 4138 + "requires": { 4139 + "fast-deep-equal": "^3.1.1", 4140 + "fast-json-stable-stringify": "^2.0.0", 4141 + "json-schema-traverse": "^0.4.1", 4142 + "uri-js": "^4.2.2" 4143 + } 4144 + }, 4145 + "ansi-regex": { 4146 + "version": "5.0.1", 4147 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 4148 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 4149 + "dev": true 4150 + }, 4151 + "ansi-styles": { 4152 + "version": "4.3.0", 4153 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 4154 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 4155 + "dev": true, 4156 + "requires": { 4157 + "color-convert": "^2.0.1" 4158 + } 4159 + }, 4160 + "any-promise": { 4161 + "version": "1.3.0", 4162 + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 4163 + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 4164 + "dev": true 4165 + }, 4166 + "anymatch": { 4167 + "version": "3.1.3", 4168 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 4169 + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 4170 + "dev": true, 4171 + "requires": { 4172 + "normalize-path": "^3.0.0", 4173 + "picomatch": "^2.0.4" 4174 + } 4175 + }, 4176 + "arg": { 4177 + "version": "5.0.2", 4178 + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 4179 + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 4180 + "dev": true 4181 + }, 4182 + "argparse": { 4183 + "version": "2.0.1", 4184 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 4185 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 4186 + "dev": true 4187 + }, 4188 + "assert-options": { 4189 + "version": "0.8.1", 4190 + "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.8.1.tgz", 4191 + "integrity": "sha512-5lNGRB5g5i2bGIzb+J1QQE1iKU/WEMVBReFIc5pPDWjcPj23otPL0eI6PB2v7QPi0qU6Mhym5D3y0ZiSIOf3GA==" 4192 + }, 4193 + "autoprefixer": { 4194 + "version": "10.4.14", 4195 + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", 4196 + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", 4197 + "dev": true, 4198 + "requires": { 4199 + "browserslist": "^4.21.5", 4200 + "caniuse-lite": "^1.0.30001464", 4201 + "fraction.js": "^4.2.0", 4202 + "normalize-range": "^0.1.2", 4203 + "picocolors": "^1.0.0", 4204 + "postcss-value-parser": "^4.2.0" 4205 + } 4206 + }, 4207 + "available-typed-arrays": { 4208 + "version": "1.0.5", 4209 + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 4210 + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" 4211 + }, 4212 + "aws-sdk": { 4213 + "version": "2.1350.0", 4214 + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1350.0.tgz", 4215 + "integrity": "sha512-b0BHug2iCtIsKgstj3FEyZYZCv8RZnie5vUQzkw0rr581Z6DOcJof7gGn19E6mPQp1l4j0d274SjvdFQS4JCMw==", 4216 + "requires": { 4217 + "buffer": "4.9.2", 4218 + "events": "1.1.1", 4219 + "ieee754": "1.1.13", 4220 + "jmespath": "0.16.0", 4221 + "querystring": "0.2.0", 4222 + "sax": "1.2.1", 4223 + "url": "0.10.3", 4224 + "util": "^0.12.4", 4225 + "uuid": "8.0.0", 4226 + "xml2js": "0.4.19" 4227 + } 4228 + }, 4229 + "balanced-match": { 4230 + "version": "1.0.2", 4231 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 4232 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 4233 + }, 4234 + "base64-js": { 4235 + "version": "1.5.1", 4236 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 4237 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 4238 + }, 4239 + "binary-extensions": { 4240 + "version": "2.2.0", 4241 + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 4242 + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 4243 + "dev": true 4244 + }, 4245 + "brace-expansion": { 4246 + "version": "1.1.11", 4247 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 4248 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 4249 + "dev": true, 4250 + "requires": { 4251 + "balanced-match": "^1.0.0", 4252 + "concat-map": "0.0.1" 4253 + } 4254 + }, 4255 + "braces": { 4256 + "version": "3.0.2", 4257 + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 4258 + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 4259 + "dev": true, 4260 + "requires": { 4261 + "fill-range": "^7.0.1" 4262 + } 4263 + }, 4264 + "browserslist": { 4265 + "version": "4.21.5", 4266 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", 4267 + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", 4268 + "dev": true, 4269 + "requires": { 4270 + "caniuse-lite": "^1.0.30001449", 4271 + "electron-to-chromium": "^1.4.284", 4272 + "node-releases": "^2.0.8", 4273 + "update-browserslist-db": "^1.0.10" 4274 + } 4275 + }, 4276 + "buffer": { 4277 + "version": "4.9.2", 4278 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 4279 + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 4280 + "requires": { 4281 + "base64-js": "^1.0.2", 4282 + "ieee754": "^1.1.4", 4283 + "isarray": "^1.0.0" 4284 + } 4285 + }, 4286 + "buffer-writer": { 4287 + "version": "2.0.0", 4288 + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", 4289 + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" 4290 + }, 4291 + "builtin-modules": { 4292 + "version": "3.3.0", 4293 + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", 4294 + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==" 4295 + }, 4296 + "busboy": { 4297 + "version": "1.6.0", 4298 + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 4299 + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 4300 + "requires": { 4301 + "streamsearch": "^1.1.0" 4302 + } 4303 + }, 4304 + "call-bind": { 4305 + "version": "1.0.2", 4306 + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 4307 + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 4308 + "requires": { 4309 + "function-bind": "^1.1.1", 4310 + "get-intrinsic": "^1.0.2" 4311 + } 4312 + }, 4313 + "callsites": { 4314 + "version": "3.1.0", 4315 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 4316 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 4317 + "dev": true 4318 + }, 4319 + "camelcase": { 4320 + "version": "7.0.1", 4321 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", 4322 + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==" 4323 + }, 4324 + "camelcase-css": { 4325 + "version": "2.0.1", 4326 + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 4327 + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 4328 + "dev": true 4329 + }, 4330 + "camelcase-keys": { 4331 + "version": "8.0.2", 4332 + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-8.0.2.tgz", 4333 + "integrity": "sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==", 4334 + "requires": { 4335 + "camelcase": "^7.0.0", 4336 + "map-obj": "^4.3.0", 4337 + "quick-lru": "^6.1.1", 4338 + "type-fest": "^2.13.0" 4339 + }, 4340 + "dependencies": { 4341 + "quick-lru": { 4342 + "version": "6.1.1", 4343 + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", 4344 + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==" 4345 + }, 4346 + "type-fest": { 4347 + "version": "2.19.0", 4348 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", 4349 + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" 4350 + } 4351 + } 4352 + }, 4353 + "caniuse-lite": { 4354 + "version": "1.0.30001473", 4355 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001473.tgz", 4356 + "integrity": "sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==", 4357 + "dev": true 4358 + }, 4359 + "chalk": { 4360 + "version": "4.1.2", 4361 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 4362 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 4363 + "dev": true, 4364 + "requires": { 4365 + "ansi-styles": "^4.1.0", 4366 + "supports-color": "^7.1.0" 4367 + } 4368 + }, 4369 + "chokidar": { 4370 + "version": "3.5.3", 4371 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 4372 + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 4373 + "dev": true, 4374 + "requires": { 4375 + "anymatch": "~3.1.2", 4376 + "braces": "~3.0.2", 4377 + "fsevents": "~2.3.2", 4378 + "glob-parent": "~5.1.2", 4379 + "is-binary-path": "~2.1.0", 4380 + "is-glob": "~4.0.1", 4381 + "normalize-path": "~3.0.0", 4382 + "readdirp": "~3.6.0" 4383 + }, 4384 + "dependencies": { 4385 + "glob-parent": { 4386 + "version": "5.1.2", 4387 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 4388 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 4389 + "dev": true, 4390 + "requires": { 4391 + "is-glob": "^4.0.1" 4392 + } 4393 + } 4394 + } 4395 + }, 4396 + "color-convert": { 4397 + "version": "2.0.1", 4398 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 4399 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 4400 + "dev": true, 4401 + "requires": { 4402 + "color-name": "~1.1.4" 4403 + } 4404 + }, 4405 + "color-name": { 4406 + "version": "1.1.4", 4407 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 4408 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 4409 + "dev": true 4410 + }, 4411 + "commander": { 4412 + "version": "4.1.1", 4413 + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 4414 + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 4415 + "dev": true 4416 + }, 4417 + "commondir": { 4418 + "version": "1.0.1", 4419 + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 4420 + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" 4421 + }, 4422 + "concat-map": { 4423 + "version": "0.0.1", 4424 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 4425 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 4426 + "dev": true 4427 + }, 4428 + "cookie": { 4429 + "version": "0.5.0", 4430 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 4431 + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 4432 + }, 4433 + "crelt": { 4434 + "version": "1.0.5", 4435 + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz", 4436 + "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==" 4437 + }, 4438 + "cross-spawn": { 4439 + "version": "7.0.3", 4440 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 4441 + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 4442 + "dev": true, 4443 + "requires": { 4444 + "path-key": "^3.1.0", 4445 + "shebang-command": "^2.0.0", 4446 + "which": "^2.0.1" 4447 + } 4448 + }, 4449 + "cssesc": { 4450 + "version": "3.0.0", 4451 + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 4452 + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 4453 + "dev": true 4454 + }, 4455 + "debug": { 4456 + "version": "4.3.4", 4457 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 4458 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 4459 + "requires": { 4460 + "ms": "2.1.2" 4461 + } 4462 + }, 4463 + "deep-is": { 4464 + "version": "0.1.4", 4465 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 4466 + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 4467 + "dev": true 4468 + }, 4469 + "deepmerge": { 4470 + "version": "4.3.0", 4471 + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", 4472 + "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==" 4473 + }, 4474 + "devalue": { 4475 + "version": "4.3.0", 4476 + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz", 4477 + "integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==" 4478 + }, 4479 + "didyoumean": { 4480 + "version": "1.2.2", 4481 + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 4482 + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 4483 + "dev": true 4484 + }, 4485 + "dlv": { 4486 + "version": "1.1.3", 4487 + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 4488 + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 4489 + "dev": true 4490 + }, 4491 + "doctrine": { 4492 + "version": "3.0.0", 4493 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 4494 + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 4495 + "dev": true, 4496 + "requires": { 4497 + "esutils": "^2.0.2" 4498 + } 4499 + }, 4500 + "electron-to-chromium": { 4501 + "version": "1.4.286", 4502 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz", 4503 + "integrity": "sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==", 4504 + "dev": true 4505 + }, 4506 + "esbuild": { 4507 + "version": "0.17.15", 4508 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", 4509 + "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", 4510 + "requires": { 4511 + "@esbuild/android-arm": "0.17.15", 4512 + "@esbuild/android-arm64": "0.17.15", 4513 + "@esbuild/android-x64": "0.17.15", 4514 + "@esbuild/darwin-arm64": "0.17.15", 4515 + "@esbuild/darwin-x64": "0.17.15", 4516 + "@esbuild/freebsd-arm64": "0.17.15", 4517 + "@esbuild/freebsd-x64": "0.17.15", 4518 + "@esbuild/linux-arm": "0.17.15", 4519 + "@esbuild/linux-arm64": "0.17.15", 4520 + "@esbuild/linux-ia32": "0.17.15", 4521 + "@esbuild/linux-loong64": "0.17.15", 4522 + "@esbuild/linux-mips64el": "0.17.15", 4523 + "@esbuild/linux-ppc64": "0.17.15", 4524 + "@esbuild/linux-riscv64": "0.17.15", 4525 + "@esbuild/linux-s390x": "0.17.15", 4526 + "@esbuild/linux-x64": "0.17.15", 4527 + "@esbuild/netbsd-x64": "0.17.15", 4528 + "@esbuild/openbsd-x64": "0.17.15", 4529 + "@esbuild/sunos-x64": "0.17.15", 4530 + "@esbuild/win32-arm64": "0.17.15", 4531 + "@esbuild/win32-ia32": "0.17.15", 4532 + "@esbuild/win32-x64": "0.17.15" 4533 + } 4534 + }, 4535 + "escalade": { 4536 + "version": "3.1.1", 4537 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 4538 + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 4539 + "dev": true 4540 + }, 4541 + "escape-string-regexp": { 4542 + "version": "4.0.0", 4543 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 4544 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 4545 + "dev": true 4546 + }, 4547 + "eslint": { 4548 + "version": "8.33.0", 4549 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", 4550 + "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", 4551 + "dev": true, 4552 + "requires": { 4553 + "@eslint/eslintrc": "^1.4.1", 4554 + "@humanwhocodes/config-array": "^0.11.8", 4555 + "@humanwhocodes/module-importer": "^1.0.1", 4556 + "@nodelib/fs.walk": "^1.2.8", 4557 + "ajv": "^6.10.0", 4558 + "chalk": "^4.0.0", 4559 + "cross-spawn": "^7.0.2", 4560 + "debug": "^4.3.2", 4561 + "doctrine": "^3.0.0", 4562 + "escape-string-regexp": "^4.0.0", 4563 + "eslint-scope": "^7.1.1", 4564 + "eslint-utils": "^3.0.0", 4565 + "eslint-visitor-keys": "^3.3.0", 4566 + "espree": "^9.4.0", 4567 + "esquery": "^1.4.0", 4568 + "esutils": "^2.0.2", 4569 + "fast-deep-equal": "^3.1.3", 4570 + "file-entry-cache": "^6.0.1", 4571 + "find-up": "^5.0.0", 4572 + "glob-parent": "^6.0.2", 4573 + "globals": "^13.19.0", 4574 + "grapheme-splitter": "^1.0.4", 4575 + "ignore": "^5.2.0", 4576 + "import-fresh": "^3.0.0", 4577 + "imurmurhash": "^0.1.4", 4578 + "is-glob": "^4.0.0", 4579 + "is-path-inside": "^3.0.3", 4580 + "js-sdsl": "^4.1.4", 4581 + "js-yaml": "^4.1.0", 4582 + "json-stable-stringify-without-jsonify": "^1.0.1", 4583 + "levn": "^0.4.1", 4584 + "lodash.merge": "^4.6.2", 4585 + "minimatch": "^3.1.2", 4586 + "natural-compare": "^1.4.0", 4587 + "optionator": "^0.9.1", 4588 + "regexpp": "^3.2.0", 4589 + "strip-ansi": "^6.0.1", 4590 + "strip-json-comments": "^3.1.0", 4591 + "text-table": "^0.2.0" 4592 + } 4593 + }, 4594 + "eslint-config-prettier": { 4595 + "version": "8.6.0", 4596 + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", 4597 + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", 4598 + "dev": true, 4599 + "requires": {} 4600 + }, 4601 + "eslint-plugin-svelte3": { 4602 + "version": "4.0.0", 4603 + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte3/-/eslint-plugin-svelte3-4.0.0.tgz", 4604 + "integrity": "sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==", 4605 + "dev": true, 4606 + "requires": {} 4607 + }, 4608 + "eslint-scope": { 4609 + "version": "7.1.1", 4610 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 4611 + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 4612 + "dev": true, 4613 + "requires": { 4614 + "esrecurse": "^4.3.0", 4615 + "estraverse": "^5.2.0" 4616 + } 4617 + }, 4618 + "eslint-utils": { 4619 + "version": "3.0.0", 4620 + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 4621 + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 4622 + "dev": true, 4623 + "requires": { 4624 + "eslint-visitor-keys": "^2.0.0" 4625 + }, 4626 + "dependencies": { 4627 + "eslint-visitor-keys": { 4628 + "version": "2.1.0", 4629 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 4630 + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 4631 + "dev": true 4632 + } 4633 + } 4634 + }, 4635 + "eslint-visitor-keys": { 4636 + "version": "3.3.0", 4637 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 4638 + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 4639 + "dev": true 4640 + }, 4641 + "esm-env": { 4642 + "version": "1.0.0", 4643 + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", 4644 + "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==" 4645 + }, 4646 + "espree": { 4647 + "version": "9.4.1", 4648 + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", 4649 + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", 4650 + "dev": true, 4651 + "requires": { 4652 + "acorn": "^8.8.0", 4653 + "acorn-jsx": "^5.3.2", 4654 + "eslint-visitor-keys": "^3.3.0" 4655 + } 4656 + }, 4657 + "esquery": { 4658 + "version": "1.4.0", 4659 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 4660 + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 4661 + "dev": true, 4662 + "requires": { 4663 + "estraverse": "^5.1.0" 4664 + } 4665 + }, 4666 + "esrecurse": { 4667 + "version": "4.3.0", 4668 + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 4669 + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 4670 + "dev": true, 4671 + "requires": { 4672 + "estraverse": "^5.2.0" 4673 + } 4674 + }, 4675 + "estraverse": { 4676 + "version": "5.3.0", 4677 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 4678 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 4679 + "dev": true 4680 + }, 4681 + "estree-walker": { 4682 + "version": "2.0.2", 4683 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 4684 + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 4685 + }, 4686 + "esutils": { 4687 + "version": "2.0.3", 4688 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 4689 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 4690 + "dev": true 4691 + }, 4692 + "events": { 4693 + "version": "1.1.1", 4694 + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 4695 + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==" 4696 + }, 4697 + "fast-deep-equal": { 4698 + "version": "3.1.3", 4699 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 4700 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 4701 + "dev": true 4702 + }, 4703 + "fast-glob": { 4704 + "version": "3.2.12", 4705 + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 4706 + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 4707 + "dev": true, 4708 + "requires": { 4709 + "@nodelib/fs.stat": "^2.0.2", 4710 + "@nodelib/fs.walk": "^1.2.3", 4711 + "glob-parent": "^5.1.2", 4712 + "merge2": "^1.3.0", 4713 + "micromatch": "^4.0.4" 4714 + }, 4715 + "dependencies": { 4716 + "glob-parent": { 4717 + "version": "5.1.2", 4718 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 4719 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 4720 + "dev": true, 4721 + "requires": { 4722 + "is-glob": "^4.0.1" 4723 + } 4724 + } 4725 + } 4726 + }, 4727 + "fast-json-stable-stringify": { 4728 + "version": "2.1.0", 4729 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 4730 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 4731 + "dev": true 4732 + }, 4733 + "fast-levenshtein": { 4734 + "version": "2.0.6", 4735 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 4736 + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 4737 + "dev": true 4738 + }, 4739 + "fastq": { 4740 + "version": "1.15.0", 4741 + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 4742 + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 4743 + "dev": true, 4744 + "requires": { 4745 + "reusify": "^1.0.4" 4746 + } 4747 + }, 4748 + "file-entry-cache": { 4749 + "version": "6.0.1", 4750 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 4751 + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 4752 + "dev": true, 4753 + "requires": { 4754 + "flat-cache": "^3.0.4" 4755 + } 4756 + }, 4757 + "fill-range": { 4758 + "version": "7.0.1", 4759 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 4760 + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 4761 + "dev": true, 4762 + "requires": { 4763 + "to-regex-range": "^5.0.1" 4764 + } 4765 + }, 4766 + "find-up": { 4767 + "version": "5.0.0", 4768 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 4769 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 4770 + "dev": true, 4771 + "requires": { 4772 + "locate-path": "^6.0.0", 4773 + "path-exists": "^4.0.0" 4774 + } 4775 + }, 4776 + "flat-cache": { 4777 + "version": "3.0.4", 4778 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 4779 + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 4780 + "dev": true, 4781 + "requires": { 4782 + "flatted": "^3.1.0", 4783 + "rimraf": "^3.0.2" 4784 + } 4785 + }, 4786 + "flatted": { 4787 + "version": "3.2.7", 4788 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 4789 + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 4790 + "dev": true 4791 + }, 4792 + "for-each": { 4793 + "version": "0.3.3", 4794 + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 4795 + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 4796 + "requires": { 4797 + "is-callable": "^1.1.3" 4798 + } 4799 + }, 4800 + "fraction.js": { 4801 + "version": "4.2.0", 4802 + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 4803 + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", 4804 + "dev": true 4805 + }, 4806 + "fs.realpath": { 4807 + "version": "1.0.0", 4808 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 4809 + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 4810 + }, 4811 + "fsevents": { 4812 + "version": "2.3.2", 4813 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 4814 + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 4815 + "optional": true 4816 + }, 4817 + "function-bind": { 4818 + "version": "1.1.1", 4819 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 4820 + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 4821 + }, 4822 + "get-intrinsic": { 4823 + "version": "1.2.0", 4824 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 4825 + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 4826 + "requires": { 4827 + "function-bind": "^1.1.1", 4828 + "has": "^1.0.3", 4829 + "has-symbols": "^1.0.3" 4830 + } 4831 + }, 4832 + "glob": { 4833 + "version": "7.2.3", 4834 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 4835 + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 4836 + "dev": true, 4837 + "requires": { 4838 + "fs.realpath": "^1.0.0", 4839 + "inflight": "^1.0.4", 4840 + "inherits": "2", 4841 + "minimatch": "^3.1.1", 4842 + "once": "^1.3.0", 4843 + "path-is-absolute": "^1.0.0" 4844 + } 4845 + }, 4846 + "glob-parent": { 4847 + "version": "6.0.2", 4848 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 4849 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 4850 + "dev": true, 4851 + "requires": { 4852 + "is-glob": "^4.0.3" 4853 + } 4854 + }, 4855 + "globals": { 4856 + "version": "13.20.0", 4857 + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", 4858 + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", 4859 + "dev": true, 4860 + "requires": { 4861 + "type-fest": "^0.20.2" 4862 + } 4863 + }, 4864 + "globalyzer": { 4865 + "version": "0.1.0", 4866 + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", 4867 + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" 4868 + }, 4869 + "globrex": { 4870 + "version": "0.1.2", 4871 + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", 4872 + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" 4873 + }, 4874 + "gopd": { 4875 + "version": "1.0.1", 4876 + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 4877 + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 4878 + "requires": { 4879 + "get-intrinsic": "^1.1.3" 4880 + } 4881 + }, 4882 + "grapheme-splitter": { 4883 + "version": "1.0.4", 4884 + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 4885 + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 4886 + "dev": true 4887 + }, 4888 + "has": { 4889 + "version": "1.0.3", 4890 + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 4891 + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 4892 + "requires": { 4893 + "function-bind": "^1.1.1" 4894 + } 4895 + }, 4896 + "has-flag": { 4897 + "version": "4.0.0", 4898 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 4899 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 4900 + "dev": true 4901 + }, 4902 + "has-symbols": { 4903 + "version": "1.0.3", 4904 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 4905 + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 4906 + }, 4907 + "has-tostringtag": { 4908 + "version": "1.0.0", 4909 + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 4910 + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 4911 + "requires": { 4912 + "has-symbols": "^1.0.2" 4913 + } 4914 + }, 4915 + "ieee754": { 4916 + "version": "1.1.13", 4917 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 4918 + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 4919 + }, 4920 + "ignore": { 4921 + "version": "5.2.4", 4922 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 4923 + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 4924 + "dev": true 4925 + }, 4926 + "import-fresh": { 4927 + "version": "3.3.0", 4928 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 4929 + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 4930 + "dev": true, 4931 + "requires": { 4932 + "parent-module": "^1.0.0", 4933 + "resolve-from": "^4.0.0" 4934 + } 4935 + }, 4936 + "import-meta-resolve": { 4937 + "version": "2.2.1", 4938 + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.1.tgz", 4939 + "integrity": "sha512-C6lLL7EJPY44kBvA80gq4uMsVFw5x3oSKfuMl1cuZ2RkI5+UJqQXgn+6hlUew0y4ig7Ypt4CObAAIzU53Nfpuw==", 4940 + "dev": true 4941 + }, 4942 + "imurmurhash": { 4943 + "version": "0.1.4", 4944 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 4945 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 4946 + "dev": true 4947 + }, 4948 + "inflight": { 4949 + "version": "1.0.6", 4950 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 4951 + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 4952 + "requires": { 4953 + "once": "^1.3.0", 4954 + "wrappy": "1" 4955 + } 4956 + }, 4957 + "inherits": { 4958 + "version": "2.0.4", 4959 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 4960 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 4961 + }, 4962 + "is-arguments": { 4963 + "version": "1.1.1", 4964 + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 4965 + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 4966 + "requires": { 4967 + "call-bind": "^1.0.2", 4968 + "has-tostringtag": "^1.0.0" 4969 + } 4970 + }, 4971 + "is-binary-path": { 4972 + "version": "2.1.0", 4973 + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 4974 + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 4975 + "dev": true, 4976 + "requires": { 4977 + "binary-extensions": "^2.0.0" 4978 + } 4979 + }, 4980 + "is-builtin-module": { 4981 + "version": "3.2.1", 4982 + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", 4983 + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", 4984 + "requires": { 4985 + "builtin-modules": "^3.3.0" 4986 + } 4987 + }, 4988 + "is-callable": { 4989 + "version": "1.2.7", 4990 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 4991 + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" 4992 + }, 4993 + "is-core-module": { 4994 + "version": "2.11.0", 4995 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 4996 + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 4997 + "requires": { 4998 + "has": "^1.0.3" 4999 + } 5000 + }, 5001 + "is-extglob": { 5002 + "version": "2.1.1", 5003 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 5004 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 5005 + "dev": true 5006 + }, 5007 + "is-generator-function": { 5008 + "version": "1.0.10", 5009 + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", 5010 + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", 5011 + "requires": { 5012 + "has-tostringtag": "^1.0.0" 5013 + } 5014 + }, 5015 + "is-glob": { 5016 + "version": "4.0.3", 5017 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 5018 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 5019 + "dev": true, 5020 + "requires": { 5021 + "is-extglob": "^2.1.1" 5022 + } 5023 + }, 5024 + "is-module": { 5025 + "version": "1.0.0", 5026 + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 5027 + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" 5028 + }, 5029 + "is-number": { 5030 + "version": "7.0.0", 5031 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 5032 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 5033 + "dev": true 5034 + }, 5035 + "is-path-inside": { 5036 + "version": "3.0.3", 5037 + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 5038 + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 5039 + "dev": true 5040 + }, 5041 + "is-reference": { 5042 + "version": "1.2.1", 5043 + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", 5044 + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", 5045 + "requires": { 5046 + "@types/estree": "*" 5047 + } 5048 + }, 5049 + "is-typed-array": { 5050 + "version": "1.1.10", 5051 + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", 5052 + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", 5053 + "requires": { 5054 + "available-typed-arrays": "^1.0.5", 5055 + "call-bind": "^1.0.2", 5056 + "for-each": "^0.3.3", 5057 + "gopd": "^1.0.1", 5058 + "has-tostringtag": "^1.0.0" 5059 + } 5060 + }, 5061 + "isarray": { 5062 + "version": "1.0.0", 5063 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 5064 + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 5065 + }, 5066 + "isexe": { 5067 + "version": "2.0.0", 5068 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 5069 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 5070 + "dev": true 5071 + }, 5072 + "jiti": { 5073 + "version": "1.18.2", 5074 + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", 5075 + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", 5076 + "dev": true 5077 + }, 5078 + "jmespath": { 5079 + "version": "0.16.0", 5080 + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", 5081 + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==" 5082 + }, 5083 + "js-sdsl": { 5084 + "version": "4.3.0", 5085 + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", 5086 + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", 5087 + "dev": true 5088 + }, 5089 + "js-yaml": { 5090 + "version": "4.1.0", 5091 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 5092 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 5093 + "dev": true, 5094 + "requires": { 5095 + "argparse": "^2.0.1" 5096 + } 5097 + }, 5098 + "json-schema-traverse": { 5099 + "version": "0.4.1", 5100 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 5101 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 5102 + "dev": true 5103 + }, 5104 + "json-stable-stringify-without-jsonify": { 5105 + "version": "1.0.1", 5106 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 5107 + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 5108 + "dev": true 5109 + }, 5110 + "kleur": { 5111 + "version": "4.1.5", 5112 + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 5113 + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" 5114 + }, 5115 + "levn": { 5116 + "version": "0.4.1", 5117 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 5118 + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 5119 + "dev": true, 5120 + "requires": { 5121 + "prelude-ls": "^1.2.1", 5122 + "type-check": "~0.4.0" 5123 + } 5124 + }, 5125 + "lilconfig": { 5126 + "version": "2.0.6", 5127 + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", 5128 + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", 5129 + "dev": true 5130 + }, 5131 + "lines-and-columns": { 5132 + "version": "1.2.4", 5133 + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 5134 + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 5135 + "dev": true 5136 + }, 5137 + "locate-path": { 5138 + "version": "6.0.0", 5139 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 5140 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 5141 + "dev": true, 5142 + "requires": { 5143 + "p-locate": "^5.0.0" 5144 + } 5145 + }, 5146 + "lodash.castarray": { 5147 + "version": "4.4.0", 5148 + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", 5149 + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", 5150 + "dev": true 5151 + }, 5152 + "lodash.isplainobject": { 5153 + "version": "4.0.6", 5154 + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 5155 + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", 5156 + "dev": true 5157 + }, 5158 + "lodash.merge": { 5159 + "version": "4.6.2", 5160 + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 5161 + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 5162 + "dev": true 5163 + }, 5164 + "magic-string": { 5165 + "version": "0.27.0", 5166 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", 5167 + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", 5168 + "requires": { 5169 + "@jridgewell/sourcemap-codec": "^1.4.13" 5170 + } 5171 + }, 5172 + "map-obj": { 5173 + "version": "4.3.0", 5174 + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", 5175 + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==" 5176 + }, 5177 + "merge2": { 5178 + "version": "1.4.1", 5179 + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 5180 + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 5181 + "dev": true 5182 + }, 5183 + "micromatch": { 5184 + "version": "4.0.5", 5185 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 5186 + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 5187 + "dev": true, 5188 + "requires": { 5189 + "braces": "^3.0.2", 5190 + "picomatch": "^2.3.1" 5191 + } 5192 + }, 5193 + "mime": { 5194 + "version": "3.0.0", 5195 + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 5196 + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" 5197 + }, 5198 + "mini-svg-data-uri": { 5199 + "version": "1.4.4", 5200 + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", 5201 + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", 5202 + "dev": true 5203 + }, 5204 + "minimatch": { 5205 + "version": "3.1.2", 5206 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 5207 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 5208 + "dev": true, 5209 + "requires": { 5210 + "brace-expansion": "^1.1.7" 5211 + } 5212 + }, 5213 + "mri": { 5214 + "version": "1.2.0", 5215 + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 5216 + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" 5217 + }, 5218 + "mrmime": { 5219 + "version": "1.0.1", 5220 + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", 5221 + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==" 5222 + }, 5223 + "ms": { 5224 + "version": "2.1.2", 5225 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 5226 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 5227 + }, 5228 + "mz": { 5229 + "version": "2.7.0", 5230 + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 5231 + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 5232 + "dev": true, 5233 + "requires": { 5234 + "any-promise": "^1.0.0", 5235 + "object-assign": "^4.0.1", 5236 + "thenify-all": "^1.0.0" 5237 + } 5238 + }, 5239 + "nanoid": { 5240 + "version": "3.3.4", 5241 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 5242 + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" 5243 + }, 5244 + "natural-compare": { 5245 + "version": "1.4.0", 5246 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 5247 + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 5248 + "dev": true 5249 + }, 5250 + "node-releases": { 5251 + "version": "2.0.10", 5252 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", 5253 + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", 5254 + "dev": true 5255 + }, 5256 + "normalize-path": { 5257 + "version": "3.0.0", 5258 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 5259 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 5260 + "dev": true 5261 + }, 5262 + "normalize-range": { 5263 + "version": "0.1.2", 5264 + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 5265 + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 5266 + "dev": true 5267 + }, 5268 + "object-assign": { 5269 + "version": "4.1.1", 5270 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 5271 + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 5272 + "dev": true 5273 + }, 5274 + "object-hash": { 5275 + "version": "3.0.0", 5276 + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 5277 + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 5278 + "dev": true 5279 + }, 5280 + "once": { 5281 + "version": "1.4.0", 5282 + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 5283 + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 5284 + "requires": { 5285 + "wrappy": "1" 5286 + } 5287 + }, 5288 + "optionator": { 5289 + "version": "0.9.1", 5290 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 5291 + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 5292 + "dev": true, 5293 + "requires": { 5294 + "deep-is": "^0.1.3", 5295 + "fast-levenshtein": "^2.0.6", 5296 + "levn": "^0.4.1", 5297 + "prelude-ls": "^1.2.1", 5298 + "type-check": "^0.4.0", 5299 + "word-wrap": "^1.2.3" 5300 + } 5301 + }, 5302 + "orderedmap": { 5303 + "version": "2.1.0", 5304 + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.0.tgz", 5305 + "integrity": "sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA==" 5306 + }, 5307 + "p-limit": { 5308 + "version": "3.1.0", 5309 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 5310 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 5311 + "dev": true, 5312 + "requires": { 5313 + "yocto-queue": "^0.1.0" 5314 + } 5315 + }, 5316 + "p-locate": { 5317 + "version": "5.0.0", 5318 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 5319 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 5320 + "dev": true, 5321 + "requires": { 5322 + "p-limit": "^3.0.2" 5323 + } 5324 + }, 5325 + "packet-reader": { 5326 + "version": "1.0.0", 5327 + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", 5328 + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" 5329 + }, 5330 + "parent-module": { 5331 + "version": "1.0.1", 5332 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 5333 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 5334 + "dev": true, 5335 + "requires": { 5336 + "callsites": "^3.0.0" 5337 + } 5338 + }, 5339 + "path-exists": { 5340 + "version": "4.0.0", 5341 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 5342 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 5343 + "dev": true 5344 + }, 5345 + "path-is-absolute": { 5346 + "version": "1.0.1", 5347 + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 5348 + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 5349 + "dev": true 5350 + }, 5351 + "path-key": { 5352 + "version": "3.1.1", 5353 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 5354 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 5355 + "dev": true 5356 + }, 5357 + "path-parse": { 5358 + "version": "1.0.7", 5359 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 5360 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 5361 + }, 5362 + "pg": { 5363 + "version": "8.10.0", 5364 + "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", 5365 + "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", 5366 + "requires": { 5367 + "buffer-writer": "2.0.0", 5368 + "packet-reader": "1.0.0", 5369 + "pg-connection-string": "^2.5.0", 5370 + "pg-pool": "^3.6.0", 5371 + "pg-protocol": "^1.6.0", 5372 + "pg-types": "^2.1.0", 5373 + "pgpass": "1.x" 5374 + } 5375 + }, 5376 + "pg-connection-string": { 5377 + "version": "2.5.0", 5378 + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 5379 + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 5380 + }, 5381 + "pg-int8": { 5382 + "version": "1.0.1", 5383 + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 5384 + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" 5385 + }, 5386 + "pg-minify": { 5387 + "version": "1.6.3", 5388 + "resolved": "https://registry.npmjs.org/pg-minify/-/pg-minify-1.6.3.tgz", 5389 + "integrity": "sha512-NoSsPqXxbkD8RIe+peQCqiea4QzXgosdTKY8p7PsbbGsh2F8TifDj/vJxfuR8qJwNYrijdSs7uf0tAe6WOyCsQ==" 5390 + }, 5391 + "pg-pool": { 5392 + "version": "3.6.0", 5393 + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", 5394 + "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", 5395 + "requires": {} 5396 + }, 5397 + "pg-promise": { 5398 + "version": "11.4.3", 5399 + "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-11.4.3.tgz", 5400 + "integrity": "sha512-b4wuukB+pkrLRZ53Z+3L9IONlIhOUSM/VlLQV2SnQzNJPJmDZj6ticgcMtZMDanAUEj+zX1FJOBrSpSR9TumXg==", 5401 + "requires": { 5402 + "assert-options": "0.8.1", 5403 + "pg": "8.10.0", 5404 + "pg-minify": "1.6.3", 5405 + "spex": "3.3.0" 5406 + } 5407 + }, 5408 + "pg-protocol": { 5409 + "version": "1.6.0", 5410 + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", 5411 + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" 5412 + }, 5413 + "pg-types": { 5414 + "version": "2.2.0", 5415 + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 5416 + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 5417 + "requires": { 5418 + "pg-int8": "1.0.1", 5419 + "postgres-array": "~2.0.0", 5420 + "postgres-bytea": "~1.0.0", 5421 + "postgres-date": "~1.0.4", 5422 + "postgres-interval": "^1.1.0" 5423 + } 5424 + }, 5425 + "pgpass": { 5426 + "version": "1.0.5", 5427 + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 5428 + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 5429 + "requires": { 5430 + "split2": "^4.1.0" 5431 + } 5432 + }, 5433 + "picocolors": { 5434 + "version": "1.0.0", 5435 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 5436 + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 5437 + }, 5438 + "picomatch": { 5439 + "version": "2.3.1", 5440 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 5441 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 5442 + }, 5443 + "pify": { 5444 + "version": "2.3.0", 5445 + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 5446 + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 5447 + "dev": true 5448 + }, 5449 + "pirates": { 5450 + "version": "4.0.5", 5451 + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", 5452 + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", 5453 + "dev": true 5454 + }, 5455 + "postcss": { 5456 + "version": "8.4.21", 5457 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", 5458 + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", 5459 + "requires": { 5460 + "nanoid": "^3.3.4", 5461 + "picocolors": "^1.0.0", 5462 + "source-map-js": "^1.0.2" 5463 + } 5464 + }, 5465 + "postcss-import": { 5466 + "version": "14.1.0", 5467 + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", 5468 + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", 5469 + "dev": true, 5470 + "requires": { 5471 + "postcss-value-parser": "^4.0.0", 5472 + "read-cache": "^1.0.0", 5473 + "resolve": "^1.1.7" 5474 + } 5475 + }, 5476 + "postcss-js": { 5477 + "version": "4.0.0", 5478 + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 5479 + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 5480 + "dev": true, 5481 + "requires": { 5482 + "camelcase-css": "^2.0.1" 5483 + } 5484 + }, 5485 + "postcss-load-config": { 5486 + "version": "3.1.4", 5487 + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 5488 + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 5489 + "dev": true, 5490 + "requires": { 5491 + "lilconfig": "^2.0.5", 5492 + "yaml": "^1.10.2" 5493 + } 5494 + }, 5495 + "postcss-nested": { 5496 + "version": "6.0.0", 5497 + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", 5498 + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", 5499 + "dev": true, 5500 + "requires": { 5501 + "postcss-selector-parser": "^6.0.10" 5502 + } 5503 + }, 5504 + "postcss-selector-parser": { 5505 + "version": "6.0.11", 5506 + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", 5507 + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", 5508 + "dev": true, 5509 + "requires": { 5510 + "cssesc": "^3.0.0", 5511 + "util-deprecate": "^1.0.2" 5512 + } 5513 + }, 5514 + "postcss-value-parser": { 5515 + "version": "4.2.0", 5516 + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 5517 + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 5518 + "dev": true 5519 + }, 5520 + "postgres-array": { 5521 + "version": "2.0.0", 5522 + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 5523 + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" 5524 + }, 5525 + "postgres-bytea": { 5526 + "version": "1.0.0", 5527 + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 5528 + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" 5529 + }, 5530 + "postgres-date": { 5531 + "version": "1.0.7", 5532 + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 5533 + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" 5534 + }, 5535 + "postgres-interval": { 5536 + "version": "1.2.0", 5537 + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 5538 + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 5539 + "requires": { 5540 + "xtend": "^4.0.0" 5541 + } 5542 + }, 5543 + "prelude-ls": { 5544 + "version": "1.2.1", 5545 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 5546 + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 5547 + "dev": true 5548 + }, 5549 + "prettier": { 5550 + "version": "2.8.3", 5551 + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz", 5552 + "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==", 5553 + "dev": true 5554 + }, 5555 + "prettier-plugin-svelte": { 5556 + "version": "2.9.0", 5557 + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.9.0.tgz", 5558 + "integrity": "sha512-3doBi5NO4IVgaNPtwewvrgPpqAcvNv0NwJNflr76PIGgi9nf1oguQV1Hpdm9TI2ALIQVn/9iIwLpBO5UcD2Jiw==", 5559 + "dev": true, 5560 + "requires": {} 5561 + }, 5562 + "prosemirror-commands": { 5563 + "version": "1.5.0", 5564 + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.0.tgz", 5565 + "integrity": "sha512-zL0Fxbj3fh71GPNHn5YdYgYGX2aU2XLecZYk2ekEF0oOD259HcXtM+96VjPVi5o3h4sGUdDfEEhGiREXW6U+4A==", 5566 + "requires": { 5567 + "prosemirror-model": "^1.0.0", 5568 + "prosemirror-state": "^1.0.0", 5569 + "prosemirror-transform": "^1.0.0" 5570 + } 5571 + }, 5572 + "prosemirror-dropcursor": { 5573 + "version": "1.6.1", 5574 + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.6.1.tgz", 5575 + "integrity": "sha512-LtyqQpkIknaT7NnZl3vDr3TpkNcG4ABvGRXx37XJ8tJNUGtcrZBh40A0344rDwlRTfUEmynQS/grUsoSWz+HgA==", 5576 + "requires": { 5577 + "prosemirror-state": "^1.0.0", 5578 + "prosemirror-transform": "^1.1.0", 5579 + "prosemirror-view": "^1.1.0" 5580 + } 5581 + }, 5582 + "prosemirror-example-setup": { 5583 + "version": "1.2.1", 5584 + "resolved": "https://registry.npmjs.org/prosemirror-example-setup/-/prosemirror-example-setup-1.2.1.tgz", 5585 + "integrity": "sha512-sxFBVjxP+Mgd7sPigjN4QenrEn8e1vgX/YWsB+Bv6nPZf9Eakx7TDdjLPs+7v/iCXFqCdRX7C20LcYdUQhvWpA==", 5586 + "requires": { 5587 + "prosemirror-commands": "^1.0.0", 5588 + "prosemirror-dropcursor": "^1.0.0", 5589 + "prosemirror-gapcursor": "^1.0.0", 5590 + "prosemirror-history": "^1.0.0", 5591 + "prosemirror-inputrules": "^1.0.0", 5592 + "prosemirror-keymap": "^1.0.0", 5593 + "prosemirror-menu": "^1.0.0", 5594 + "prosemirror-schema-list": "^1.0.0", 5595 + "prosemirror-state": "^1.0.0" 5596 + } 5597 + }, 5598 + "prosemirror-gapcursor": { 5599 + "version": "1.3.1", 5600 + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.1.tgz", 5601 + "integrity": "sha512-GKTeE7ZoMsx5uVfc51/ouwMFPq0o8YrZ7Hx4jTF4EeGbXxBveUV8CGv46mSHuBBeXGmvu50guoV2kSnOeZZnUA==", 5602 + "requires": { 5603 + "prosemirror-keymap": "^1.0.0", 5604 + "prosemirror-model": "^1.0.0", 5605 + "prosemirror-state": "^1.0.0", 5606 + "prosemirror-view": "^1.0.0" 5607 + } 5608 + }, 5609 + "prosemirror-history": { 5610 + "version": "1.3.0", 5611 + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.0.tgz", 5612 + "integrity": "sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA==", 5613 + "requires": { 5614 + "prosemirror-state": "^1.2.2", 5615 + "prosemirror-transform": "^1.0.0", 5616 + "rope-sequence": "^1.3.0" 5617 + } 5618 + }, 5619 + "prosemirror-inputrules": { 5620 + "version": "1.2.0", 5621 + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.2.0.tgz", 5622 + "integrity": "sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ==", 5623 + "requires": { 5624 + "prosemirror-state": "^1.0.0", 5625 + "prosemirror-transform": "^1.0.0" 5626 + } 5627 + }, 5628 + "prosemirror-keymap": { 5629 + "version": "1.2.0", 5630 + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz", 5631 + "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==", 5632 + "requires": { 5633 + "prosemirror-state": "^1.0.0", 5634 + "w3c-keyname": "^2.2.0" 5635 + } 5636 + }, 5637 + "prosemirror-menu": { 5638 + "version": "1.2.1", 5639 + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.1.tgz", 5640 + "integrity": "sha512-sBirXxVfHalZO4f1ZS63WzewINK4182+7dOmoMeBkqYO8wqMBvBS7wQuwVOHnkMWPEh0+N0LJ856KYUN+vFkmQ==", 5641 + "requires": { 5642 + "crelt": "^1.0.0", 5643 + "prosemirror-commands": "^1.0.0", 5644 + "prosemirror-history": "^1.0.0", 5645 + "prosemirror-state": "^1.0.0" 5646 + } 5647 + }, 5648 + "prosemirror-model": { 5649 + "version": "1.19.0", 5650 + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.0.tgz", 5651 + "integrity": "sha512-/CvFGJnwc41EJSfDkQLly1cAJJJmBpZwwUJtwZPTjY2RqZJfM8HVbCreOY/jti8wTRbVyjagcylyGoeJH/g/3w==", 5652 + "requires": { 5653 + "orderedmap": "^2.0.0" 5654 + } 5655 + }, 5656 + "prosemirror-schema-basic": { 5657 + "version": "1.2.1", 5658 + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.1.tgz", 5659 + "integrity": "sha512-vYBdIHsYKSDIqYmPBC7lnwk9DsKn8PnVqK97pMYP5MLEDFqWIX75JiaJTzndBii4bRuNqhC2UfDOfM3FKhlBHg==", 5660 + "requires": { 5661 + "prosemirror-model": "^1.19.0" 5662 + } 5663 + }, 5664 + "prosemirror-schema-list": { 5665 + "version": "1.2.2", 5666 + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.2.2.tgz", 5667 + "integrity": "sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w==", 5668 + "requires": { 5669 + "prosemirror-model": "^1.0.0", 5670 + "prosemirror-state": "^1.0.0", 5671 + "prosemirror-transform": "^1.0.0" 5672 + } 5673 + }, 5674 + "prosemirror-state": { 5675 + "version": "1.4.2", 5676 + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.2.tgz", 5677 + "integrity": "sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ==", 5678 + "requires": { 5679 + "prosemirror-model": "^1.0.0", 5680 + "prosemirror-transform": "^1.0.0", 5681 + "prosemirror-view": "^1.27.0" 5682 + } 5683 + }, 5684 + "prosemirror-transform": { 5685 + "version": "1.7.1", 5686 + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.7.1.tgz", 5687 + "integrity": "sha512-VteoifAfpt46z0yEt6Fc73A5OID9t/y2QIeR5MgxEwTuitadEunD/V0c9jQW8ziT8pbFM54uTzRLJ/nLuQjMxg==", 5688 + "requires": { 5689 + "prosemirror-model": "^1.0.0" 5690 + } 5691 + }, 5692 + "prosemirror-view": { 5693 + "version": "1.30.1", 5694 + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.30.1.tgz", 5695 + "integrity": "sha512-pZUfr7lICJkEY7XwzldAKrkflZDeIvnbfuu2RIS01N5NwJmR/dfZzDzJRzhb3SM2QtT/bM8b4Nnib8X3MGpAhA==", 5696 + "requires": { 5697 + "prosemirror-model": "^1.16.0", 5698 + "prosemirror-state": "^1.0.0", 5699 + "prosemirror-transform": "^1.1.0" 5700 + } 5701 + }, 5702 + "punycode": { 5703 + "version": "2.3.0", 5704 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 5705 + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 5706 + "dev": true 5707 + }, 5708 + "querystring": { 5709 + "version": "0.2.0", 5710 + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 5711 + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" 5712 + }, 5713 + "queue-microtask": { 5714 + "version": "1.2.3", 5715 + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 5716 + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 5717 + "dev": true 5718 + }, 5719 + "quick-lru": { 5720 + "version": "5.1.1", 5721 + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 5722 + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 5723 + "dev": true 5724 + }, 5725 + "read-cache": { 5726 + "version": "1.0.0", 5727 + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 5728 + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 5729 + "dev": true, 5730 + "requires": { 5731 + "pify": "^2.3.0" 5732 + } 5733 + }, 5734 + "readdirp": { 5735 + "version": "3.6.0", 5736 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 5737 + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 5738 + "dev": true, 5739 + "requires": { 5740 + "picomatch": "^2.2.1" 5741 + } 5742 + }, 5743 + "regexpp": { 5744 + "version": "3.2.0", 5745 + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 5746 + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 5747 + "dev": true 5748 + }, 5749 + "resolve": { 5750 + "version": "1.22.1", 5751 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 5752 + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 5753 + "requires": { 5754 + "is-core-module": "^2.9.0", 5755 + "path-parse": "^1.0.7", 5756 + "supports-preserve-symlinks-flag": "^1.0.0" 5757 + } 5758 + }, 5759 + "resolve-from": { 5760 + "version": "4.0.0", 5761 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 5762 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 5763 + "dev": true 5764 + }, 5765 + "reusify": { 5766 + "version": "1.0.4", 5767 + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 5768 + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 5769 + "dev": true 5770 + }, 5771 + "rimraf": { 5772 + "version": "3.0.2", 5773 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 5774 + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 5775 + "dev": true, 5776 + "requires": { 5777 + "glob": "^7.1.3" 5778 + } 5779 + }, 5780 + "rollup": { 5781 + "version": "3.20.2", 5782 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", 5783 + "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", 5784 + "requires": { 5785 + "fsevents": "~2.3.2" 5786 + } 5787 + }, 5788 + "rope-sequence": { 5789 + "version": "1.3.3", 5790 + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.3.tgz", 5791 + "integrity": "sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==" 5792 + }, 5793 + "run-parallel": { 5794 + "version": "1.2.0", 5795 + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 5796 + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 5797 + "dev": true, 5798 + "requires": { 5799 + "queue-microtask": "^1.2.2" 5800 + } 5801 + }, 5802 + "sade": { 5803 + "version": "1.8.1", 5804 + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 5805 + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 5806 + "requires": { 5807 + "mri": "^1.1.0" 5808 + } 5809 + }, 5810 + "sax": { 5811 + "version": "1.2.1", 5812 + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 5813 + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" 5814 + }, 5815 + "set-cookie-parser": { 5816 + "version": "2.5.1", 5817 + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", 5818 + "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==" 5819 + }, 5820 + "shebang-command": { 5821 + "version": "2.0.0", 5822 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 5823 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 5824 + "dev": true, 5825 + "requires": { 5826 + "shebang-regex": "^3.0.0" 5827 + } 5828 + }, 5829 + "shebang-regex": { 5830 + "version": "3.0.0", 5831 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 5832 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 5833 + "dev": true 5834 + }, 5835 + "sirv": { 5836 + "version": "2.0.2", 5837 + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", 5838 + "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==", 5839 + "requires": { 5840 + "@polka/url": "^1.0.0-next.20", 5841 + "mrmime": "^1.0.0", 5842 + "totalist": "^3.0.0" 5843 + } 5844 + }, 5845 + "slugify": { 5846 + "version": "1.6.5", 5847 + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", 5848 + "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==" 5849 + }, 5850 + "source-map-js": { 5851 + "version": "1.0.2", 5852 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 5853 + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 5854 + }, 5855 + "spex": { 5856 + "version": "3.3.0", 5857 + "resolved": "https://registry.npmjs.org/spex/-/spex-3.3.0.tgz", 5858 + "integrity": "sha512-VNiXjFp6R4ldPbVRYbpxlD35yRHceecVXlct1J4/X80KuuPnW2AXMq3sGwhnJOhKkUsOxAT6nRGfGE5pocVw5w==" 5859 + }, 5860 + "split2": { 5861 + "version": "4.2.0", 5862 + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 5863 + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" 5864 + }, 5865 + "streamsearch": { 5866 + "version": "1.1.0", 5867 + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 5868 + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" 5869 + }, 5870 + "strip-ansi": { 5871 + "version": "6.0.1", 5872 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 5873 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 5874 + "dev": true, 5875 + "requires": { 5876 + "ansi-regex": "^5.0.1" 5877 + } 5878 + }, 5879 + "strip-json-comments": { 5880 + "version": "3.1.1", 5881 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 5882 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 5883 + "dev": true 5884 + }, 5885 + "sucrase": { 5886 + "version": "3.31.0", 5887 + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.31.0.tgz", 5888 + "integrity": "sha512-6QsHnkqyVEzYcaiHsOKkzOtOgdJcb8i54x6AV2hDwyZcY9ZyykGZVw6L/YN98xC0evwTP6utsWWrKRaa8QlfEQ==", 5889 + "dev": true, 5890 + "requires": { 5891 + "commander": "^4.0.0", 5892 + "glob": "7.1.6", 5893 + "lines-and-columns": "^1.1.6", 5894 + "mz": "^2.7.0", 5895 + "pirates": "^4.0.1", 5896 + "ts-interface-checker": "^0.1.9" 5897 + }, 5898 + "dependencies": { 5899 + "glob": { 5900 + "version": "7.1.6", 5901 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 5902 + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 5903 + "dev": true, 5904 + "requires": { 5905 + "fs.realpath": "^1.0.0", 5906 + "inflight": "^1.0.4", 5907 + "inherits": "2", 5908 + "minimatch": "^3.0.4", 5909 + "once": "^1.3.0", 5910 + "path-is-absolute": "^1.0.0" 5911 + } 5912 + } 5913 + } 5914 + }, 5915 + "supports-color": { 5916 + "version": "7.2.0", 5917 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 5918 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 5919 + "dev": true, 5920 + "requires": { 5921 + "has-flag": "^4.0.0" 5922 + } 5923 + }, 5924 + "supports-preserve-symlinks-flag": { 5925 + "version": "1.0.0", 5926 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 5927 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" 5928 + }, 5929 + "svelte": { 5930 + "version": "3.55.1", 5931 + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.55.1.tgz", 5932 + "integrity": "sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ==" 5933 + }, 5934 + "svelte-hmr": { 5935 + "version": "0.15.1", 5936 + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", 5937 + "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", 5938 + "requires": {} 5939 + }, 5940 + "tailwindcss": { 5941 + "version": "3.3.1", 5942 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.1.tgz", 5943 + "integrity": "sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==", 5944 + "dev": true, 5945 + "requires": { 5946 + "arg": "^5.0.2", 5947 + "chokidar": "^3.5.3", 5948 + "color-name": "^1.1.4", 5949 + "didyoumean": "^1.2.2", 5950 + "dlv": "^1.1.3", 5951 + "fast-glob": "^3.2.12", 5952 + "glob-parent": "^6.0.2", 5953 + "is-glob": "^4.0.3", 5954 + "jiti": "^1.17.2", 5955 + "lilconfig": "^2.0.6", 5956 + "micromatch": "^4.0.5", 5957 + "normalize-path": "^3.0.0", 5958 + "object-hash": "^3.0.0", 5959 + "picocolors": "^1.0.0", 5960 + "postcss": "^8.0.9", 5961 + "postcss-import": "^14.1.0", 5962 + "postcss-js": "^4.0.0", 5963 + "postcss-load-config": "^3.1.4", 5964 + "postcss-nested": "6.0.0", 5965 + "postcss-selector-parser": "^6.0.11", 5966 + "postcss-value-parser": "^4.2.0", 5967 + "quick-lru": "^5.1.1", 5968 + "resolve": "^1.22.1", 5969 + "sucrase": "^3.29.0" 5970 + } 5971 + }, 5972 + "text-table": { 5973 + "version": "0.2.0", 5974 + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 5975 + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 5976 + "dev": true 5977 + }, 5978 + "thenify": { 5979 + "version": "3.3.1", 5980 + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 5981 + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 5982 + "dev": true, 5983 + "requires": { 5984 + "any-promise": "^1.0.0" 5985 + } 5986 + }, 5987 + "thenify-all": { 5988 + "version": "1.6.0", 5989 + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 5990 + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 5991 + "dev": true, 5992 + "requires": { 5993 + "thenify": ">= 3.1.0 < 4" 5994 + } 5995 + }, 5996 + "tiny-glob": { 5997 + "version": "0.2.9", 5998 + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", 5999 + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", 6000 + "requires": { 6001 + "globalyzer": "0.1.0", 6002 + "globrex": "^0.1.2" 6003 + } 6004 + }, 6005 + "to-regex-range": { 6006 + "version": "5.0.1", 6007 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 6008 + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 6009 + "dev": true, 6010 + "requires": { 6011 + "is-number": "^7.0.0" 6012 + } 6013 + }, 6014 + "totalist": { 6015 + "version": "3.0.0", 6016 + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", 6017 + "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==" 6018 + }, 6019 + "ts-interface-checker": { 6020 + "version": "0.1.13", 6021 + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 6022 + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 6023 + "dev": true 6024 + }, 6025 + "type-check": { 6026 + "version": "0.4.0", 6027 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 6028 + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 6029 + "dev": true, 6030 + "requires": { 6031 + "prelude-ls": "^1.2.1" 6032 + } 6033 + }, 6034 + "type-fest": { 6035 + "version": "0.20.2", 6036 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 6037 + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 6038 + "dev": true 6039 + }, 6040 + "undici": { 6041 + "version": "5.20.0", 6042 + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", 6043 + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", 6044 + "requires": { 6045 + "busboy": "^1.6.0" 6046 + } 6047 + }, 6048 + "update-browserslist-db": { 6049 + "version": "1.0.10", 6050 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 6051 + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 6052 + "dev": true, 6053 + "requires": { 6054 + "escalade": "^3.1.1", 6055 + "picocolors": "^1.0.0" 6056 + } 6057 + }, 6058 + "uri-js": { 6059 + "version": "4.4.1", 6060 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 6061 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 6062 + "dev": true, 6063 + "requires": { 6064 + "punycode": "^2.1.0" 6065 + } 6066 + }, 6067 + "url": { 6068 + "version": "0.10.3", 6069 + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 6070 + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", 6071 + "requires": { 6072 + "punycode": "1.3.2", 6073 + "querystring": "0.2.0" 6074 + }, 6075 + "dependencies": { 6076 + "punycode": { 6077 + "version": "1.3.2", 6078 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 6079 + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" 6080 + } 6081 + } 6082 + }, 6083 + "util": { 6084 + "version": "0.12.5", 6085 + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", 6086 + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", 6087 + "requires": { 6088 + "inherits": "^2.0.3", 6089 + "is-arguments": "^1.0.4", 6090 + "is-generator-function": "^1.0.7", 6091 + "is-typed-array": "^1.1.3", 6092 + "which-typed-array": "^1.1.2" 6093 + } 6094 + }, 6095 + "util-deprecate": { 6096 + "version": "1.0.2", 6097 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 6098 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 6099 + "dev": true 6100 + }, 6101 + "uuid": { 6102 + "version": "8.0.0", 6103 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", 6104 + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==" 6105 + }, 6106 + "vite": { 6107 + "version": "4.2.1", 6108 + "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", 6109 + "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", 6110 + "requires": { 6111 + "esbuild": "^0.17.5", 6112 + "fsevents": "~2.3.2", 6113 + "postcss": "^8.4.21", 6114 + "resolve": "^1.22.1", 6115 + "rollup": "^3.18.0" 6116 + } 6117 + }, 6118 + "vitefu": { 6119 + "version": "0.2.4", 6120 + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", 6121 + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", 6122 + "requires": {} 6123 + }, 6124 + "w3c-keyname": { 6125 + "version": "2.2.6", 6126 + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", 6127 + "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" 6128 + }, 6129 + "which": { 6130 + "version": "2.0.2", 6131 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 6132 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 6133 + "dev": true, 6134 + "requires": { 6135 + "isexe": "^2.0.0" 6136 + } 6137 + }, 6138 + "which-typed-array": { 6139 + "version": "1.1.9", 6140 + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", 6141 + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", 6142 + "requires": { 6143 + "available-typed-arrays": "^1.0.5", 6144 + "call-bind": "^1.0.2", 6145 + "for-each": "^0.3.3", 6146 + "gopd": "^1.0.1", 6147 + "has-tostringtag": "^1.0.0", 6148 + "is-typed-array": "^1.1.10" 6149 + } 6150 + }, 6151 + "word-wrap": { 6152 + "version": "1.2.3", 6153 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 6154 + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 6155 + "dev": true 6156 + }, 6157 + "wrappy": { 6158 + "version": "1.0.2", 6159 + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 6160 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 6161 + }, 6162 + "xml2js": { 6163 + "version": "0.4.19", 6164 + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 6165 + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 6166 + "requires": { 6167 + "sax": ">=0.6.0", 6168 + "xmlbuilder": "~9.0.1" 6169 + } 6170 + }, 6171 + "xmlbuilder": { 6172 + "version": "9.0.7", 6173 + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 6174 + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==" 6175 + }, 6176 + "xtend": { 6177 + "version": "4.0.2", 6178 + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 6179 + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 6180 + }, 6181 + "yaml": { 6182 + "version": "1.10.2", 6183 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 6184 + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 6185 + "dev": true 6186 + }, 6187 + "yocto-queue": { 6188 + "version": "0.1.0", 6189 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 6190 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 6191 + "dev": true 6192 + } 6193 + } 6194 + }
+49
package.json
··· 1 + { 2 + "name": "editable-website", 3 + "version": "0.0.1", 4 + "private": true, 5 + "scripts": { 6 + "dev": "vite dev", 7 + "build": "vite build", 8 + "preview": "vite preview", 9 + "lint": "prettier --plugin-search-dir . --check . && eslint .", 10 + "format": "prettier --plugin-search-dir . --write ." 11 + }, 12 + "devDependencies": { 13 + "@sveltejs/adapter-auto": "^2.0.0", 14 + "@sveltejs/kit": "^1.5.3", 15 + "@tailwindcss/forms": "^0.5.3", 16 + "@tailwindcss/typography": "^0.5.9", 17 + "autoprefixer": "^10.4.14", 18 + "eslint": "^8.28.0", 19 + "eslint-config-prettier": "^8.5.0", 20 + "eslint-plugin-svelte3": "^4.0.0", 21 + "postcss": "^8.4.21", 22 + "prettier": "^2.8.0", 23 + "prettier-plugin-svelte": "^2.8.1", 24 + "svelte": "^3.54.0", 25 + "tailwindcss": "^3.3.1", 26 + "vite": "^4.2.0" 27 + }, 28 + "type": "module", 29 + "dependencies": { 30 + "@fontsource/jost": "^4.5.13", 31 + "@sveltejs/adapter-node": "^1.2.3", 32 + "aws-sdk": "^2.1350.0", 33 + "camelcase-keys": "^8.0.2", 34 + "pg-promise": "^11.4.3", 35 + "prosemirror-commands": "^1.5.0", 36 + "prosemirror-dropcursor": "^1.6.1", 37 + "prosemirror-example-setup": "^1.2.1", 38 + "prosemirror-gapcursor": "^1.3.1", 39 + "prosemirror-history": "^1.3.0", 40 + "prosemirror-inputrules": "^1.2.0", 41 + "prosemirror-keymap": "^1.2.0", 42 + "prosemirror-model": "^1.19.0", 43 + "prosemirror-schema-basic": "^1.2.1", 44 + "prosemirror-schema-list": "^1.2.2", 45 + "prosemirror-state": "^1.4.2", 46 + "prosemirror-view": "^1.30.1", 47 + "slugify": "^1.6.5" 48 + } 49 + }
+6
postcss.config.cjs
··· 1 + module.exports = { 2 + plugins: { 3 + tailwindcss: {}, 4 + autoprefixer: {} 5 + } 6 + };
+35
sql/schema.sql
··· 1 + CREATE EXTENSION IF NOT EXISTS pgcrypto; 2 + 3 + -- articles 4 + DROP TABLE IF EXISTS articles cascade; 5 + CREATE TABLE articles ( 6 + article_id uuid PRIMARY KEY DEFAULT gen_random_uuid(), 7 + slug varchar(100) UNIQUE NOT NULL, 8 + title varchar(100) NOT NULL, 9 + teaser varchar(1000) NOT NULL, 10 + content text, 11 + created_at timestamptz DEFAULT NOW()::timestamptz, 12 + published_at timestamptz NULL, 13 + updated_at timestamptz NULL 14 + ); 15 + 16 + -- sessions 17 + DROP TABLE IF EXISTS sessions cascade; 18 + CREATE TABLE sessions ( 19 + session_id uuid PRIMARY KEY DEFAULT gen_random_uuid(), 20 + expires timestamptz NOT NULL 21 + ); 22 + 23 + -- pages 24 + DROP TABLE IF EXISTS pages cascade; 25 + CREATE TABLE pages ( 26 + page_id varchar(100) PRIMARY KEY, 27 + data json NOT NULL 28 + ); 29 + 30 + -- counters (for view counts and everything you want to track anonymously) 31 + DROP TABLE IF EXISTS counters cascade; 32 + CREATE TABLE counters ( 33 + counter_id varchar(100) PRIMARY KEY, 34 + count integer NOT NULL 35 + );
+80
src/app.css
··· 1 + @tailwind base; 2 + @tailwind components; 3 + @tailwind utilities; 4 + 5 + html { 6 + @apply text-gray-900; 7 + } 8 + 9 + .bounce { 10 + animation: bounce 2s infinite; 11 + } 12 + 13 + @keyframes bounce { 14 + 0%, 15 + 20%, 16 + 50%, 17 + 80%, 18 + 100% { 19 + transform: translateY(0); 20 + } 21 + 40% { 22 + transform: translateY(-10px); 23 + } 24 + 60% { 25 + transform: translateY(-5px); 26 + } 27 + } 28 + 29 + /* Prosemirror styles */ 30 + 31 + .ProseMirror { 32 + position: relative; 33 + } 34 + 35 + .ProseMirror { 36 + word-wrap: break-word; 37 + white-space: pre-wrap; 38 + white-space: break-spaces; 39 + -webkit-font-variant-ligatures: none; 40 + font-variant-ligatures: none; 41 + font-feature-settings: "liga" 0; /* the above doesn't seem to work in Edge */ 42 + } 43 + 44 + .ProseMirror pre { 45 + white-space: pre-wrap; 46 + } 47 + 48 + .ProseMirror li { 49 + position: relative; 50 + } 51 + 52 + .ProseMirror-hideselection *::selection { 53 + background: transparent; 54 + } 55 + .ProseMirror-hideselection *::-moz-selection { 56 + background: transparent; 57 + } 58 + .ProseMirror-hideselection { 59 + caret-color: transparent; 60 + } 61 + 62 + .ProseMirror-selectednode { 63 + outline: 2px solid #8cf; 64 + } 65 + 66 + /* Make sure li selections wrap around markers */ 67 + li.ProseMirror-selectednode { 68 + outline: none; 69 + } 70 + 71 + li.ProseMirror-selectednode:after { 72 + content: ""; 73 + position: absolute; 74 + left: -32px; 75 + right: -2px; 76 + top: -2px; 77 + bottom: -2px; 78 + border: 2px solid #8cf; 79 + pointer-events: none; 80 + }
+19
src/app.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8" /> 5 + <link rel="icon" type="image/png" href="%sveltekit.assets%/favicon-32x32.png" /> 6 + <link rel="apple-touch-icon" sizes="48x48" href="%sveltekit.assets%/favicon-48x48.png" /> 7 + <link rel="apple-touch-icon" sizes="72x72" href="%sveltekit.assets%/favicon-72x72.png" /> 8 + <link rel="apple-touch-icon" sizes="96x96" href="%sveltekit.assets%/favicon-96x96.png" /> 9 + <link rel="apple-touch-icon" sizes="256x256" href="%sveltekit.assets%/favicon-256x256.png" /> 10 + <link rel="apple-touch-icon" sizes="384x384" href="%sveltekit.assets%/favicon-384x384.png" /> 11 + <link rel="apple-touch-icon" sizes="512x512" href="%sveltekit.assets%/favicon-512x512.png" /> 12 + <link rel="manifest" href="%sveltekit.assets%/manifest.webmanifest" crossorigin="anonymous" /> 13 + <meta name="viewport" content="width=device-width" /> 14 + %sveltekit.head% 15 + </head> 16 + <body data-sveltekit-preload-data="hover"> 17 + <div style="display: contents">%sveltekit.body%</div> 18 + </body> 19 + </html>
+7
src/hooks.server.js
··· 1 + import { getCurrentUser } from '$lib/api'; 2 + 3 + export async function handle({ event, resolve }) { 4 + event.locals.user = await getCurrentUser(event.cookies.get('sessionid')); 5 + const response = await resolve(event); 6 + return response; 7 + }
+92
src/lib/_db.js
··· 1 + import pgPromise from 'pg-promise'; 2 + import camelcaseKeys from 'camelcase-keys'; 3 + 4 + const pgOptions = { 5 + receive: ({ data }) => { 6 + camelizeColumns(data); 7 + } 8 + }; 9 + 10 + const camelizeColumns = data => { 11 + const template = data[0]; 12 + for (const prop in template) { 13 + const camel = pgPromise.utils.camelize(prop); 14 + if (!(camel in template)) { 15 + for (let i = 0; i < data.length; i++) { 16 + const d = data[i]; 17 + d[camel] = d[prop]; 18 + delete d[prop]; 19 + } 20 + } 21 + } 22 + }; 23 + 24 + const DB_SSL = import.meta.env.VITE_DB_SSL; 25 + const DB_URL = import.meta.env.VITE_DB_URL; 26 + 27 + const pgp = pgPromise(pgOptions); 28 + 29 + // Configure types 30 + // https://github.com/vitaly-t/pg-promise/wiki/FAQ#how-to-access-the-instance-of-node-postgres-thats-used 31 + 32 + const types = pgp.pg.types; 33 + // Use strings to represent timestamps rather than a Date object (pg default) 34 + types.setTypeParser(types.builtins.TIMESTAMPTZ, function (val) { 35 + return new Date(val).toJSON(); 36 + }); 37 + types.setTypeParser(types.builtins.DATE, function (val) { 38 + return val; 39 + }); 40 + types.setTypeParser(types.builtins.JSON, function (val) { 41 + const json = camelcaseKeys(JSON.parse(val), { deep: true }); 42 + return json; 43 + }); 44 + 45 + // Default number parsing Postgres -> JS Types (maybe consider going away from numeric for performance gains and automatic conversion to JS floats) 46 + // smallint: parseInt() 47 + // integer: parseInt() 48 + // bigint: string 49 + // decimal: string 50 + // numeric: string 51 + // real: parseFloat() 52 + // double precision: parseFloat() 53 + // smallserial: parseInt() 54 + // serial: parseInt() 55 + // bigserial: string 56 + 57 + // Singleton usage as described here 58 + // https://www.codeoftheprogrammer.com/2020/01/16/postgresql-from-nextjs-api-route/ 59 + 60 + // Avoid self-signed ssl errors (with DigitalOcean) as described here 61 + // https://www.javaniceday.com/post/pg-promise-self-signed-certificate-error-in-postgres 62 + 63 + let ssl = null; 64 + if (DB_SSL) { 65 + ssl = { rejectUnauthorized: false }; 66 + } 67 + 68 + // Or you can use it this way 69 + const config = { 70 + connectionString: DB_URL, // 'postgres://john:pass123@localhost:5432/products', 71 + max: 30, 72 + ssl 73 + }; 74 + 75 + // Use a symbol to store a global instance of a connection, and to access it from the singleton. 76 + const DB_KEY = Symbol.for('The.db'); 77 + const globalSymbols = Object.getOwnPropertySymbols(global); 78 + const hasDb = globalSymbols.indexOf(DB_KEY) > -1; 79 + if (!hasDb) { 80 + global[DB_KEY] = pgp(config); 81 + } 82 + 83 + // Create and freeze the singleton object so that it has an instance property. 84 + const singleton = {}; 85 + Object.defineProperty(singleton, 'instance', { 86 + get: function () { 87 + return global[DB_KEY]; 88 + } 89 + }); 90 + Object.freeze(singleton); 91 + 92 + export default singleton;
+249
src/lib/api.js
··· 1 + import slugify from 'slugify'; 2 + import _db from './_db'; 3 + import { SHORTCUTS } from './constants'; 4 + 5 + const ADMIN_PASSWORD = import.meta.env.VITE_ADMIN_PASSWORD; 6 + 7 + /** Use a singleton DB instance */ 8 + const db = _db.instance; 9 + 10 + /** 11 + * Creates a new draft 12 + */ 13 + export async function createArticle(title, content, teaser, currentUser) { 14 + if (!currentUser) throw new Error('Not authorized'); 15 + 16 + const slug = slugify(title, { 17 + lower: true, 18 + strict: true 19 + }); 20 + 21 + return await db.tx('create-article', async t => { 22 + let newArticle = await t.one( 23 + 'INSERT INTO articles (slug, title, content, teaser, published_at) values($1, $2, $3, $4, NOW()) RETURNING slug, created_at', 24 + [slug, title, content, teaser] 25 + ); 26 + return newArticle; 27 + }); 28 + } 29 + 30 + /** 31 + * We automatically extract a teaser text from the document's content. 32 + */ 33 + export async function updateArticle(slug, title, content, teaser, currentUser) { 34 + if (!currentUser) throw new Error('Not authorized'); 35 + return await db.tx('update-article', async t => { 36 + return await t.one( 37 + 'UPDATE articles SET title= $1, content = $2, teaser = $3, updated_at = NOW() WHERE slug = $4 RETURNING slug, updated_at', 38 + [title, content, teaser, slug] 39 + ); 40 + }); 41 + } 42 + 43 + /* 44 + This can be replaced with any user-based authentication system 45 + */ 46 + export async function authenticate(password, sessionTimeout) { 47 + return await db.tx('create-session', async t => { 48 + const expires = __getDateTimeMinutesAfter(sessionTimeout); 49 + if (password === ADMIN_PASSWORD) { 50 + const { sessionId } = await t.one( 51 + 'INSERT INTO sessions (expires) values($1) returning session_id', 52 + [expires] 53 + ); 54 + return { sessionId }; 55 + } else { 56 + throw 'Authentication failed.'; 57 + } 58 + }); 59 + } 60 + 61 + /* 62 + Log out of the admin session ... 63 + */ 64 + export async function destroySession(sessionId) { 65 + return await db.tx('destroy-session', async t => { 66 + await t.any('DELETE FROM sessions WHERE session_id = $1', [sessionId]); 67 + return true; 68 + }); 69 + } 70 + 71 + /** 72 + * List all available articles (newest first) 73 + */ 74 + export async function getArticles(currentUser) { 75 + return await db.tx('get-articles', async t => { 76 + let articles; 77 + if (currentUser) { 78 + // When logged in show both, drafts and published articles 79 + articles = await t.any( 80 + 'SELECT *, COALESCE(published_at, updated_at, created_at) AS modified_at FROM articles ORDER BY modified_at DESC' 81 + ); 82 + } else { 83 + articles = await t.any( 84 + 'SELECT * FROM articles WHERE published_at IS NOT NULL ORDER BY published_at DESC' 85 + ); 86 + } 87 + return articles; 88 + }); 89 + } 90 + 91 + /** 92 + * Given a slug, determine article to "read next" 93 + */ 94 + export async function getNextArticle(slug) { 95 + return db.tx('get-next-article', async t => { 96 + return t.oneOrNone( 97 + ` 98 + ( 99 + SELECT 100 + title, 101 + teaser, 102 + slug, 103 + published_at 104 + FROM articles 105 + WHERE 106 + published_at < (SELECT published_at FROM articles WHERE slug= $1) 107 + ORDER BY published_at DESC 108 + LIMIT 1 109 + ) 110 + UNION 111 + ( 112 + SELECT title, teaser, slug, published_at FROM articles ORDER BY published_at DESC LIMIT 1 113 + ) 114 + ORDER BY published_at ASC 115 + LIMIT 1; 116 + `, 117 + [slug] 118 + ); 119 + }); 120 + } 121 + 122 + /** 123 + * Search within all searchable items (including articles and website sections) 124 + */ 125 + export async function search(q, currentUser) { 126 + return await db.tx('search', async t => { 127 + let result; 128 + if (currentUser) { 129 + result = await t.any( 130 + "SELECT title AS name, CONCAT('/blog/', slug) AS url, COALESCE(published_at, updated_at, created_at) AS modified_at FROM articles WHERE title ILIKE $1 ORDER BY modified_at DESC", 131 + [`%${q}%`] 132 + ); 133 + } else { 134 + result = await t.any( 135 + "SELECT title AS name, CONCAT('/blog/', slug) AS url, COALESCE(published_at, updated_at, created_at) AS modified_at FROM articles WHERE title ILIKE $1 AND published_at IS NOT NULL ORDER BY modified_at DESC", 136 + [`%${q}%`] 137 + ); 138 + } 139 + 140 + // Also include prefined shortcuts in search 141 + SHORTCUTS.forEach(shortcut => { 142 + if (shortcut.name.toLowerCase().includes(q.toLowerCase())) { 143 + result.push(shortcut); 144 + } 145 + }); 146 + 147 + return result; 148 + }); 149 + } 150 + 151 + /** 152 + * Retrieve article based on a given slug 153 + */ 154 + export async function getArticleBySlug(slug) { 155 + return await db.tx('get-article-by-slug', async t => { 156 + const article = await t.one('SELECT * FROM articles WHERE slug = $1', [slug]); 157 + return article; 158 + }); 159 + } 160 + 161 + /** 162 + * Remove the entire article 163 + */ 164 + export async function deleteArticle(slug, currentUser) { 165 + if (!currentUser) throw new Error('Not authorized'); 166 + return await db.tx('delete-article', async t => { 167 + await t.any('DELETE FROM articles WHERE slug = $1', [slug]); 168 + return true; 169 + }); 170 + } 171 + 172 + /** 173 + * In this minimal setup there is only one user, the website admin. 174 + * If you want to support multiple users/authors you want to return the current user record here. 175 + */ 176 + export async function getCurrentUser(sessionId) { 177 + return await db.tx('get-current-user', async t => { 178 + const session = await t.oneOrNone('SELECT session_id FROM sessions WHERE session_id = $1', [ 179 + sessionId 180 + ]); 181 + if (session) { 182 + return { 183 + name: 'Admin' 184 + }; 185 + } else { 186 + return null; 187 + } 188 + }); 189 + } 190 + 191 + /** 192 + * Update the page 193 + */ 194 + export async function createOrUpdatePage(pageId, page, currentUser) { 195 + if (!currentUser) throw new Error('Not authorized'); 196 + return await db.tx('create-or-update-page', async t => { 197 + const pageExists = await t.oneOrNone('SELECT page_id FROM pages WHERE page_id = $1', [pageId]); 198 + if (pageExists) { 199 + return await t.one('UPDATE pages SET data = $1 WHERE page_id = $2 RETURNING page_id', [ 200 + page, 201 + pageId 202 + ]); 203 + } else { 204 + return await t.one('INSERT INTO pages (page_id, data) values($1, $2) RETURNING page_id', [ 205 + pageId, 206 + page 207 + ]); 208 + } 209 + }); 210 + } 211 + 212 + /** 213 + * E.g. getPage("home") gets all dynamic data for the home page 214 + */ 215 + export async function getPage(pageId) { 216 + return await db.tx('get-page', async t => { 217 + const page = await t.oneOrNone('SELECT data FROM pages WHERE page_id = $1', [pageId]); 218 + return page?.data; 219 + }); 220 + } 221 + 222 + /** 223 + * TODO: Turn this into a Postgres function 224 + */ 225 + export async function createOrUpdateCounter(counterId) { 226 + return await db.tx('create-or-update-counter', async t => { 227 + const counterExists = await t.oneOrNone( 228 + 'SELECT counter_id FROM counters WHERE counter_id = $1', 229 + [counterId] 230 + ); 231 + if (counterExists) { 232 + return await t.one( 233 + 'UPDATE counters SET count = count + 1 WHERE counter_id = $1 RETURNING count', 234 + [counterId] 235 + ); 236 + } else { 237 + return await t.one('INSERT INTO counters (counter_id, count) values($1, 1) RETURNING count', [ 238 + counterId 239 + ]); 240 + } 241 + }); 242 + } 243 + 244 + /** 245 + * Helpers 246 + */ 247 + function __getDateTimeMinutesAfter(minutes) { 248 + return new Date(new Date().getTime() + minutes * 60000).toISOString(); 249 + }
+30
src/lib/components/Article.svelte
··· 1 + <script> 2 + import PlainText from '$lib/components/PlainText.svelte'; 3 + import RichText from '$lib/components/RichText.svelte'; 4 + import { formatDate } from '$lib/util'; 5 + export let title; 6 + export let content; 7 + export let publishedAt = undefined; 8 + export let editable; 9 + </script> 10 + 11 + <div> 12 + <div class="max-w-screen-md mx-auto px-6"> 13 + <div class="pt-12 sm:pt-24"> 14 + {#if !publishedAt} 15 + <div class="font-bold text-sm">DRAFT</div> 16 + {:else} 17 + <div class="font-bold text-sm">{formatDate(publishedAt)}</div> 18 + {/if} 19 + </div> 20 + <h1 class="text-3xl md:text-5xl font-bold pt-1"> 21 + <PlainText {editable} bind:content={title} /> 22 + </h1> 23 + </div> 24 + </div> 25 + 26 + <div class="max-w-screen-md mx-auto px-6 pb-12 sm:pb-24"> 27 + <div id="article_content" class="prose sm:prose-xl"> 28 + <RichText multiLine {editable} bind:content /> 29 + </div> 30 + </div>
+38
src/lib/components/ArticleTeaser.svelte
··· 1 + <script> 2 + export let article; 3 + export let firstEntry; 4 + import { classNames } from '$lib/util'; 5 + import SecondaryButton from './SecondaryButton.svelte'; 6 + </script> 7 + 8 + <div> 9 + <div 10 + class={classNames( 11 + 'max-w-screen-md mx-auto px-6 md:text-xl', 12 + firstEntry ? 'pt-2 pb-8 sm:pb-12' : 'py-6 sm:py-10' 13 + )} 14 + > 15 + <div class={classNames(article.publishedAt ? '' : 'opacity-50')}> 16 + <div> 17 + <a 18 + class={classNames('mb-12 text-2xl md:text-3xl font-bold')} 19 + href={`/blog/${article.slug}`} 20 + > 21 + {article.title} 22 + </a> 23 + </div> 24 + <div class="pt-2 pb-4"> 25 + <div class="line-clamp-4"> 26 + <a href={`/blog/${article.slug}`}> 27 + {article.teaser} 28 + </a> 29 + </div> 30 + </div> 31 + </div> 32 + <div class="pt-2"> 33 + <SecondaryButton size="sm" href={`/blog/${article.slug}`}> 34 + Continue reading&nbsp;→ 35 + </SecondaryButton> 36 + </div> 37 + </div> 38 + </div>
+26
src/lib/components/BaseButton.svelte
··· 1 + <script> 2 + import { classNames } from '$lib/util'; 3 + export let styles; 4 + export let size = 'default'; 5 + export let type = 'button'; 6 + export let href = undefined; 7 + export let disabled = false; 8 + const STYLE_SHARED = 9 + 'm-0 p-0 disabled:cursor-not-allowed disabled:opacity-50 rounded-full cursor-pointer focus:outline-none focus:ring-2 focus:ring-offset-2 font-sans no-underline text-center'; 10 + const STYLE_SIZES = { 11 + sm: `px-4 py-2 text-sm sm:text-base sm:px-4 sm:py-1`, 12 + default: `px-4 py-2 text-sm sm:text-base sm:px-5 sm:py-3`, 13 + lg: `px-8 sm:px-12 py-3 text-base sm:py-4 sm:text-xl` 14 + }; 15 + $: className = classNames(styles, STYLE_SHARED, STYLE_SIZES[size], disabled ? 'disabled' : ''); 16 + </script> 17 + 18 + {#if href} 19 + <a {href} class={className} {disabled}> 20 + <slot /> 21 + </a> 22 + {:else} 23 + <button {type} class={className} {disabled} on:click> 24 + <slot /> 25 + </button> 26 + {/if}
+25
src/lib/components/EditableWebsiteTeaser.svelte
··· 1 + <script> 2 + import { classNames } from '$lib/util'; 3 + import PrimaryButton from './PrimaryButton.svelte'; 4 + </script> 5 + 6 + <div class={classNames('py-12 sm:py-24 border-t-2 border-gray-100')}> 7 + <div 8 + class="max-w-screen-md mx-auto px-6 flex flex-col sm:flex-row space-y-6 sm:space-x-8 sm:space-y-0" 9 + > 10 + <img 11 + class="flex-shrink-0 w-24 h-24 rounded-full" 12 + src="https://letsken.imgix.net/users/958dc1d9-de59-40ee-b814-b43885b3053f/27421e71f9e3ef6f828be3018eb69d74.jpg?fit=max&w=576&auto=format" 13 + alt="Michael Aufreiter" 14 + /> 15 + <div> 16 + <h2 class="text-3xl md:text-5xl font-bold">Hi, I'm Michael.</h2> 17 + <div class="mt-4 md:text-xl"> 18 + I want your website to be <strong>editable</strong>. 19 + </div> 20 + <div class="pt-8 sm:pt-12"> 21 + <PrimaryButton size="lg" href="/">Learn more</PrimaryButton> 22 + </div> 23 + </div> 24 + </div> 25 + </div>
+166
src/lib/components/EditorToolbar.svelte
··· 1 + <script> 2 + import { activeEditorView } from '$lib/stores'; 3 + import { onDestroy } from 'svelte'; 4 + import ToggleMark from './tools/ToggleMark.svelte'; 5 + import ToggleBulletList from './tools/ToggleBulletList.svelte'; 6 + import ToggleBlockquote from './tools/ToggleBlockquote.svelte'; 7 + import ToggleOrderedList from './tools/ToggleOrderedList.svelte'; 8 + import PrimaryButton from './PrimaryButton.svelte'; 9 + import SecondaryButton from './SecondaryButton.svelte'; 10 + import { createEventDispatcher } from 'svelte'; 11 + import ToggleHeading from './tools/ToggleHeading.svelte'; 12 + import InsertImage from './tools/InsertImage.svelte'; 13 + import CreateLink from './tools/CreateLink.svelte'; 14 + 15 + export let currentUser = undefined; 16 + 17 + let editorView = null; 18 + let editorState = null; 19 + 20 + const unsubscribe = activeEditorView.subscribe(value => { 21 + editorView = value; 22 + editorState = value?.state; 23 + }); 24 + 25 + const dispatch = createEventDispatcher(); 26 + 27 + function handleCancel() { 28 + dispatch('cancel', {}); 29 + } 30 + 31 + function handleSave() { 32 + dispatch('save', {}); 33 + } 34 + 35 + onDestroy(unsubscribe); 36 + 37 + function onKeyDown(e) { 38 + // Trigger save 39 + if (e.key === 's' && e.metaKey) { 40 + dispatch('save', {}); 41 + e.preventDefault(); 42 + e.stopPropagation(); 43 + } 44 + } 45 + </script> 46 + 47 + <div class="sticky top-0 z-10 sm:py-4 sm:px-4"> 48 + <div 49 + class="max-w-screen-lg mx-auto px-2 backdrop-blur-sm bg-white bg-opacity-95 border-b border-t sm:border sm:rounded-full border-gray-100 shadow" 50 + > 51 + <div> 52 + <div class="flex items-center overflow-x-auto py-3 px-1"> 53 + {#if editorState} 54 + <div class="flex"> 55 + <ToggleMark {editorState} {editorView} type="strong"> 56 + <svg 57 + class="h-3 w-3 sm:h-4 sm:w-4" 58 + xmlns="http://www.w3.org/2000/svg" 59 + fill="currentColor" 60 + stroke="currentColor" 61 + viewBox="0 0 384 512" 62 + ><!--! Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path 63 + d="M0 64C0 46.3 14.3 32 32 32H80 96 224c70.7 0 128 57.3 128 128c0 31.3-11.3 60.1-30 82.3c37.1 22.4 62 63.1 62 109.7c0 70.7-57.3 128-128 128H96 80 32c-17.7 0-32-14.3-32-32s14.3-32 32-32H48V256 96H32C14.3 96 0 81.7 0 64zM224 224c35.3 0 64-28.7 64-64s-28.7-64-64-64H112V224H224zM112 288V416H256c35.3 0 64-28.7 64-64s-28.7-64-64-64H224 112z" 64 + /></svg 65 + > 66 + </ToggleMark> 67 + <ToggleMark {editorState} {editorView} type="em"> 68 + <svg 69 + class="h-3 w-3 sm:h-4 sm:w-4" 70 + fill="currentColor" 71 + stroke="currentColor" 72 + xmlns="http://www.w3.org/2000/svg" 73 + viewBox="0 0 384 512" 74 + ><!--! Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path 75 + d="M128 64c0-17.7 14.3-32 32-32H352c17.7 0 32 14.3 32 32s-14.3 32-32 32H293.3L160 416h64c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H90.7L224 96H160c-17.7 0-32-14.3-32-32z" 76 + /></svg 77 + > 78 + </ToggleMark> 79 + <CreateLink {editorState} {editorView}> 80 + <svg 81 + class="h-3 w-3 sm:h-4 sm:w-4" 82 + fill="currentColor" 83 + stroke="currentColor" 84 + xmlns="http://www.w3.org/2000/svg" 85 + viewBox="0 0 640 512" 86 + ><!--! Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path 87 + d="M562.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L405.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C189.5 251.2 196 330 246 380c56.5 56.5 148 56.5 204.5 0L562.8 267.7zM43.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C57 372 57 321 88.5 289.5L200.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C416.5 260.8 410 182 360 132c-56.5-56.5-148-56.5-204.5 0L43.2 244.3z" 88 + /></svg 89 + > 90 + </CreateLink> 91 + <div class="hidden sm:block w-px bg-gray-300 mx-3" /> 92 + <ToggleHeading {editorState} {editorView}> 93 + <svg 94 + class="h-3 w-3 sm:h-4 sm:w-4" 95 + fill="currentColor" 96 + stroke="currentColor" 97 + xmlns="http://www.w3.org/2000/svg" 98 + viewBox="0 0 448 512" 99 + ><!--! Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path 100 + d="M0 64C0 46.3 14.3 32 32 32H80h48c17.7 0 32 14.3 32 32s-14.3 32-32 32H112V208H336V96H320c-17.7 0-32-14.3-32-32s14.3-32 32-32h48 48c17.7 0 32 14.3 32 32s-14.3 32-32 32H400V240 416h16c17.7 0 32 14.3 32 32s-14.3 32-32 32H368 320c-17.7 0-32-14.3-32-32s14.3-32 32-32h16V272H112V416h16c17.7 0 32 14.3 32 32s-14.3 32-32 32H80 32c-17.7 0-32-14.3-32-32s14.3-32 32-32H48V240 96H32C14.3 96 0 81.7 0 64z" 101 + /></svg 102 + > 103 + </ToggleHeading> 104 + <ToggleBlockquote {editorState} {editorView}> 105 + <svg 106 + class="h-3 w-3 sm:h-4 sm:w-4" 107 + fill="currentColor" 108 + stroke="currentColor" 109 + xmlns="http://www.w3.org/2000/svg" 110 + viewBox="0 0 448 512" 111 + ><!--! Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path 112 + d="M0 216C0 149.7 53.7 96 120 96h8c17.7 0 32 14.3 32 32s-14.3 32-32 32h-8c-30.9 0-56 25.1-56 56v8h64c35.3 0 64 28.7 64 64v64c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V320 288 216zm256 0c0-66.3 53.7-120 120-120h8c17.7 0 32 14.3 32 32s-14.3 32-32 32h-8c-30.9 0-56 25.1-56 56v8h64c35.3 0 64 28.7 64 64v64c0 35.3-28.7 64-64 64H320c-35.3 0-64-28.7-64-64V320 288 216z" 113 + /></svg 114 + > 115 + </ToggleBlockquote> 116 + <div class="hidden sm:block w-px bg-gray-300 mx-3" /> 117 + <ToggleBulletList {editorState} {editorView}> 118 + <svg 119 + class="h-3 w-3 sm:h-4 sm:w-4" 120 + fill="currentColor" 121 + stroke="currentColor" 122 + xmlns="http://www.w3.org/2000/svg" 123 + viewBox="0 0 512 512" 124 + ><!--! Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path 125 + d="M64 144a48 48 0 1 0 0-96 48 48 0 1 0 0 96zM192 64c-17.7 0-32 14.3-32 32s14.3 32 32 32H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H192zm0 160c-17.7 0-32 14.3-32 32s14.3 32 32 32H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H192zm0 160c-17.7 0-32 14.3-32 32s14.3 32 32 32H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H192zM64 464a48 48 0 1 0 0-96 48 48 0 1 0 0 96zm48-208a48 48 0 1 0 -96 0 48 48 0 1 0 96 0z" 126 + /></svg 127 + > 128 + </ToggleBulletList> 129 + <ToggleOrderedList {editorState} {editorView}> 130 + <svg 131 + class="h-3 w-3 sm:h-4 sm:w-4" 132 + fill="currentColor" 133 + stroke="currentColor" 134 + xmlns="http://www.w3.org/2000/svg" 135 + viewBox="0 0 512 512" 136 + ><!--! Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path 137 + d="M24 56c0-13.3 10.7-24 24-24H80c13.3 0 24 10.7 24 24V176h16c13.3 0 24 10.7 24 24s-10.7 24-24 24H40c-13.3 0-24-10.7-24-24s10.7-24 24-24H56V80H48C34.7 80 24 69.3 24 56zM86.7 341.2c-6.5-7.4-18.3-6.9-24 1.2L51.5 357.9c-7.7 10.8-22.7 13.3-33.5 5.6s-13.3-22.7-5.6-33.5l11.1-15.6c23.7-33.2 72.3-35.6 99.2-4.9c21.3 24.4 20.8 60.9-1.1 84.7L86.8 432H120c13.3 0 24 10.7 24 24s-10.7 24-24 24H32c-9.5 0-18.2-5.6-22-14.4s-2.1-18.9 4.3-25.9l72-78c5.3-5.8 5.4-14.6 .3-20.5zM224 64H480c17.7 0 32 14.3 32 32s-14.3 32-32 32H224c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 160H480c17.7 0 32 14.3 32 32s-14.3 32-32 32H224c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 160H480c17.7 0 32 14.3 32 32s-14.3 32-32 32H224c-17.7 0-32-14.3-32-32s14.3-32 32-32z" 138 + /></svg 139 + > 140 + </ToggleOrderedList> 141 + <div class="hidden sm:block w-px bg-gray-300 mx-3" /> 142 + <InsertImage {currentUser} {editorState} {editorView}> 143 + <svg 144 + class="h-3 w-3 sm:h-4 sm:w-4" 145 + fill="currentColor" 146 + stroke="currentColor" 147 + xmlns="http://www.w3.org/2000/svg" 148 + viewBox="0 0 512 512" 149 + ><!--! Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path 150 + d="M0 96C0 60.7 28.7 32 64 32H448c35.3 0 64 28.7 64 64V416c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V96zM323.8 202.5c-4.5-6.6-11.9-10.5-19.8-10.5s-15.4 3.9-19.8 10.5l-87 127.6L170.7 297c-4.6-5.7-11.5-9-18.7-9s-14.2 3.3-18.7 9l-64 80c-5.8 7.2-6.9 17.1-2.9 25.4s12.4 13.6 21.6 13.6h96 32H424c8.9 0 17.1-4.9 21.2-12.8s3.6-17.4-1.4-24.7l-120-176zM112 192a48 48 0 1 0 0-96 48 48 0 1 0 0 96z" 151 + /></svg 152 + > 153 + </InsertImage> 154 + </div> 155 + {/if} 156 + 157 + <div class="flex-1 h-8" /> 158 + <SecondaryButton type="button" on:click={handleCancel}>Cancel</SecondaryButton> 159 + <div class="shrink-0 w-2 sm:w-4" /> 160 + <PrimaryButton type="button" on:click={handleSave}>Save</PrimaryButton> 161 + </div> 162 + </div> 163 + </div> 164 + </div> 165 + 166 + <svelte:window on:keydown={onKeyDown} />
+52
src/lib/components/Footer.svelte
··· 1 + <script> 2 + import { onMount } from 'svelte'; 3 + import { fetchJSON } from '$lib/util'; 4 + import NotEditable from '$lib/components/NotEditable.svelte'; 5 + 6 + export let counter; 7 + export let editable = false; 8 + let count; 9 + 10 + onMount(async () => { 11 + if (counter) { 12 + const result = await fetchJSON('GET', `/api/counter?c=${counter}`); 13 + count = result.count; 14 + } 15 + }); 16 + </script> 17 + 18 + <NotEditable {editable}> 19 + <div class="bg-white font-medium"> 20 + <div class="max-w-screen-md mx-auto px-6 py-5 flex space-x-8 text-sm"> 21 + <a href="/">About</a> 22 + <a href="/blog">Blog</a> 23 + <a href="/#contact">Contact</a> 24 + <a href="/imprint">Imprint</a> 25 + {#if count} 26 + <div class="flex-1" /> 27 + <div class="text-xs font-normal flex items-center space-x-2"> 28 + <svg 29 + xmlns="http://www.w3.org/2000/svg" 30 + fill="none" 31 + viewBox="0 0 24 24" 32 + stroke-width="1.5" 33 + stroke="currentColor" 34 + class="w-4 h-4" 35 + > 36 + <path 37 + stroke-linecap="round" 38 + stroke-linejoin="round" 39 + d="M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z" 40 + /> 41 + <path 42 + stroke-linecap="round" 43 + stroke-linejoin="round" 44 + d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" 45 + /> 46 + </svg> 47 + <span>{count}</span> 48 + </div> 49 + {/if} 50 + </div> 51 + </div> 52 + </NotEditable>
+19
src/lib/components/Image.svelte
··· 1 + <script> 2 + import ImageEditor from './ImageEditor.svelte'; 3 + 4 + export let editable; 5 + export let currentUser; 6 + export let src; 7 + export let alt; 8 + export let maxWidth; 9 + export let maxHeight; 10 + export let quality; 11 + let className = ''; 12 + export { className as class }; 13 + </script> 14 + 15 + {#if editable} 16 + <ImageEditor {currentUser} class={className} bind:src {alt} {maxWidth} {maxHeight} {quality} /> 17 + {:else} 18 + <img class={className} {src} {alt} /> 19 + {/if}
+61
src/lib/components/ImageEditor.svelte
··· 1 + <script> 2 + import uuid from '$lib/uuid'; 3 + import { resizeImage } from '$lib/util'; 4 + import uploadAsset from '$lib/uploadAsset'; 5 + 6 + export let currentUser; 7 + export let src; 8 + export let alt; 9 + export let maxWidth; 10 + export let maxHeight; 11 + export let quality; 12 + let className = ''; 13 + export { className as class }; 14 + 15 + const ASSET_PATH = import.meta.env.VITE_ASSET_PATH; 16 + 17 + let fileInput; // for uploading an image 18 + let progress = undefined; // file upload progress 19 + 20 + async function uploadImage() { 21 + const file = fileInput.files[0]; 22 + 23 + // We convert all uploads to the WEBP image format 24 + const extension = 'webp'; 25 + const path = [['editable-website', 'images', uuid()].join('/'), extension].join('.'); 26 + 27 + const resizedBlob = await resizeImage(file, maxWidth, maxHeight, quality); 28 + const resizedFile = new File([resizedBlob], `${file.name.split('.')[0]}.webp`, { 29 + type: 'image/webp' 30 + }); 31 + 32 + progress = 0; 33 + try { 34 + if (currentUser) { 35 + await uploadAsset(resizedFile, path, p => { 36 + progress = p; 37 + }); 38 + src = `${ASSET_PATH}/${path}`; 39 + } else { 40 + src = URL.createObjectURL(file); 41 + } 42 + progress = undefined; 43 + } catch (err) { 44 + console.error(err); 45 + alert('An error occured. Please try again'); 46 + progress = undefined; 47 + } 48 + fileInput.value = null; 49 + } 50 + </script> 51 + 52 + <img on:mousedown={() => fileInput.click()} class={className + ' cursor-pointer'} {src} {alt} /> 53 + 54 + <input 55 + class="w-px h-px opacity-0 fixed -top-40" 56 + type="file" 57 + accept="image/*" 58 + name="imagefile" 59 + bind:this={fileInput} 60 + on:change={uploadImage} 61 + />
+24
src/lib/components/Input.svelte
··· 1 + <script> 2 + export let value = ''; 3 + export let id; 4 + export let type = 'text'; 5 + export let name; 6 + export let required = false; 7 + export let inputRef = null; 8 + export let placeholder = ''; 9 + function setType(node) { 10 + node.type = type; 11 + } 12 + </script> 13 + 14 + <input 15 + autocomplete="off" 16 + use:setType 17 + {placeholder} 18 + {name} 19 + {id} 20 + {required} 21 + bind:value 22 + bind:this={inputRef} 23 + class="border focus focus:border-gray-800 focus:ring-gray-800" 24 + />
+21
src/lib/components/IntroStep.svelte
··· 1 + <script> 2 + import PlainText from './PlainText.svelte'; 3 + import RichText from './RichText.svelte'; 4 + 5 + export let intro; 6 + export let editable; 7 + </script> 8 + 9 + <div class="my-12"> 10 + <div class="bg-white relative py-8 mt-20 mb-20"> 11 + <div class="font-bold text-center text-sm sm:text-base"> 12 + <PlainText {editable} bind:content={intro.label} /> 13 + </div> 14 + <div class="text-2xl md:text-5xl font-bold text-center pt-2"> 15 + <PlainText {editable} bind:content={intro.title} /> 16 + </div> 17 + <div class="max-w-md mx-auto text-lg md:text-2xl text-center pt-2 md:pt-4"> 18 + <RichText {editable} bind:content={intro.description} /> 19 + </div> 20 + </div> 21 + </div>
+8
src/lib/components/Limiter.svelte
··· 1 + <script> 2 + import { classNames } from '$lib/util'; 3 + export let noPadding = false; 4 + </script> 5 + 6 + <div class={classNames('max-w-lg mx-auto', noPadding ? '' : 'px-4')}> 7 + <slot /> 8 + </div>
+12
src/lib/components/LoginMenu.svelte
··· 1 + <script> 2 + import { goto } from '$app/navigation'; 3 + import PrimaryButton from './PrimaryButton.svelte'; 4 + export let currentUser; 5 + </script> 6 + 7 + <div> 8 + <div class="py-4 text-center">Signed in as {currentUser.name}</div> 9 + <div class="flex flex-col"> 10 + <PrimaryButton on:click={() => goto('/logout')}>Sign out</PrimaryButton> 11 + </div> 12 + </div>
+42
src/lib/components/Modal.svelte
··· 1 + <script> 2 + import { createEventDispatcher, onMount, onDestroy } from 'svelte'; 3 + import { browser } from '$app/environment'; 4 + import { classNames } from '$lib/util'; 5 + 6 + // Only relevant for mobile 7 + export let position = 'bottom'; 8 + 9 + const dispatch = createEventDispatcher(); 10 + let surface; 11 + onMount(async () => { 12 + window.document.children[0].style = 'overflow: hidden;'; 13 + }); 14 + onDestroy(() => { 15 + if (browser) { 16 + window.document.children[0].style = ''; 17 + } 18 + }); 19 + function onMouseUp(e) { 20 + if (e.target === surface) dispatch('close'); 21 + } 22 + </script> 23 + 24 + <div class="relative z-50" aria-labelledby="modal-title" role="dialog" aria-modal="true"> 25 + <div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity" /> 26 + 27 + <div class="fixed inset-0 z-50 overflow-y-auto" on:mouseup={onMouseUp}> 28 + <div 29 + bind:this={surface} 30 + class={classNames( 31 + 'flex min-h-full justify-center p-4 text-center sm:items-center sm:p-0', 32 + position === 'bottom' ? 'items-end' : 'items-start' 33 + )} 34 + > 35 + <div 36 + class="relative transform overflow-hidden rounded-lg bg-white text-left shadow-xl sm:my-8 w-full sm:max-w-lg" 37 + > 38 + <slot /> 39 + </div> 40 + </div> 41 + </div> 42 + </div>
+12
src/lib/components/NotEditable.svelte
··· 1 + <script> 2 + import { classNames } from '$lib/util'; 3 + 4 + export let editable; 5 + </script> 6 + 7 + <div class={classNames(editable ? 'opacity-25 cursor-not-allowed relative' : '')}> 8 + {#if editable} 9 + <div class="absolute inset-0 z-50" /> 10 + {/if} 11 + <slot /> 12 + </div>
+13
src/lib/components/PlainText.svelte
··· 1 + <script> 2 + import PlainTextEditor from './PlainTextEditor.svelte'; 3 + 4 + export let editable; 5 + export let content; 6 + export let multiLine = false; 7 + </script> 8 + 9 + {#if editable} 10 + <PlainTextEditor bind:content {multiLine} /> 11 + {:else} 12 + {@html content} 13 + {/if}
+83
src/lib/components/PlainTextEditor.svelte
··· 1 + <script> 2 + import { onMount, onDestroy } from 'svelte'; 3 + import { toHTML, fromHTML } from '$lib/prosemirrorUtil'; 4 + import { singleLinePlainTextSchema, multiLinePlainTextSchema } from '$lib/prosemirrorSchemas'; 5 + import { activeEditorView } from '$lib/stores'; 6 + import { EditorState, Plugin } from 'prosemirror-state'; 7 + import { EditorView } from 'prosemirror-view'; 8 + import { history } from 'prosemirror-history'; 9 + import { keymap } from 'prosemirror-keymap'; 10 + import { baseKeymap } from 'prosemirror-commands'; 11 + import { buildKeymap } from '$lib/prosemirrorKeymap'; 12 + 13 + export let content = ''; 14 + export let multiLine = false; 15 + 16 + let editorChange = false; 17 + let prosemirrorNode, editorView, editorState; 18 + 19 + $: schema = multiLine ? multiLinePlainTextSchema : singleLinePlainTextSchema; 20 + 21 + $: { 22 + const doc = fromHTML(schema, content); 23 + editorState = EditorState.create({ 24 + doc, 25 + schema, 26 + plugins: [keymap(buildKeymap(schema)), keymap(baseKeymap), history(), onUpdatePlugin] 27 + }); 28 + // Only if there is already an editorView and the content change was external 29 + // update editorView with the new editorState 30 + if (!editorChange) { 31 + editorView?.updateState(editorState); 32 + } else { 33 + editorChange = false; 34 + } 35 + } 36 + 37 + function dispatchTransaction(transaction) { 38 + const editorState = this.state.apply(transaction); 39 + this.updateState(editorState); 40 + if (transaction.docChanged) { 41 + content = toHTML(editorState); 42 + // Leave a hint so we know the last content update came 43 + // from the editor (not the parent) 44 + editorChange = true; 45 + } 46 + this.state = editorState; 47 + } 48 + 49 + const onUpdatePlugin = new Plugin({ 50 + view() { 51 + return { 52 + update(updatedView) { 53 + activeEditorView.set(updatedView); 54 + } 55 + }; 56 + } 57 + }); 58 + 59 + onMount(() => { 60 + editorView = new EditorView(prosemirrorNode, { 61 + state: editorState, 62 + dispatchTransaction 63 + }); 64 + activeEditorView.set(editorView); 65 + }); 66 + 67 + onDestroy(() => { 68 + // Guard on server side 69 + if (editorView) { 70 + editorView.destroy(); 71 + } 72 + }); 73 + </script> 74 + 75 + <div id="prosemirror-editor" bind:this={prosemirrorNode} /> 76 + 77 + <style> 78 + :global(#prosemirror-editor .ProseMirror) { 79 + outline: none; 80 + white-space: pre-wrap; 81 + word-wrap: break-word; 82 + } 83 + </style>
+18
src/lib/components/PrimaryButton.svelte
··· 1 + <script> 2 + import BaseButton from '$lib/components/BaseButton.svelte'; 3 + export let disabled = undefined; 4 + export let type = 'button'; 5 + export let size = undefined; 6 + export let href = undefined; 7 + </script> 8 + 9 + <BaseButton 10 + {type} 11 + {size} 12 + {disabled} 13 + {href} 14 + styles="font-medium hover:bg-gray-800 focus:ring-gray-900 border-2 border-transparent bg-gray-900 text-white" 15 + on:click 16 + > 17 + <slot /> 18 + </BaseButton>
+15
src/lib/components/RichText.svelte
··· 1 + <script> 2 + import RichTextEditor from './RichTextEditor.svelte'; 3 + 4 + export let editable; 5 + export let content; 6 + export let multiLine = false; 7 + </script> 8 + 9 + {#if editable} 10 + <RichTextEditor {multiLine} bind:content /> 11 + {:else} 12 + <div> 13 + {@html content} 14 + </div> 15 + {/if}
+87
src/lib/components/RichTextEditor.svelte
··· 1 + <script> 2 + import { onMount, onDestroy } from 'svelte'; 3 + import { toHTML, fromHTML } from '$lib/prosemirrorUtil'; 4 + import { singleLineRichTextSchema, multiLineRichTextSchema } from '$lib/prosemirrorSchemas'; 5 + import { activeEditorView } from '$lib/stores'; 6 + import { EditorState, Plugin } from 'prosemirror-state'; 7 + import { EditorView } from 'prosemirror-view'; 8 + import { history } from 'prosemirror-history'; 9 + import { keymap } from 'prosemirror-keymap'; 10 + import { baseKeymap } from 'prosemirror-commands'; 11 + import { buildKeymap } from '$lib/prosemirrorKeymap'; 12 + import { buildInputRules } from '$lib/prosemirrorInputrules'; 13 + 14 + export let content = '<p>Enter text.</p>'; 15 + export let multiLine = false; 16 + let editorChange = false; 17 + let prosemirrorNode, editorView, editorState; 18 + 19 + $: schema = multiLine ? multiLineRichTextSchema : singleLineRichTextSchema; 20 + $: { 21 + const doc = fromHTML(schema, content); 22 + editorState = EditorState.create({ 23 + doc, 24 + schema, 25 + plugins: [ 26 + buildInputRules(schema), 27 + keymap(buildKeymap(schema)), 28 + keymap(baseKeymap), 29 + history(), 30 + onUpdatePlugin 31 + ] 32 + }); 33 + // Only if there is already an editorView and the content change was external 34 + // update editorView with the new editorState 35 + if (!editorChange) { 36 + editorView?.updateState(editorState); 37 + } else { 38 + editorChange = false; 39 + } 40 + } 41 + 42 + function dispatchTransaction(transaction) { 43 + const editorState = this.state.apply(transaction); 44 + this.updateState(editorState); 45 + if (transaction.docChanged) { 46 + content = toHTML(editorState); 47 + // Leave a hint so we know the last content update came 48 + // from the editor (not the parent) 49 + editorChange = true; 50 + } 51 + this.state = editorState; 52 + } 53 + 54 + const onUpdatePlugin = new Plugin({ 55 + view() { 56 + return { 57 + update(updatedView) { 58 + activeEditorView.set(updatedView); 59 + } 60 + }; 61 + } 62 + }); 63 + 64 + onMount(() => { 65 + editorView = new EditorView(prosemirrorNode, { 66 + state: editorState, 67 + dispatchTransaction 68 + }); 69 + activeEditorView.set(editorView); 70 + }); 71 + onDestroy(() => { 72 + // Guard on server side 73 + if (editorView) { 74 + editorView.destroy(); 75 + } 76 + }); 77 + </script> 78 + 79 + <div id="prosemirror-editor" bind:this={prosemirrorNode} /> 80 + 81 + <style> 82 + :global(#prosemirror-editor .ProseMirror) { 83 + outline: none; 84 + white-space: pre-wrap; 85 + word-wrap: break-word; 86 + } 87 + </style>
+124
src/lib/components/Search.svelte
··· 1 + <script> 2 + import { onMount } from 'svelte'; 3 + import { debounce, classNames } from '$lib/util'; 4 + import { SHORTCUTS } from '$lib/constants'; 5 + import { goto } from '$app/navigation'; 6 + 7 + export let showSearch; 8 + let value; 9 + let result = SHORTCUTS; 10 + let selectedResult = 0; 11 + let input; 12 + let resultsEl; 13 + 14 + onMount(() => { 15 + input.focus(); 16 + }); 17 + 18 + async function search() { 19 + if (value) { 20 + const response = await fetch(`/api/search?q=${value}`); 21 + result = await response.json(); 22 + } else { 23 + result = SHORTCUTS; 24 + } 25 + selectedResult = 0; 26 + } 27 + 28 + function navigate() { 29 + const currentResult = result[selectedResult]; 30 + if (currentResult) { 31 + goto(currentResult.url); 32 + } 33 + showSearch = false; 34 + } 35 + 36 + function prevResult() { 37 + if (selectedResult > 0) { 38 + selectedResult -= 1; 39 + } 40 + scrollIntoViewIfNeeded(); 41 + } 42 + 43 + function nextResult() { 44 + if (selectedResult < result.length - 1) { 45 + selectedResult += 1; 46 + } 47 + scrollIntoViewIfNeeded(); 48 + } 49 + 50 + function scrollIntoViewIfNeeded() { 51 + let node = resultsEl.childNodes[selectedResult]; 52 + if (node.scrollIntoViewIfNeeded) { 53 + node.scrollIntoViewIfNeeded(); 54 + } 55 + } 56 + 57 + function onKeyDown(e) { 58 + switch (e.keyCode) { 59 + case 38: // up 60 + prevResult(); 61 + e.preventDefault(); 62 + break; 63 + case 40: // down 64 + nextResult(); 65 + e.preventDefault(); 66 + break; 67 + case 13: 68 + navigate(); 69 + break; 70 + } 71 + } 72 + </script> 73 + 74 + <div class="relative border-b border-gray-100 flex space-x-4 items-center px-4 sm:px-6 py-2"> 75 + <svg 76 + xmlns="http://www.w3.org/2000/svg" 77 + fill="none" 78 + viewBox="0 0 24 24" 79 + stroke-width="1.5" 80 + stroke="currentColor" 81 + class="w-6 h-6" 82 + > 83 + <path 84 + stroke-linecap="round" 85 + stroke-linejoin="round" 86 + d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z" 87 + /> 88 + </svg> 89 + <input 90 + bind:this={input} 91 + bind:value 92 + use:debounce={{ value, func: search, duration: 50 }} 93 + autocomplete="off" 94 + id="search" 95 + name="search" 96 + class="block w-full border-none bg-transparent px-0 py-2 placeholder-gray-300 focus:border-black focus:text-gray-900 focus:placeholder-gray-400 focus:outline-none focus:ring-0" 97 + placeholder="Search website ..." 98 + type="text" 99 + /> 100 + <button 101 + class="bg-gray-100 rounded-md px-4 py-2 text-xs font-bold text-gray-600 hover:text-gray-900" 102 + on:click={() => (showSearch = false)}>ESC</button 103 + > 104 + </div> 105 + 106 + {#if result.length > 0} 107 + <div class="font-bold text-sm px-4 sm:px-6 py-4 border-b border-gray-100"> 108 + {value ? 'BEST MATCHES' : 'SHORTCUTS'} 109 + </div> 110 + {/if} 111 + <div class="overflow-y-auto" bind:this={resultsEl}> 112 + {#each result as item, i} 113 + <a 114 + on:click={() => (showSearch = false)} 115 + class={classNames( 116 + 'block px-4 sm:px-6 py-3 border-b border-gray-100 text-gray-600 hover:text-black', 117 + selectedResult === i ? 'bg-gray-100' : '' 118 + )} 119 + href={item.url}>{item.name}</a 120 + > 121 + {/each} 122 + </div> 123 + 124 + <svelte:window on:keydown={onKeyDown} />
+18
src/lib/components/SecondaryButton.svelte
··· 1 + <script> 2 + import BaseButton from '$lib/components/BaseButton.svelte'; 3 + export let disabled = undefined; 4 + export let type = 'button'; 5 + export let size = undefined; 6 + export let href = undefined; 7 + </script> 8 + 9 + <BaseButton 10 + {href} 11 + {type} 12 + {size} 13 + {disabled} 14 + styles="font-medium hover:bg-gray-100 focus:ring-gray-100 border-2 border-gray-100 bg-white" 15 + on:click 16 + > 17 + <slot /> 18 + </BaseButton>
+92
src/lib/components/Testimonial.svelte
··· 1 + <script> 2 + import PlainText from './PlainText.svelte'; 3 + import { classNames } from '$lib/util'; 4 + import Image from './Image.svelte'; 5 + import { createEventDispatcher } from 'svelte'; 6 + 7 + const dispatch = createEventDispatcher(); 8 + 9 + export let testimonial; 10 + export let currentUser; 11 + export let editable; 12 + export let firstEntry = false; 13 + export let lastEntry = false; 14 + </script> 15 + 16 + <div class={classNames(firstEntry ? 'pt-2 pb-8 sm:pb-12' : 'py-8 sm:py-12')}> 17 + <div class="max-w-screen-md mx-auto px-6 flex space-x-6 sm:space-x-8 relative"> 18 + <Image 19 + class="flex-shrink-0 w-14 h-14 sm:w-20 sm:h-20 rounded-full" 20 + maxWidth={160} 21 + maxHeight={160} 22 + quality={0.8} 23 + {editable} 24 + {currentUser} 25 + bind:src={testimonial.image} 26 + alt={testimonial.name} 27 + /> 28 + <div class="flex-1"> 29 + <div class="text-lg sm:text-2xl italic"> 30 + <PlainText {editable} bind:content={testimonial.text} /> 31 + </div> 32 + <div class="mt-4 md:text-xl font-medium"> 33 + <PlainText {editable} bind:content={testimonial.name} /> 34 + </div> 35 + </div> 36 + {#if editable} 37 + <div class="space-y-2 flex flex-col"> 38 + <button 39 + class="w-6 h-6 p-1 rounded-full bg-gray-900 hover:bg-gray-800 text-white" 40 + on:click={() => dispatch('delete')} 41 + > 42 + <svg 43 + xmlns="http://www.w3.org/2000/svg" 44 + fill="none" 45 + viewBox="0 0 24 24" 46 + stroke-width="1.5" 47 + stroke="currentColor" 48 + class="w-4 h-4" 49 + > 50 + <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" /> 51 + </svg> 52 + </button> 53 + <button 54 + class={classNames( 55 + 'w-6 h-6 p-1 rounded-full hover:bg-gray-100', 56 + firstEntry ? 'opacity-20' : '' 57 + )} 58 + on:click={() => dispatch('up')} 59 + > 60 + <svg 61 + xmlns="http://www.w3.org/2000/svg" 62 + fill="none" 63 + viewBox="0 0 24 24" 64 + stroke-width="1.5" 65 + stroke="currentColor" 66 + class="w-4 h-4" 67 + > 68 + <path stroke-linecap="round" stroke-linejoin="round" d="M4.5 15.75l7.5-7.5 7.5 7.5" /> 69 + </svg> 70 + </button> 71 + <button 72 + class={classNames( 73 + 'w-6 h-6 p-1 rounded-full hover:bg-gray-100', 74 + lastEntry ? 'opacity-20' : '' 75 + )} 76 + on:click={() => dispatch('down')} 77 + > 78 + <svg 79 + xmlns="http://www.w3.org/2000/svg" 80 + fill="none" 81 + viewBox="0 0 24 24" 82 + stroke-width="1.5" 83 + stroke="currentColor" 84 + class="w-4 h-4" 85 + > 86 + <path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5" /> 87 + </svg> 88 + </button> 89 + </div> 90 + {/if} 91 + </div> 92 + </div>
+25
src/lib/components/Toggle.svelte
··· 1 + <script> 2 + import { classNames } from '$lib/util'; 3 + export let checked = false; 4 + export let size = 'default'; 5 + $: className = classNames( 6 + 'relative inline-flex flex-shrink-0 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-600', 7 + checked ? 'bg-indigo-600' : 'bg-slate-300', 8 + size === 'default' ? 'h-5 w-10' : 'w-8' 9 + ); 10 + $: innerClassName = classNames( 11 + checked ? (size === 'default' ? 'translate-x-5' : 'translate-x-4') : 'translate-x-0', 12 + 'pointer-events-none inline-block rounded-full bg-white shadow transform ring-0 transition ease-in-out duration-200', 13 + size === 'default' ? 'h-4 w-4' : 'h-3 w-3' 14 + ); 15 + function toggle() { 16 + checked = !checked; 17 + } 18 + </script> 19 + 20 + <div class="inline-flex items-center"> 21 + <button class={className} on:click={toggle}> 22 + <div class={innerClassName} /> 23 + </button> 24 + <div class="px-2"><slot /></div> 25 + </div>
+96
src/lib/components/WebsiteNav.svelte
··· 1 + <script> 2 + import { classNames } from '$lib/util'; 3 + import Modal from './Modal.svelte'; 4 + import NotEditable from './NotEditable.svelte'; 5 + import Search from './Search.svelte'; 6 + export let editable = false; 7 + export let currentUser; 8 + 9 + // TODO: Replace with a globally managed context menu implementation (only one active) 10 + export let showUserMenu = undefined; 11 + export let showSearch = undefined; 12 + 13 + function onKeyDown(e) { 14 + // Close modals 15 + if (e.key === 'Escape') { 16 + showSearch = false; 17 + showUserMenu = false; 18 + } 19 + // Trigger the search panel 20 + if (e.key === 'k' && e.metaKey) { 21 + showSearch = true; 22 + } 23 + // Turn on editing 24 + if (e.key === 'e' && e.metaKey) { 25 + editable = true; 26 + } 27 + } 28 + </script> 29 + 30 + {#if showSearch} 31 + <Modal position="top" on:close={() => (showSearch = false)}> 32 + <Search bind:showSearch /> 33 + </Modal> 34 + {/if} 35 + 36 + <div 37 + class={classNames( 38 + 'backdrop-blur-sm bg-white bg-opacity-95 transition-colors duration-500 z-10 text-sm', 39 + !editable ? 'sticky top-0' : '' 40 + )} 41 + > 42 + <div class="max-w-xs mx-auto py-4"> 43 + <NotEditable {editable}> 44 + <div class="flex items-center relative"> 45 + <div class="flex-1" /> 46 + <button class={classNames('mr-6 hover:text-black')} on:click={() => (showSearch = true)}> 47 + <svg 48 + xmlns="http://www.w3.org/2000/svg" 49 + fill="none" 50 + viewBox="0 0 24 24" 51 + stroke-width="1.5" 52 + stroke="currentColor" 53 + class="w-6 h-6" 54 + > 55 + <path 56 + stroke-linecap="round" 57 + stroke-linejoin="round" 58 + d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z" 59 + /> 60 + </svg> 61 + </button> 62 + <a class="mr-4 font-medium px-2 py-1 rounded-md hover:text-black" href="/"> About </a> 63 + <a class="mr-4 font-medium px-2 py-1 rounded-md hover:text-black" href="/blog"> Blog </a> 64 + <a class="mr-4 font-medium px-2 py-1 rounded-md hover:text-black" href="/#contact"> 65 + Contact 66 + </a> 67 + <div class="flex-1" /> 68 + {#if currentUser} 69 + <button 70 + on:click={() => (showUserMenu = !showUserMenu)} 71 + class="ml-0 hover:text-black" 72 + title={currentUser.name} 73 + > 74 + <svg 75 + xmlns="http://www.w3.org/2000/svg" 76 + fill="none" 77 + viewBox="0 0 24 24" 78 + stroke-width="1.5" 79 + stroke="currentColor" 80 + class="w-6 h-6" 81 + > 82 + <path 83 + stroke-linecap="round" 84 + stroke-linejoin="round" 85 + d="M12 6.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 12.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 18.75a.75.75 0 110-1.5.75.75 0 010 1.5z" 86 + /> 87 + </svg> 88 + </button> 89 + {/if} 90 + <div class="flex-1" /> 91 + </div> 92 + </NotEditable> 93 + </div> 94 + </div> 95 + 96 + <svelte:window on:keydown={onKeyDown} />
+27
src/lib/components/tools/CreateLink.svelte
··· 1 + <script> 2 + import { classNames } from '$lib/util'; 3 + import { toggleMark } from 'prosemirror-commands'; 4 + import { createLink } from '$lib/prosemirrorCommands'; 5 + 6 + export let editorView; 7 + export let editorState; 8 + 9 + $: schema = editorState.schema; 10 + $: disabled = !createLink(editorState, null, editorView); 11 + 12 + function handleClick() { 13 + let url = prompt('Enter link URL', 'https://example.com'); 14 + if (url) { 15 + toggleMark(schema.marks.link, { href: url })(editorState, editorView.dispatch); 16 + editorView.focus(); 17 + } 18 + } 19 + </script> 20 + 21 + <button 22 + on:click={handleClick} 23 + {disabled} 24 + class={classNames('disabled:opacity-30 rounded-full p-2 sm:mx-1 hover:bg-gray-100')} 25 + > 26 + <slot /> 27 + </button>
+81
src/lib/components/tools/InsertImage.svelte
··· 1 + <script> 2 + import { classNames, resizeImage, getDimensions } from '$lib/util'; 3 + import uuid from '$lib/uuid'; 4 + import uploadAsset from '$lib/uploadAsset'; 5 + import { insertImage } from '$lib/prosemirrorCommands'; 6 + 7 + const ASSET_PATH = import.meta.env.VITE_ASSET_PATH; 8 + 9 + export let editorView; 10 + export let editorState; 11 + export let currentUser; 12 + 13 + let fileInput; // for uploading an image 14 + let progress = undefined; // file upload progress 15 + 16 + $: schema = editorState.schema; 17 + $: disabled = !insertImage(editorState, null, editorView); 18 + 19 + async function uploadImage() { 20 + const file = fileInput.files[0]; 21 + 22 + // We convert all uploads to the WEBP image format 23 + const extension = 'webp'; 24 + const path = [['editable-website', 'images', uuid()].join('/'), extension].join('.'); 25 + 26 + const maxWidth = 1440; 27 + const maxHeight = 1440; 28 + const quality = 0.8; 29 + 30 + const resizedBlob = await resizeImage(file, maxWidth, maxHeight, quality); 31 + const resizedFile = new File([resizedBlob], `${file.name.split('.')[0]}.webp`, { 32 + type: 'image/webp' 33 + }); 34 + 35 + const { width, height } = await getDimensions(resizedFile); 36 + const src = currentUser ? `${ASSET_PATH}/${path}` : URL.createObjectURL(resizedFile); 37 + 38 + progress = 0; 39 + try { 40 + if (currentUser) { 41 + await uploadAsset(resizedFile, path, p => { 42 + progress = p; 43 + }); 44 + } 45 + 46 + editorView.dispatch( 47 + editorState.tr.replaceSelectionWith( 48 + schema.nodes.image.createAndFill({ 49 + src, 50 + width, 51 + height 52 + }) 53 + ) 54 + ); 55 + editorView.focus(); 56 + progress = undefined; 57 + } catch (err) { 58 + console.error(err); 59 + progress = undefined; 60 + } 61 + fileInput.value = null; 62 + } 63 + </script> 64 + 65 + <input 66 + class="w-px h-px opacity-0 fixed -top-40" 67 + type="file" 68 + accept="image/*" 69 + name="imagefile" 70 + multiple 71 + bind:this={fileInput} 72 + on:change={uploadImage} 73 + /> 74 + <button 75 + on:click={() => fileInput.click()} 76 + {disabled} 77 + class={classNames('hover:bg-gray-100 sm:mx-1 rounded-full p-2 disabled:opacity-30')} 78 + > 79 + <slot /> 80 + {progress || ''} 81 + </button>
+23
src/lib/components/tools/ToggleBlockquote.svelte
··· 1 + <script> 2 + import { classNames } from '$lib/util'; 3 + import { wrapIn } from 'prosemirror-commands'; 4 + 5 + export let editorView; 6 + export let editorState; 7 + 8 + $: schema = editorState.schema; 9 + $: disabled = !wrapIn(schema.nodes.blockquote)(editorView.state); 10 + 11 + function handleClick() { 12 + wrapIn(schema.nodes.blockquote)(editorState, editorView.dispatch); 13 + editorView.focus(); 14 + } 15 + </script> 16 + 17 + <button 18 + on:click={handleClick} 19 + {disabled} 20 + class={classNames('disabled:opacity-30 rounded-full sm:mx-1 p-2 hover:bg-gray-100')} 21 + > 22 + <slot /> 23 + </button>
+23
src/lib/components/tools/ToggleBulletList.svelte
··· 1 + <script> 2 + import { classNames } from '$lib/util'; 3 + import { wrapInList } from 'prosemirror-schema-list'; 4 + 5 + export let editorView; 6 + export let editorState; 7 + 8 + $: schema = editorState.schema; 9 + $: disabled = !wrapInList(schema.nodes.bullet_list)(editorView.state); 10 + 11 + function handleClick() { 12 + wrapInList(schema.nodes.bullet_list)(editorState, editorView.dispatch); 13 + editorView.focus(); 14 + } 15 + </script> 16 + 17 + <button 18 + on:click={handleClick} 19 + {disabled} 20 + class={classNames('disabled:opacity-30 rounded-full p-2 sm:mx-1 hover:bg-gray-100')} 21 + > 22 + <slot /> 23 + </button>
+34
src/lib/components/tools/ToggleHeading.svelte
··· 1 + <script> 2 + import { classNames } from '$lib/util'; 3 + import { setBlockType } from 'prosemirror-commands'; 4 + import { blockTypeActive } from '../../prosemirrorUtil'; 5 + 6 + export let editorView; 7 + export let editorState; 8 + 9 + $: schema = editorState.schema; 10 + $: disabled = 11 + !setBlockType(schema.nodes.heading)(editorState) && 12 + !setBlockType(schema.nodes.paragraph)(editorState); 13 + $: active = blockTypeActive(schema.nodes.heading, { level: 1 })(editorState); 14 + 15 + function handleClick() { 16 + if (active) { 17 + setBlockType(schema.nodes.paragraph)(editorState, editorView.dispatch); 18 + } else { 19 + setBlockType(schema.nodes.heading, { level: 1 })(editorState, editorView.dispatch); 20 + } 21 + editorView.focus(); 22 + } 23 + </script> 24 + 25 + <button 26 + on:click={handleClick} 27 + {disabled} 28 + class={classNames( 29 + active ? 'bg-gray-900 text-white' : 'hover:bg-gray-100', 30 + 'sm:mx-1 rounded-full p-2 disabled:opacity-30' 31 + )} 32 + > 33 + <slot /> 34 + </button>
+32
src/lib/components/tools/ToggleMark.svelte
··· 1 + <script> 2 + import { toggleMark } from 'prosemirror-commands'; 3 + import { markActive } from '$lib/prosemirrorUtil'; 4 + import { classNames } from '$lib/util'; 5 + 6 + export let editorView; 7 + export let editorState; 8 + export let type; 9 + 10 + $: schema = editorState.schema; 11 + $: markType = schema.marks[type]; 12 + 13 + $: command = toggleMark(markType); 14 + $: disabled = !markType || !command(editorState, null); 15 + $: active = markActive(markType)(editorState); 16 + 17 + function handleClick() { 18 + command(editorState, editorView.dispatch, editorView); 19 + editorView.focus(); 20 + } 21 + </script> 22 + 23 + <button 24 + on:click={handleClick} 25 + {disabled} 26 + class={classNames( 27 + active ? 'bg-gray-900 text-white' : 'hover:bg-gray-100', 28 + 'sm:mx-1 rounded-full p-2 disabled:opacity-30' 29 + )} 30 + > 31 + <slot /> 32 + </button>
+23
src/lib/components/tools/ToggleOrderedList.svelte
··· 1 + <script> 2 + import { classNames } from '$lib/util'; 3 + import { wrapInList } from 'prosemirror-schema-list'; 4 + 5 + export let editorView; 6 + export let editorState; 7 + 8 + $: schema = editorState.schema; 9 + $: disabled = !wrapInList(schema.nodes.ordered_list)(editorView.state); 10 + 11 + function handleClick() { 12 + wrapInList(schema.nodes.ordered_list)(editorState, editorView.dispatch); 13 + editorView.focus(); 14 + } 15 + </script> 16 + 17 + <button 18 + on:click={handleClick} 19 + {disabled} 20 + class={classNames('disabled:opacity-30 rounded-full p-2 sm:mx-1 hover:bg-gray-100')} 21 + > 22 + <slot /> 23 + </button>
+7
src/lib/constants.js
··· 1 + export const SHORTCUTS = [ 2 + { name: 'About', url: '/' }, 3 + { name: 'Blog', url: '/blog' }, 4 + { name: 'Contact', url: '/#contact' }, 5 + { name: 'Imprint', url: '/imprint' }, 6 + { name: 'Login', url: '/login' } 7 + ];
+20
src/lib/prosemirrorCommands.js
··· 1 + import { markApplies, canInsert } from '$lib/prosemirrorUtil'; 2 + 3 + export function createLink(state /*, dispatch, cb*/) { 4 + const schema = state.schema; 5 + const markType = schema.marks.link; 6 + if (!markType) return false; 7 + const { $cursor, ranges, from, to } = state.selection; 8 + const allowed = markApplies(state.doc, ranges, markType); 9 + const hasLink = state.doc.rangeHasMark(from, to, markType); 10 + // Disable if either the cursor is collapsed, the mark does not apply or is already present 11 + if ($cursor || !allowed || hasLink) return false; 12 + return true; 13 + } 14 + 15 + export function insertImage(state /*, dispatch, editorView, src*/) { 16 + const nodeType = state.schema.nodes.image; 17 + if (!nodeType) return false; 18 + if (!canInsert(state, nodeType)) return false; 19 + return true; 20 + }
+61
src/lib/prosemirrorInputrules.js
··· 1 + import { 2 + inputRules, 3 + wrappingInputRule, 4 + textblockTypeInputRule, 5 + smartQuotes, 6 + emDash, 7 + ellipsis 8 + } from 'prosemirror-inputrules'; 9 + 10 + // Given a blockquote node type, returns an input rule that turns `"> "` 11 + // at the start of a textblock into a blockquote. 12 + export function blockQuoteRule(nodeType) { 13 + return wrappingInputRule(/^\s*>\s$/, nodeType); 14 + } 15 + 16 + // Given a list node type, returns an input rule that turns a number 17 + // followed by a dot at the start of a textblock into an ordered list. 18 + export function orderedListRule(nodeType) { 19 + return wrappingInputRule( 20 + /^(\d+)\.\s$/, 21 + nodeType, 22 + match => ({ order: +match[1] }), 23 + (match, node) => node.childCount + node.attrs.order == +match[1] 24 + ); 25 + } 26 + 27 + // Given a list node type, returns an input rule that turns a bullet 28 + // (dash, plush, or asterisk) at the start of a textblock into a 29 + // bullet list. 30 + export function bulletListRule(nodeType) { 31 + return wrappingInputRule(/^\s*([-+*])\s$/, nodeType); 32 + } 33 + 34 + // Given a code block node type, returns an input rule that turns a 35 + // textblock starting with three backticks into a code block. 36 + export function codeBlockRule(nodeType) { 37 + return textblockTypeInputRule(/^```$/, nodeType); 38 + } 39 + 40 + // Given a node type and a maximum level, creates an input rule that 41 + // turns up to that number of `#` characters followed by a space at 42 + // the start of a textblock into a heading whose level corresponds to 43 + // the number of `#` signs. 44 + export function headingRule(nodeType, maxLevel) { 45 + return textblockTypeInputRule(new RegExp('^(#{1,' + maxLevel + '})\\s$'), nodeType, match => ({ 46 + level: match[1].length 47 + })); 48 + } 49 + 50 + // A set of input rules for creating the basic block quotes, lists, 51 + // code blocks, and heading. 52 + export function buildInputRules(schema) { 53 + let rules = smartQuotes.concat(ellipsis, emDash), 54 + type; 55 + if ((type = schema.nodes.blockquote)) rules.push(blockQuoteRule(type)); 56 + if ((type = schema.nodes.ordered_list)) rules.push(orderedListRule(type)); 57 + if ((type = schema.nodes.bullet_list)) rules.push(bulletListRule(type)); 58 + if ((type = schema.nodes.code_block)) rules.push(codeBlockRule(type)); 59 + if ((type = schema.nodes.heading)) rules.push(headingRule(type, 6)); 60 + return inputRules({ rules }); 61 + }
+106
src/lib/prosemirrorKeymap.js
··· 1 + import { 2 + wrapIn, 3 + setBlockType, 4 + chainCommands, 5 + toggleMark, 6 + exitCode, 7 + joinUp, 8 + joinDown, 9 + lift, 10 + selectParentNode 11 + } from 'prosemirror-commands'; 12 + import { wrapInList, splitListItem } from 'prosemirror-schema-list'; 13 + import { undo, redo } from 'prosemirror-history'; 14 + import { undoInputRule } from 'prosemirror-inputrules'; 15 + 16 + const mac = typeof navigator != 'undefined' ? /Mac|iP(hone|[oa]d)/.test(navigator.platform) : false; 17 + 18 + /// Inspect the given schema looking for marks and nodes from the 19 + /// basic schema, and if found, add key bindings related to them. 20 + /// This will add: 21 + /// 22 + /// * **Mod-b** for toggling [strong](#schema-basic.StrongMark) 23 + /// * **Mod-i** for toggling [emphasis](#schema-basic.EmMark) 24 + /// * **Mod-`** for toggling [code font](#schema-basic.CodeMark) 25 + /// * **Ctrl-Shift-0** for making the current textblock a paragraph 26 + /// * **Ctrl-Shift-1** to **Ctrl-Shift-Digit6** for making the current 27 + /// textblock a heading of the corresponding level 28 + /// * **Ctrl-Shift-Backslash** to make the current textblock a code block 29 + /// * **Ctrl-Shift-8** to wrap the selection in an ordered list 30 + /// * **Ctrl-Shift-9** to wrap the selection in a bullet list 31 + /// * **Ctrl->** to wrap the selection in a block quote 32 + /// * **Enter** to split a non-empty textblock in a list item while at 33 + /// the same time splitting the list item 34 + /// * **Mod-Enter** to insert a hard break 35 + /// * **Mod-_** to insert a horizontal rule 36 + /// * **Backspace** to undo an input rule 37 + /// * **Alt-ArrowUp** to `joinUp` 38 + /// * **Alt-ArrowDown** to `joinDown` 39 + /// * **Mod-BracketLeft** to `lift` 40 + /// * **Escape** to `selectParentNode` 41 + /// 42 + /// You can suppress or map these bindings by passing a `mapKeys` 43 + /// argument, which maps key names (say `"Mod-B"` to either `false`, to 44 + /// remove the binding, or a new key name string. 45 + export function buildKeymap(schema, mapKeys) { 46 + let keys = {}, 47 + type; 48 + function bind(key, cmd) { 49 + if (mapKeys) { 50 + let mapped = mapKeys[key]; 51 + if (mapped === false) return; 52 + if (mapped) key = mapped; 53 + } 54 + keys[key] = cmd; 55 + } 56 + 57 + bind('Mod-z', undo); 58 + bind('Shift-Mod-z', redo); 59 + bind('Backspace', undoInputRule); 60 + if (!mac) bind('Mod-y', redo); 61 + 62 + bind('Alt-ArrowUp', joinUp); 63 + bind('Alt-ArrowDown', joinDown); 64 + bind('Mod-BracketLeft', lift); 65 + bind('Escape', selectParentNode); 66 + 67 + if ((type = schema.marks.strong)) { 68 + bind('Mod-b', toggleMark(type)); 69 + bind('Mod-B', toggleMark(type)); 70 + } 71 + if ((type = schema.marks.em)) { 72 + bind('Mod-i', toggleMark(type)); 73 + bind('Mod-I', toggleMark(type)); 74 + } 75 + if ((type = schema.marks.code)) bind('Mod-`', toggleMark(type)); 76 + 77 + if ((type = schema.nodes.bullet_list)) bind('Shift-Ctrl-8', wrapInList(type)); 78 + if ((type = schema.nodes.ordered_list)) bind('Shift-Ctrl-9', wrapInList(type)); 79 + if ((type = schema.nodes.blockquote)) bind('Ctrl->', wrapIn(type)); 80 + if ((type = schema.nodes.hard_break)) { 81 + let br = type, 82 + cmd = chainCommands(exitCode, (state, dispatch) => { 83 + if (dispatch) dispatch(state.tr.replaceSelectionWith(br.create()).scrollIntoView()); 84 + return true; 85 + }); 86 + bind('Mod-Enter', cmd); 87 + bind('Shift-Enter', cmd); 88 + if (mac) bind('Ctrl-Enter', cmd); 89 + } 90 + if ((type = schema.nodes.list_item)) { 91 + bind('Enter', splitListItem(type)); 92 + } 93 + if ((type = schema.nodes.paragraph)) bind('Shift-Ctrl-0', setBlockType(type)); 94 + if ((type = schema.nodes.code_block)) bind('Shift-Ctrl-\\', setBlockType(type)); 95 + if ((type = schema.nodes.heading)) 96 + for (let i = 1; i <= 6; i++) bind('Shift-Ctrl-' + i, setBlockType(type, { level: i })); 97 + if ((type = schema.nodes.horizontal_rule)) { 98 + let hr = type; 99 + bind('Mod-_', (state, dispatch) => { 100 + if (dispatch) dispatch(state.tr.replaceSelectionWith(hr.create()).scrollIntoView()); 101 + return true; 102 + }); 103 + } 104 + 105 + return keys; 106 + }
+295
src/lib/prosemirrorSchemas.js
··· 1 + import { Schema } from 'prosemirror-model'; 2 + 3 + const pDOM = ['p', 0]; 4 + const blockquoteDOM = ['blockquote', 0]; 5 + const brDOM = ['br']; 6 + const olDOM = ['ol', 0]; 7 + const ulDOM = ['ul', 0]; 8 + const liDOM = ['li', 0]; 9 + const emDOM = ['em', 0]; 10 + const strongDOM = ['strong', 0]; 11 + 12 + // :: Object 13 + // [Specs](#model.NodeSpec) for the nodes defined in this schema. 14 + 15 + // :: Object [Specs](#model.MarkSpec) for the marks in the schema. 16 + export const marks = { 17 + // :: MarkSpec A link. Has `href` and `title` attributes. `title` 18 + // defaults to the empty string. Rendered and parsed as an `<a>` 19 + // element. 20 + link: { 21 + attrs: { 22 + href: {}, 23 + title: { default: null } 24 + }, 25 + inclusive: false, 26 + parseDOM: [ 27 + { 28 + tag: 'a[href]', 29 + getAttrs(dom) { 30 + return { href: dom.getAttribute('href'), title: dom.getAttribute('title') }; 31 + } 32 + } 33 + ], 34 + toDOM(node) { 35 + const { href, title } = node.attrs; 36 + return ['a', { href, title }, 0]; 37 + } 38 + }, 39 + 40 + // :: MarkSpec An emphasis mark. Rendered as an `<em>` element. 41 + // Has parse rules that also match `<i>` and `font-style: italic`. 42 + em: { 43 + parseDOM: [{ tag: 'i' }, { tag: 'em' }, { style: 'font-style=italic' }], 44 + toDOM() { 45 + return emDOM; 46 + } 47 + }, 48 + 49 + // :: MarkSpec A strong mark. Rendered as `<strong>`, parse rules 50 + // also match `<b>` and `font-weight: bold`. 51 + strong: { 52 + parseDOM: [ 53 + { tag: 'strong' }, 54 + // This works around a Google Docs misbehavior where 55 + // pasted content will be inexplicably wrapped in `<b>` 56 + // tags with a font-weight normal. 57 + { tag: 'b', getAttrs: node => node.style.fontWeight !== 'normal' && null }, 58 + { style: 'font-weight', getAttrs: value => /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null } 59 + ], 60 + toDOM() { 61 + return strongDOM; 62 + } 63 + } 64 + }; 65 + 66 + /** 67 + * Schema to represent a single line of plain text 68 + * @type {Schema} 69 + */ 70 + export const singleLinePlainTextSchema = new Schema({ 71 + nodes: { 72 + doc: { content: 'text*' }, 73 + text: { inline: true } 74 + } 75 + }); 76 + 77 + /** 78 + * Schema to represent a single line of plain text 79 + * @type {Schema} 80 + */ 81 + export const singleLineRichTextSchema = new Schema({ 82 + nodes: { 83 + doc: { content: 'text*' }, 84 + text: { inline: true } 85 + }, 86 + marks 87 + }); 88 + 89 + /** 90 + * Schema to represent rich text 91 + * @type {Schema} 92 + */ 93 + export const multiLineRichTextSchema = new Schema({ 94 + nodes: { 95 + // :: NodeSpec The top level document node. 96 + doc: { 97 + content: 'block+' 98 + }, 99 + 100 + // :: NodeSpec A plain paragraph textblock. Represented in the DOM 101 + // as a `<p>` element. 102 + paragraph: { 103 + content: 'inline*', 104 + group: 'block', 105 + parseDOM: [{ tag: 'p' }], 106 + toDOM() { 107 + return pDOM; 108 + } 109 + }, 110 + 111 + // :: NodeSpec 112 + // An ordered list [node spec](#model.NodeSpec). Has a single 113 + // attribute, `order`, which determines the number at which the list 114 + // starts counting, and defaults to 1. Represented as an `<ol>` 115 + // element. 116 + ordered_list: { 117 + content: 'list_item+', 118 + group: 'block', 119 + attrs: { order: { default: 1 } }, 120 + parseDOM: [ 121 + { 122 + tag: 'ol', 123 + getAttrs(dom) { 124 + return { order: dom.hasAttribute('start') ? +dom.getAttribute('start') : 1 }; 125 + } 126 + } 127 + ], 128 + toDOM(node) { 129 + return node.attrs.order === 1 ? olDOM : ['ol', { start: node.attrs.order }, 0]; 130 + } 131 + }, 132 + 133 + // :: NodeSpec 134 + // A bullet list node spec, represented in the DOM as `<ul>`. 135 + bullet_list: { 136 + content: 'list_item+', 137 + group: 'block', 138 + parseDOM: [{ tag: 'ul' }], 139 + toDOM() { 140 + return ulDOM; 141 + } 142 + }, 143 + 144 + // :: NodeSpec 145 + // A list item (`<li>`) spec. 146 + list_item: { 147 + content: 'paragraph+', // only allow one or more paragraphs 148 + // content: 'paragraph (orderedList | bulletList | paragraph)*', 149 + parseDOM: [{ tag: 'li' }], 150 + toDOM() { 151 + return liDOM; 152 + }, 153 + defining: true 154 + }, 155 + 156 + // :: NodeSpec A blockquote (`<blockquote>`) wrapping one or more blocks. 157 + blockquote: { 158 + content: 'paragraph+', 159 + group: 'block', 160 + defining: true, 161 + parseDOM: [{ tag: 'blockquote' }], 162 + toDOM() { 163 + return blockquoteDOM; 164 + } 165 + }, 166 + 167 + // :: NodeSpec A heading textblock, with a `level` attribute that 168 + // should hold the number 1 to 6. Parsed and serialized as `<h1>` to 169 + // `<h6>` elements. 170 + heading: { 171 + attrs: { level: { default: 1 } }, 172 + content: 'inline*', 173 + marks: '', 174 + group: 'block', 175 + defining: true, 176 + parseDOM: [ 177 + { 178 + tag: 'h2', 179 + getAttrs() { 180 + return { level: 1 }; 181 + } 182 + }, 183 + { 184 + tag: 'h3', 185 + getAttrs() { 186 + return { level: 2 }; 187 + } 188 + }, 189 + { 190 + tag: 'h4', 191 + getAttrs() { 192 + return { level: 3 }; 193 + } 194 + } 195 + ], 196 + toDOM(node) { 197 + return ['h' + (parseInt(node.attrs.level) + 1), {}, 0]; 198 + } 199 + }, 200 + 201 + // :: NodeSpec The text node. 202 + text: { 203 + group: 'inline' 204 + }, 205 + 206 + // :: NodeSpec An inline image (`<img>`) node. Supports `src`, 207 + // `alt`, and `href` attributes. The latter two default to the empty 208 + // string. 209 + image: { 210 + // inline: true, 211 + attrs: { 212 + src: {}, 213 + width: {}, 214 + height: {} 215 + }, 216 + group: 'block', 217 + draggable: true, 218 + parseDOM: [ 219 + { 220 + tag: 'img', 221 + getAttrs(dom) { 222 + return { 223 + src: dom.getAttribute('src'), 224 + width: dom.getAttribute('width'), 225 + height: dom.getAttribute('height') 226 + }; 227 + } 228 + } 229 + ], 230 + toDOM(node) { 231 + const { src, width, height } = node.attrs; 232 + return [ 233 + 'img', 234 + { 235 + src: src, 236 + width: width, 237 + height: height 238 + } 239 + ]; 240 + } 241 + }, 242 + 243 + // :: NodeSpec A hard line break, represented in the DOM as `<br>`. 244 + hard_break: { 245 + inline: true, 246 + group: 'inline', 247 + selectable: false, 248 + parseDOM: [{ tag: 'br' }], 249 + toDOM() { 250 + return brDOM; 251 + } 252 + } 253 + }, 254 + marks 255 + }); 256 + 257 + /** 258 + * Schema to represent rich text 259 + * @type {Schema} 260 + */ 261 + export const multiLinePlainTextSchema = new Schema({ 262 + nodes: { 263 + // :: NodeSpec The top level document node. 264 + doc: { 265 + content: 'block+' 266 + }, 267 + 268 + // :: NodeSpec A plain paragraph textblock. Represented in the DOM 269 + // as a `<p>` element. 270 + paragraph: { 271 + content: 'inline*', 272 + group: 'block', 273 + parseDOM: [{ tag: 'p' }], 274 + toDOM() { 275 + return pDOM; 276 + } 277 + }, 278 + 279 + // :: NodeSpec The text node. 280 + text: { 281 + group: 'inline' 282 + }, 283 + 284 + // :: NodeSpec A hard line break, represented in the DOM as `<br>`. 285 + hard_break: { 286 + inline: true, 287 + group: 'inline', 288 + selectable: false, 289 + parseDOM: [{ tag: 'br' }], 290 + toDOM() { 291 + return brDOM; 292 + } 293 + } 294 + } 295 + });
+127
src/lib/prosemirrorUtil.js
··· 1 + import { DOMSerializer, DOMParser } from 'prosemirror-model'; 2 + 3 + /** 4 + * Converts editor state to an HTML string 5 + * @param editorState 6 + * @returns {string} 7 + */ 8 + export function toHTML(editorState) { 9 + const serializer = DOMSerializer.fromSchema(editorState.schema); 10 + const fragment = serializer.serializeFragment(editorState.doc.content); 11 + const node = document.createElement('div'); 12 + node.append(fragment); 13 + return node.innerHTML; 14 + } 15 + 16 + /** 17 + * Converts the editor state to plain text 18 + * @param editorState 19 + * @return {string} 20 + */ 21 + export function toPlainText(editorState) { 22 + if (editorState.doc.childCount === 0) { 23 + return ''; 24 + } else if (editorState.doc.childCount === 1) { 25 + return editorState.doc.textContent; 26 + } else { 27 + let paragraphs = []; 28 + for (let i = 0; i < editorState.doc.childCount; i++) { 29 + paragraphs.push(editorState.doc.child(i).textContent); 30 + } 31 + return paragraphs.join('\n'); 32 + } 33 + } 34 + 35 + export function fromHTML(schema, content) { 36 + const doc = document.implementation.createHTMLDocument(); 37 + doc.body.innerHTML = content; 38 + return DOMParser.fromSchema(schema).parse(doc.body); 39 + } 40 + 41 + export function markActive(type) { 42 + return function (state) { 43 + const { from, $from, to, empty } = state.selection; 44 + if (!type) return false; // mark might not be available in current schema 45 + if (empty) return type.isInSet(state.storedMarks || $from.marks()); 46 + else return state.doc.rangeHasMark(from, to, type); 47 + }; 48 + } 49 + 50 + export function canInsert(state, nodeType) { 51 + const $from = state.selection.$from; 52 + for (let d = $from.depth; d >= 0; d--) { 53 + const index = $from.index(d); 54 + if ($from.node(d).canReplaceWith(index, index, nodeType)) return true; 55 + } 56 + return false; 57 + } 58 + 59 + export function markApplies(doc, ranges, type) { 60 + for (let i = 0; i < ranges.length; i++) { 61 + const { $from, $to } = ranges[i]; 62 + let can = $from.depth === 0 ? doc.type.allowsMarkType(type) : false; 63 + doc.nodesBetween($from.pos, $to.pos, node => { 64 + if (can) return false; 65 + can = node.inlineContent && node.type.allowsMarkType(type); 66 + }); 67 + if (can) return true; 68 + } 69 + return false; 70 + } 71 + 72 + // Returns true when cursor (collapsed or not) is inside a link 73 + export function linkActive(type) { 74 + return function (state) { 75 + const { from, to } = state.selection; 76 + return state.doc.rangeHasMark(from, to, type); 77 + }; 78 + } 79 + 80 + export function blockTypeActive(type, attrs) { 81 + return function (state) { 82 + // HACK: we fill in the id attribute if present, so the comparison works 83 + const dynAttrs = Object.assign({}, attrs); 84 + const { $from, to, node } = state.selection; 85 + if (node) { 86 + if (node.attrs.id) { 87 + dynAttrs.id = node.attrs.id; 88 + } 89 + return node.hasMarkup(type, dynAttrs); 90 + } 91 + if ($from.parent && $from.parent.attrs.id) { 92 + dynAttrs.id = $from.parent.attrs.id; 93 + } 94 + const result = to <= $from.end() && $from.parent.hasMarkup(type, dynAttrs); 95 + return result; 96 + }; 97 + } 98 + 99 + // Returns the first mark found for a given type 100 + // TODO: currently this doesn't covers the case where a link has just one character 101 + export function getMarkAtCurrentSelection(type) { 102 + return function (state) { 103 + const { $from } = state.selection; 104 + return $from.marks().find(m => m.type === type); 105 + }; 106 + } 107 + 108 + export function markExtend($start, mark) { 109 + let startIndex = $start.index(); 110 + let endIndex = $start.indexAfter(); 111 + 112 + while (startIndex > 0 && mark.isInSet($start.parent.child(startIndex - 1).marks)) { 113 + startIndex--; 114 + } 115 + while (endIndex < $start.parent.childCount && mark.isInSet($start.parent.child(endIndex).marks)) { 116 + endIndex++; 117 + } 118 + 119 + let startPos = $start.start(); 120 + let endPos = startPos; 121 + for (let i = 0; i < endIndex; i++) { 122 + const size = $start.parent.child(i).nodeSize; 123 + if (i < startIndex) startPos += size; 124 + endPos += size; 125 + } 126 + return { from: startPos, to: endPos }; 127 + }
+3
src/lib/stores.js
··· 1 + import { writable } from 'svelte/store'; 2 + 3 + export const activeEditorView = writable(null);
+45
src/lib/uploadAsset.js
··· 1 + async function getSignedUrl(path, type) { 2 + const response = await fetch(`/api/presignedurl?path=${path}&type=${type}`, { 3 + method: 'GET', 4 + headers: { 5 + Accept: 'application/json' 6 + } 7 + }); 8 + const { signedUrl } = await response.json(); 9 + return signedUrl; 10 + } 11 + 12 + function uploadS3(url, file, progressCallback) { 13 + return new Promise(function (resolve, reject) { 14 + const xhr = new XMLHttpRequest(); 15 + xhr.onreadystatechange = () => { 16 + if (xhr.readyState === 4) { 17 + if (xhr.status === 200) { 18 + resolve(xhr); 19 + } else { 20 + reject(xhr); 21 + } 22 + } 23 + }; 24 + 25 + if (progressCallback) { 26 + xhr.upload.onprogress = e => { 27 + if (e.lengthComputable) { 28 + const percentComplete = (e.loaded / file.size) * 100; 29 + progressCallback(parseInt(percentComplete, 10)); 30 + } 31 + }; 32 + } 33 + 34 + xhr.open('put', url); 35 + xhr.setRequestHeader('Content-Type', file.type); 36 + xhr.setRequestHeader('x-amz-acl', 'public-read'); 37 + xhr.send(file); 38 + }); 39 + } 40 + 41 + export default async function uploadAsset(file, path, onProgress) { 42 + const signedUrl = await getSignedUrl(path, file.type); 43 + await uploadS3(signedUrl, file, onProgress); 44 + return path; 45 + }
+167
src/lib/util.js
··· 1 + export function classNames(...classes) { 2 + return classes.filter(Boolean).join(' '); 3 + } 4 + 5 + /*! 6 + Math.uuid.js (v1.4) 7 + http://www.broofa.com 8 + mailto:robert@broofa.com 9 + Copyright (c) 2010 Robert Kieffer 10 + Dual licensed under the MIT and GPL licenses. 11 + */ 12 + 13 + /** 14 + * Generates a unique id. 15 + * 16 + * @param {String} [prefix] if provided the UUID will be prefixed. 17 + * @param {Number} [len] if provided a UUID with given length will be created. 18 + * @return A generated uuid. 19 + */ 20 + export function uuid(prefix, len) { 21 + if (prefix && prefix[prefix.length - 1] !== '-') { 22 + prefix = prefix.concat('-'); 23 + } 24 + const chars = '0123456789abcdefghijklmnopqrstuvwxyz'.split(''); 25 + const uuid = []; 26 + const radix = 16; 27 + let idx; 28 + len = len || 32; 29 + if (len) { 30 + // Compact form 31 + for (idx = 0; idx < len; idx++) uuid[idx] = chars[0 | (Math.random() * radix)]; 32 + } else { 33 + // rfc4122, version 4 form 34 + let r; 35 + // rfc4122 requires these characters 36 + uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'; 37 + uuid[14] = '4'; 38 + // Fill in random data. At i==19 set the high bits of clock sequence as 39 + // per rfc4122, sec. 4.1.5 40 + for (idx = 0; idx < 36; idx++) { 41 + if (!uuid[idx]) { 42 + r = 0 | (Math.random() * 16); 43 + uuid[idx] = chars[idx === 19 ? (r & 0x3) | 0x8 : r]; 44 + } 45 + } 46 + } 47 + return (prefix || '') + uuid.join(''); 48 + } 49 + 50 + export function formatDate(dateString, withTime) { 51 + const date = new Date(dateString); 52 + if (withTime) { 53 + if (date.toDateString() === new Date().toDateString()) { 54 + // on same day, only show the time 55 + return date.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true }); 56 + } else { 57 + return date.toLocaleDateString('en-US', { 58 + month: 'short', 59 + day: 'numeric', 60 + year: 'numberic', 61 + hour: 'numeric', 62 + minute: 'numeric', 63 + hour12: true 64 + }); 65 + } 66 + } else { 67 + return date.toLocaleDateString('en-US', { 68 + month: 'short', 69 + day: 'numeric', 70 + year: 'numeric' 71 + }); 72 + } 73 + } 74 + 75 + export function debounce(node, params) { 76 + let timer; 77 + 78 + return { 79 + update() { 80 + clearTimeout(timer); 81 + timer = setTimeout(params.func, params.duration); 82 + }, 83 + destroy() { 84 + clearTimeout(timer); 85 + } 86 + }; 87 + } 88 + 89 + export function extractTeaser(body) { 90 + const teaser = [...body.querySelectorAll('p')].map(n => n.textContent).join(' '); 91 + if (teaser.length > 512) { 92 + return teaser.slice(0, 512).concat('…'); 93 + } else { 94 + return teaser; 95 + } 96 + } 97 + 98 + export function resizeImage(file, maxWidth, maxHeight, quality) { 99 + const reader = new FileReader(); 100 + reader.readAsDataURL(file); 101 + return new Promise((resolve, reject) => { 102 + reader.onload = event => { 103 + const image = new Image(); 104 + image.src = event.target.result; 105 + image.onload = () => { 106 + let width = image.width; 107 + let height = image.height; 108 + let newWidth = width; 109 + let newHeight = height; 110 + if (width > maxWidth) { 111 + newWidth = maxWidth; 112 + newHeight = (height * maxWidth) / width; 113 + } 114 + if (newHeight > maxHeight) { 115 + newWidth = (newWidth * maxHeight) / newHeight; 116 + newHeight = maxHeight; 117 + } 118 + const canvas = document.createElement('canvas'); 119 + canvas.width = newWidth; 120 + canvas.height = newHeight; 121 + const context = canvas.getContext('2d'); 122 + context.drawImage(image, 0, 0, newWidth, newHeight); 123 + canvas.toBlob( 124 + blob => { 125 + resolve(blob); 126 + }, 127 + file.type, 128 + quality 129 + ); 130 + }; 131 + image.onerror = error => { 132 + reject(error); 133 + }; 134 + }; 135 + reader.onerror = error => { 136 + reject(error); 137 + }; 138 + }); 139 + } 140 + /** 141 + * Get image dimensions from a file 142 + */ 143 + export async function getDimensions(file) { 144 + return new Promise((resolve, reject) => { 145 + const img = new window.Image(); 146 + img.onload = function () { 147 + resolve({ width: this.width, height: this.height }); 148 + }; 149 + img.onerror = function () { 150 + reject(img.error); 151 + }; 152 + img.src = URL.createObjectURL(file); 153 + }); 154 + } 155 + 156 + export async function fetchJSON(method, url, data = undefined) { 157 + const response = await fetch(url, { 158 + method: method, 159 + body: JSON.stringify(data), 160 + headers: { 161 + 'content-type': 'application/json' 162 + } 163 + }); 164 + if (!response.ok) throw new Error(response.statusText); 165 + const result = await response.json(); 166 + return result; 167 + }
+44
src/lib/uuid.js
··· 1 + /*! 2 + Math.uuid.js (v1.4) 3 + http://www.broofa.com 4 + mailto:robert@broofa.com 5 + Copyright (c) 2010 Robert Kieffer 6 + Dual licensed under the MIT and GPL licenses. 7 + */ 8 + 9 + /** 10 + * Generates a unique id. 11 + * 12 + * @param {String} [prefix] if provided the UUID will be prefixed. 13 + * @param {Number} [len] if provided a UUID with given length will be created. 14 + * @return A generated uuid. 15 + */ 16 + export default function uuid(prefix, len) { 17 + if (prefix && prefix[prefix.length - 1] !== '-') { 18 + prefix = prefix.concat('-'); 19 + } 20 + const chars = '0123456789abcdefghijklmnopqrstuvwxyz'.split(''); 21 + const uuid = []; 22 + const radix = 16; 23 + let idx; 24 + len = len || 32; 25 + if (len) { 26 + // Compact form 27 + for (idx = 0; idx < len; idx++) uuid[idx] = chars[0 | (Math.random() * radix)]; 28 + } else { 29 + // rfc4122, version 4 form 30 + let r; 31 + // rfc4122 requires these characters 32 + uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'; 33 + uuid[14] = '4'; 34 + // Fill in random data. At i==19 set the high bits of clock sequence as 35 + // per rfc4122, sec. 4.1.5 36 + for (idx = 0; idx < 36; idx++) { 37 + if (!uuid[idx]) { 38 + r = 0 | (Math.random() * 16); 39 + uuid[idx] = chars[idx === 19 ? (r & 0x3) | 0x8 : r]; 40 + } 41 + } 42 + } 43 + return (prefix || '') + uuid.join(''); 44 + }
+10
src/routes/+layout.svelte
··· 1 + <script> 2 + import '@fontsource/jost/400.css'; 3 + import '@fontsource/jost/500.css'; 4 + import '@fontsource/jost/600.css'; 5 + import '@fontsource/jost/700.css'; 6 + 7 + import '../app.css'; 8 + </script> 9 + 10 + <slot />
+13
src/routes/+page.server.js
··· 1 + import { getArticles, getPage } from '$lib/api'; 2 + 3 + export async function load({ locals }) { 4 + const currentUser = locals.user; 5 + const articles = await getArticles(); 6 + const page = await getPage('home'); 7 + 8 + return { 9 + currentUser, 10 + articles: articles.slice(0, 3), 11 + page 12 + }; 13 + }
+344
src/routes/+page.svelte
··· 1 + <script> 2 + import EditorToolbar from '$lib/components/EditorToolbar.svelte'; 3 + import PlainText from '$lib/components/PlainText.svelte'; 4 + import RichText from '$lib/components/RichText.svelte'; 5 + import { fetchJSON } from '$lib/util'; 6 + import PrimaryButton from '$lib/components/PrimaryButton.svelte'; 7 + import SecondaryButton from '$lib/components/SecondaryButton.svelte'; 8 + import WebsiteNav from '$lib/components/WebsiteNav.svelte'; 9 + import Modal from '$lib/components/Modal.svelte'; 10 + import LoginMenu from '$lib/components/LoginMenu.svelte'; 11 + import ArticleTeaser from '$lib/components/ArticleTeaser.svelte'; 12 + import Testimonial from '$lib/components/Testimonial.svelte'; 13 + import IntroStep from '$lib/components/IntroStep.svelte'; 14 + import Footer from '$lib/components/Footer.svelte'; 15 + import Image from '$lib/components/Image.svelte'; 16 + import NotEditable from '$lib/components/NotEditable.svelte'; 17 + 18 + export let data; 19 + $: currentUser = data.currentUser; 20 + 21 + // -------------------------------------------------------------------------- 22 + // DEFAULT PAGE CONTENT - AJDUST TO YOUR NEEDS 23 + // -------------------------------------------------------------------------- 24 + 25 + const EMAIL = 'michael@letsken.com'; 26 + 27 + // Can contain spaces but must not contain the + sign 28 + const PHONE_NUMBER = '43 664 1533015'; 29 + 30 + const FAQS_PLACEHOLDER = ` 31 + <h2>Question 1</h2> 32 + <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras mi lectus, pellentesque nec urna eget, pretium dictum arcu. In rutrum pretium leo, id efficitur nisl ullamcorper sit amet.</p> 33 + <h2>Question 2</h2> 34 + <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras mi lectus, pellentesque nec urna eget, pretium dictum arcu. In rutrum pretium leo, id efficitur nisl ullamcorper sit amet.</p> 35 + `; 36 + 37 + const BIO_PLACEHOLDER = ` 38 + <p>Modern tools, such as Svelte and Tailwind allow you to easily hand-craft fast and beautiful websites. What’s missing is the ability to <strong>make edits without changing the source code</strong>.</p> 39 + <p>With this <a href="https://github.com/michael/editable-website">open-source website template</a>, I want to fill that gap.</p> 40 + <p>If you have questions or need any help, contact me.</p> 41 + `; 42 + 43 + const TESTIMONIALS_PLACEHOLDER = [ 44 + { 45 + text: '“Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras mi lectus, pellentesque nec urna eget, pretium dictum arcu. In rutrum pretium leo, id efficitur nisl ullamcorper sit amet.”', 46 + image: '/images/person-placeholder.jpg', 47 + name: 'Jane Doe · jane-doe.org' 48 + } 49 + ]; 50 + 51 + let editable, 52 + title, 53 + testimonials, 54 + faqs, 55 + introStep1, 56 + introStep2, 57 + introStep3, 58 + introStep4, 59 + bioTitle, 60 + bioPicture, 61 + bio, 62 + showUserMenu; 63 + 64 + function initOrReset() { 65 + title = data.page?.title || 'Untitled Website'; 66 + faqs = data.page?.faqs || FAQS_PLACEHOLDER; 67 + 68 + // Make a deep copy 69 + testimonials = JSON.parse(JSON.stringify(data.page?.testimonials || TESTIMONIALS_PLACEHOLDER)); 70 + 71 + introStep1 = JSON.parse( 72 + JSON.stringify( 73 + data.page?.introStep1 || { 74 + label: 'THE PROBLEM', 75 + title: 'The problem statement', 76 + description: 'Describe the problem you are solving in a short sentence.' 77 + } 78 + ) 79 + ); 80 + introStep2 = JSON.parse( 81 + JSON.stringify( 82 + data.page?.introStep2 || { 83 + label: 'THE DREAM', 84 + title: 'This is how it should be.', 85 + description: 'Describe why it should be like that.' 86 + } 87 + ) 88 + ); 89 + introStep3 = JSON.parse( 90 + JSON.stringify( 91 + data.page?.introStep3 || { 92 + label: 'THE REALITY', 93 + title: 'A statement why it is not that easy.', 94 + description: 'Describe the reality a bit more.' 95 + } 96 + ) 97 + ); 98 + introStep4 = JSON.parse( 99 + JSON.stringify( 100 + data.page?.introStep4 || { 101 + label: 'THE PROMISE', 102 + title: 'Still the solution is worth it.', 103 + description: 'And why this is, should be described here.' 104 + } 105 + ) 106 + ); 107 + bioPicture = data.page?.bioPicture || '/images/person-placeholder.jpg'; 108 + bioTitle = data.page?.bioTitle || "Hi, I'm Michael — I want your website to be editable."; 109 + bio = data.page?.bio || BIO_PLACEHOLDER; 110 + editable = false; 111 + } 112 + 113 + // -------------------------------------------------------------------------- 114 + // Page logic 115 + // -------------------------------------------------------------------------- 116 + 117 + function toggleEdit() { 118 + editable = true; 119 + showUserMenu = false; 120 + } 121 + 122 + function addTestimonial() { 123 + testimonials.push({ 124 + text: '“Add a quote text here”', 125 + image: '/images/person-placeholder.jpg', 126 + name: 'Firstname Lastname · example.com' 127 + }); 128 + testimonials = testimonials; // trigger update 129 + } 130 + 131 + function deleteTestimonial(index) { 132 + testimonials.splice(index, 1); 133 + testimonials = testimonials; // trigger update 134 + } 135 + 136 + function moveTestimonial(index, direction) { 137 + let toIndex; 138 + if (direction === 'up' && index > 0) { 139 + toIndex = index - 1; 140 + } else if (direction === 'down' && index < testimonials.length - 1) { 141 + toIndex = index + 1; 142 + } else { 143 + return; // operation not possible 144 + } 145 + // Remove item from original position 146 + const element = testimonials.splice(index, 1)[0]; 147 + // Insert at new position 148 + testimonials.splice(toIndex, 0, element); 149 + testimonials = testimonials; // trigger update 150 + } 151 + 152 + async function savePage() { 153 + try { 154 + // Only persist the start page when logged in as an admin 155 + if (currentUser) { 156 + await fetchJSON('POST', '/api/save-page', { 157 + pageId: 'home', 158 + page: { 159 + title, 160 + faqs, 161 + testimonials, 162 + introStep1, 163 + introStep2, 164 + introStep3, 165 + introStep4, 166 + bioPicture, 167 + bioTitle, 168 + bio 169 + } 170 + }); 171 + } 172 + editable = false; 173 + } catch (err) { 174 + console.error(err); 175 + alert('There was an error. Please try again.'); 176 + } 177 + } 178 + 179 + initOrReset(); 180 + </script> 181 + 182 + <svelte:head> 183 + <title>Make your website editable</title> 184 + <meta name="description" content="Make changes to your website while browsing it." /> 185 + </svelte:head> 186 + 187 + {#if editable} 188 + <EditorToolbar {currentUser} on:cancel={initOrReset} on:save={savePage} /> 189 + {/if} 190 + 191 + <WebsiteNav bind:showUserMenu {currentUser} bind:editable /> 192 + 193 + {#if showUserMenu} 194 + <Modal on:close={() => (showUserMenu = false)}> 195 + <form class="w-full block" method="POST"> 196 + <div class="w-full flex flex-col space-y-4 p-4 sm:p-6"> 197 + <PrimaryButton on:click={toggleEdit}>Edit page</PrimaryButton> 198 + <LoginMenu {currentUser} /> 199 + </div> 200 + </form> 201 + </Modal> 202 + {/if} 203 + 204 + <div> 205 + <div class="max-w-screen-md mx-auto px-6 pt-12 sm:pt-24"> 206 + <NotEditable {editable}> 207 + <svg 208 + class="pb-8 w-14 sm:w-24 mx-auto" 209 + viewBox="0 0 200 200" 210 + fill="none" 211 + xmlns="http://www.w3.org/2000/svg" 212 + > 213 + <path d="M164 110L64 163.768V200L164 147.059V110Z" fill="#111827" /> 214 + <path d="M136 66L36 119.768V156L136 103.059V66Z" fill="#111827" /> 215 + <path d="M164 0L64 53.7684V90L164 37.0588V0Z" fill="#111827" /> 216 + </svg> 217 + </NotEditable> 218 + <h1 class="text-4xl md:text-7xl font-bold text-center"> 219 + <PlainText {editable} bind:content={title} /> 220 + </h1> 221 + <NotEditable {editable}> 222 + <div class="text-center pt-8 pb-4 bounce text-xl">↓</div> 223 + <div class="text-center"> 224 + <PrimaryButton size="lg" type="button" on:click={toggleEdit}>Edit</PrimaryButton> 225 + </div> 226 + </NotEditable> 227 + </div> 228 + </div> 229 + 230 + <div class="pt-12 md:pt-24 border-gray-100 border-b-2"> 231 + <div class="max-w-screen-md mx-auto px-6"> 232 + <div class="relative"> 233 + <div class="w-1 bg-gray-900 absolute inset-0 -top-8 bottom-12 mx-auto z-0"> 234 + <div class="w-4 h-4 rounded-full bg-gray-900 absolute -top-1 -left-[6px]" /> 235 + </div> 236 + <div class="z-10"> 237 + <IntroStep {editable} bind:intro={introStep1} /> 238 + <IntroStep {editable} bind:intro={introStep2} /> 239 + <IntroStep {editable} bind:intro={introStep3} /> 240 + <IntroStep {editable} bind:intro={introStep4} /> 241 + </div> 242 + </div> 243 + <div class="relative h-14"> 244 + <div class="w-1 bg-gray-900 absolute inset-0 -top-16 bottom-12 mx-auto z-0"> 245 + <div 246 + class="absolute -bottom-2 -left-[7px] h-0 w-0 border-x-[9px] border-x-transparent border-t-[10px] border-gray-900" 247 + /> 248 + </div> 249 + </div> 250 + <div class="text-center mb-32"> 251 + <PrimaryButton 252 + size="lg" 253 + type="button" 254 + on:click={() => 255 + document.getElementById('contact').scrollIntoView({ behavior: 'smooth', block: 'start' })} 256 + >Create an editable website</PrimaryButton 257 + > 258 + </div> 259 + </div> 260 + </div> 261 + 262 + <div class="bg-white pb-6 sm:pb-12"> 263 + <div class="max-w-screen-md mx-auto px-6"> 264 + <div class="font-bold text-sm sm:text-base py-12 sm:pt-24 pb-8">WHAT PEOPLE SAY</div> 265 + </div> 266 + {#each testimonials as testimonial, i} 267 + <Testimonial 268 + {editable} 269 + {currentUser} 270 + bind:testimonial 271 + firstEntry={i === 0} 272 + lastEntry={i === testimonials.length - 1} 273 + on:delete={() => deleteTestimonial(i)} 274 + on:up={() => moveTestimonial(i, 'up')} 275 + on:down={() => moveTestimonial(i, 'down')} 276 + /> 277 + {/each} 278 + 279 + {#if editable} 280 + <div class="text-center pb-12 border-b border-gray-100"> 281 + <SecondaryButton on:click={addTestimonial}>Add testimonial</SecondaryButton> 282 + </div> 283 + {/if} 284 + </div> 285 + 286 + {#if data.articles.length > 0} 287 + <NotEditable {editable}> 288 + <div class="bg-white border-t-2 border-gray-100 pb-10 sm:pb-16"> 289 + <div class="max-w-screen-md mx-auto px-6 pt-12 sm:pt-24"> 290 + <div class="font-bold text-sm sm:text-base">FROM THE BLOG</div> 291 + </div> 292 + {#each data.articles as article, i} 293 + <ArticleTeaser {article} firstEntry={i === 0} /> 294 + {/each} 295 + </div> 296 + </NotEditable> 297 + {/if} 298 + 299 + <!-- Bio --> 300 + <div id="contact" class="bg-white border-t-2 border-b-2 border-gray-100 pb-12 sm:pb-24"> 301 + <div class="max-w-screen-md mx-auto px-6"> 302 + <div class="pt-12 sm:pt-24 pb-12 text-center"> 303 + <Image 304 + class="inline-block w-48 h-48 md:w-72 md:h-72 rounded-full" 305 + maxWidth="384" 306 + maxHeight="384" 307 + quality="0.8" 308 + {editable} 309 + {currentUser} 310 + bind:src={bioPicture} 311 + alt="Michael Aufreiter" 312 + /> 313 + </div> 314 + <div class=""> 315 + <h1 class="text-3xl md:text-5xl font-bold"> 316 + <PlainText {editable} bind:content={bioTitle} /> 317 + </h1> 318 + </div> 319 + <div class="prose md:prose-xl pb-6"> 320 + <RichText multiLine {editable} bind:content={bio} /> 321 + </div> 322 + 323 + <NotEditable {editable}> 324 + <div class="flex flex-col sm:flex-row sm:space-x-6 md:space-x-8 space-y-4 sm:space-y-0"> 325 + <PrimaryButton size="lg" href={`mailto:${EMAIL}`}>Email</PrimaryButton> 326 + <SecondaryButton size="lg" href={`https://wa.me/${PHONE_NUMBER.replace(/\s+/g, '')}`}> 327 + WhatsApp (+{PHONE_NUMBER}) 328 + </SecondaryButton> 329 + </div> 330 + </NotEditable> 331 + </div> 332 + </div> 333 + 334 + <!-- FAQs --> 335 + <div class="bg-white"> 336 + <div class="max-w-screen-md mx-auto px-6"> 337 + <div class="font-bold text-sm sm:text-base pt-12 sm:pt-24 -mb-6 md:-mb-12">FAQs</div> 338 + <div class="prose md:prose-xl pb-12 sm:pb-24"> 339 + <RichText multiLine {editable} bind:content={faqs} /> 340 + </div> 341 + </div> 342 + </div> 343 + 344 + <Footer counter="/" {editable} />
+7
src/routes/api/counter/+server.js
··· 1 + import { createOrUpdateCounter } from '$lib/api'; 2 + import { json } from '@sveltejs/kit'; 3 + 4 + export async function GET({ url }) { 5 + const counterId = url.searchParams.get('c'); 6 + return json(await createOrUpdateCounter(counterId, true)); 7 + }
+9
src/routes/api/create-article/+server.js
··· 1 + import { json } from '@sveltejs/kit'; 2 + import { createArticle } from '$lib/api'; 3 + 4 + export async function POST({ request, locals }) { 5 + const currentUser = locals.user; 6 + const { title, content, teaser } = await request.json(); 7 + const { slug } = await createArticle(title, content, teaser, currentUser); 8 + return json({ slug }); 9 + }
+9
src/routes/api/delete-article/+server.js
··· 1 + import { json } from '@sveltejs/kit'; 2 + import { deleteArticle } from '$lib/api'; 3 + 4 + export async function POST({ request, locals }) { 5 + const user = locals.user; 6 + const { slug } = await request.json(); 7 + const result = await deleteArticle(slug, user); 8 + return json(result); 9 + }
+42
src/routes/api/presignedurl/+server.js
··· 1 + const S3_ENDPOINT = import.meta.env.VITE_S3_ENDPOINT; 2 + const S3_ACCESS_KEY = import.meta.env.VITE_S3_ACCESS_KEY; 3 + const S3_SECRET_ACCESS_KEY = import.meta.env.VITE_S3_SECRET_ACCESS_KEY; 4 + const S3_BUCKET = import.meta.env.VITE_S3_BUCKET; 5 + 6 + import aws from 'aws-sdk'; 7 + import { json } from '@sveltejs/kit'; 8 + 9 + // Create a new S3 instance for interacting with our MinIO space. We use S3 because 10 + // the API is the same between MinIO and AWS S3. 11 + const spaces = new aws.S3({ 12 + endpoint: new aws.Endpoint(S3_ENDPOINT), 13 + accessKeyId: S3_ACCESS_KEY, 14 + secretAccessKey: S3_SECRET_ACCESS_KEY, 15 + // the two lines below need to be enabled to make it work with MinIO on Northflank 16 + signatureVersion: 'v4', 17 + s3ForcePathStyle: true 18 + }); 19 + 20 + export function GET({ url, locals }) { 21 + const currentUser = locals.user; 22 + const path = url.searchParams.get('path'); // e.g. 'nachmachen/test/meh.jpg' 23 + const type = url.searchParams.get('type'); // e.g. 'image/jpeg' 24 + if (!currentUser) throw new Error('Not authorized'); 25 + 26 + const params = { 27 + Bucket: S3_BUCKET, 28 + Key: path, 29 + Expires: 60 * 20, // Expires in 20 minutes 30 + ContentType: type, 31 + ACL: 'public-read' // Remove this to make the file private 32 + }; 33 + 34 + let signedUrl = spaces.getSignedUrl('putObject', params); 35 + // console.log('signedUrl', signedUrl); 36 + // console.log('S3_ACCESS_KEY', S3_ACCESS_KEY); 37 + // console.log('S3_SECRET_ACCESS_KEY', S3_SECRET_ACCESS_KEY); 38 + // console.log('S3_ENDPOINT', S3_ENDPOINT); 39 + // console.log('S3_BUCKET', S3_BUCKET); 40 + // Returns https://nachmachen.minio.nachmachen-assets--8j8fmgtqfmwp.addon.code.run/nachmachen/... 41 + return json({ signedUrl }); 42 + }
+9
src/routes/api/save-page/+server.js
··· 1 + import { json } from '@sveltejs/kit'; 2 + import { createOrUpdatePage } from '$lib/api'; 3 + 4 + export async function POST({ request, locals }) { 5 + const currentUser = locals.user; 6 + const { pageId, page } = await request.json(); 7 + await createOrUpdatePage(pageId, page, currentUser); 8 + return json({ pageId, status: 'ok' }); 9 + }
+8
src/routes/api/search/+server.js
··· 1 + import { search } from '$lib/api'; 2 + import { json } from '@sveltejs/kit'; 3 + 4 + export async function GET({ url, locals }) { 5 + const currentUser = locals.user; 6 + const searchQuery = url.searchParams.get('q') || ''; 7 + return json(await search(searchQuery, currentUser)); 8 + }
+9
src/routes/api/update-article/+server.js
··· 1 + import { json } from '@sveltejs/kit'; 2 + import { updateArticle } from '$lib/api'; 3 + 4 + export async function POST({ request, locals }) { 5 + const currentUser = locals.user; 6 + const { slug, title, content, teaser } = await request.json(); 7 + await updateArticle(slug, title, content, teaser, currentUser); 8 + return json({ slug, status: 'ok' }); 9 + }
+11
src/routes/blog/+page.server.js
··· 1 + import { getArticles } from '$lib/api'; 2 + 3 + export async function load({ locals }) { 4 + const currentUser = locals.user; 5 + const articles = await getArticles(currentUser); 6 + 7 + return { 8 + currentUser, 9 + articles 10 + }; 11 + }
+52
src/routes/blog/+page.svelte
··· 1 + <script> 2 + import { goto } from '$app/navigation'; 3 + import PrimaryButton from '$lib/components/PrimaryButton.svelte'; 4 + import WebsiteNav from '$lib/components/WebsiteNav.svelte'; 5 + import Modal from '$lib/components/Modal.svelte'; 6 + import LoginMenu from '$lib/components/LoginMenu.svelte'; 7 + import ArticleTeaser from '$lib/components/ArticleTeaser.svelte'; 8 + import Footer from '$lib/components/Footer.svelte'; 9 + import EditableWebsiteTeaser from '$lib/components/EditableWebsiteTeaser.svelte'; 10 + 11 + export let data; 12 + let showUserMenu; 13 + 14 + $: currentUser = data.currentUser; 15 + </script> 16 + 17 + <svelte:head> 18 + <title>Blog</title> 19 + <meta name="description" content="What you always wanted to know about web development." /> 20 + </svelte:head> 21 + 22 + <WebsiteNav bind:showUserMenu {currentUser} /> 23 + 24 + {#if showUserMenu} 25 + <Modal on:close={() => (showUserMenu = false)}> 26 + <form class="w-full block" method="POST"> 27 + <div class="w-full flex flex-col space-y-4 p-4 sm:p-6"> 28 + <PrimaryButton type="button" on:click={() => goto('/blog/new')}> 29 + New blog post 30 + </PrimaryButton> 31 + <LoginMenu {currentUser} /> 32 + </div> 33 + </form> 34 + </Modal> 35 + {/if} 36 + 37 + <div class="pb-8"> 38 + <div class="max-w-screen-md mx-auto px-6 pt-12 sm:pt-24"> 39 + <div class="font-bold text-sm">LATEST ARTICLES</div> 40 + {#if data.articles.length === 0} 41 + <div class="md:text-xl py-4">No blog posts have been published so far.</div> 42 + {/if} 43 + </div> 44 + 45 + {#each data.articles as article, i} 46 + <ArticleTeaser {article} firstEntry={i === 0} /> 47 + {/each} 48 + </div> 49 + 50 + <EditableWebsiteTeaser /> 51 + 52 + <Footer counter="/blog" />
+12
src/routes/blog/[slug]/+page.server.js
··· 1 + import { getArticleBySlug, getNextArticle } from '$lib/api'; 2 + 3 + export async function load({ params, locals }) { 4 + const currentUser = locals.user; 5 + const data = await getArticleBySlug(params.slug); 6 + const articles = [await getNextArticle(params.slug)]; 7 + return { 8 + ...data, 9 + currentUser, 10 + articles 11 + }; 12 + }
+119
src/routes/blog/[slug]/+page.svelte
··· 1 + <script> 2 + import EditorToolbar from '$lib/components/EditorToolbar.svelte'; 3 + import { extractTeaser, fetchJSON } from '$lib/util'; 4 + import PrimaryButton from '$lib/components/PrimaryButton.svelte'; 5 + import WebsiteNav from '$lib/components/WebsiteNav.svelte'; 6 + import Modal from '$lib/components/Modal.svelte'; 7 + import LoginMenu from '$lib/components/LoginMenu.svelte'; 8 + import { goto } from '$app/navigation'; 9 + import Footer from '$lib/components/Footer.svelte'; 10 + import ArticleTeaser from '$lib/components/ArticleTeaser.svelte'; 11 + import EditableWebsiteTeaser from '$lib/components/EditableWebsiteTeaser.svelte'; 12 + import Article from '$lib/components/Article.svelte'; 13 + import NotEditable from '$lib/components/NotEditable.svelte'; 14 + 15 + export let data; 16 + 17 + let showUserMenu = false; 18 + let editable, title, teaser, content, publishedAt, updatedAt; 19 + 20 + $: currentUser = data.currentUser; 21 + 22 + $: { 23 + // HACK: To make sure this is only run when the parent passes in new data 24 + data = data; 25 + initOrReset(); 26 + } 27 + 28 + function initOrReset() { 29 + title = data.title; 30 + teaser = data.teaser; 31 + content = data.content; 32 + publishedAt = data.publishedAt; 33 + updatedAt = data.updatedAt; 34 + editable = false; 35 + } 36 + 37 + function toggleEdit() { 38 + editable = true; 39 + showUserMenu = false; 40 + } 41 + 42 + async function deleteArticle() { 43 + if (!currentUser) return alert('Sorry, you are not authorized.'); 44 + try { 45 + fetchJSON('POST', '/api/delete-article', { 46 + slug: data.slug 47 + }); 48 + goto('/blog'); 49 + } catch (err) { 50 + console.error(err); 51 + alert('Error deleting the article. Try again.'); 52 + window.location.reload(); 53 + } 54 + } 55 + 56 + async function saveArticle() { 57 + if (!currentUser) return alert('Sorry, you are not authorized.'); 58 + const teaser = extractTeaser(document.getElementById('article_content')); 59 + try { 60 + const result = await fetchJSON('POST', '/api/update-article', { 61 + slug: data.slug, 62 + title, 63 + content, 64 + teaser 65 + }); 66 + updatedAt = result.updatedAt; 67 + editable = false; 68 + } catch (err) { 69 + console.error(err); 70 + alert( 71 + 'There was an error. You can try again, but before that, please just copy and paste your article into a safe place.' 72 + ); 73 + } 74 + } 75 + </script> 76 + 77 + <svelte:head> 78 + <title>{title}</title> 79 + <meta name="description" content={teaser} /> 80 + </svelte:head> 81 + 82 + {#if editable} 83 + <EditorToolbar {currentUser} on:cancel={initOrReset} on:save={saveArticle} /> 84 + {/if} 85 + 86 + <WebsiteNav bind:editable bind:showUserMenu {currentUser} /> 87 + 88 + {#if showUserMenu} 89 + <Modal on:close={() => (showUserMenu = false)}> 90 + <form class="w-full block" method="POST"> 91 + <div class="w-full flex flex-col space-y-4 p-4 sm:p-6"> 92 + <PrimaryButton on:click={toggleEdit}>Edit post</PrimaryButton> 93 + <PrimaryButton type="button" on:click={deleteArticle}>Delete post</PrimaryButton> 94 + <LoginMenu {currentUser} /> 95 + </div> 96 + </form> 97 + </Modal> 98 + {/if} 99 + 100 + <Article bind:title bind:content bind:publishedAt {editable} /> 101 + 102 + {#if data.articles.length > 0} 103 + <NotEditable {editable}> 104 + <div class="border-t-2 border-gray-100"> 105 + <div class="max-w-screen-md mx-auto px-6 pt-8 sm:pt-12"> 106 + <div class="font-bold text-sm">READ NEXT</div> 107 + </div> 108 + {#each data.articles as article, i} 109 + <ArticleTeaser {article} firstEntry={i === 0} /> 110 + {/each} 111 + </div> 112 + </NotEditable> 113 + {/if} 114 + 115 + <NotEditable {editable}> 116 + <EditableWebsiteTeaser /> 117 + </NotEditable> 118 + 119 + <Footer counter={`/blog/${data.slug}`} />
+6
src/routes/blog/new/+page.server.js
··· 1 + export async function load({ locals }) { 2 + const currentUser = locals.user; 3 + return { 4 + currentUser 5 + }; 6 + }
+58
src/routes/blog/new/+page.svelte
··· 1 + <script> 2 + import EditorToolbar from '$lib/components/EditorToolbar.svelte'; 3 + import { extractTeaser, fetchJSON } from '$lib/util'; 4 + import WebsiteNav from '$lib/components/WebsiteNav.svelte'; 5 + import { goto } from '$app/navigation'; 6 + import Footer from '$lib/components/Footer.svelte'; 7 + import EditableWebsiteTeaser from '$lib/components/EditableWebsiteTeaser.svelte'; 8 + import Article from '$lib/components/Article.svelte'; 9 + import NotEditable from '$lib/components/NotEditable.svelte'; 10 + 11 + export let data; 12 + 13 + let showUserMenu = false, 14 + editable = true, 15 + title = 'Untitled', 16 + content = 'Copy and paste your text here.'; 17 + 18 + $: currentUser = data.currentUser; 19 + 20 + async function createArticle() { 21 + if (!currentUser) { 22 + return alert('Sorry, you are not authorized to create new articles.'); 23 + } 24 + const teaser = extractTeaser(document.getElementById('article_content')); 25 + try { 26 + const { slug } = await fetchJSON('POST', '/api/create-article', { 27 + title, 28 + content, 29 + teaser 30 + }); 31 + goto(`/blog/${slug}`); 32 + } catch (err) { 33 + console.error(err); 34 + alert('A document with that title has already been published. Choose a different title.'); 35 + } 36 + } 37 + 38 + async function discardDraft() { 39 + goto('/blog'); 40 + } 41 + </script> 42 + 43 + <svelte:head> 44 + <title>New blog post</title> 45 + </svelte:head> 46 + 47 + {#if editable} 48 + <EditorToolbar {currentUser} on:cancel={discardDraft} on:save={createArticle} /> 49 + {/if} 50 + 51 + <WebsiteNav bind:editable bind:showUserMenu {currentUser} /> 52 + <Article bind:title bind:content {editable} /> 53 + 54 + <NotEditable {editable}> 55 + <EditableWebsiteTeaser /> 56 + </NotEditable> 57 + 58 + <Footer {editable} />
+10
src/routes/imprint/+page.server.js
··· 1 + import { getPage } from '$lib/api'; 2 + 3 + export async function load({ locals }) { 4 + const currentUser = locals.user; 5 + const page = await getPage('imprint'); 6 + return { 7 + currentUser, 8 + page 9 + }; 10 + }
+97
src/routes/imprint/+page.svelte
··· 1 + <script> 2 + import WebsiteNav from '$lib/components/WebsiteNav.svelte'; 3 + import Footer from '$lib/components/Footer.svelte'; 4 + import PlainText from '$lib/components/PlainText.svelte'; 5 + import RichText from '$lib/components/RichText.svelte'; 6 + import Modal from '$lib/components/Modal.svelte'; 7 + import LoginMenu from '$lib/components/LoginMenu.svelte'; 8 + import PrimaryButton from '$lib/components/PrimaryButton.svelte'; 9 + import EditorToolbar from '$lib/components/EditorToolbar.svelte'; 10 + import { fetchJSON } from '$lib/util'; 11 + 12 + export let data; 13 + $: currentUser = data.currentUser; 14 + 15 + let editable = false, 16 + showUserMenu = false, 17 + title, 18 + imprint; 19 + 20 + // -------------------------------------------------------------------------- 21 + // DEFAULT PAGE CONTENT - AJDUST TO YOUR NEEDS 22 + // -------------------------------------------------------------------------- 23 + 24 + function initOrReset() { 25 + title = data.page?.title || 'Imprint'; 26 + imprint = 27 + data.page?.imprint || 28 + [ 29 + ['Ken Experiences GmbH', 'Mozartstraße 56', '4020 Linz, Austria'].join('<br/>'), 30 + [ 31 + 'Managing Director: DI Michael Aufreiter', 32 + 'Register No: FN 408728x', 33 + 'Court: Linz', 34 + 'VAT ID: ATU68395257' 35 + ].join('<br/>') 36 + ] 37 + .map(text => `<p>${text}</p>`) 38 + .join('\n'); 39 + editable = false; 40 + } 41 + 42 + initOrReset(); 43 + 44 + function toggleEdit() { 45 + editable = true; 46 + showUserMenu = false; 47 + } 48 + 49 + async function savePage() { 50 + if (!currentUser) return alert('Sorry, you are not authorized.'); 51 + try { 52 + fetchJSON('POST', '/api/save-page', { 53 + pageId: 'imprint', 54 + page: { 55 + title, 56 + imprint 57 + } 58 + }); 59 + editable = false; 60 + } catch (err) { 61 + console.error(err); 62 + alert('There was an error. Please try again.'); 63 + } 64 + } 65 + </script> 66 + 67 + <svelte:head> 68 + <title>Imprint</title> 69 + </svelte:head> 70 + 71 + {#if showUserMenu} 72 + <Modal on:close={() => (showUserMenu = false)}> 73 + <div class="w-full flex flex-col space-y-4 p-4 sm:p-6"> 74 + <PrimaryButton on:click={toggleEdit}>Edit page</PrimaryButton> 75 + <LoginMenu {currentUser} /> 76 + </div> 77 + </Modal> 78 + {/if} 79 + 80 + {#if editable} 81 + <EditorToolbar on:cancel={initOrReset} on:save={savePage} /> 82 + {/if} 83 + 84 + <WebsiteNav bind:showUserMenu {currentUser} bind:editable /> 85 + 86 + <div class="py-12 sm:py-24"> 87 + <div class="max-w-screen-md mx-auto px-6 md:text-xl"> 88 + <h1 class="text-4xl md:text-7xl font-bold pb-8"> 89 + <PlainText {editable} bind:content={title} /> 90 + </h1> 91 + <div class="prose md:prose-xl pb-12 sm:pb-24"> 92 + <RichText multiLine {editable} bind:content={imprint} /> 93 + </div> 94 + </div> 95 + </div> 96 + 97 + <Footer counter="/imprint" />
+18
src/routes/login/+page.server.js
··· 1 + import { redirect, fail } from '@sveltejs/kit'; 2 + import { authenticate } from '$lib/api'; 3 + 4 + export const actions = { 5 + default: async ({ cookies, request }) => { 6 + const data = await request.formData(); 7 + const password = data.get('password'); 8 + const sessionTimeout = 60 * 24 * 7; // one week in minutes 9 + try { 10 + const { sessionId } = await authenticate(password, sessionTimeout); 11 + cookies.set('sessionid', sessionId); 12 + } catch (err) { 13 + console.error(err); 14 + return fail(400, { incorrect: true }); 15 + } 16 + throw redirect(303, '/'); 17 + } 18 + };
+30
src/routes/login/+page.svelte
··· 1 + <script> 2 + import Limiter from '$lib/components/Limiter.svelte'; 3 + import PrimaryButton from '$lib/components/PrimaryButton.svelte'; 4 + import Input from '$lib/components/Input.svelte'; 5 + export let form; 6 + </script> 7 + 8 + <svelte:head> 9 + <title>Anmelden</title> 10 + </svelte:head> 11 + 12 + <Limiter> 13 + {#if form?.incorrect} 14 + <p class="p-4 bg-red-100 text-red-600 my-4 rounded-md">Login incorrect. Please try again.</p> 15 + {/if} 16 + <div class="w-full flex flex-col space-y-4 mt-12 mb-4"> 17 + <form method="POST" class="flex flex-col space-y-8"> 18 + <!-- <div class="flex flex-col"> 19 + <label for="email" class="font-semibold mb-2">E-Mail</label> 20 + <Input type="text" name="email" id="email" /> 21 + </div> --> 22 + <div class="flex flex-col"> 23 + <label for="password" class="font-semibold mb-2 text-2xl">Enter Admin password</label> 24 + <Input type="password" name="password" id="password" /> 25 + </div> 26 + <PrimaryButton type="submit">Login</PrimaryButton> 27 + <div><a class="underline" href="/">Return to the homepage</a></div> 28 + </form> 29 + </div> 30 + </Limiter>
+13
src/routes/logout/+page.server.js
··· 1 + import { fail } from '@sveltejs/kit'; 2 + import { destroySession } from '$lib/api'; 3 + 4 + export async function load({ cookies }) { 5 + const sessionId = cookies.get('sessionid'); 6 + try { 7 + await destroySession(sessionId); 8 + cookies.delete('sessionid'); 9 + } catch (err) { 10 + console.error(err); 11 + return fail(400, { incorrect: true }); 12 + } 13 + }
+14
src/routes/logout/+page.svelte
··· 1 + <script> 2 + import Limiter from '$lib/components/Limiter.svelte'; 3 + export let form; 4 + </script> 5 + 6 + <Limiter> 7 + <div class="pt-20"> 8 + {#if form?.incorrect} 9 + <p class="p-4 bg-red-100 text-red-600 my-4 rounded-md">Error while signing out.</p> 10 + {:else} 11 + Successfully logged out. <a class="underline" href="/">Continue</a>. 12 + {/if} 13 + </div> 14 + </Limiter>
static/favicon-144x144.png

This is a binary file and will not be displayed.

static/favicon-192x192.png

This is a binary file and will not be displayed.

static/favicon-256x256.png

This is a binary file and will not be displayed.

static/favicon-32x32.png

This is a binary file and will not be displayed.

static/favicon-384x384.png

This is a binary file and will not be displayed.

static/favicon-48x48.png

This is a binary file and will not be displayed.

static/favicon-512x512.png

This is a binary file and will not be displayed.

static/favicon-72x72.png

This is a binary file and will not be displayed.

static/favicon-96x96.png

This is a binary file and will not be displayed.

static/favicon.png

This is a binary file and will not be displayed.

static/images/person-placeholder.jpg

This is a binary file and will not be displayed.

+46
static/manifest.webmanifest
··· 1 + { 2 + "name": "Make your website editable", 3 + "short_name": "Editable Website", 4 + "icons": [ 5 + { 6 + "src": "/favicon-48x48.png?v=9d77a4ce079ca15fd3da4b420a2e7cf6", 7 + "sizes": "48x48", 8 + "type": "image/png" 9 + }, 10 + { 11 + "src": "/favicon-72x72.png?v=9d77a4ce079ca15fd3da4b420a2e7cf6", 12 + "sizes": "72x72", 13 + "type": "image/png" 14 + }, 15 + { 16 + "src": "/favicon-96x96.png?v=9d77a4ce079ca15fd3da4b420a2e7cf6", 17 + "sizes": "96x96", 18 + "type": "image/png" 19 + }, 20 + { 21 + "src": "/favicon-144x144.png?v=9d77a4ce079ca15fd3da4b420a2e7cf6", 22 + "sizes": "144x144", 23 + "type": "image/png" 24 + }, 25 + { 26 + "src": "/favicon-192x192.png?v=9d77a4ce079ca15fd3da4b420a2e7cf6", 27 + "sizes": "192x192", 28 + "type": "image/png" 29 + }, 30 + { 31 + "src": "/favicon-256x256.png?v=9d77a4ce079ca15fd3da4b420a2e7cf6", 32 + "sizes": "256x256", 33 + "type": "image/png" 34 + }, 35 + { 36 + "src": "/favicon-384x384.png?v=9d77a4ce079ca15fd3da4b420a2e7cf6", 37 + "sizes": "384x384", 38 + "type": "image/png" 39 + }, 40 + { 41 + "src": "/favicon-512x512.png?v=9d77a4ce079ca15fd3da4b420a2e7cf6", 42 + "sizes": "512x512", 43 + "type": "image/png" 44 + } 45 + ] 46 + }
+15
svelte.config.js
··· 1 + import adapter from '@sveltejs/adapter-node'; 2 + import { vitePreprocess } from '@sveltejs/kit/vite'; 3 + 4 + /** @type {import('@sveltejs/kit').Config} */ 5 + const config = { 6 + kit: { 7 + adapter: adapter(), 8 + csrf: { 9 + checkOrigin: false 10 + } 11 + }, 12 + preprocess: vitePreprocess() 13 + }; 14 + 15 + export default config;
+68
tailwind.config.js
··· 1 + import forms from '@tailwindcss/forms'; 2 + import typography from '@tailwindcss/typography'; 3 + 4 + const round = num => 5 + num 6 + .toFixed(7) 7 + .replace(/(\.[0-9]+?)0+$/, '$1') 8 + .replace(/\.0$/, ''); 9 + const em = (px, base) => `${round(px / base)}em`; 10 + 11 + /** @type {import('tailwindcss').Config} */ 12 + export default { 13 + content: ['./src/**/*.{html,js,svelte,ts}'], 14 + theme: { 15 + fontFamily: { 16 + sans: ['Jost', 'system-ui'] 17 + }, 18 + extend: { 19 + typography: { 20 + DEFAULT: { 21 + css: { 22 + h2: { 23 + fontSize: em(20, 14), 24 + marginTop: em(32, 20), 25 + marginBottom: em(4, 20), 26 + lineHeight: round(28 / 20) 27 + }, 28 + blockquote: { 29 + fontWeight: 'normal', 30 + fontStyle: 'normal', 31 + color: '', 32 + borderLeftWidth: '0.25rem', 33 + borderLeftColor: 'var(--tw-prose-quote-borders)', 34 + quotes: '' 35 + }, 36 + 'blockquote p:first-of-type::before': { 37 + content: '' 38 + }, 39 + 'blockquote p:last-of-type::after': { 40 + content: '' 41 + } 42 + } 43 + }, 44 + lg: { 45 + css: { 46 + h2: { 47 + fontSize: em(30, 18), 48 + marginTop: em(56, 30), 49 + marginBottom: em(4, 20), 50 + lineHeight: round(40 / 30) 51 + } 52 + } 53 + }, 54 + xl: { 55 + css: { 56 + h2: { 57 + fontSize: em(30, 18), 58 + marginTop: em(56, 30), 59 + marginBottom: em(4, 20), 60 + lineHeight: round(40 / 30) 61 + } 62 + } 63 + } 64 + } 65 + } 66 + }, 67 + plugins: [forms, typography] 68 + };
+7
vite.config.js
··· 1 + import { sveltekit } from '@sveltejs/kit/vite'; 2 + 3 + const config = { 4 + plugins: [sveltekit()] 5 + }; 6 + 7 + export default config;