├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── README.md ├── package-lock.json ├── package.json ├── src ├── app.d.ts ├── app.html ├── hooks.server.ts ├── lib │ └── auth │ │ ├── config.ts │ │ └── services.ts └── routes │ ├── (protected) │ ├── +layout.svelte │ ├── +page.svelte │ └── logout │ │ └── +server.ts │ └── callback │ └── +server.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 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "pluginSearchDirs": ["."], 8 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 9 | } 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sveltkit AAD Authentication 2 | 3 | A demo app explaining the authorization code flow in Azure AD using a svelteki app. 4 | Full explanation of the code can be found at: https://medium.com/@varu87/azure-ad-authentication-in-sveltekit-f596cfa8a349 5 | 6 | ## Getting Started 7 | 8 | To run this application on your local machine, follow these steps: 9 | 10 | 1. Clone the repository: `git clone https://github.com/varu87/sveltekit-aad-auth.git` 11 | 2. Navigate to the project directory: `cd sveltekit-aad-auth` 12 | 3. Install dependencies: `npm install` 13 | 4. Start the development server: `npm run dev -- --open` 14 | 15 | ## Credits 16 | 17 | This project was built using the following technologies: 18 | 19 | - [SvelteKit](https://kit.svelte.dev/) 20 | - [Azure](https://www.npmjs.com/package/@azure/msal-node) 21 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sveltekit-msal", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "sveltekit-msal", 9 | "version": "0.0.1", 10 | "devDependencies": { 11 | "@azure/msal-node": "^1.17.2", 12 | "@sveltejs/adapter-auto": "^2.0.0", 13 | "@sveltejs/kit": "^1.5.0", 14 | "prettier": "^2.8.0", 15 | "prettier-plugin-svelte": "^2.8.1", 16 | "svelte": "^3.54.0", 17 | "svelte-check": "^3.0.1", 18 | "tslib": "^2.4.1", 19 | "typescript": "^5.0.0", 20 | "vite": "^4.3.0" 21 | } 22 | }, 23 | "node_modules/@azure/msal-common": { 24 | "version": "13.0.0", 25 | "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-13.0.0.tgz", 26 | "integrity": "sha512-GqCOg5H5bouvLij9NFXFkh+asRRxsPBRwnTDsfK7o0KcxYHJbuidKw8/VXpycahGXNxgtuhqtK/n5he+5NhyEA==", 27 | "dev": true, 28 | "engines": { 29 | "node": ">=0.8.0" 30 | } 31 | }, 32 | "node_modules/@azure/msal-node": { 33 | "version": "1.17.2", 34 | "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.17.2.tgz", 35 | "integrity": "sha512-l8edYnA2LQj4ue3pjxVz1Qy4HuU5xbcoebfe2bGTRvBL9Q6n2Df47aGftkLIyimD1HxHuA4ZZOe23a/HshoYXw==", 36 | "dev": true, 37 | "dependencies": { 38 | "@azure/msal-common": "13.0.0", 39 | "jsonwebtoken": "^9.0.0", 40 | "uuid": "^8.3.0" 41 | }, 42 | "engines": { 43 | "node": "10 || 12 || 14 || 16 || 18" 44 | } 45 | }, 46 | "node_modules/@esbuild/android-arm": { 47 | "version": "0.17.19", 48 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", 49 | "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", 50 | "cpu": [ 51 | "arm" 52 | ], 53 | "dev": true, 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.19", 64 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", 65 | "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", 66 | "cpu": [ 67 | "arm64" 68 | ], 69 | "dev": true, 70 | "optional": true, 71 | "os": [ 72 | "android" 73 | ], 74 | "engines": { 75 | "node": ">=12" 76 | } 77 | }, 78 | "node_modules/@esbuild/android-x64": { 79 | "version": "0.17.19", 80 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", 81 | "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", 82 | "cpu": [ 83 | "x64" 84 | ], 85 | "dev": true, 86 | "optional": true, 87 | "os": [ 88 | "android" 89 | ], 90 | "engines": { 91 | "node": ">=12" 92 | } 93 | }, 94 | "node_modules/@esbuild/darwin-arm64": { 95 | "version": "0.17.19", 96 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", 97 | "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", 98 | "cpu": [ 99 | "arm64" 100 | ], 101 | "dev": true, 102 | "optional": true, 103 | "os": [ 104 | "darwin" 105 | ], 106 | "engines": { 107 | "node": ">=12" 108 | } 109 | }, 110 | "node_modules/@esbuild/darwin-x64": { 111 | "version": "0.17.19", 112 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", 113 | "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", 114 | "cpu": [ 115 | "x64" 116 | ], 117 | "dev": true, 118 | "optional": true, 119 | "os": [ 120 | "darwin" 121 | ], 122 | "engines": { 123 | "node": ">=12" 124 | } 125 | }, 126 | "node_modules/@esbuild/freebsd-arm64": { 127 | "version": "0.17.19", 128 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", 129 | "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", 130 | "cpu": [ 131 | "arm64" 132 | ], 133 | "dev": true, 134 | "optional": true, 135 | "os": [ 136 | "freebsd" 137 | ], 138 | "engines": { 139 | "node": ">=12" 140 | } 141 | }, 142 | "node_modules/@esbuild/freebsd-x64": { 143 | "version": "0.17.19", 144 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", 145 | "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", 146 | "cpu": [ 147 | "x64" 148 | ], 149 | "dev": true, 150 | "optional": true, 151 | "os": [ 152 | "freebsd" 153 | ], 154 | "engines": { 155 | "node": ">=12" 156 | } 157 | }, 158 | "node_modules/@esbuild/linux-arm": { 159 | "version": "0.17.19", 160 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", 161 | "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", 162 | "cpu": [ 163 | "arm" 164 | ], 165 | "dev": true, 166 | "optional": true, 167 | "os": [ 168 | "linux" 169 | ], 170 | "engines": { 171 | "node": ">=12" 172 | } 173 | }, 174 | "node_modules/@esbuild/linux-arm64": { 175 | "version": "0.17.19", 176 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", 177 | "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", 178 | "cpu": [ 179 | "arm64" 180 | ], 181 | "dev": true, 182 | "optional": true, 183 | "os": [ 184 | "linux" 185 | ], 186 | "engines": { 187 | "node": ">=12" 188 | } 189 | }, 190 | "node_modules/@esbuild/linux-ia32": { 191 | "version": "0.17.19", 192 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", 193 | "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", 194 | "cpu": [ 195 | "ia32" 196 | ], 197 | "dev": true, 198 | "optional": true, 199 | "os": [ 200 | "linux" 201 | ], 202 | "engines": { 203 | "node": ">=12" 204 | } 205 | }, 206 | "node_modules/@esbuild/linux-loong64": { 207 | "version": "0.17.19", 208 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", 209 | "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", 210 | "cpu": [ 211 | "loong64" 212 | ], 213 | "dev": true, 214 | "optional": true, 215 | "os": [ 216 | "linux" 217 | ], 218 | "engines": { 219 | "node": ">=12" 220 | } 221 | }, 222 | "node_modules/@esbuild/linux-mips64el": { 223 | "version": "0.17.19", 224 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", 225 | "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", 226 | "cpu": [ 227 | "mips64el" 228 | ], 229 | "dev": true, 230 | "optional": true, 231 | "os": [ 232 | "linux" 233 | ], 234 | "engines": { 235 | "node": ">=12" 236 | } 237 | }, 238 | "node_modules/@esbuild/linux-ppc64": { 239 | "version": "0.17.19", 240 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", 241 | "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", 242 | "cpu": [ 243 | "ppc64" 244 | ], 245 | "dev": true, 246 | "optional": true, 247 | "os": [ 248 | "linux" 249 | ], 250 | "engines": { 251 | "node": ">=12" 252 | } 253 | }, 254 | "node_modules/@esbuild/linux-riscv64": { 255 | "version": "0.17.19", 256 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", 257 | "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", 258 | "cpu": [ 259 | "riscv64" 260 | ], 261 | "dev": true, 262 | "optional": true, 263 | "os": [ 264 | "linux" 265 | ], 266 | "engines": { 267 | "node": ">=12" 268 | } 269 | }, 270 | "node_modules/@esbuild/linux-s390x": { 271 | "version": "0.17.19", 272 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", 273 | "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", 274 | "cpu": [ 275 | "s390x" 276 | ], 277 | "dev": true, 278 | "optional": true, 279 | "os": [ 280 | "linux" 281 | ], 282 | "engines": { 283 | "node": ">=12" 284 | } 285 | }, 286 | "node_modules/@esbuild/linux-x64": { 287 | "version": "0.17.19", 288 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", 289 | "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", 290 | "cpu": [ 291 | "x64" 292 | ], 293 | "dev": true, 294 | "optional": true, 295 | "os": [ 296 | "linux" 297 | ], 298 | "engines": { 299 | "node": ">=12" 300 | } 301 | }, 302 | "node_modules/@esbuild/netbsd-x64": { 303 | "version": "0.17.19", 304 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", 305 | "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", 306 | "cpu": [ 307 | "x64" 308 | ], 309 | "dev": true, 310 | "optional": true, 311 | "os": [ 312 | "netbsd" 313 | ], 314 | "engines": { 315 | "node": ">=12" 316 | } 317 | }, 318 | "node_modules/@esbuild/openbsd-x64": { 319 | "version": "0.17.19", 320 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", 321 | "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", 322 | "cpu": [ 323 | "x64" 324 | ], 325 | "dev": true, 326 | "optional": true, 327 | "os": [ 328 | "openbsd" 329 | ], 330 | "engines": { 331 | "node": ">=12" 332 | } 333 | }, 334 | "node_modules/@esbuild/sunos-x64": { 335 | "version": "0.17.19", 336 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", 337 | "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", 338 | "cpu": [ 339 | "x64" 340 | ], 341 | "dev": true, 342 | "optional": true, 343 | "os": [ 344 | "sunos" 345 | ], 346 | "engines": { 347 | "node": ">=12" 348 | } 349 | }, 350 | "node_modules/@esbuild/win32-arm64": { 351 | "version": "0.17.19", 352 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", 353 | "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", 354 | "cpu": [ 355 | "arm64" 356 | ], 357 | "dev": true, 358 | "optional": true, 359 | "os": [ 360 | "win32" 361 | ], 362 | "engines": { 363 | "node": ">=12" 364 | } 365 | }, 366 | "node_modules/@esbuild/win32-ia32": { 367 | "version": "0.17.19", 368 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", 369 | "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", 370 | "cpu": [ 371 | "ia32" 372 | ], 373 | "dev": true, 374 | "optional": true, 375 | "os": [ 376 | "win32" 377 | ], 378 | "engines": { 379 | "node": ">=12" 380 | } 381 | }, 382 | "node_modules/@esbuild/win32-x64": { 383 | "version": "0.17.19", 384 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", 385 | "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", 386 | "cpu": [ 387 | "x64" 388 | ], 389 | "dev": true, 390 | "optional": true, 391 | "os": [ 392 | "win32" 393 | ], 394 | "engines": { 395 | "node": ">=12" 396 | } 397 | }, 398 | "node_modules/@jridgewell/resolve-uri": { 399 | "version": "3.1.0", 400 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 401 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 402 | "dev": true, 403 | "engines": { 404 | "node": ">=6.0.0" 405 | } 406 | }, 407 | "node_modules/@jridgewell/sourcemap-codec": { 408 | "version": "1.4.15", 409 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 410 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 411 | "dev": true 412 | }, 413 | "node_modules/@jridgewell/trace-mapping": { 414 | "version": "0.3.18", 415 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", 416 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", 417 | "dev": true, 418 | "dependencies": { 419 | "@jridgewell/resolve-uri": "3.1.0", 420 | "@jridgewell/sourcemap-codec": "1.4.14" 421 | } 422 | }, 423 | "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { 424 | "version": "1.4.14", 425 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 426 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 427 | "dev": true 428 | }, 429 | "node_modules/@nodelib/fs.scandir": { 430 | "version": "2.1.5", 431 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 432 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 433 | "dev": true, 434 | "dependencies": { 435 | "@nodelib/fs.stat": "2.0.5", 436 | "run-parallel": "^1.1.9" 437 | }, 438 | "engines": { 439 | "node": ">= 8" 440 | } 441 | }, 442 | "node_modules/@nodelib/fs.stat": { 443 | "version": "2.0.5", 444 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 445 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 446 | "dev": true, 447 | "engines": { 448 | "node": ">= 8" 449 | } 450 | }, 451 | "node_modules/@nodelib/fs.walk": { 452 | "version": "1.2.8", 453 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 454 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 455 | "dev": true, 456 | "dependencies": { 457 | "@nodelib/fs.scandir": "2.1.5", 458 | "fastq": "^1.6.0" 459 | }, 460 | "engines": { 461 | "node": ">= 8" 462 | } 463 | }, 464 | "node_modules/@polka/url": { 465 | "version": "1.0.0-next.21", 466 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", 467 | "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", 468 | "dev": true 469 | }, 470 | "node_modules/@sveltejs/adapter-auto": { 471 | "version": "2.0.1", 472 | "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.0.1.tgz", 473 | "integrity": "sha512-anxxYMcQy7HWSKxN4YNaVcgNzCHtNFwygq72EA1Xv7c+5gSECOJ1ez1PYoLciPiFa7A3XBvMDQXUFJ2eqLDtAA==", 474 | "dev": true, 475 | "dependencies": { 476 | "import-meta-resolve": "^3.0.0" 477 | }, 478 | "peerDependencies": { 479 | "@sveltejs/kit": "^1.0.0" 480 | } 481 | }, 482 | "node_modules/@sveltejs/kit": { 483 | "version": "1.16.3", 484 | "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.16.3.tgz", 485 | "integrity": "sha512-8uv0udYRpVuE1BweFidcWHfL+u2gAANKmvIal1dN/FWPBl7DJYbt9zYEtr3bNTiXystT8Sn0Wp54RfwpbPqHjQ==", 486 | "dev": true, 487 | "hasInstallScript": true, 488 | "dependencies": { 489 | "@sveltejs/vite-plugin-svelte": "^2.1.1", 490 | "@types/cookie": "^0.5.1", 491 | "cookie": "^0.5.0", 492 | "devalue": "^4.3.0", 493 | "esm-env": "^1.0.0", 494 | "kleur": "^4.1.5", 495 | "magic-string": "^0.30.0", 496 | "mime": "^3.0.0", 497 | "sade": "^1.8.1", 498 | "set-cookie-parser": "^2.6.0", 499 | "sirv": "^2.0.2", 500 | "tiny-glob": "^0.2.9", 501 | "undici": "~5.22.0" 502 | }, 503 | "bin": { 504 | "svelte-kit": "svelte-kit.js" 505 | }, 506 | "engines": { 507 | "node": "^16.14 || >=18" 508 | }, 509 | "peerDependencies": { 510 | "svelte": "^3.54.0", 511 | "vite": "^4.0.0" 512 | } 513 | }, 514 | "node_modules/@sveltejs/vite-plugin-svelte": { 515 | "version": "2.2.0", 516 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.2.0.tgz", 517 | "integrity": "sha512-KDtdva+FZrZlyug15KlbXuubntAPKcBau0K7QhAIqC5SAy0uDbjZwoexDRx0L0J2T4niEfC6FnA9GuQQJKg+Aw==", 518 | "dev": true, 519 | "dependencies": { 520 | "debug": "^4.3.4", 521 | "deepmerge": "^4.3.1", 522 | "kleur": "^4.1.5", 523 | "magic-string": "^0.30.0", 524 | "svelte-hmr": "^0.15.1", 525 | "vitefu": "^0.2.4" 526 | }, 527 | "engines": { 528 | "node": "^14.18.0 || >= 16" 529 | }, 530 | "peerDependencies": { 531 | "svelte": "^3.54.0", 532 | "vite": "^4.0.0" 533 | } 534 | }, 535 | "node_modules/@types/cookie": { 536 | "version": "0.5.1", 537 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", 538 | "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", 539 | "dev": true 540 | }, 541 | "node_modules/@types/pug": { 542 | "version": "2.0.6", 543 | "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", 544 | "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", 545 | "dev": true 546 | }, 547 | "node_modules/anymatch": { 548 | "version": "3.1.3", 549 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 550 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 551 | "dev": true, 552 | "dependencies": { 553 | "normalize-path": "^3.0.0", 554 | "picomatch": "^2.0.4" 555 | }, 556 | "engines": { 557 | "node": ">= 8" 558 | } 559 | }, 560 | "node_modules/balanced-match": { 561 | "version": "1.0.2", 562 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 563 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 564 | "dev": true 565 | }, 566 | "node_modules/binary-extensions": { 567 | "version": "2.2.0", 568 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 569 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 570 | "dev": true, 571 | "engines": { 572 | "node": ">=8" 573 | } 574 | }, 575 | "node_modules/brace-expansion": { 576 | "version": "1.1.11", 577 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 578 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 579 | "dev": true, 580 | "dependencies": { 581 | "balanced-match": "^1.0.0", 582 | "concat-map": "0.0.1" 583 | } 584 | }, 585 | "node_modules/braces": { 586 | "version": "3.0.2", 587 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 588 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 589 | "dev": true, 590 | "dependencies": { 591 | "fill-range": "^7.0.1" 592 | }, 593 | "engines": { 594 | "node": ">=8" 595 | } 596 | }, 597 | "node_modules/buffer-crc32": { 598 | "version": "0.2.13", 599 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 600 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 601 | "dev": true, 602 | "engines": { 603 | "node": "*" 604 | } 605 | }, 606 | "node_modules/buffer-equal-constant-time": { 607 | "version": "1.0.1", 608 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 609 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", 610 | "dev": true 611 | }, 612 | "node_modules/busboy": { 613 | "version": "1.6.0", 614 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 615 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 616 | "dev": true, 617 | "dependencies": { 618 | "streamsearch": "^1.1.0" 619 | }, 620 | "engines": { 621 | "node": ">=10.16.0" 622 | } 623 | }, 624 | "node_modules/callsites": { 625 | "version": "3.1.0", 626 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 627 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 628 | "dev": true, 629 | "engines": { 630 | "node": ">=6" 631 | } 632 | }, 633 | "node_modules/chokidar": { 634 | "version": "3.5.3", 635 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 636 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 637 | "dev": true, 638 | "funding": [ 639 | { 640 | "type": "individual", 641 | "url": "https://paulmillr.com/funding/" 642 | } 643 | ], 644 | "dependencies": { 645 | "anymatch": "~3.1.2", 646 | "braces": "~3.0.2", 647 | "glob-parent": "~5.1.2", 648 | "is-binary-path": "~2.1.0", 649 | "is-glob": "~4.0.1", 650 | "normalize-path": "~3.0.0", 651 | "readdirp": "~3.6.0" 652 | }, 653 | "engines": { 654 | "node": ">= 8.10.0" 655 | }, 656 | "optionalDependencies": { 657 | "fsevents": "~2.3.2" 658 | } 659 | }, 660 | "node_modules/concat-map": { 661 | "version": "0.0.1", 662 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 663 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 664 | "dev": true 665 | }, 666 | "node_modules/cookie": { 667 | "version": "0.5.0", 668 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 669 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 670 | "dev": true, 671 | "engines": { 672 | "node": ">= 0.6" 673 | } 674 | }, 675 | "node_modules/debug": { 676 | "version": "4.3.4", 677 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 678 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 679 | "dev": true, 680 | "dependencies": { 681 | "ms": "2.1.2" 682 | }, 683 | "engines": { 684 | "node": ">=6.0" 685 | }, 686 | "peerDependenciesMeta": { 687 | "supports-color": { 688 | "optional": true 689 | } 690 | } 691 | }, 692 | "node_modules/deepmerge": { 693 | "version": "4.3.1", 694 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 695 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 696 | "dev": true, 697 | "engines": { 698 | "node": ">=0.10.0" 699 | } 700 | }, 701 | "node_modules/detect-indent": { 702 | "version": "6.1.0", 703 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", 704 | "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", 705 | "dev": true, 706 | "engines": { 707 | "node": ">=8" 708 | } 709 | }, 710 | "node_modules/devalue": { 711 | "version": "4.3.1", 712 | "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.1.tgz", 713 | "integrity": "sha512-Kc0TSP9IUU9eg55au5Q3YtqaYI2cgntVpunJV9Exbm9nvlBeTE5p2NqYHfpuXK6+VF2hF5PI+BPFPUti7e2N1g==", 714 | "dev": true 715 | }, 716 | "node_modules/ecdsa-sig-formatter": { 717 | "version": "1.0.11", 718 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 719 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 720 | "dev": true, 721 | "dependencies": { 722 | "safe-buffer": "^5.0.1" 723 | } 724 | }, 725 | "node_modules/es6-promise": { 726 | "version": "3.3.1", 727 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", 728 | "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", 729 | "dev": true 730 | }, 731 | "node_modules/esbuild": { 732 | "version": "0.17.19", 733 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", 734 | "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", 735 | "dev": true, 736 | "hasInstallScript": true, 737 | "bin": { 738 | "esbuild": "bin/esbuild" 739 | }, 740 | "engines": { 741 | "node": ">=12" 742 | }, 743 | "optionalDependencies": { 744 | "@esbuild/android-arm": "0.17.19", 745 | "@esbuild/android-arm64": "0.17.19", 746 | "@esbuild/android-x64": "0.17.19", 747 | "@esbuild/darwin-arm64": "0.17.19", 748 | "@esbuild/darwin-x64": "0.17.19", 749 | "@esbuild/freebsd-arm64": "0.17.19", 750 | "@esbuild/freebsd-x64": "0.17.19", 751 | "@esbuild/linux-arm": "0.17.19", 752 | "@esbuild/linux-arm64": "0.17.19", 753 | "@esbuild/linux-ia32": "0.17.19", 754 | "@esbuild/linux-loong64": "0.17.19", 755 | "@esbuild/linux-mips64el": "0.17.19", 756 | "@esbuild/linux-ppc64": "0.17.19", 757 | "@esbuild/linux-riscv64": "0.17.19", 758 | "@esbuild/linux-s390x": "0.17.19", 759 | "@esbuild/linux-x64": "0.17.19", 760 | "@esbuild/netbsd-x64": "0.17.19", 761 | "@esbuild/openbsd-x64": "0.17.19", 762 | "@esbuild/sunos-x64": "0.17.19", 763 | "@esbuild/win32-arm64": "0.17.19", 764 | "@esbuild/win32-ia32": "0.17.19", 765 | "@esbuild/win32-x64": "0.17.19" 766 | } 767 | }, 768 | "node_modules/esm-env": { 769 | "version": "1.0.0", 770 | "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", 771 | "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", 772 | "dev": true 773 | }, 774 | "node_modules/fast-glob": { 775 | "version": "3.2.12", 776 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 777 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 778 | "dev": true, 779 | "dependencies": { 780 | "@nodelib/fs.stat": "^2.0.2", 781 | "@nodelib/fs.walk": "^1.2.3", 782 | "glob-parent": "^5.1.2", 783 | "merge2": "^1.3.0", 784 | "micromatch": "^4.0.4" 785 | }, 786 | "engines": { 787 | "node": ">=8.6.0" 788 | } 789 | }, 790 | "node_modules/fastq": { 791 | "version": "1.15.0", 792 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 793 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 794 | "dev": true, 795 | "dependencies": { 796 | "reusify": "^1.0.4" 797 | } 798 | }, 799 | "node_modules/fill-range": { 800 | "version": "7.0.1", 801 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 802 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 803 | "dev": true, 804 | "dependencies": { 805 | "to-regex-range": "^5.0.1" 806 | }, 807 | "engines": { 808 | "node": ">=8" 809 | } 810 | }, 811 | "node_modules/fs.realpath": { 812 | "version": "1.0.0", 813 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 814 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 815 | "dev": true 816 | }, 817 | "node_modules/fsevents": { 818 | "version": "2.3.2", 819 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 820 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 821 | "dev": true, 822 | "hasInstallScript": true, 823 | "optional": true, 824 | "os": [ 825 | "darwin" 826 | ], 827 | "engines": { 828 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 829 | } 830 | }, 831 | "node_modules/glob": { 832 | "version": "7.2.3", 833 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 834 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 835 | "dev": true, 836 | "dependencies": { 837 | "fs.realpath": "^1.0.0", 838 | "inflight": "^1.0.4", 839 | "inherits": "2", 840 | "minimatch": "^3.1.1", 841 | "once": "^1.3.0", 842 | "path-is-absolute": "^1.0.0" 843 | }, 844 | "engines": { 845 | "node": "*" 846 | }, 847 | "funding": { 848 | "url": "https://github.com/sponsors/isaacs" 849 | } 850 | }, 851 | "node_modules/glob-parent": { 852 | "version": "5.1.2", 853 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 854 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 855 | "dev": true, 856 | "dependencies": { 857 | "is-glob": "^4.0.1" 858 | }, 859 | "engines": { 860 | "node": ">= 6" 861 | } 862 | }, 863 | "node_modules/globalyzer": { 864 | "version": "0.1.0", 865 | "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", 866 | "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", 867 | "dev": true 868 | }, 869 | "node_modules/globrex": { 870 | "version": "0.1.2", 871 | "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", 872 | "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", 873 | "dev": true 874 | }, 875 | "node_modules/graceful-fs": { 876 | "version": "4.2.11", 877 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 878 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 879 | "dev": true 880 | }, 881 | "node_modules/import-fresh": { 882 | "version": "3.3.0", 883 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 884 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 885 | "dev": true, 886 | "dependencies": { 887 | "parent-module": "^1.0.0", 888 | "resolve-from": "^4.0.0" 889 | }, 890 | "engines": { 891 | "node": ">=6" 892 | }, 893 | "funding": { 894 | "url": "https://github.com/sponsors/sindresorhus" 895 | } 896 | }, 897 | "node_modules/import-meta-resolve": { 898 | "version": "3.0.0", 899 | "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", 900 | "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", 901 | "dev": true, 902 | "funding": { 903 | "type": "github", 904 | "url": "https://github.com/sponsors/wooorm" 905 | } 906 | }, 907 | "node_modules/inflight": { 908 | "version": "1.0.6", 909 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 910 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 911 | "dev": true, 912 | "dependencies": { 913 | "once": "^1.3.0", 914 | "wrappy": "1" 915 | } 916 | }, 917 | "node_modules/inherits": { 918 | "version": "2.0.4", 919 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 920 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 921 | "dev": true 922 | }, 923 | "node_modules/is-binary-path": { 924 | "version": "2.1.0", 925 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 926 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 927 | "dev": true, 928 | "dependencies": { 929 | "binary-extensions": "^2.0.0" 930 | }, 931 | "engines": { 932 | "node": ">=8" 933 | } 934 | }, 935 | "node_modules/is-extglob": { 936 | "version": "2.1.1", 937 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 938 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 939 | "dev": true, 940 | "engines": { 941 | "node": ">=0.10.0" 942 | } 943 | }, 944 | "node_modules/is-glob": { 945 | "version": "4.0.3", 946 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 947 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 948 | "dev": true, 949 | "dependencies": { 950 | "is-extglob": "^2.1.1" 951 | }, 952 | "engines": { 953 | "node": ">=0.10.0" 954 | } 955 | }, 956 | "node_modules/is-number": { 957 | "version": "7.0.0", 958 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 959 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 960 | "dev": true, 961 | "engines": { 962 | "node": ">=0.12.0" 963 | } 964 | }, 965 | "node_modules/jsonwebtoken": { 966 | "version": "9.0.0", 967 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", 968 | "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", 969 | "dev": true, 970 | "dependencies": { 971 | "jws": "^3.2.2", 972 | "lodash": "^4.17.21", 973 | "ms": "^2.1.1", 974 | "semver": "^7.3.8" 975 | }, 976 | "engines": { 977 | "node": ">=12", 978 | "npm": ">=6" 979 | } 980 | }, 981 | "node_modules/jwa": { 982 | "version": "1.4.1", 983 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 984 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 985 | "dev": true, 986 | "dependencies": { 987 | "buffer-equal-constant-time": "1.0.1", 988 | "ecdsa-sig-formatter": "1.0.11", 989 | "safe-buffer": "^5.0.1" 990 | } 991 | }, 992 | "node_modules/jws": { 993 | "version": "3.2.2", 994 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 995 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 996 | "dev": true, 997 | "dependencies": { 998 | "jwa": "^1.4.1", 999 | "safe-buffer": "^5.0.1" 1000 | } 1001 | }, 1002 | "node_modules/kleur": { 1003 | "version": "4.1.5", 1004 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 1005 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 1006 | "dev": true, 1007 | "engines": { 1008 | "node": ">=6" 1009 | } 1010 | }, 1011 | "node_modules/lodash": { 1012 | "version": "4.17.21", 1013 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1014 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1015 | "dev": true 1016 | }, 1017 | "node_modules/lru-cache": { 1018 | "version": "6.0.0", 1019 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1020 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1021 | "dev": true, 1022 | "dependencies": { 1023 | "yallist": "^4.0.0" 1024 | }, 1025 | "engines": { 1026 | "node": ">=10" 1027 | } 1028 | }, 1029 | "node_modules/magic-string": { 1030 | "version": "0.30.0", 1031 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", 1032 | "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", 1033 | "dev": true, 1034 | "dependencies": { 1035 | "@jridgewell/sourcemap-codec": "^1.4.13" 1036 | }, 1037 | "engines": { 1038 | "node": ">=12" 1039 | } 1040 | }, 1041 | "node_modules/merge2": { 1042 | "version": "1.4.1", 1043 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1044 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1045 | "dev": true, 1046 | "engines": { 1047 | "node": ">= 8" 1048 | } 1049 | }, 1050 | "node_modules/micromatch": { 1051 | "version": "4.0.5", 1052 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1053 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1054 | "dev": true, 1055 | "dependencies": { 1056 | "braces": "^3.0.2", 1057 | "picomatch": "^2.3.1" 1058 | }, 1059 | "engines": { 1060 | "node": ">=8.6" 1061 | } 1062 | }, 1063 | "node_modules/mime": { 1064 | "version": "3.0.0", 1065 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 1066 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 1067 | "dev": true, 1068 | "bin": { 1069 | "mime": "cli.js" 1070 | }, 1071 | "engines": { 1072 | "node": ">=10.0.0" 1073 | } 1074 | }, 1075 | "node_modules/min-indent": { 1076 | "version": "1.0.1", 1077 | "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", 1078 | "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", 1079 | "dev": true, 1080 | "engines": { 1081 | "node": ">=4" 1082 | } 1083 | }, 1084 | "node_modules/minimatch": { 1085 | "version": "3.1.2", 1086 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1087 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1088 | "dev": true, 1089 | "dependencies": { 1090 | "brace-expansion": "^1.1.7" 1091 | }, 1092 | "engines": { 1093 | "node": "*" 1094 | } 1095 | }, 1096 | "node_modules/minimist": { 1097 | "version": "1.2.8", 1098 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1099 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1100 | "dev": true, 1101 | "funding": { 1102 | "url": "https://github.com/sponsors/ljharb" 1103 | } 1104 | }, 1105 | "node_modules/mkdirp": { 1106 | "version": "0.5.6", 1107 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1108 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1109 | "dev": true, 1110 | "dependencies": { 1111 | "minimist": "^1.2.6" 1112 | }, 1113 | "bin": { 1114 | "mkdirp": "bin/cmd.js" 1115 | } 1116 | }, 1117 | "node_modules/mri": { 1118 | "version": "1.2.0", 1119 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 1120 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 1121 | "dev": true, 1122 | "engines": { 1123 | "node": ">=4" 1124 | } 1125 | }, 1126 | "node_modules/mrmime": { 1127 | "version": "1.0.1", 1128 | "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", 1129 | "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", 1130 | "dev": true, 1131 | "engines": { 1132 | "node": ">=10" 1133 | } 1134 | }, 1135 | "node_modules/ms": { 1136 | "version": "2.1.2", 1137 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1138 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1139 | "dev": true 1140 | }, 1141 | "node_modules/nanoid": { 1142 | "version": "3.3.6", 1143 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 1144 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 1145 | "dev": true, 1146 | "funding": [ 1147 | { 1148 | "type": "github", 1149 | "url": "https://github.com/sponsors/ai" 1150 | } 1151 | ], 1152 | "bin": { 1153 | "nanoid": "bin/nanoid.cjs" 1154 | }, 1155 | "engines": { 1156 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1157 | } 1158 | }, 1159 | "node_modules/normalize-path": { 1160 | "version": "3.0.0", 1161 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1162 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1163 | "dev": true, 1164 | "engines": { 1165 | "node": ">=0.10.0" 1166 | } 1167 | }, 1168 | "node_modules/once": { 1169 | "version": "1.4.0", 1170 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1171 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1172 | "dev": true, 1173 | "dependencies": { 1174 | "wrappy": "1" 1175 | } 1176 | }, 1177 | "node_modules/parent-module": { 1178 | "version": "1.0.1", 1179 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1180 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1181 | "dev": true, 1182 | "dependencies": { 1183 | "callsites": "^3.0.0" 1184 | }, 1185 | "engines": { 1186 | "node": ">=6" 1187 | } 1188 | }, 1189 | "node_modules/path-is-absolute": { 1190 | "version": "1.0.1", 1191 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1192 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1193 | "dev": true, 1194 | "engines": { 1195 | "node": ">=0.10.0" 1196 | } 1197 | }, 1198 | "node_modules/picocolors": { 1199 | "version": "1.0.0", 1200 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1201 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1202 | "dev": true 1203 | }, 1204 | "node_modules/picomatch": { 1205 | "version": "2.3.1", 1206 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1207 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1208 | "dev": true, 1209 | "engines": { 1210 | "node": ">=8.6" 1211 | }, 1212 | "funding": { 1213 | "url": "https://github.com/sponsors/jonschlinkert" 1214 | } 1215 | }, 1216 | "node_modules/postcss": { 1217 | "version": "8.4.23", 1218 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", 1219 | "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", 1220 | "dev": true, 1221 | "funding": [ 1222 | { 1223 | "type": "opencollective", 1224 | "url": "https://opencollective.com/postcss/" 1225 | }, 1226 | { 1227 | "type": "tidelift", 1228 | "url": "https://tidelift.com/funding/github/npm/postcss" 1229 | }, 1230 | { 1231 | "type": "github", 1232 | "url": "https://github.com/sponsors/ai" 1233 | } 1234 | ], 1235 | "dependencies": { 1236 | "nanoid": "^3.3.6", 1237 | "picocolors": "^1.0.0", 1238 | "source-map-js": "^1.0.2" 1239 | }, 1240 | "engines": { 1241 | "node": "^10 || ^12 || >=14" 1242 | } 1243 | }, 1244 | "node_modules/prettier": { 1245 | "version": "2.8.8", 1246 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", 1247 | "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", 1248 | "dev": true, 1249 | "bin": { 1250 | "prettier": "bin-prettier.js" 1251 | }, 1252 | "engines": { 1253 | "node": ">=10.13.0" 1254 | }, 1255 | "funding": { 1256 | "url": "https://github.com/prettier/prettier?sponsor=1" 1257 | } 1258 | }, 1259 | "node_modules/prettier-plugin-svelte": { 1260 | "version": "2.10.0", 1261 | "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.10.0.tgz", 1262 | "integrity": "sha512-GXMY6t86thctyCvQq+jqElO+MKdB09BkL3hexyGP3Oi8XLKRFaJP1ud/xlWCZ9ZIa2BxHka32zhHfcuU+XsRQg==", 1263 | "dev": true, 1264 | "peerDependencies": { 1265 | "prettier": "^1.16.4 || ^2.0.0", 1266 | "svelte": "^3.2.0" 1267 | } 1268 | }, 1269 | "node_modules/queue-microtask": { 1270 | "version": "1.2.3", 1271 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1272 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1273 | "dev": true, 1274 | "funding": [ 1275 | { 1276 | "type": "github", 1277 | "url": "https://github.com/sponsors/feross" 1278 | }, 1279 | { 1280 | "type": "patreon", 1281 | "url": "https://www.patreon.com/feross" 1282 | }, 1283 | { 1284 | "type": "consulting", 1285 | "url": "https://feross.org/support" 1286 | } 1287 | ] 1288 | }, 1289 | "node_modules/readdirp": { 1290 | "version": "3.6.0", 1291 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1292 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1293 | "dev": true, 1294 | "dependencies": { 1295 | "picomatch": "^2.2.1" 1296 | }, 1297 | "engines": { 1298 | "node": ">=8.10.0" 1299 | } 1300 | }, 1301 | "node_modules/resolve-from": { 1302 | "version": "4.0.0", 1303 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1304 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1305 | "dev": true, 1306 | "engines": { 1307 | "node": ">=4" 1308 | } 1309 | }, 1310 | "node_modules/reusify": { 1311 | "version": "1.0.4", 1312 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1313 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1314 | "dev": true, 1315 | "engines": { 1316 | "iojs": ">=1.0.0", 1317 | "node": ">=0.10.0" 1318 | } 1319 | }, 1320 | "node_modules/rimraf": { 1321 | "version": "2.7.1", 1322 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1323 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1324 | "dev": true, 1325 | "dependencies": { 1326 | "glob": "^7.1.3" 1327 | }, 1328 | "bin": { 1329 | "rimraf": "bin.js" 1330 | } 1331 | }, 1332 | "node_modules/rollup": { 1333 | "version": "3.21.7", 1334 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.7.tgz", 1335 | "integrity": "sha512-KXPaEuR8FfUoK2uHwNjxTmJ18ApyvD6zJpYv9FOJSqLStmt6xOY84l1IjK2dSolQmoXknrhEFRaPRgOPdqCT5w==", 1336 | "dev": true, 1337 | "bin": { 1338 | "rollup": "dist/bin/rollup" 1339 | }, 1340 | "engines": { 1341 | "node": ">=14.18.0", 1342 | "npm": ">=8.0.0" 1343 | }, 1344 | "optionalDependencies": { 1345 | "fsevents": "~2.3.2" 1346 | } 1347 | }, 1348 | "node_modules/run-parallel": { 1349 | "version": "1.2.0", 1350 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1351 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1352 | "dev": true, 1353 | "funding": [ 1354 | { 1355 | "type": "github", 1356 | "url": "https://github.com/sponsors/feross" 1357 | }, 1358 | { 1359 | "type": "patreon", 1360 | "url": "https://www.patreon.com/feross" 1361 | }, 1362 | { 1363 | "type": "consulting", 1364 | "url": "https://feross.org/support" 1365 | } 1366 | ], 1367 | "dependencies": { 1368 | "queue-microtask": "^1.2.2" 1369 | } 1370 | }, 1371 | "node_modules/sade": { 1372 | "version": "1.8.1", 1373 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 1374 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 1375 | "dev": true, 1376 | "dependencies": { 1377 | "mri": "^1.1.0" 1378 | }, 1379 | "engines": { 1380 | "node": ">=6" 1381 | } 1382 | }, 1383 | "node_modules/safe-buffer": { 1384 | "version": "5.2.1", 1385 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1386 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1387 | "dev": true, 1388 | "funding": [ 1389 | { 1390 | "type": "github", 1391 | "url": "https://github.com/sponsors/feross" 1392 | }, 1393 | { 1394 | "type": "patreon", 1395 | "url": "https://www.patreon.com/feross" 1396 | }, 1397 | { 1398 | "type": "consulting", 1399 | "url": "https://feross.org/support" 1400 | } 1401 | ] 1402 | }, 1403 | "node_modules/sander": { 1404 | "version": "0.5.1", 1405 | "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", 1406 | "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", 1407 | "dev": true, 1408 | "dependencies": { 1409 | "es6-promise": "^3.1.2", 1410 | "graceful-fs": "^4.1.3", 1411 | "mkdirp": "^0.5.1", 1412 | "rimraf": "^2.5.2" 1413 | } 1414 | }, 1415 | "node_modules/semver": { 1416 | "version": "7.5.1", 1417 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", 1418 | "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", 1419 | "dev": true, 1420 | "dependencies": { 1421 | "lru-cache": "^6.0.0" 1422 | }, 1423 | "bin": { 1424 | "semver": "bin/semver.js" 1425 | }, 1426 | "engines": { 1427 | "node": ">=10" 1428 | } 1429 | }, 1430 | "node_modules/set-cookie-parser": { 1431 | "version": "2.6.0", 1432 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", 1433 | "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", 1434 | "dev": true 1435 | }, 1436 | "node_modules/sirv": { 1437 | "version": "2.0.3", 1438 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", 1439 | "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", 1440 | "dev": true, 1441 | "dependencies": { 1442 | "@polka/url": "^1.0.0-next.20", 1443 | "mrmime": "^1.0.0", 1444 | "totalist": "^3.0.0" 1445 | }, 1446 | "engines": { 1447 | "node": ">= 10" 1448 | } 1449 | }, 1450 | "node_modules/sorcery": { 1451 | "version": "0.11.0", 1452 | "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", 1453 | "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", 1454 | "dev": true, 1455 | "dependencies": { 1456 | "@jridgewell/sourcemap-codec": "^1.4.14", 1457 | "buffer-crc32": "^0.2.5", 1458 | "minimist": "^1.2.0", 1459 | "sander": "^0.5.0" 1460 | }, 1461 | "bin": { 1462 | "sorcery": "bin/sorcery" 1463 | } 1464 | }, 1465 | "node_modules/source-map-js": { 1466 | "version": "1.0.2", 1467 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1468 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1469 | "dev": true, 1470 | "engines": { 1471 | "node": ">=0.10.0" 1472 | } 1473 | }, 1474 | "node_modules/streamsearch": { 1475 | "version": "1.1.0", 1476 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 1477 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 1478 | "dev": true, 1479 | "engines": { 1480 | "node": ">=10.0.0" 1481 | } 1482 | }, 1483 | "node_modules/strip-indent": { 1484 | "version": "3.0.0", 1485 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", 1486 | "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", 1487 | "dev": true, 1488 | "dependencies": { 1489 | "min-indent": "^1.0.0" 1490 | }, 1491 | "engines": { 1492 | "node": ">=8" 1493 | } 1494 | }, 1495 | "node_modules/svelte": { 1496 | "version": "3.59.1", 1497 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.1.tgz", 1498 | "integrity": "sha512-pKj8fEBmqf6mq3/NfrB9SLtcJcUvjYSWyePlfCqN9gujLB25RitWK8PvFzlwim6hD/We35KbPlRteuA6rnPGcQ==", 1499 | "dev": true, 1500 | "engines": { 1501 | "node": ">= 8" 1502 | } 1503 | }, 1504 | "node_modules/svelte-check": { 1505 | "version": "3.3.2", 1506 | "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.3.2.tgz", 1507 | "integrity": "sha512-67j3rI0LDc2DvL0ON/2pvCasVVD3nHDrTkZNr4eITNfo2oFXdw7SIyMOiFj4swu+pjmFQAigytBK1IWyik8dBw==", 1508 | "dev": true, 1509 | "dependencies": { 1510 | "@jridgewell/trace-mapping": "^0.3.17", 1511 | "chokidar": "^3.4.1", 1512 | "fast-glob": "^3.2.7", 1513 | "import-fresh": "^3.2.1", 1514 | "picocolors": "^1.0.0", 1515 | "sade": "^1.7.4", 1516 | "svelte-preprocess": "^5.0.3", 1517 | "typescript": "^5.0.3" 1518 | }, 1519 | "bin": { 1520 | "svelte-check": "bin/svelte-check" 1521 | }, 1522 | "peerDependencies": { 1523 | "svelte": "^3.55.0" 1524 | } 1525 | }, 1526 | "node_modules/svelte-hmr": { 1527 | "version": "0.15.1", 1528 | "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", 1529 | "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", 1530 | "dev": true, 1531 | "engines": { 1532 | "node": "^12.20 || ^14.13.1 || >= 16" 1533 | }, 1534 | "peerDependencies": { 1535 | "svelte": ">=3.19.0" 1536 | } 1537 | }, 1538 | "node_modules/svelte-preprocess": { 1539 | "version": "5.0.3", 1540 | "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.3.tgz", 1541 | "integrity": "sha512-GrHF1rusdJVbOZOwgPWtpqmaexkydznKzy5qIC2FabgpFyKN57bjMUUUqPRfbBXK5igiEWn1uO/DXsa2vJ5VHA==", 1542 | "dev": true, 1543 | "hasInstallScript": true, 1544 | "dependencies": { 1545 | "@types/pug": "^2.0.6", 1546 | "detect-indent": "^6.1.0", 1547 | "magic-string": "^0.27.0", 1548 | "sorcery": "^0.11.0", 1549 | "strip-indent": "^3.0.0" 1550 | }, 1551 | "engines": { 1552 | "node": ">= 14.10.0" 1553 | }, 1554 | "peerDependencies": { 1555 | "@babel/core": "^7.10.2", 1556 | "coffeescript": "^2.5.1", 1557 | "less": "^3.11.3 || ^4.0.0", 1558 | "postcss": "^7 || ^8", 1559 | "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", 1560 | "pug": "^3.0.0", 1561 | "sass": "^1.26.8", 1562 | "stylus": "^0.55.0", 1563 | "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", 1564 | "svelte": "^3.23.0", 1565 | "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" 1566 | }, 1567 | "peerDependenciesMeta": { 1568 | "@babel/core": { 1569 | "optional": true 1570 | }, 1571 | "coffeescript": { 1572 | "optional": true 1573 | }, 1574 | "less": { 1575 | "optional": true 1576 | }, 1577 | "postcss": { 1578 | "optional": true 1579 | }, 1580 | "postcss-load-config": { 1581 | "optional": true 1582 | }, 1583 | "pug": { 1584 | "optional": true 1585 | }, 1586 | "sass": { 1587 | "optional": true 1588 | }, 1589 | "stylus": { 1590 | "optional": true 1591 | }, 1592 | "sugarss": { 1593 | "optional": true 1594 | }, 1595 | "typescript": { 1596 | "optional": true 1597 | } 1598 | } 1599 | }, 1600 | "node_modules/svelte-preprocess/node_modules/magic-string": { 1601 | "version": "0.27.0", 1602 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", 1603 | "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", 1604 | "dev": true, 1605 | "dependencies": { 1606 | "@jridgewell/sourcemap-codec": "^1.4.13" 1607 | }, 1608 | "engines": { 1609 | "node": ">=12" 1610 | } 1611 | }, 1612 | "node_modules/tiny-glob": { 1613 | "version": "0.2.9", 1614 | "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", 1615 | "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", 1616 | "dev": true, 1617 | "dependencies": { 1618 | "globalyzer": "0.1.0", 1619 | "globrex": "^0.1.2" 1620 | } 1621 | }, 1622 | "node_modules/to-regex-range": { 1623 | "version": "5.0.1", 1624 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1625 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1626 | "dev": true, 1627 | "dependencies": { 1628 | "is-number": "^7.0.0" 1629 | }, 1630 | "engines": { 1631 | "node": ">=8.0" 1632 | } 1633 | }, 1634 | "node_modules/totalist": { 1635 | "version": "3.0.1", 1636 | "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", 1637 | "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", 1638 | "dev": true, 1639 | "engines": { 1640 | "node": ">=6" 1641 | } 1642 | }, 1643 | "node_modules/tslib": { 1644 | "version": "2.5.0", 1645 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", 1646 | "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", 1647 | "dev": true 1648 | }, 1649 | "node_modules/typescript": { 1650 | "version": "5.0.4", 1651 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", 1652 | "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", 1653 | "dev": true, 1654 | "bin": { 1655 | "tsc": "bin/tsc", 1656 | "tsserver": "bin/tsserver" 1657 | }, 1658 | "engines": { 1659 | "node": ">=12.20" 1660 | } 1661 | }, 1662 | "node_modules/undici": { 1663 | "version": "5.22.1", 1664 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", 1665 | "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", 1666 | "dev": true, 1667 | "dependencies": { 1668 | "busboy": "^1.6.0" 1669 | }, 1670 | "engines": { 1671 | "node": ">=14.0" 1672 | } 1673 | }, 1674 | "node_modules/uuid": { 1675 | "version": "8.3.2", 1676 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1677 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 1678 | "dev": true, 1679 | "bin": { 1680 | "uuid": "dist/bin/uuid" 1681 | } 1682 | }, 1683 | "node_modules/vite": { 1684 | "version": "4.3.6", 1685 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.6.tgz", 1686 | "integrity": "sha512-cqIyLSbA6gornMS659AXTVKF7cvSHMdKmJJwQ9DXq3lwsT1uZSdktuBRlpHQ8VnOWx0QHtjDwxPpGtyo9Fh/Qg==", 1687 | "dev": true, 1688 | "dependencies": { 1689 | "esbuild": "^0.17.5", 1690 | "postcss": "^8.4.23", 1691 | "rollup": "^3.21.0" 1692 | }, 1693 | "bin": { 1694 | "vite": "bin/vite.js" 1695 | }, 1696 | "engines": { 1697 | "node": "^14.18.0 || >=16.0.0" 1698 | }, 1699 | "optionalDependencies": { 1700 | "fsevents": "~2.3.2" 1701 | }, 1702 | "peerDependencies": { 1703 | "@types/node": ">= 14", 1704 | "less": "*", 1705 | "sass": "*", 1706 | "stylus": "*", 1707 | "sugarss": "*", 1708 | "terser": "^5.4.0" 1709 | }, 1710 | "peerDependenciesMeta": { 1711 | "@types/node": { 1712 | "optional": true 1713 | }, 1714 | "less": { 1715 | "optional": true 1716 | }, 1717 | "sass": { 1718 | "optional": true 1719 | }, 1720 | "stylus": { 1721 | "optional": true 1722 | }, 1723 | "sugarss": { 1724 | "optional": true 1725 | }, 1726 | "terser": { 1727 | "optional": true 1728 | } 1729 | } 1730 | }, 1731 | "node_modules/vitefu": { 1732 | "version": "0.2.4", 1733 | "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", 1734 | "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", 1735 | "dev": true, 1736 | "peerDependencies": { 1737 | "vite": "^3.0.0 || ^4.0.0" 1738 | }, 1739 | "peerDependenciesMeta": { 1740 | "vite": { 1741 | "optional": true 1742 | } 1743 | } 1744 | }, 1745 | "node_modules/wrappy": { 1746 | "version": "1.0.2", 1747 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1748 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1749 | "dev": true 1750 | }, 1751 | "node_modules/yallist": { 1752 | "version": "4.0.0", 1753 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1754 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1755 | "dev": true 1756 | } 1757 | } 1758 | } 1759 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sveltekit-msal", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite dev", 7 | "build": "vite build", 8 | "preview": "vite preview", 9 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 10 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 11 | "lint": "prettier --plugin-search-dir . --check .", 12 | "format": "prettier --plugin-search-dir . --write ." 13 | }, 14 | "devDependencies": { 15 | "@azure/msal-node": "^1.17.2", 16 | "@sveltejs/adapter-auto": "^2.0.0", 17 | "@sveltejs/kit": "^1.5.0", 18 | "prettier": "^2.8.0", 19 | "prettier-plugin-svelte": "^2.8.1", 20 | "svelte": "^3.54.0", 21 | "svelte-check": "^3.0.1", 22 | "tslib": "^2.4.1", 23 | "typescript": "^5.0.0", 24 | "vite": "^4.3.0" 25 | }, 26 | "type": "module" 27 | } 28 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface Platform {} 9 | } 10 | } 11 | 12 | export {}; 13 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /src/hooks.server.ts: -------------------------------------------------------------------------------- 1 | import { redirect, type Handle } from '@sveltejs/kit'; 2 | import { redirectToAuthCodeUrl } from '$lib/auth/services'; 3 | 4 | export const handle: Handle = async ({ event, resolve }) => { 5 | if (event.route.id && event.route.id.indexOf('(protected)') > 0) { 6 | if (!event.cookies.get('idToken') || !event.cookies.get('accessToken')) { 7 | const authCodeUrl = await redirectToAuthCodeUrl(event); 8 | if (authCodeUrl) throw redirect(302, authCodeUrl); 9 | } 10 | } 11 | return await resolve(event); 12 | }; 13 | -------------------------------------------------------------------------------- /src/lib/auth/config.ts: -------------------------------------------------------------------------------- 1 | import { CLIENT_ID, CLOUD_INSTANCE, TENANT_ID, CLIENT_SECRET } from '$env/static/private'; 2 | 3 | export const msalConfig = { 4 | auth: { 5 | clientId: CLIENT_ID, 6 | authority: CLOUD_INSTANCE + TENANT_ID, 7 | clientSecret: CLIENT_SECRET 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /src/lib/auth/services.ts: -------------------------------------------------------------------------------- 1 | import type { RequestEvent } from '@sveltejs/kit'; 2 | import { ConfidentialClientApplication, CryptoProvider, ResponseMode } from '@azure/msal-node'; 3 | import { REDIRECT_URI } from '$env/static/private'; 4 | import { dev } from '$app/environment'; 5 | import { msalConfig } from './config'; 6 | 7 | const msalInstance = new ConfidentialClientApplication(msalConfig); 8 | const cryptoProvider = new CryptoProvider(); 9 | 10 | const cookiesConfig = { 11 | httpOnly: true, 12 | path: '/', 13 | secure: !dev 14 | }; 15 | 16 | export const redirectToAuthCodeUrl = async (event: RequestEvent) => { 17 | const { verifier, challenge } = await cryptoProvider.generatePkceCodes(); 18 | const pkceCodes = { 19 | challengeMethod: 'S256', 20 | verifier, 21 | challenge 22 | }; 23 | const csrfToken = cryptoProvider.createNewGuid(); 24 | const state = cryptoProvider.base64Encode( 25 | JSON.stringify({ 26 | csrfToken, 27 | redirectTo: event.url.pathname 28 | }) 29 | ); 30 | const authCodeUrlRequest = { 31 | redirectUri: REDIRECT_URI, 32 | responseMode: ResponseMode.QUERY, 33 | codeChallenge: pkceCodes.challenge, 34 | codeChallengeMethod: pkceCodes.challengeMethod, 35 | scopes: [], 36 | state 37 | }; 38 | 39 | try { 40 | const authCodeUrl = await msalInstance.getAuthCodeUrl(authCodeUrlRequest); 41 | event.cookies.set('pkceVerifier', verifier, cookiesConfig); 42 | event.cookies.set('csrfToken', csrfToken, cookiesConfig); 43 | return authCodeUrl; 44 | } catch (err) { 45 | console.log(err); 46 | } 47 | }; 48 | 49 | export const getTokens = async (event: RequestEvent) => { 50 | const state = event.url.searchParams.get('state'); 51 | if (state) { 52 | const decodedState = JSON.parse(cryptoProvider.base64Decode(state)); 53 | const csrfToken = event.cookies.get('csrfToken'); 54 | if (decodedState.csrfToken === csrfToken) { 55 | const code = event.url.searchParams.get('code'); 56 | const error = event.url.searchParams.get('error'); 57 | if (code) { 58 | const authCodeRequest = { 59 | redirectUri: REDIRECT_URI, 60 | code, 61 | scopes: [], 62 | codeVerifier: event.cookies.get('pkceVerifier') 63 | }; 64 | try { 65 | const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest); 66 | event.cookies.set('accessToken', tokenResponse.accessToken, cookiesConfig); 67 | event.cookies.set('idToken', tokenResponse.idToken, cookiesConfig); 68 | event.cookies.set('account', JSON.stringify(tokenResponse.account), cookiesConfig); 69 | return decodedState.redirectTo; 70 | } catch (err) { 71 | console.log(err); 72 | } 73 | } else if (error) { 74 | throw new Error(error); 75 | } 76 | } else { 77 | throw new Error('CSRF token mismatch'); 78 | } 79 | } else { 80 | throw new Error('State parameter missing'); 81 | } 82 | }; 83 | 84 | export const getLogoutUri = () => { 85 | return `${msalConfig.auth.authority}/oauth2/v2.0/logout`; 86 | }; 87 | -------------------------------------------------------------------------------- /src/routes/(protected)/+layout.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 31 | -------------------------------------------------------------------------------- /src/routes/(protected)/+page.svelte: -------------------------------------------------------------------------------- 1 |

Welcome to SvelteKit

2 |

Visit kit.svelte.dev to read the documentation

3 | -------------------------------------------------------------------------------- /src/routes/(protected)/logout/+server.ts: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit'; 2 | import type { RequestHandler } from './$types'; 3 | import { getLogoutUri } from '$lib/auth/services'; 4 | 5 | export const GET: RequestHandler = async ({ cookies }) => { 6 | cookies.delete('accessToken'); 7 | cookies.delete('idToken'); 8 | cookies.delete('account'); 9 | 10 | throw redirect(302, getLogoutUri()); 11 | }; 12 | -------------------------------------------------------------------------------- /src/routes/callback/+server.ts: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit'; 2 | import type { RequestHandler } from './$types'; 3 | import { getTokens } from '$lib/auth/services'; 4 | 5 | export const GET: RequestHandler = async (event) => { 6 | const redirectTo = await getTokens(event); 7 | throw redirect(302, redirectTo); 8 | }; 9 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/varu87/sveltekit-aad-auth/bcdcdc3636c978b30ff1aa10ca96b7dfd5ce350f/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 | } 16 | }; 17 | 18 | export default config; 19 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------