├── .gitignore ├── .npmrc ├── .typesafe-i18n.json ├── README.md ├── package.json ├── pnpm-lock.yaml ├── src ├── app.d.ts ├── app.html ├── hooks.server.ts ├── i18n │ ├── ar │ │ └── index.ts │ ├── de │ │ └── index.ts │ ├── en │ │ └── index.ts │ ├── formatters.ts │ ├── i18n-svelte.ts │ ├── i18n-types.ts │ ├── i18n-util.async.ts │ ├── i18n-util.sync.ts │ ├── i18n-util.ts │ └── it │ │ └── index.ts ├── lib │ ├── HeadHrefLangs.svelte │ ├── Header.svelte │ └── LocaleSwitcher.svelte ├── params │ └── lang.ts ├── routes │ ├── +layout.server.ts │ ├── +layout.svelte │ ├── +layout.ts │ ├── [lang=lang] │ │ ├── +page.server.ts │ │ ├── +page.svelte │ │ └── +page.ts │ └── api │ │ └── spectators │ │ └── +server.ts ├── styles │ └── global.scss └── utils.ts ├── static └── favicon.png ├── svelte.config.js ├── tsconfig.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | vite.config.js.timestamp-* 10 | vite.config.ts.timestamp-* 11 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | resolution-mode=highest 3 | -------------------------------------------------------------------------------- /.typesafe-i18n.json: -------------------------------------------------------------------------------- 1 | { 2 | "adapter": "svelte", 3 | "$schema": "https://unpkg.com/typesafe-i18n@5.26.0/schema/typesafe-i18n.json" 4 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # typesafe-i18n demo sveltekit 2 | 3 | **Here is a [video](https://www.youtube.com/watch?v=C6O5pMMMTG0) for better context.** _SvelteKit has undergone some major changes since this video was published. For the most up-to-date way of handling i18n, please refer to the code in this repository._ 4 | 5 | This example demonstrates a [`typesafe-i18n`](https://github.com/ivanhofer/typesafe-i18n)-integration with [SvelteKit](https://kit.svelte.dev/). 6 | 7 | [!IMPORTANT] 8 | Make sure you adopt `app.d.ts` for full TypeScript type inference. More context [here]([url](https://github.com/ivanhofer/typesafe-i18n/discussions/717#discussioncomment-6640503)) 9 | 10 | ### LIVE-DEMO: https://typesafe-i18n-demo-sveltekit.vercel.app 11 | 12 | It is a basic example and shows: 13 | 14 | - basic i18n setup of three different locales 15 | - auto-detecting user language preferences 16 | - full SSR support 17 | - SEO optimizations 18 | - locale switching 19 | - lazy loading of locales 20 | - persistent locale state via language routes 21 | - typesafety features of `typesafe-i18n` 22 | - plural rules 23 | - locale specific date-formatting 24 | - [`rel="alternate"` links](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel#attr-alternate) 25 | - [`hreflang` attribute](https://developer.mozilla.org/de/docs/Web/HTML/Element/a#attr-hreflang) 26 | 27 | What is missing: 28 | 29 | - opinion how to localize slugs\ 30 | this highly depends where your data comes from. This will probably differ from project to project. 31 | 32 | ## JavaScript version 33 | 34 | You can find the exact same example in a JavaScript only version [here](https://github.com/ivanhofer/typesafe-i18n-demo-sveltekit-jsdoc).\ 35 | It offers the same typesafety features but instead of TypeScript files it is written in JavaScript with JsDoc comments. 36 | 37 | ## learn more 38 | 39 | If you want to know more about `typesafe-i18n` head over to the main repo: 40 | 41 | ### https://github.com/ivanhofer/typesafe-i18n 42 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typesafe-i18n-demo-sveltekit", 3 | "description": "Showcase of typesafe-i18n working in a SvelteKit project", 4 | "version": "1.0.0", 5 | "author": "ivanhofer", 6 | "license": "MIT", 7 | "homepage": "https://github.com/ivanhofer/typesafe-i18n-demo-sveltekit", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/ivanhofer/typesafe-i18n-demo-sveltekit" 11 | }, 12 | "scripts": { 13 | "dev": "npm-run-all --parallel vite typesafe-i18n", 14 | "vite": "vite dev", 15 | "build": "vite build", 16 | "preview": "vite preview", 17 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 18 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 19 | "typesafe-i18n": "typesafe-i18n" 20 | }, 21 | "devDependencies": { 22 | "@sveltejs/adapter-auto": "^2.1.0", 23 | "@sveltejs/kit": "^1.22.1", 24 | "npm-run-all": "^4.1.5", 25 | "sass": "^1.63.6", 26 | "svelte": "^4.0.5", 27 | "svelte-check": "^3.4.5", 28 | "tslib": "^2.6.0", 29 | "typesafe-i18n": "^5.24.3", 30 | "typescript": "^5.1.6", 31 | "vite": "^4.4.2" 32 | }, 33 | "type": "module" 34 | } 35 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | devDependencies: 4 | '@sveltejs/adapter-auto': 5 | specifier: ^2.1.0 6 | version: 2.1.0(@sveltejs/kit@1.22.1) 7 | '@sveltejs/kit': 8 | specifier: ^1.22.1 9 | version: 1.22.1(svelte@4.0.5)(vite@4.4.2) 10 | npm-run-all: 11 | specifier: ^4.1.5 12 | version: 4.1.5 13 | sass: 14 | specifier: ^1.63.6 15 | version: 1.63.6 16 | svelte: 17 | specifier: ^4.0.5 18 | version: 4.0.5 19 | svelte-check: 20 | specifier: ^3.4.5 21 | version: 3.4.5(sass@1.63.6)(svelte@4.0.5) 22 | tslib: 23 | specifier: ^2.6.0 24 | version: 2.6.0 25 | typesafe-i18n: 26 | specifier: ^5.24.3 27 | version: 5.24.3(typescript@5.1.6) 28 | typescript: 29 | specifier: ^5.1.6 30 | version: 5.1.6 31 | vite: 32 | specifier: ^4.4.2 33 | version: 4.4.2(sass@1.63.6) 34 | 35 | packages: 36 | 37 | /@ampproject/remapping@2.2.1: 38 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 39 | engines: {node: '>=6.0.0'} 40 | dependencies: 41 | '@jridgewell/gen-mapping': 0.3.3 42 | '@jridgewell/trace-mapping': 0.3.18 43 | dev: true 44 | 45 | /@esbuild/android-arm64@0.18.11: 46 | resolution: {integrity: sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==} 47 | engines: {node: '>=12'} 48 | cpu: [arm64] 49 | os: [android] 50 | requiresBuild: true 51 | dev: true 52 | optional: true 53 | 54 | /@esbuild/android-arm@0.18.11: 55 | resolution: {integrity: sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==} 56 | engines: {node: '>=12'} 57 | cpu: [arm] 58 | os: [android] 59 | requiresBuild: true 60 | dev: true 61 | optional: true 62 | 63 | /@esbuild/android-x64@0.18.11: 64 | resolution: {integrity: sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==} 65 | engines: {node: '>=12'} 66 | cpu: [x64] 67 | os: [android] 68 | requiresBuild: true 69 | dev: true 70 | optional: true 71 | 72 | /@esbuild/darwin-arm64@0.18.11: 73 | resolution: {integrity: sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==} 74 | engines: {node: '>=12'} 75 | cpu: [arm64] 76 | os: [darwin] 77 | requiresBuild: true 78 | dev: true 79 | optional: true 80 | 81 | /@esbuild/darwin-x64@0.18.11: 82 | resolution: {integrity: sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==} 83 | engines: {node: '>=12'} 84 | cpu: [x64] 85 | os: [darwin] 86 | requiresBuild: true 87 | dev: true 88 | optional: true 89 | 90 | /@esbuild/freebsd-arm64@0.18.11: 91 | resolution: {integrity: sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==} 92 | engines: {node: '>=12'} 93 | cpu: [arm64] 94 | os: [freebsd] 95 | requiresBuild: true 96 | dev: true 97 | optional: true 98 | 99 | /@esbuild/freebsd-x64@0.18.11: 100 | resolution: {integrity: sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==} 101 | engines: {node: '>=12'} 102 | cpu: [x64] 103 | os: [freebsd] 104 | requiresBuild: true 105 | dev: true 106 | optional: true 107 | 108 | /@esbuild/linux-arm64@0.18.11: 109 | resolution: {integrity: sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==} 110 | engines: {node: '>=12'} 111 | cpu: [arm64] 112 | os: [linux] 113 | requiresBuild: true 114 | dev: true 115 | optional: true 116 | 117 | /@esbuild/linux-arm@0.18.11: 118 | resolution: {integrity: sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==} 119 | engines: {node: '>=12'} 120 | cpu: [arm] 121 | os: [linux] 122 | requiresBuild: true 123 | dev: true 124 | optional: true 125 | 126 | /@esbuild/linux-ia32@0.18.11: 127 | resolution: {integrity: sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==} 128 | engines: {node: '>=12'} 129 | cpu: [ia32] 130 | os: [linux] 131 | requiresBuild: true 132 | dev: true 133 | optional: true 134 | 135 | /@esbuild/linux-loong64@0.18.11: 136 | resolution: {integrity: sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==} 137 | engines: {node: '>=12'} 138 | cpu: [loong64] 139 | os: [linux] 140 | requiresBuild: true 141 | dev: true 142 | optional: true 143 | 144 | /@esbuild/linux-mips64el@0.18.11: 145 | resolution: {integrity: sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==} 146 | engines: {node: '>=12'} 147 | cpu: [mips64el] 148 | os: [linux] 149 | requiresBuild: true 150 | dev: true 151 | optional: true 152 | 153 | /@esbuild/linux-ppc64@0.18.11: 154 | resolution: {integrity: sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==} 155 | engines: {node: '>=12'} 156 | cpu: [ppc64] 157 | os: [linux] 158 | requiresBuild: true 159 | dev: true 160 | optional: true 161 | 162 | /@esbuild/linux-riscv64@0.18.11: 163 | resolution: {integrity: sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==} 164 | engines: {node: '>=12'} 165 | cpu: [riscv64] 166 | os: [linux] 167 | requiresBuild: true 168 | dev: true 169 | optional: true 170 | 171 | /@esbuild/linux-s390x@0.18.11: 172 | resolution: {integrity: sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==} 173 | engines: {node: '>=12'} 174 | cpu: [s390x] 175 | os: [linux] 176 | requiresBuild: true 177 | dev: true 178 | optional: true 179 | 180 | /@esbuild/linux-x64@0.18.11: 181 | resolution: {integrity: sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==} 182 | engines: {node: '>=12'} 183 | cpu: [x64] 184 | os: [linux] 185 | requiresBuild: true 186 | dev: true 187 | optional: true 188 | 189 | /@esbuild/netbsd-x64@0.18.11: 190 | resolution: {integrity: sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==} 191 | engines: {node: '>=12'} 192 | cpu: [x64] 193 | os: [netbsd] 194 | requiresBuild: true 195 | dev: true 196 | optional: true 197 | 198 | /@esbuild/openbsd-x64@0.18.11: 199 | resolution: {integrity: sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==} 200 | engines: {node: '>=12'} 201 | cpu: [x64] 202 | os: [openbsd] 203 | requiresBuild: true 204 | dev: true 205 | optional: true 206 | 207 | /@esbuild/sunos-x64@0.18.11: 208 | resolution: {integrity: sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==} 209 | engines: {node: '>=12'} 210 | cpu: [x64] 211 | os: [sunos] 212 | requiresBuild: true 213 | dev: true 214 | optional: true 215 | 216 | /@esbuild/win32-arm64@0.18.11: 217 | resolution: {integrity: sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==} 218 | engines: {node: '>=12'} 219 | cpu: [arm64] 220 | os: [win32] 221 | requiresBuild: true 222 | dev: true 223 | optional: true 224 | 225 | /@esbuild/win32-ia32@0.18.11: 226 | resolution: {integrity: sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==} 227 | engines: {node: '>=12'} 228 | cpu: [ia32] 229 | os: [win32] 230 | requiresBuild: true 231 | dev: true 232 | optional: true 233 | 234 | /@esbuild/win32-x64@0.18.11: 235 | resolution: {integrity: sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==} 236 | engines: {node: '>=12'} 237 | cpu: [x64] 238 | os: [win32] 239 | requiresBuild: true 240 | dev: true 241 | optional: true 242 | 243 | /@jridgewell/gen-mapping@0.3.3: 244 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 245 | engines: {node: '>=6.0.0'} 246 | dependencies: 247 | '@jridgewell/set-array': 1.1.2 248 | '@jridgewell/sourcemap-codec': 1.4.15 249 | '@jridgewell/trace-mapping': 0.3.18 250 | dev: true 251 | 252 | /@jridgewell/resolve-uri@3.1.0: 253 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 254 | engines: {node: '>=6.0.0'} 255 | dev: true 256 | 257 | /@jridgewell/set-array@1.1.2: 258 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 259 | engines: {node: '>=6.0.0'} 260 | dev: true 261 | 262 | /@jridgewell/sourcemap-codec@1.4.14: 263 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 264 | dev: true 265 | 266 | /@jridgewell/sourcemap-codec@1.4.15: 267 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 268 | dev: true 269 | 270 | /@jridgewell/trace-mapping@0.3.18: 271 | resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} 272 | dependencies: 273 | '@jridgewell/resolve-uri': 3.1.0 274 | '@jridgewell/sourcemap-codec': 1.4.14 275 | dev: true 276 | 277 | /@nodelib/fs.scandir@2.1.5: 278 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 279 | engines: {node: '>= 8'} 280 | dependencies: 281 | '@nodelib/fs.stat': 2.0.5 282 | run-parallel: 1.2.0 283 | dev: true 284 | 285 | /@nodelib/fs.stat@2.0.5: 286 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 287 | engines: {node: '>= 8'} 288 | dev: true 289 | 290 | /@nodelib/fs.walk@1.2.8: 291 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 292 | engines: {node: '>= 8'} 293 | dependencies: 294 | '@nodelib/fs.scandir': 2.1.5 295 | fastq: 1.15.0 296 | dev: true 297 | 298 | /@polka/url@1.0.0-next.21: 299 | resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} 300 | dev: true 301 | 302 | /@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.22.1): 303 | resolution: {integrity: sha512-o2pZCfATFtA/Gw/BB0Xm7k4EYaekXxaPGER3xGSY3FvzFJGTlJlZjBseaXwYSM94lZ0HniOjTokN3cWaLX6fow==} 304 | peerDependencies: 305 | '@sveltejs/kit': ^1.0.0 306 | dependencies: 307 | '@sveltejs/kit': 1.22.1(svelte@4.0.5)(vite@4.4.2) 308 | import-meta-resolve: 3.0.0 309 | dev: true 310 | 311 | /@sveltejs/kit@1.22.1(svelte@4.0.5)(vite@4.4.2): 312 | resolution: {integrity: sha512-idFhKVEHuCKbTETvuo3V7UShqSYX9JMKVJXP546dOTkh5ZRejo5XtKtsB5TCSwNBa0TH8hIV44/bnylaFhM1Vg==} 313 | engines: {node: ^16.14 || >=18} 314 | hasBin: true 315 | requiresBuild: true 316 | peerDependencies: 317 | svelte: ^3.54.0 || ^4.0.0-next.0 318 | vite: ^4.0.0 319 | dependencies: 320 | '@sveltejs/vite-plugin-svelte': 2.4.2(svelte@4.0.5)(vite@4.4.2) 321 | '@types/cookie': 0.5.1 322 | cookie: 0.5.0 323 | devalue: 4.3.2 324 | esm-env: 1.0.0 325 | kleur: 4.1.5 326 | magic-string: 0.30.1 327 | mime: 3.0.0 328 | sade: 1.8.1 329 | set-cookie-parser: 2.6.0 330 | sirv: 2.0.3 331 | svelte: 4.0.5 332 | undici: 5.22.1 333 | vite: 4.4.2(sass@1.63.6) 334 | transitivePeerDependencies: 335 | - supports-color 336 | dev: true 337 | 338 | /@sveltejs/vite-plugin-svelte-inspector@1.0.3(@sveltejs/vite-plugin-svelte@2.4.2)(svelte@4.0.5)(vite@4.4.2): 339 | resolution: {integrity: sha512-Khdl5jmmPN6SUsVuqSXatKpQTMIifoQPDanaxC84m9JxIibWvSABJyHpyys0Z+1yYrxY5TTEQm+6elh0XCMaOA==} 340 | engines: {node: ^14.18.0 || >= 16} 341 | peerDependencies: 342 | '@sveltejs/vite-plugin-svelte': ^2.2.0 343 | svelte: ^3.54.0 || ^4.0.0 344 | vite: ^4.0.0 345 | dependencies: 346 | '@sveltejs/vite-plugin-svelte': 2.4.2(svelte@4.0.5)(vite@4.4.2) 347 | debug: 4.3.4 348 | svelte: 4.0.5 349 | vite: 4.4.2(sass@1.63.6) 350 | transitivePeerDependencies: 351 | - supports-color 352 | dev: true 353 | 354 | /@sveltejs/vite-plugin-svelte@2.4.2(svelte@4.0.5)(vite@4.4.2): 355 | resolution: {integrity: sha512-ePfcC48ftMKhkT0OFGdOyycYKnnkT6i/buzey+vHRTR/JpQvuPzzhf1PtKqCDQfJRgoPSN2vscXs6gLigx/zGw==} 356 | engines: {node: ^14.18.0 || >= 16} 357 | peerDependencies: 358 | svelte: ^3.54.0 || ^4.0.0 359 | vite: ^4.0.0 360 | dependencies: 361 | '@sveltejs/vite-plugin-svelte-inspector': 1.0.3(@sveltejs/vite-plugin-svelte@2.4.2)(svelte@4.0.5)(vite@4.4.2) 362 | debug: 4.3.4 363 | deepmerge: 4.3.1 364 | kleur: 4.1.5 365 | magic-string: 0.30.1 366 | svelte: 4.0.5 367 | svelte-hmr: 0.15.2(svelte@4.0.5) 368 | vite: 4.4.2(sass@1.63.6) 369 | vitefu: 0.2.4(vite@4.4.2) 370 | transitivePeerDependencies: 371 | - supports-color 372 | dev: true 373 | 374 | /@types/cookie@0.5.1: 375 | resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} 376 | dev: true 377 | 378 | /@types/estree@1.0.1: 379 | resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} 380 | dev: true 381 | 382 | /@types/pug@2.0.6: 383 | resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} 384 | dev: true 385 | 386 | /acorn@8.10.0: 387 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 388 | engines: {node: '>=0.4.0'} 389 | hasBin: true 390 | dev: true 391 | 392 | /ansi-styles@3.2.1: 393 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 394 | engines: {node: '>=4'} 395 | dependencies: 396 | color-convert: 1.9.3 397 | dev: true 398 | 399 | /anymatch@3.1.3: 400 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 401 | engines: {node: '>= 8'} 402 | dependencies: 403 | normalize-path: 3.0.0 404 | picomatch: 2.3.1 405 | dev: true 406 | 407 | /aria-query@5.3.0: 408 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} 409 | dependencies: 410 | dequal: 2.0.3 411 | dev: true 412 | 413 | /array-buffer-byte-length@1.0.0: 414 | resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} 415 | dependencies: 416 | call-bind: 1.0.2 417 | is-array-buffer: 3.0.2 418 | dev: true 419 | 420 | /available-typed-arrays@1.0.5: 421 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 422 | engines: {node: '>= 0.4'} 423 | dev: true 424 | 425 | /axobject-query@3.2.1: 426 | resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} 427 | dependencies: 428 | dequal: 2.0.3 429 | dev: true 430 | 431 | /balanced-match@1.0.2: 432 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 433 | dev: true 434 | 435 | /binary-extensions@2.2.0: 436 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 437 | engines: {node: '>=8'} 438 | dev: true 439 | 440 | /brace-expansion@1.1.11: 441 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 442 | dependencies: 443 | balanced-match: 1.0.2 444 | concat-map: 0.0.1 445 | dev: true 446 | 447 | /braces@3.0.2: 448 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 449 | engines: {node: '>=8'} 450 | dependencies: 451 | fill-range: 7.0.1 452 | dev: true 453 | 454 | /buffer-crc32@0.2.13: 455 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 456 | dev: true 457 | 458 | /busboy@1.6.0: 459 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 460 | engines: {node: '>=10.16.0'} 461 | dependencies: 462 | streamsearch: 1.1.0 463 | dev: true 464 | 465 | /call-bind@1.0.2: 466 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 467 | dependencies: 468 | function-bind: 1.1.1 469 | get-intrinsic: 1.2.1 470 | dev: true 471 | 472 | /callsites@3.1.0: 473 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 474 | engines: {node: '>=6'} 475 | dev: true 476 | 477 | /chalk@2.4.2: 478 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 479 | engines: {node: '>=4'} 480 | dependencies: 481 | ansi-styles: 3.2.1 482 | escape-string-regexp: 1.0.5 483 | supports-color: 5.5.0 484 | dev: true 485 | 486 | /chokidar@3.5.3: 487 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 488 | engines: {node: '>= 8.10.0'} 489 | dependencies: 490 | anymatch: 3.1.3 491 | braces: 3.0.2 492 | glob-parent: 5.1.2 493 | is-binary-path: 2.1.0 494 | is-glob: 4.0.3 495 | normalize-path: 3.0.0 496 | readdirp: 3.6.0 497 | optionalDependencies: 498 | fsevents: 2.3.2 499 | dev: true 500 | 501 | /code-red@1.0.3: 502 | resolution: {integrity: sha512-kVwJELqiILQyG5aeuyKFbdsI1fmQy1Cmf7dQ8eGmVuJoaRVdwey7WaMknr2ZFeVSYSKT0rExsa8EGw0aoI/1QQ==} 503 | dependencies: 504 | '@jridgewell/sourcemap-codec': 1.4.15 505 | '@types/estree': 1.0.1 506 | acorn: 8.10.0 507 | estree-walker: 3.0.3 508 | periscopic: 3.1.0 509 | dev: true 510 | 511 | /color-convert@1.9.3: 512 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 513 | dependencies: 514 | color-name: 1.1.3 515 | dev: true 516 | 517 | /color-name@1.1.3: 518 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 519 | dev: true 520 | 521 | /concat-map@0.0.1: 522 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 523 | dev: true 524 | 525 | /cookie@0.5.0: 526 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 527 | engines: {node: '>= 0.6'} 528 | dev: true 529 | 530 | /cross-spawn@6.0.5: 531 | resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} 532 | engines: {node: '>=4.8'} 533 | dependencies: 534 | nice-try: 1.0.5 535 | path-key: 2.0.1 536 | semver: 5.7.1 537 | shebang-command: 1.2.0 538 | which: 1.3.1 539 | dev: true 540 | 541 | /css-tree@2.3.1: 542 | resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} 543 | engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 544 | dependencies: 545 | mdn-data: 2.0.30 546 | source-map-js: 1.0.2 547 | dev: true 548 | 549 | /debug@4.3.4: 550 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 551 | engines: {node: '>=6.0'} 552 | peerDependencies: 553 | supports-color: '*' 554 | peerDependenciesMeta: 555 | supports-color: 556 | optional: true 557 | dependencies: 558 | ms: 2.1.2 559 | dev: true 560 | 561 | /deepmerge@4.3.1: 562 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 563 | engines: {node: '>=0.10.0'} 564 | dev: true 565 | 566 | /define-properties@1.2.0: 567 | resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} 568 | engines: {node: '>= 0.4'} 569 | dependencies: 570 | has-property-descriptors: 1.0.0 571 | object-keys: 1.1.1 572 | dev: true 573 | 574 | /dequal@2.0.3: 575 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 576 | engines: {node: '>=6'} 577 | dev: true 578 | 579 | /detect-indent@6.1.0: 580 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 581 | engines: {node: '>=8'} 582 | dev: true 583 | 584 | /devalue@4.3.2: 585 | resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} 586 | dev: true 587 | 588 | /error-ex@1.3.2: 589 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 590 | dependencies: 591 | is-arrayish: 0.2.1 592 | dev: true 593 | 594 | /es-abstract@1.21.2: 595 | resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} 596 | engines: {node: '>= 0.4'} 597 | dependencies: 598 | array-buffer-byte-length: 1.0.0 599 | available-typed-arrays: 1.0.5 600 | call-bind: 1.0.2 601 | es-set-tostringtag: 2.0.1 602 | es-to-primitive: 1.2.1 603 | function.prototype.name: 1.1.5 604 | get-intrinsic: 1.2.1 605 | get-symbol-description: 1.0.0 606 | globalthis: 1.0.3 607 | gopd: 1.0.1 608 | has: 1.0.3 609 | has-property-descriptors: 1.0.0 610 | has-proto: 1.0.1 611 | has-symbols: 1.0.3 612 | internal-slot: 1.0.5 613 | is-array-buffer: 3.0.2 614 | is-callable: 1.2.7 615 | is-negative-zero: 2.0.2 616 | is-regex: 1.1.4 617 | is-shared-array-buffer: 1.0.2 618 | is-string: 1.0.7 619 | is-typed-array: 1.1.10 620 | is-weakref: 1.0.2 621 | object-inspect: 1.12.3 622 | object-keys: 1.1.1 623 | object.assign: 4.1.4 624 | regexp.prototype.flags: 1.5.0 625 | safe-regex-test: 1.0.0 626 | string.prototype.trim: 1.2.7 627 | string.prototype.trimend: 1.0.6 628 | string.prototype.trimstart: 1.0.6 629 | typed-array-length: 1.0.4 630 | unbox-primitive: 1.0.2 631 | which-typed-array: 1.1.9 632 | dev: true 633 | 634 | /es-set-tostringtag@2.0.1: 635 | resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} 636 | engines: {node: '>= 0.4'} 637 | dependencies: 638 | get-intrinsic: 1.2.1 639 | has: 1.0.3 640 | has-tostringtag: 1.0.0 641 | dev: true 642 | 643 | /es-to-primitive@1.2.1: 644 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 645 | engines: {node: '>= 0.4'} 646 | dependencies: 647 | is-callable: 1.2.7 648 | is-date-object: 1.0.5 649 | is-symbol: 1.0.4 650 | dev: true 651 | 652 | /es6-promise@3.3.1: 653 | resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} 654 | dev: true 655 | 656 | /esbuild@0.18.11: 657 | resolution: {integrity: sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==} 658 | engines: {node: '>=12'} 659 | hasBin: true 660 | requiresBuild: true 661 | optionalDependencies: 662 | '@esbuild/android-arm': 0.18.11 663 | '@esbuild/android-arm64': 0.18.11 664 | '@esbuild/android-x64': 0.18.11 665 | '@esbuild/darwin-arm64': 0.18.11 666 | '@esbuild/darwin-x64': 0.18.11 667 | '@esbuild/freebsd-arm64': 0.18.11 668 | '@esbuild/freebsd-x64': 0.18.11 669 | '@esbuild/linux-arm': 0.18.11 670 | '@esbuild/linux-arm64': 0.18.11 671 | '@esbuild/linux-ia32': 0.18.11 672 | '@esbuild/linux-loong64': 0.18.11 673 | '@esbuild/linux-mips64el': 0.18.11 674 | '@esbuild/linux-ppc64': 0.18.11 675 | '@esbuild/linux-riscv64': 0.18.11 676 | '@esbuild/linux-s390x': 0.18.11 677 | '@esbuild/linux-x64': 0.18.11 678 | '@esbuild/netbsd-x64': 0.18.11 679 | '@esbuild/openbsd-x64': 0.18.11 680 | '@esbuild/sunos-x64': 0.18.11 681 | '@esbuild/win32-arm64': 0.18.11 682 | '@esbuild/win32-ia32': 0.18.11 683 | '@esbuild/win32-x64': 0.18.11 684 | dev: true 685 | 686 | /escape-string-regexp@1.0.5: 687 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 688 | engines: {node: '>=0.8.0'} 689 | dev: true 690 | 691 | /esm-env@1.0.0: 692 | resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} 693 | dev: true 694 | 695 | /estree-walker@3.0.3: 696 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 697 | dependencies: 698 | '@types/estree': 1.0.1 699 | dev: true 700 | 701 | /fast-glob@3.3.0: 702 | resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} 703 | engines: {node: '>=8.6.0'} 704 | dependencies: 705 | '@nodelib/fs.stat': 2.0.5 706 | '@nodelib/fs.walk': 1.2.8 707 | glob-parent: 5.1.2 708 | merge2: 1.4.1 709 | micromatch: 4.0.5 710 | dev: true 711 | 712 | /fastq@1.15.0: 713 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 714 | dependencies: 715 | reusify: 1.0.4 716 | dev: true 717 | 718 | /fill-range@7.0.1: 719 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 720 | engines: {node: '>=8'} 721 | dependencies: 722 | to-regex-range: 5.0.1 723 | dev: true 724 | 725 | /for-each@0.3.3: 726 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 727 | dependencies: 728 | is-callable: 1.2.7 729 | dev: true 730 | 731 | /fs.realpath@1.0.0: 732 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 733 | dev: true 734 | 735 | /fsevents@2.3.2: 736 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 737 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 738 | os: [darwin] 739 | requiresBuild: true 740 | dev: true 741 | optional: true 742 | 743 | /function-bind@1.1.1: 744 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 745 | dev: true 746 | 747 | /function.prototype.name@1.1.5: 748 | resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} 749 | engines: {node: '>= 0.4'} 750 | dependencies: 751 | call-bind: 1.0.2 752 | define-properties: 1.2.0 753 | es-abstract: 1.21.2 754 | functions-have-names: 1.2.3 755 | dev: true 756 | 757 | /functions-have-names@1.2.3: 758 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 759 | dev: true 760 | 761 | /get-intrinsic@1.2.1: 762 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 763 | dependencies: 764 | function-bind: 1.1.1 765 | has: 1.0.3 766 | has-proto: 1.0.1 767 | has-symbols: 1.0.3 768 | dev: true 769 | 770 | /get-symbol-description@1.0.0: 771 | resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} 772 | engines: {node: '>= 0.4'} 773 | dependencies: 774 | call-bind: 1.0.2 775 | get-intrinsic: 1.2.1 776 | dev: true 777 | 778 | /glob-parent@5.1.2: 779 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 780 | engines: {node: '>= 6'} 781 | dependencies: 782 | is-glob: 4.0.3 783 | dev: true 784 | 785 | /glob@7.2.3: 786 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 787 | dependencies: 788 | fs.realpath: 1.0.0 789 | inflight: 1.0.6 790 | inherits: 2.0.4 791 | minimatch: 3.1.2 792 | once: 1.4.0 793 | path-is-absolute: 1.0.1 794 | dev: true 795 | 796 | /globalthis@1.0.3: 797 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} 798 | engines: {node: '>= 0.4'} 799 | dependencies: 800 | define-properties: 1.2.0 801 | dev: true 802 | 803 | /gopd@1.0.1: 804 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 805 | dependencies: 806 | get-intrinsic: 1.2.1 807 | dev: true 808 | 809 | /graceful-fs@4.2.11: 810 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 811 | dev: true 812 | 813 | /has-bigints@1.0.2: 814 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 815 | dev: true 816 | 817 | /has-flag@3.0.0: 818 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 819 | engines: {node: '>=4'} 820 | dev: true 821 | 822 | /has-property-descriptors@1.0.0: 823 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 824 | dependencies: 825 | get-intrinsic: 1.2.1 826 | dev: true 827 | 828 | /has-proto@1.0.1: 829 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 830 | engines: {node: '>= 0.4'} 831 | dev: true 832 | 833 | /has-symbols@1.0.3: 834 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 835 | engines: {node: '>= 0.4'} 836 | dev: true 837 | 838 | /has-tostringtag@1.0.0: 839 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 840 | engines: {node: '>= 0.4'} 841 | dependencies: 842 | has-symbols: 1.0.3 843 | dev: true 844 | 845 | /has@1.0.3: 846 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 847 | engines: {node: '>= 0.4.0'} 848 | dependencies: 849 | function-bind: 1.1.1 850 | dev: true 851 | 852 | /hosted-git-info@2.8.9: 853 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 854 | dev: true 855 | 856 | /immutable@4.3.0: 857 | resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} 858 | dev: true 859 | 860 | /import-fresh@3.3.0: 861 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 862 | engines: {node: '>=6'} 863 | dependencies: 864 | parent-module: 1.0.1 865 | resolve-from: 4.0.0 866 | dev: true 867 | 868 | /import-meta-resolve@3.0.0: 869 | resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} 870 | dev: true 871 | 872 | /inflight@1.0.6: 873 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 874 | dependencies: 875 | once: 1.4.0 876 | wrappy: 1.0.2 877 | dev: true 878 | 879 | /inherits@2.0.4: 880 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 881 | dev: true 882 | 883 | /internal-slot@1.0.5: 884 | resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} 885 | engines: {node: '>= 0.4'} 886 | dependencies: 887 | get-intrinsic: 1.2.1 888 | has: 1.0.3 889 | side-channel: 1.0.4 890 | dev: true 891 | 892 | /is-array-buffer@3.0.2: 893 | resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} 894 | dependencies: 895 | call-bind: 1.0.2 896 | get-intrinsic: 1.2.1 897 | is-typed-array: 1.1.10 898 | dev: true 899 | 900 | /is-arrayish@0.2.1: 901 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 902 | dev: true 903 | 904 | /is-bigint@1.0.4: 905 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 906 | dependencies: 907 | has-bigints: 1.0.2 908 | dev: true 909 | 910 | /is-binary-path@2.1.0: 911 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 912 | engines: {node: '>=8'} 913 | dependencies: 914 | binary-extensions: 2.2.0 915 | dev: true 916 | 917 | /is-boolean-object@1.1.2: 918 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 919 | engines: {node: '>= 0.4'} 920 | dependencies: 921 | call-bind: 1.0.2 922 | has-tostringtag: 1.0.0 923 | dev: true 924 | 925 | /is-callable@1.2.7: 926 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 927 | engines: {node: '>= 0.4'} 928 | dev: true 929 | 930 | /is-core-module@2.12.1: 931 | resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} 932 | dependencies: 933 | has: 1.0.3 934 | dev: true 935 | 936 | /is-date-object@1.0.5: 937 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 938 | engines: {node: '>= 0.4'} 939 | dependencies: 940 | has-tostringtag: 1.0.0 941 | dev: true 942 | 943 | /is-extglob@2.1.1: 944 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 945 | engines: {node: '>=0.10.0'} 946 | dev: true 947 | 948 | /is-glob@4.0.3: 949 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 950 | engines: {node: '>=0.10.0'} 951 | dependencies: 952 | is-extglob: 2.1.1 953 | dev: true 954 | 955 | /is-negative-zero@2.0.2: 956 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} 957 | engines: {node: '>= 0.4'} 958 | dev: true 959 | 960 | /is-number-object@1.0.7: 961 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 962 | engines: {node: '>= 0.4'} 963 | dependencies: 964 | has-tostringtag: 1.0.0 965 | dev: true 966 | 967 | /is-number@7.0.0: 968 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 969 | engines: {node: '>=0.12.0'} 970 | dev: true 971 | 972 | /is-reference@3.0.1: 973 | resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} 974 | dependencies: 975 | '@types/estree': 1.0.1 976 | dev: true 977 | 978 | /is-regex@1.1.4: 979 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 980 | engines: {node: '>= 0.4'} 981 | dependencies: 982 | call-bind: 1.0.2 983 | has-tostringtag: 1.0.0 984 | dev: true 985 | 986 | /is-shared-array-buffer@1.0.2: 987 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 988 | dependencies: 989 | call-bind: 1.0.2 990 | dev: true 991 | 992 | /is-string@1.0.7: 993 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 994 | engines: {node: '>= 0.4'} 995 | dependencies: 996 | has-tostringtag: 1.0.0 997 | dev: true 998 | 999 | /is-symbol@1.0.4: 1000 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1001 | engines: {node: '>= 0.4'} 1002 | dependencies: 1003 | has-symbols: 1.0.3 1004 | dev: true 1005 | 1006 | /is-typed-array@1.1.10: 1007 | resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} 1008 | engines: {node: '>= 0.4'} 1009 | dependencies: 1010 | available-typed-arrays: 1.0.5 1011 | call-bind: 1.0.2 1012 | for-each: 0.3.3 1013 | gopd: 1.0.1 1014 | has-tostringtag: 1.0.0 1015 | dev: true 1016 | 1017 | /is-weakref@1.0.2: 1018 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1019 | dependencies: 1020 | call-bind: 1.0.2 1021 | dev: true 1022 | 1023 | /isexe@2.0.0: 1024 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1025 | dev: true 1026 | 1027 | /json-parse-better-errors@1.0.2: 1028 | resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} 1029 | dev: true 1030 | 1031 | /kleur@4.1.5: 1032 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 1033 | engines: {node: '>=6'} 1034 | dev: true 1035 | 1036 | /load-json-file@4.0.0: 1037 | resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} 1038 | engines: {node: '>=4'} 1039 | dependencies: 1040 | graceful-fs: 4.2.11 1041 | parse-json: 4.0.0 1042 | pify: 3.0.0 1043 | strip-bom: 3.0.0 1044 | dev: true 1045 | 1046 | /locate-character@3.0.0: 1047 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 1048 | dev: true 1049 | 1050 | /magic-string@0.27.0: 1051 | resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} 1052 | engines: {node: '>=12'} 1053 | dependencies: 1054 | '@jridgewell/sourcemap-codec': 1.4.15 1055 | dev: true 1056 | 1057 | /magic-string@0.30.1: 1058 | resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==} 1059 | engines: {node: '>=12'} 1060 | dependencies: 1061 | '@jridgewell/sourcemap-codec': 1.4.15 1062 | dev: true 1063 | 1064 | /mdn-data@2.0.30: 1065 | resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} 1066 | dev: true 1067 | 1068 | /memorystream@0.3.1: 1069 | resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} 1070 | engines: {node: '>= 0.10.0'} 1071 | dev: true 1072 | 1073 | /merge2@1.4.1: 1074 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1075 | engines: {node: '>= 8'} 1076 | dev: true 1077 | 1078 | /micromatch@4.0.5: 1079 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1080 | engines: {node: '>=8.6'} 1081 | dependencies: 1082 | braces: 3.0.2 1083 | picomatch: 2.3.1 1084 | dev: true 1085 | 1086 | /mime@3.0.0: 1087 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 1088 | engines: {node: '>=10.0.0'} 1089 | hasBin: true 1090 | dev: true 1091 | 1092 | /min-indent@1.0.1: 1093 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 1094 | engines: {node: '>=4'} 1095 | dev: true 1096 | 1097 | /minimatch@3.1.2: 1098 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1099 | dependencies: 1100 | brace-expansion: 1.1.11 1101 | dev: true 1102 | 1103 | /minimist@1.2.8: 1104 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1105 | dev: true 1106 | 1107 | /mkdirp@0.5.6: 1108 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1109 | hasBin: true 1110 | dependencies: 1111 | minimist: 1.2.8 1112 | dev: true 1113 | 1114 | /mri@1.2.0: 1115 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1116 | engines: {node: '>=4'} 1117 | dev: true 1118 | 1119 | /mrmime@1.0.1: 1120 | resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} 1121 | engines: {node: '>=10'} 1122 | dev: true 1123 | 1124 | /ms@2.1.2: 1125 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1126 | dev: true 1127 | 1128 | /nanoid@3.3.6: 1129 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 1130 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1131 | hasBin: true 1132 | dev: true 1133 | 1134 | /nice-try@1.0.5: 1135 | resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} 1136 | dev: true 1137 | 1138 | /normalize-package-data@2.5.0: 1139 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 1140 | dependencies: 1141 | hosted-git-info: 2.8.9 1142 | resolve: 1.22.2 1143 | semver: 5.7.1 1144 | validate-npm-package-license: 3.0.4 1145 | dev: true 1146 | 1147 | /normalize-path@3.0.0: 1148 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1149 | engines: {node: '>=0.10.0'} 1150 | dev: true 1151 | 1152 | /npm-run-all@4.1.5: 1153 | resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} 1154 | engines: {node: '>= 4'} 1155 | hasBin: true 1156 | dependencies: 1157 | ansi-styles: 3.2.1 1158 | chalk: 2.4.2 1159 | cross-spawn: 6.0.5 1160 | memorystream: 0.3.1 1161 | minimatch: 3.1.2 1162 | pidtree: 0.3.1 1163 | read-pkg: 3.0.0 1164 | shell-quote: 1.8.1 1165 | string.prototype.padend: 3.1.4 1166 | dev: true 1167 | 1168 | /object-inspect@1.12.3: 1169 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 1170 | dev: true 1171 | 1172 | /object-keys@1.1.1: 1173 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1174 | engines: {node: '>= 0.4'} 1175 | dev: true 1176 | 1177 | /object.assign@4.1.4: 1178 | resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} 1179 | engines: {node: '>= 0.4'} 1180 | dependencies: 1181 | call-bind: 1.0.2 1182 | define-properties: 1.2.0 1183 | has-symbols: 1.0.3 1184 | object-keys: 1.1.1 1185 | dev: true 1186 | 1187 | /once@1.4.0: 1188 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1189 | dependencies: 1190 | wrappy: 1.0.2 1191 | dev: true 1192 | 1193 | /parent-module@1.0.1: 1194 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1195 | engines: {node: '>=6'} 1196 | dependencies: 1197 | callsites: 3.1.0 1198 | dev: true 1199 | 1200 | /parse-json@4.0.0: 1201 | resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} 1202 | engines: {node: '>=4'} 1203 | dependencies: 1204 | error-ex: 1.3.2 1205 | json-parse-better-errors: 1.0.2 1206 | dev: true 1207 | 1208 | /path-is-absolute@1.0.1: 1209 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1210 | engines: {node: '>=0.10.0'} 1211 | dev: true 1212 | 1213 | /path-key@2.0.1: 1214 | resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} 1215 | engines: {node: '>=4'} 1216 | dev: true 1217 | 1218 | /path-parse@1.0.7: 1219 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1220 | dev: true 1221 | 1222 | /path-type@3.0.0: 1223 | resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} 1224 | engines: {node: '>=4'} 1225 | dependencies: 1226 | pify: 3.0.0 1227 | dev: true 1228 | 1229 | /periscopic@3.1.0: 1230 | resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} 1231 | dependencies: 1232 | '@types/estree': 1.0.1 1233 | estree-walker: 3.0.3 1234 | is-reference: 3.0.1 1235 | dev: true 1236 | 1237 | /picocolors@1.0.0: 1238 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1239 | dev: true 1240 | 1241 | /picomatch@2.3.1: 1242 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1243 | engines: {node: '>=8.6'} 1244 | dev: true 1245 | 1246 | /pidtree@0.3.1: 1247 | resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} 1248 | engines: {node: '>=0.10'} 1249 | hasBin: true 1250 | dev: true 1251 | 1252 | /pify@3.0.0: 1253 | resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} 1254 | engines: {node: '>=4'} 1255 | dev: true 1256 | 1257 | /postcss@8.4.25: 1258 | resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==} 1259 | engines: {node: ^10 || ^12 || >=14} 1260 | dependencies: 1261 | nanoid: 3.3.6 1262 | picocolors: 1.0.0 1263 | source-map-js: 1.0.2 1264 | dev: true 1265 | 1266 | /queue-microtask@1.2.3: 1267 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1268 | dev: true 1269 | 1270 | /read-pkg@3.0.0: 1271 | resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} 1272 | engines: {node: '>=4'} 1273 | dependencies: 1274 | load-json-file: 4.0.0 1275 | normalize-package-data: 2.5.0 1276 | path-type: 3.0.0 1277 | dev: true 1278 | 1279 | /readdirp@3.6.0: 1280 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1281 | engines: {node: '>=8.10.0'} 1282 | dependencies: 1283 | picomatch: 2.3.1 1284 | dev: true 1285 | 1286 | /regexp.prototype.flags@1.5.0: 1287 | resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} 1288 | engines: {node: '>= 0.4'} 1289 | dependencies: 1290 | call-bind: 1.0.2 1291 | define-properties: 1.2.0 1292 | functions-have-names: 1.2.3 1293 | dev: true 1294 | 1295 | /resolve-from@4.0.0: 1296 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1297 | engines: {node: '>=4'} 1298 | dev: true 1299 | 1300 | /resolve@1.22.2: 1301 | resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} 1302 | hasBin: true 1303 | dependencies: 1304 | is-core-module: 2.12.1 1305 | path-parse: 1.0.7 1306 | supports-preserve-symlinks-flag: 1.0.0 1307 | dev: true 1308 | 1309 | /reusify@1.0.4: 1310 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1311 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1312 | dev: true 1313 | 1314 | /rimraf@2.7.1: 1315 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 1316 | hasBin: true 1317 | dependencies: 1318 | glob: 7.2.3 1319 | dev: true 1320 | 1321 | /rollup@3.26.2: 1322 | resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==} 1323 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1324 | hasBin: true 1325 | optionalDependencies: 1326 | fsevents: 2.3.2 1327 | dev: true 1328 | 1329 | /run-parallel@1.2.0: 1330 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1331 | dependencies: 1332 | queue-microtask: 1.2.3 1333 | dev: true 1334 | 1335 | /sade@1.8.1: 1336 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 1337 | engines: {node: '>=6'} 1338 | dependencies: 1339 | mri: 1.2.0 1340 | dev: true 1341 | 1342 | /safe-regex-test@1.0.0: 1343 | resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} 1344 | dependencies: 1345 | call-bind: 1.0.2 1346 | get-intrinsic: 1.2.1 1347 | is-regex: 1.1.4 1348 | dev: true 1349 | 1350 | /sander@0.5.1: 1351 | resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} 1352 | dependencies: 1353 | es6-promise: 3.3.1 1354 | graceful-fs: 4.2.11 1355 | mkdirp: 0.5.6 1356 | rimraf: 2.7.1 1357 | dev: true 1358 | 1359 | /sass@1.63.6: 1360 | resolution: {integrity: sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==} 1361 | engines: {node: '>=14.0.0'} 1362 | hasBin: true 1363 | dependencies: 1364 | chokidar: 3.5.3 1365 | immutable: 4.3.0 1366 | source-map-js: 1.0.2 1367 | dev: true 1368 | 1369 | /semver@5.7.1: 1370 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1371 | hasBin: true 1372 | dev: true 1373 | 1374 | /set-cookie-parser@2.6.0: 1375 | resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} 1376 | dev: true 1377 | 1378 | /shebang-command@1.2.0: 1379 | resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 1380 | engines: {node: '>=0.10.0'} 1381 | dependencies: 1382 | shebang-regex: 1.0.0 1383 | dev: true 1384 | 1385 | /shebang-regex@1.0.0: 1386 | resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 1387 | engines: {node: '>=0.10.0'} 1388 | dev: true 1389 | 1390 | /shell-quote@1.8.1: 1391 | resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} 1392 | dev: true 1393 | 1394 | /side-channel@1.0.4: 1395 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1396 | dependencies: 1397 | call-bind: 1.0.2 1398 | get-intrinsic: 1.2.1 1399 | object-inspect: 1.12.3 1400 | dev: true 1401 | 1402 | /sirv@2.0.3: 1403 | resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} 1404 | engines: {node: '>= 10'} 1405 | dependencies: 1406 | '@polka/url': 1.0.0-next.21 1407 | mrmime: 1.0.1 1408 | totalist: 3.0.1 1409 | dev: true 1410 | 1411 | /sorcery@0.11.0: 1412 | resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} 1413 | hasBin: true 1414 | dependencies: 1415 | '@jridgewell/sourcemap-codec': 1.4.15 1416 | buffer-crc32: 0.2.13 1417 | minimist: 1.2.8 1418 | sander: 0.5.1 1419 | dev: true 1420 | 1421 | /source-map-js@1.0.2: 1422 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1423 | engines: {node: '>=0.10.0'} 1424 | dev: true 1425 | 1426 | /spdx-correct@3.2.0: 1427 | resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 1428 | dependencies: 1429 | spdx-expression-parse: 3.0.1 1430 | spdx-license-ids: 3.0.13 1431 | dev: true 1432 | 1433 | /spdx-exceptions@2.3.0: 1434 | resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} 1435 | dev: true 1436 | 1437 | /spdx-expression-parse@3.0.1: 1438 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1439 | dependencies: 1440 | spdx-exceptions: 2.3.0 1441 | spdx-license-ids: 3.0.13 1442 | dev: true 1443 | 1444 | /spdx-license-ids@3.0.13: 1445 | resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} 1446 | dev: true 1447 | 1448 | /streamsearch@1.1.0: 1449 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 1450 | engines: {node: '>=10.0.0'} 1451 | dev: true 1452 | 1453 | /string.prototype.padend@3.1.4: 1454 | resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} 1455 | engines: {node: '>= 0.4'} 1456 | dependencies: 1457 | call-bind: 1.0.2 1458 | define-properties: 1.2.0 1459 | es-abstract: 1.21.2 1460 | dev: true 1461 | 1462 | /string.prototype.trim@1.2.7: 1463 | resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} 1464 | engines: {node: '>= 0.4'} 1465 | dependencies: 1466 | call-bind: 1.0.2 1467 | define-properties: 1.2.0 1468 | es-abstract: 1.21.2 1469 | dev: true 1470 | 1471 | /string.prototype.trimend@1.0.6: 1472 | resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} 1473 | dependencies: 1474 | call-bind: 1.0.2 1475 | define-properties: 1.2.0 1476 | es-abstract: 1.21.2 1477 | dev: true 1478 | 1479 | /string.prototype.trimstart@1.0.6: 1480 | resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} 1481 | dependencies: 1482 | call-bind: 1.0.2 1483 | define-properties: 1.2.0 1484 | es-abstract: 1.21.2 1485 | dev: true 1486 | 1487 | /strip-bom@3.0.0: 1488 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1489 | engines: {node: '>=4'} 1490 | dev: true 1491 | 1492 | /strip-indent@3.0.0: 1493 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 1494 | engines: {node: '>=8'} 1495 | dependencies: 1496 | min-indent: 1.0.1 1497 | dev: true 1498 | 1499 | /supports-color@5.5.0: 1500 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1501 | engines: {node: '>=4'} 1502 | dependencies: 1503 | has-flag: 3.0.0 1504 | dev: true 1505 | 1506 | /supports-preserve-symlinks-flag@1.0.0: 1507 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1508 | engines: {node: '>= 0.4'} 1509 | dev: true 1510 | 1511 | /svelte-check@3.4.5(sass@1.63.6)(svelte@4.0.5): 1512 | resolution: {integrity: sha512-FsD/CUVdEI0F9sfylh1Fe15kDjvvbyBxzDpACPsdq0EASgaZukBXaMXofpxlgmWsgVET3OynMQlbtUQoWCz9Rw==} 1513 | hasBin: true 1514 | peerDependencies: 1515 | svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 1516 | dependencies: 1517 | '@jridgewell/trace-mapping': 0.3.18 1518 | chokidar: 3.5.3 1519 | fast-glob: 3.3.0 1520 | import-fresh: 3.3.0 1521 | picocolors: 1.0.0 1522 | sade: 1.8.1 1523 | svelte: 4.0.5 1524 | svelte-preprocess: 5.0.4(sass@1.63.6)(svelte@4.0.5)(typescript@5.1.6) 1525 | typescript: 5.1.6 1526 | transitivePeerDependencies: 1527 | - '@babel/core' 1528 | - coffeescript 1529 | - less 1530 | - postcss 1531 | - postcss-load-config 1532 | - pug 1533 | - sass 1534 | - stylus 1535 | - sugarss 1536 | dev: true 1537 | 1538 | /svelte-hmr@0.15.2(svelte@4.0.5): 1539 | resolution: {integrity: sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==} 1540 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 1541 | peerDependencies: 1542 | svelte: ^3.19.0 || ^4.0.0-next.0 1543 | dependencies: 1544 | svelte: 4.0.5 1545 | dev: true 1546 | 1547 | /svelte-preprocess@5.0.4(sass@1.63.6)(svelte@4.0.5)(typescript@5.1.6): 1548 | resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} 1549 | engines: {node: '>= 14.10.0'} 1550 | requiresBuild: true 1551 | peerDependencies: 1552 | '@babel/core': ^7.10.2 1553 | coffeescript: ^2.5.1 1554 | less: ^3.11.3 || ^4.0.0 1555 | postcss: ^7 || ^8 1556 | postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 1557 | pug: ^3.0.0 1558 | sass: ^1.26.8 1559 | stylus: ^0.55.0 1560 | sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 1561 | svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 1562 | typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' 1563 | peerDependenciesMeta: 1564 | '@babel/core': 1565 | optional: true 1566 | coffeescript: 1567 | optional: true 1568 | less: 1569 | optional: true 1570 | postcss: 1571 | optional: true 1572 | postcss-load-config: 1573 | optional: true 1574 | pug: 1575 | optional: true 1576 | sass: 1577 | optional: true 1578 | stylus: 1579 | optional: true 1580 | sugarss: 1581 | optional: true 1582 | typescript: 1583 | optional: true 1584 | dependencies: 1585 | '@types/pug': 2.0.6 1586 | detect-indent: 6.1.0 1587 | magic-string: 0.27.0 1588 | sass: 1.63.6 1589 | sorcery: 0.11.0 1590 | strip-indent: 3.0.0 1591 | svelte: 4.0.5 1592 | typescript: 5.1.6 1593 | dev: true 1594 | 1595 | /svelte@4.0.5: 1596 | resolution: {integrity: sha512-PHKPWP1wiWHBtsE57nCb8xiWB3Ht7/3Kvi3jac0XIxUM2rep8alO7YoAtgWeGD7++tFy46krilOrPW0mG3Dx+A==} 1597 | engines: {node: '>=16'} 1598 | dependencies: 1599 | '@ampproject/remapping': 2.2.1 1600 | '@jridgewell/sourcemap-codec': 1.4.15 1601 | '@jridgewell/trace-mapping': 0.3.18 1602 | acorn: 8.10.0 1603 | aria-query: 5.3.0 1604 | axobject-query: 3.2.1 1605 | code-red: 1.0.3 1606 | css-tree: 2.3.1 1607 | estree-walker: 3.0.3 1608 | is-reference: 3.0.1 1609 | locate-character: 3.0.0 1610 | magic-string: 0.30.1 1611 | periscopic: 3.1.0 1612 | dev: true 1613 | 1614 | /to-regex-range@5.0.1: 1615 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1616 | engines: {node: '>=8.0'} 1617 | dependencies: 1618 | is-number: 7.0.0 1619 | dev: true 1620 | 1621 | /totalist@3.0.1: 1622 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 1623 | engines: {node: '>=6'} 1624 | dev: true 1625 | 1626 | /tslib@2.6.0: 1627 | resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} 1628 | dev: true 1629 | 1630 | /typed-array-length@1.0.4: 1631 | resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} 1632 | dependencies: 1633 | call-bind: 1.0.2 1634 | for-each: 0.3.3 1635 | is-typed-array: 1.1.10 1636 | dev: true 1637 | 1638 | /typesafe-i18n@5.24.3(typescript@5.1.6): 1639 | resolution: {integrity: sha512-VqjGbIydOqtQjO81mGo++TjuqeC8YoxxgYrO1/ikXIS/l/Q6mAcz4yrt5AvqjdFHMt3gRm7oGbVI/yLyV+VTOg==} 1640 | hasBin: true 1641 | peerDependencies: 1642 | typescript: '>=3.5.1' 1643 | dependencies: 1644 | typescript: 5.1.6 1645 | dev: true 1646 | 1647 | /typescript@5.1.6: 1648 | resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} 1649 | engines: {node: '>=14.17'} 1650 | hasBin: true 1651 | dev: true 1652 | 1653 | /unbox-primitive@1.0.2: 1654 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 1655 | dependencies: 1656 | call-bind: 1.0.2 1657 | has-bigints: 1.0.2 1658 | has-symbols: 1.0.3 1659 | which-boxed-primitive: 1.0.2 1660 | dev: true 1661 | 1662 | /undici@5.22.1: 1663 | resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==} 1664 | engines: {node: '>=14.0'} 1665 | dependencies: 1666 | busboy: 1.6.0 1667 | dev: true 1668 | 1669 | /validate-npm-package-license@3.0.4: 1670 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1671 | dependencies: 1672 | spdx-correct: 3.2.0 1673 | spdx-expression-parse: 3.0.1 1674 | dev: true 1675 | 1676 | /vite@4.4.2(sass@1.63.6): 1677 | resolution: {integrity: sha512-zUcsJN+UvdSyHhYa277UHhiJ3iq4hUBwHavOpsNUGsTgjBeoBlK8eDt+iT09pBq0h9/knhG/SPrZiM7cGmg7NA==} 1678 | engines: {node: ^14.18.0 || >=16.0.0} 1679 | hasBin: true 1680 | peerDependencies: 1681 | '@types/node': '>= 14' 1682 | less: '*' 1683 | lightningcss: ^1.21.0 1684 | sass: '*' 1685 | stylus: '*' 1686 | sugarss: '*' 1687 | terser: ^5.4.0 1688 | peerDependenciesMeta: 1689 | '@types/node': 1690 | optional: true 1691 | less: 1692 | optional: true 1693 | lightningcss: 1694 | optional: true 1695 | sass: 1696 | optional: true 1697 | stylus: 1698 | optional: true 1699 | sugarss: 1700 | optional: true 1701 | terser: 1702 | optional: true 1703 | dependencies: 1704 | esbuild: 0.18.11 1705 | postcss: 8.4.25 1706 | rollup: 3.26.2 1707 | sass: 1.63.6 1708 | optionalDependencies: 1709 | fsevents: 2.3.2 1710 | dev: true 1711 | 1712 | /vitefu@0.2.4(vite@4.4.2): 1713 | resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} 1714 | peerDependencies: 1715 | vite: ^3.0.0 || ^4.0.0 1716 | peerDependenciesMeta: 1717 | vite: 1718 | optional: true 1719 | dependencies: 1720 | vite: 4.4.2(sass@1.63.6) 1721 | dev: true 1722 | 1723 | /which-boxed-primitive@1.0.2: 1724 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 1725 | dependencies: 1726 | is-bigint: 1.0.4 1727 | is-boolean-object: 1.1.2 1728 | is-number-object: 1.0.7 1729 | is-string: 1.0.7 1730 | is-symbol: 1.0.4 1731 | dev: true 1732 | 1733 | /which-typed-array@1.1.9: 1734 | resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} 1735 | engines: {node: '>= 0.4'} 1736 | dependencies: 1737 | available-typed-arrays: 1.0.5 1738 | call-bind: 1.0.2 1739 | for-each: 0.3.3 1740 | gopd: 1.0.1 1741 | has-tostringtag: 1.0.0 1742 | is-typed-array: 1.1.10 1743 | dev: true 1744 | 1745 | /which@1.3.1: 1746 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 1747 | hasBin: true 1748 | dependencies: 1749 | isexe: 2.0.0 1750 | dev: true 1751 | 1752 | /wrappy@1.0.2: 1753 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1754 | dev: true 1755 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | type Locales = import('$i18n/i18n-types').Locales 2 | type TranslationFunctions = import('$i18n/i18n-types').TranslationFun 3 | 4 | // See https://kit.svelte.dev/docs/types#app 5 | // for information about these interfaces 6 | declare global { 7 | namespace App { 8 | // interface Error {} 9 | interface Locals { 10 | locale: Locales 11 | LL: TranslationFunctions 12 | } 13 | // interface PageData {} 14 | // interface Platform {} 15 | } 16 | } 17 | 18 | export {}; 19 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | typesafe-i18n - Svelte Fall Summit 2021 8 | %sveltekit.head% 9 | 10 | 11 |
%sveltekit.body%
12 | 13 | 14 | -------------------------------------------------------------------------------- /src/hooks.server.ts: -------------------------------------------------------------------------------- 1 | import { base } from '$app/paths' 2 | import type { Locales } from '$i18n/i18n-types.js' 3 | import { detectLocale, i18n, isLocale } from '$i18n/i18n-util' 4 | import { loadAllLocales } from '$i18n/i18n-util.sync' 5 | import { redirect, type Handle, type RequestEvent } from '@sveltejs/kit' 6 | import { initAcceptLanguageHeaderDetector } from 'typesafe-i18n/detectors' 7 | import { getPathnameWithoutBase } from './utils.js' 8 | 9 | loadAllLocales() 10 | const L = i18n() 11 | 12 | export const handle: Handle = async ({ event, resolve }) => { 13 | // read language slug 14 | const [, lang] = getPathnameWithoutBase(event.url).split('/') 15 | 16 | // redirect to base locale if no locale slug was found 17 | if (!lang) { 18 | const locale = getPreferredLocale(event) 19 | 20 | throw redirect(307, `${base}/${locale}`) 21 | } 22 | 23 | // if slug is not a locale, use base locale (e.g. api endpoints) 24 | const locale = isLocale(lang) ? (lang as Locales) : getPreferredLocale(event) 25 | const LL = L[locale] 26 | 27 | // bind locale and translation functions to current request 28 | event.locals.locale = locale 29 | event.locals.LL = LL 30 | 31 | console.info(LL.log({ fileName: 'hooks.server.ts' })) 32 | 33 | // replace html lang attribute with correct language 34 | return resolve(event, { transformPageChunk: ({ html }) => html.replace('%lang%', locale) }) 35 | } 36 | 37 | const getPreferredLocale = ({ request }: RequestEvent) => { 38 | // detect the preferred language the user has configured in his browser 39 | // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language 40 | const acceptLanguageDetector = initAcceptLanguageHeaderDetector(request) 41 | 42 | return detectLocale(acceptLanguageDetector) 43 | } 44 | -------------------------------------------------------------------------------- /src/i18n/ar/index.ts: -------------------------------------------------------------------------------- 1 | import type { BaseTranslation } from '../i18n-types' 2 | 3 | const ar = { 4 | title: 'typesafe-i18n - قمة Svelte {year:number}', 5 | welcome: 'مرحبًا بك في قمة Svelte الخريفية {year:number}', 6 | spectators: '{0} مشاهد مباشر', 7 | summit: { 8 | schedule: '{0:Date|simpleDate}', 9 | }, 10 | log: `تم استدعاء هذا السجل من '{fileName:string}'`, 11 | } satisfies BaseTranslation 12 | 13 | export default ar 14 | -------------------------------------------------------------------------------- /src/i18n/de/index.ts: -------------------------------------------------------------------------------- 1 | import type { Translation } from '../i18n-types' 2 | 3 | const de = { 4 | title: 'typesafe-i18n - Svelte Herbst Summit {year}', 5 | welcome: 'Willkommen zum Svelte Herbst Summit {year}', 6 | spectators: '{0} Zuschauer live', 7 | summit: { 8 | schedule: '{0|simpleDate}', 9 | }, 10 | log: `Dieses Logging wurde von '{fileName}' aufgerufen`, 11 | } satisfies Translation 12 | 13 | export default de 14 | -------------------------------------------------------------------------------- /src/i18n/en/index.ts: -------------------------------------------------------------------------------- 1 | import type { BaseTranslation } from '../i18n-types' 2 | 3 | const en = { 4 | title: 'typesafe-i18n - Svelte Fall Summit {year:number}', 5 | welcome: 'Welcome to Svelte Fall Summit {year:number}', 6 | spectators: '{0} live spectator{{s}}', 7 | summit: { 8 | schedule: '{0:Date|simpleDate}', 9 | }, 10 | log: `This log was called from '{fileName:string}'`, 11 | } satisfies BaseTranslation 12 | 13 | export default en 14 | -------------------------------------------------------------------------------- /src/i18n/formatters.ts: -------------------------------------------------------------------------------- 1 | import type { FormattersInitializer } from 'typesafe-i18n' 2 | import type { Locales, Formatters } from './i18n-types' 3 | import { date } from 'typesafe-i18n/formatters' 4 | 5 | export const initFormatters: FormattersInitializer = (locale: Locales) => { 6 | const formatters: Formatters = { 7 | simpleDate: date(locale, { day: '2-digit', month: 'short', year: 'numeric' }), 8 | } 9 | 10 | return formatters 11 | } 12 | -------------------------------------------------------------------------------- /src/i18n/i18n-svelte.ts: -------------------------------------------------------------------------------- 1 | // This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. 2 | /* eslint-disable */ 3 | 4 | import { initI18nSvelte } from 'typesafe-i18n/svelte' 5 | import type { Formatters, Locales, TranslationFunctions, Translations } from './i18n-types' 6 | import { loadedFormatters, loadedLocales } from './i18n-util' 7 | 8 | const { locale, LL, setLocale } = initI18nSvelte(loadedLocales, loadedFormatters) 9 | 10 | export { locale, LL, setLocale } 11 | 12 | export default LL 13 | -------------------------------------------------------------------------------- /src/i18n/i18n-types.ts: -------------------------------------------------------------------------------- 1 | // This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. 2 | /* eslint-disable */ 3 | import type { BaseTranslation as BaseTranslationType, LocalizedString, RequiredParams } from 'typesafe-i18n' 4 | 5 | export type BaseTranslation = BaseTranslationType 6 | export type BaseLocale = 'en' 7 | 8 | export type Locales = 9 | | 'ar' 10 | | 'de' 11 | | 'en' 12 | | 'it' 13 | 14 | export type Translation = RootTranslation 15 | 16 | export type Translations = RootTranslation 17 | 18 | type RootTranslation = { 19 | /** 20 | * t​y​p​e​s​a​f​e​-​i​1​8​n​ ​-​ ​S​v​e​l​t​e​ ​F​a​l​l​ ​S​u​m​m​i​t​ ​{​y​e​a​r​} 21 | * @param {number} year 22 | */ 23 | title: RequiredParams<'year'> 24 | /** 25 | * W​e​l​c​o​m​e​ ​t​o​ ​S​v​e​l​t​e​ ​F​a​l​l​ ​S​u​m​m​i​t​ ​{​y​e​a​r​} 26 | * @param {number} year 27 | */ 28 | welcome: RequiredParams<'year'> 29 | /** 30 | * {​0​}​ ​l​i​v​e​ ​s​p​e​c​t​a​t​o​r​{​{​s​}​} 31 | * @param {string | number | boolean} 0 32 | */ 33 | spectators: RequiredParams<'0'> 34 | summit: { 35 | /** 36 | * {​0​|​s​i​m​p​l​e​D​a​t​e​} 37 | * @param {Date} 0 38 | */ 39 | schedule: RequiredParams<'0|simpleDate'> 40 | } 41 | /** 42 | * T​h​i​s​ ​l​o​g​ ​w​a​s​ ​c​a​l​l​e​d​ ​f​r​o​m​ ​'​{​f​i​l​e​N​a​m​e​}​' 43 | * @param {string} fileName 44 | */ 45 | log: RequiredParams<'fileName'> 46 | } 47 | 48 | export type TranslationFunctions = { 49 | /** 50 | * typesafe-i18n - Svelte Fall Summit {year} 51 | */ 52 | title: (arg: { year: number }) => LocalizedString 53 | /** 54 | * Welcome to Svelte Fall Summit {year} 55 | */ 56 | welcome: (arg: { year: number }) => LocalizedString 57 | /** 58 | * {0} live spectator{{s}} 59 | */ 60 | spectators: (arg0: string | number | boolean) => LocalizedString 61 | summit: { 62 | /** 63 | * {0|simpleDate} 64 | */ 65 | schedule: (arg0: Date) => LocalizedString 66 | } 67 | /** 68 | * This log was called from '{fileName}' 69 | */ 70 | log: (arg: { fileName: string }) => LocalizedString 71 | } 72 | 73 | export type Formatters = { 74 | simpleDate: (value: Date) => unknown 75 | } 76 | -------------------------------------------------------------------------------- /src/i18n/i18n-util.async.ts: -------------------------------------------------------------------------------- 1 | // This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. 2 | /* eslint-disable */ 3 | 4 | import { initFormatters } from './formatters' 5 | import type { Locales, Translations } from './i18n-types' 6 | import { loadedFormatters, loadedLocales, locales } from './i18n-util' 7 | 8 | const localeTranslationLoaders = { 9 | ar: () => import('./ar'), 10 | de: () => import('./de'), 11 | en: () => import('./en'), 12 | it: () => import('./it'), 13 | } 14 | 15 | const updateDictionary = (locale: Locales, dictionary: Partial): Translations => 16 | loadedLocales[locale] = { ...loadedLocales[locale], ...dictionary } 17 | 18 | export const importLocaleAsync = async (locale: Locales): Promise => 19 | (await localeTranslationLoaders[locale]()).default as unknown as Translations 20 | 21 | export const loadLocaleAsync = async (locale: Locales): Promise => { 22 | updateDictionary(locale, await importLocaleAsync(locale)) 23 | loadFormatters(locale) 24 | } 25 | 26 | export const loadAllLocalesAsync = (): Promise => Promise.all(locales.map(loadLocaleAsync)) 27 | 28 | export const loadFormatters = (locale: Locales): void => 29 | void (loadedFormatters[locale] = initFormatters(locale)) 30 | -------------------------------------------------------------------------------- /src/i18n/i18n-util.sync.ts: -------------------------------------------------------------------------------- 1 | // This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. 2 | /* eslint-disable */ 3 | 4 | import { initFormatters } from './formatters' 5 | import type { Locales, Translations } from './i18n-types' 6 | import { loadedFormatters, loadedLocales, locales } from './i18n-util' 7 | 8 | import ar from './ar' 9 | import de from './de' 10 | import en from './en' 11 | import it from './it' 12 | 13 | const localeTranslations = { 14 | ar, 15 | de, 16 | en, 17 | it, 18 | } 19 | 20 | export const loadLocale = (locale: Locales): void => { 21 | if (loadedLocales[locale]) return 22 | 23 | loadedLocales[locale] = localeTranslations[locale] as unknown as Translations 24 | loadFormatters(locale) 25 | } 26 | 27 | export const loadAllLocales = (): void => locales.forEach(loadLocale) 28 | 29 | export const loadFormatters = (locale: Locales): void => 30 | void (loadedFormatters[locale] = initFormatters(locale)) 31 | -------------------------------------------------------------------------------- /src/i18n/i18n-util.ts: -------------------------------------------------------------------------------- 1 | // This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. 2 | /* eslint-disable */ 3 | 4 | import { i18n as initI18n, i18nObject as initI18nObject, i18nString as initI18nString } from 'typesafe-i18n' 5 | import type { LocaleDetector } from 'typesafe-i18n/detectors' 6 | import type { LocaleTranslationFunctions, TranslateByString } from 'typesafe-i18n' 7 | import { detectLocale as detectLocaleFn } from 'typesafe-i18n/detectors' 8 | import { initExtendDictionary } from 'typesafe-i18n/utils' 9 | import type { Formatters, Locales, Translations, TranslationFunctions } from './i18n-types' 10 | 11 | export const baseLocale: Locales = 'en' 12 | 13 | export const locales: Locales[] = [ 14 | 'ar', 15 | 'de', 16 | 'en', 17 | 'it' 18 | ] 19 | 20 | export const isLocale = (locale: string): locale is Locales => locales.includes(locale as Locales) 21 | 22 | export const loadedLocales: Record = {} as Record 23 | 24 | export const loadedFormatters: Record = {} as Record 25 | 26 | export const extendDictionary = initExtendDictionary() 27 | 28 | export const i18nString = (locale: Locales): TranslateByString => initI18nString(locale, loadedFormatters[locale]) 29 | 30 | export const i18nObject = (locale: Locales): TranslationFunctions => 31 | initI18nObject( 32 | locale, 33 | loadedLocales[locale], 34 | loadedFormatters[locale] 35 | ) 36 | 37 | export const i18n = (): LocaleTranslationFunctions => 38 | initI18n(loadedLocales, loadedFormatters) 39 | 40 | export const detectLocale = (...detectors: LocaleDetector[]): Locales => detectLocaleFn(baseLocale, locales, ...detectors) 41 | -------------------------------------------------------------------------------- /src/i18n/it/index.ts: -------------------------------------------------------------------------------- 1 | import type { Translation } from '../i18n-types' 2 | 3 | const it = { 4 | title: 'typesafe-i18n - Svelte Summit Autunno {year}', 5 | welcome: 'Benvenuti al Svelte Summit Autunno {year}', 6 | spectators: '{0} {{spettatore|spettatori}} in diretta', 7 | summit: { 8 | schedule: '{0|simpleDate}', 9 | }, 10 | log: `Questa protocollazione è stata chiamata da '{fileName}'`, 11 | } satisfies Translation 12 | 13 | export default it 14 | -------------------------------------------------------------------------------- /src/lib/HeadHrefLangs.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | {#each locales as l} 8 | 9 | {/each} 10 | 11 | -------------------------------------------------------------------------------- /src/lib/Header.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |
8 | 9 |

typesafe-i18n

10 |
11 | 12 | 13 |
14 | -------------------------------------------------------------------------------- /src/lib/LocaleSwitcher.svelte: -------------------------------------------------------------------------------- 1 | 42 | 43 | 44 | 45 | 54 | -------------------------------------------------------------------------------- /src/params/lang.ts: -------------------------------------------------------------------------------- 1 | import type { ParamMatcher } from '@sveltejs/kit' 2 | import { isLocale } from '$i18n/i18n-util' 3 | 4 | // only accept valid languages as a segment in the URL 5 | export const match: ParamMatcher = (param) => { 6 | return isLocale(param) 7 | } 8 | -------------------------------------------------------------------------------- /src/routes/+layout.server.ts: -------------------------------------------------------------------------------- 1 | import type { LayoutServerLoad } from './$types' 2 | 3 | export const load: LayoutServerLoad = ({ locals: { locale, LL } }) => { 4 | console.info(LL.log({ fileName: '+layout.server.ts' })) 5 | 6 | // pass locale information from "server-context" to "shared server + client context" 7 | return { locale } 8 | } 9 | -------------------------------------------------------------------------------- /src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 16 | 17 |
18 | 19 |
20 | 21 |
22 | 23 | 24 | {$page.data.title || 'typesafe-i18n'} 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/routes/+layout.ts: -------------------------------------------------------------------------------- 1 | import type { LayoutLoad } from './$types' 2 | import type { Locales } from '$i18n/i18n-types' 3 | import { loadLocaleAsync } from '$i18n/i18n-util.async' 4 | import { i18nObject } from '$i18n/i18n-util.js' 5 | 6 | export const load: LayoutLoad<{ locale: Locales }> = async ({ data: { locale } }) => { 7 | // load dictionary into memory 8 | await loadLocaleAsync(locale) 9 | // if you need to output a localized string in a `load` function, 10 | // you always need to create a new `i18nObject` instance in each `load` function 11 | // to not run into shared server state issues 12 | const LL = i18nObject(locale) 13 | 14 | console.info(LL.log({ fileName: '+layout.ts' })) 15 | 16 | // pass locale to the "rendering context" 17 | return { locale } 18 | } 19 | -------------------------------------------------------------------------------- /src/routes/[lang=lang]/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { PageServerLoad } from './$types' 2 | 3 | export const load: PageServerLoad = ({ locals: { LL } }) => { 4 | console.info(LL.log({ fileName: '+page.server.ts' })) 5 | } 6 | -------------------------------------------------------------------------------- /src/routes/[lang=lang]/+page.svelte: -------------------------------------------------------------------------------- 1 | 25 | 26 |

27 | {$LL.welcome({ year: 2021 })} 28 |

29 | 30 |

31 | {$LL.summit.schedule(day)} 32 |

33 | 34 |
35 | {$LL.spectators(spectators)} 36 |
37 | -------------------------------------------------------------------------------- /src/routes/[lang=lang]/+page.ts: -------------------------------------------------------------------------------- 1 | import type { PageLoad } from './$types' 2 | import { i18nObject } from '$i18n/i18n-util.js' 3 | 4 | export const load: PageLoad = async ({ parent }) => { 5 | // wait for `+layout.ts` to load dictionary and pass locale information 6 | const { locale } = await parent() 7 | // if you need to output a localized string in a `load` function, 8 | // you always need to create a new `i18nObject` instance in each `load` function 9 | // to not run into shared server state issues 10 | const LL = i18nObject(locale) 11 | 12 | console.info(LL.log({ fileName: '+page.ts' })) 13 | 14 | return { 15 | title: LL.title({ year: 2021 }), 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/routes/api/spectators/+server.ts: -------------------------------------------------------------------------------- 1 | import { json } from '@sveltejs/kit' 2 | import type { RequestHandler } from './$types' 3 | 4 | export const GET: RequestHandler = async ({ url, locals: { LL } }) => { 5 | // no real data, just a simulation ;) 6 | const oldSpectators = Number(url.searchParams.get('oldSpectators') ?? '0') 7 | let spectators = oldSpectators * 2 + 1 8 | if (spectators > 100_000) { 9 | spectators = 0 10 | } 11 | 12 | console.info(LL.log({ fileName: 'api/+server.ts' })) 13 | 14 | return json({ spectators }) 15 | } 16 | -------------------------------------------------------------------------------- /src/styles/global.scss: -------------------------------------------------------------------------------- 1 | :root[lang='ar'] { 2 | direction: rtl; 3 | } 4 | 5 | * { 6 | box-sizing: border-box; 7 | } 8 | 9 | body { 10 | margin: 0; 11 | padding: 0; 12 | font-family: Arial, Helvetica, sans-serif; 13 | background-color: #ff3e001a; 14 | overscroll-behavior: none; 15 | } 16 | 17 | header { 18 | background-color: white; 19 | height: 100px; 20 | display: flex; 21 | justify-content: space-between; 22 | align-items: center; 23 | padding: 1rem 2rem; 24 | font-family: monospace; 25 | 26 | >a { 27 | text-decoration: none; 28 | } 29 | 30 | ul { 31 | list-style-type: none; 32 | display: flex; 33 | gap: 0.5rem; 34 | 35 | li>a { 36 | all: initial; 37 | cursor: pointer; 38 | padding: 0.5rem; 39 | color: #444; 40 | 41 | &.active { 42 | color: #ff3e00; 43 | border-bottom: 1px solid; 44 | } 45 | } 46 | } 47 | } 48 | 49 | h1 { 50 | color: #ff3e00; 51 | } 52 | 53 | h2 { 54 | margin: 5rem; 55 | text-align: center; 56 | } 57 | 58 | h3 { 59 | margin: 5rem; 60 | text-align: center; 61 | } 62 | 63 | main { 64 | padding: 1rem 2rem; 65 | overflow: hidden; 66 | color: #444; 67 | } 68 | 69 | nav { 70 | display: flex; 71 | justify-content: space-between; 72 | align-items: center; 73 | position: absolute; 74 | bottom: 0; 75 | left: 0; 76 | right: 0; 77 | padding: 1rem; 78 | } 79 | 80 | .spectators { 81 | text-align: center; 82 | } -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | // Replaces the locale slug in a URL. 2 | // 3 | // If the `full` argument is set to `true`, the full URL is returned as a string. 4 | // e.g. https://mywebsite.com/en/blog/article-1 => https://mywebsite.com/de/blog/article-1 5 | // 6 | // Otherwise (default) the URL relative to the base is returned. 7 | 8 | import { base } from '$app/paths' 9 | 10 | // e.g. https://mywebsite.com/en/blog/article-1 => /de/blog/article-1 11 | export const replaceLocaleInUrl = (url: URL, locale: string, full = false): string => { 12 | const [, , ...rest] = getPathnameWithoutBase(url).split('/') 13 | const new_pathname = `/${[locale, ...rest].join('/')}` 14 | if (!full) { 15 | return `${new_pathname}${url.search}` 16 | } 17 | const newUrl = new URL(url.toString()) 18 | newUrl.pathname = base + new_pathname 19 | return newUrl.toString() 20 | } 21 | 22 | // ---------------------------------------------------------------------------- 23 | 24 | const REGEX_START_WITH_BASE = new RegExp(`^${base}`) 25 | 26 | export const getPathnameWithoutBase = (url: URL) => url.pathname.replace(REGEX_START_WITH_BASE, '') -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanhofer/typesafe-i18n-demo-sveltekit/202b5dd4cfbda3587b22549f3a6384f42814530a/static/favicon.png -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import { vitePreprocess } from '@sveltejs/kit/vite'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors 7 | // for more information about preprocessors 8 | preprocess: vitePreprocess(), 9 | 10 | kit: { 11 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. 12 | // If your environment is not supported or you settled on a specific environment, switch out the adapter. 13 | // See https://kit.svelte.dev/docs/adapters for more information about adapters. 14 | adapter: adapter(), 15 | alias: { 16 | $i18n: 'src/i18n', 17 | }, 18 | } 19 | }; 20 | 21 | export default config; 22 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true 12 | } 13 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 14 | // 15 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 16 | // from the referenced tsconfig.json - TypeScript does not merge them in 17 | } 18 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vite'; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()] 6 | }); 7 | --------------------------------------------------------------------------------