final code

This commit is contained in:
Hunter Johnston 2023-02-05 16:15:28 -05:00 committed by GitHub
commit dcc30ded70
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 478 additions and 219 deletions

View File

@ -14,28 +14,31 @@
"format": "prettier --plugin-search-dir . --write ."
},
"devDependencies": {
"@playwright/test": "^1.28.1",
"@sveltejs/adapter-auto": "^1.0.0",
"@sveltejs/kit": "^1.0.0",
"@typescript-eslint/eslint-plugin": "^5.45.0",
"@typescript-eslint/parser": "^5.45.0",
"eslint": "^8.28.0",
"eslint-config-prettier": "^8.5.0",
"@playwright/test": "^1.30.0",
"@sveltejs/adapter-auto": "^1.0.2",
"@sveltejs/kit": "^1.3.10",
"@typescript-eslint/eslint-plugin": "^5.50.0",
"@typescript-eslint/parser": "^5.50.0",
"eslint": "^8.33.0",
"eslint-config-prettier": "^8.6.0",
"eslint-plugin-svelte3": "^4.0.0",
"prettier": "^2.8.0",
"prettier-plugin-svelte": "^2.8.1",
"prettier": "^2.8.3",
"prettier-plugin-svelte": "^2.9.0",
"prisma": "^4.9.0",
"rome": "^11.0.0",
"svelte": "^3.54.0",
"svelte-check": "^3.0.1",
"tslib": "^2.4.1",
"typescript": "^4.9.3",
"vite": "^4.0.0",
"vitest": "^0.25.3"
"svelte": "^3.55.1",
"svelte-check": "^3.0.3",
"tslib": "^2.5.0",
"typescript": "^4.9.5",
"vite": "^4.1.1",
"vitest": "^0.25.8"
},
"type": "module",
"dependencies": {
"@picocss/pico": "^1.5.6",
"@prisma/client": "^4.9.0"
"@lucia-auth/adapter-prisma": "^0.4.0",
"@lucia-auth/sveltekit": "^0.6.2",
"@picocss/pico": "^1.5.7",
"@prisma/client": "^4.9.0",
"lucia-auth": "^0.6.0"
}
}

View File

@ -1,49 +1,55 @@
lockfileVersion: 5.4
specifiers:
'@picocss/pico': ^1.5.6
'@playwright/test': ^1.28.1
'@lucia-auth/adapter-prisma': ^0.4.0
'@lucia-auth/sveltekit': ^0.6.2
'@picocss/pico': ^1.5.7
'@playwright/test': ^1.30.0
'@prisma/client': ^4.9.0
'@sveltejs/adapter-auto': ^1.0.0
'@sveltejs/kit': ^1.0.0
'@typescript-eslint/eslint-plugin': ^5.45.0
'@typescript-eslint/parser': ^5.45.0
eslint: ^8.28.0
eslint-config-prettier: ^8.5.0
'@sveltejs/adapter-auto': ^1.0.2
'@sveltejs/kit': ^1.3.10
'@typescript-eslint/eslint-plugin': ^5.50.0
'@typescript-eslint/parser': ^5.50.0
eslint: ^8.33.0
eslint-config-prettier: ^8.6.0
eslint-plugin-svelte3: ^4.0.0
prettier: ^2.8.0
prettier-plugin-svelte: ^2.8.1
lucia-auth: ^0.6.0
prettier: ^2.8.3
prettier-plugin-svelte: ^2.9.0
prisma: ^4.9.0
rome: ^11.0.0
svelte: ^3.54.0
svelte-check: ^3.0.1
tslib: ^2.4.1
typescript: ^4.9.3
vite: ^4.0.0
vitest: ^0.25.3
svelte: ^3.55.1
svelte-check: ^3.0.3
tslib: ^2.5.0
typescript: ^4.9.5
vite: ^4.1.1
vitest: ^0.25.8
dependencies:
'@picocss/pico': 1.5.6
'@lucia-auth/adapter-prisma': 0.4.0_lucia-auth@0.6.0
'@lucia-auth/sveltekit': 0.6.2_iyasqsbplmktfcni36hpxhd3zi
'@picocss/pico': 1.5.7
'@prisma/client': 4.9.0_prisma@4.9.0
lucia-auth: 0.6.0
devDependencies:
'@playwright/test': 1.29.2
'@sveltejs/adapter-auto': 1.0.1_@sveltejs+kit@1.1.3
'@sveltejs/kit': 1.1.3_svelte@3.55.1+vite@4.0.4
'@typescript-eslint/eslint-plugin': 5.48.2_caon6io6stgpr7lz2rtbhekxqy
'@typescript-eslint/parser': 5.48.2_7uibuqfxkfaozanbtbziikiqje
eslint: 8.32.0
eslint-config-prettier: 8.6.0_eslint@8.32.0
eslint-plugin-svelte3: 4.0.0_tmo5zkisvhu6htudosk5k7m6pu
'@playwright/test': 1.30.0
'@sveltejs/adapter-auto': 1.0.2_@sveltejs+kit@1.3.10
'@sveltejs/kit': 1.3.10_svelte@3.55.1+vite@4.1.1
'@typescript-eslint/eslint-plugin': 5.50.0_go4drrxstycfikanvu45pi4vgq
'@typescript-eslint/parser': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64
eslint: 8.33.0
eslint-config-prettier: 8.6.0_eslint@8.33.0
eslint-plugin-svelte3: 4.0.0_4omm2ewoudhgnmf7aocafatnc4
prettier: 2.8.3
prettier-plugin-svelte: 2.9.0_kdmmghgdi3ngrsq6otxkjilbry
prisma: 4.9.0
rome: 11.0.0
svelte: 3.55.1
svelte-check: 3.0.2_svelte@3.55.1
tslib: 2.4.1
typescript: 4.9.4
vite: 4.0.4
svelte-check: 3.0.3_svelte@3.55.1
tslib: 2.5.0
typescript: 4.9.5
vite: 4.1.1
vitest: 0.25.8
packages:
@ -253,7 +259,7 @@ packages:
ajv: 6.12.6
debug: 4.3.4
espree: 9.4.1
globals: 13.19.0
globals: 13.20.0
ignore: 5.2.4
import-fresh: 3.3.0
js-yaml: 4.1.0
@ -299,6 +305,29 @@ packages:
'@jridgewell/sourcemap-codec': 1.4.14
dev: true
/@lucia-auth/adapter-prisma/0.4.0_lucia-auth@0.6.0:
resolution: {integrity: sha512-HMaGbVfB5KTZBs6KPqI5z6RFKVl4AKfm9u2KrrQglthpd/rWJoJRDI2oYkdcEX4Xu1FNdNJJrEtKKBtVAXYqrw==}
peerDependencies:
lucia-auth: 0.6.x
dependencies:
lucia-auth: 0.6.0
dev: false
/@lucia-auth/sveltekit/0.6.2_iyasqsbplmktfcni36hpxhd3zi:
resolution: {integrity: sha512-+lOhgctcdVkPRYtJegTaEZYLFhPJOHFjdAm9cBFFjpkV6cNGuHSTxobfOn7yRy3pGVhzGFM91uOfYrJxmECOBA==}
peerDependencies:
lucia-auth: 0.5.x - 0.6.x
svelte: 3.x
dependencies:
'@noble/hashes': 1.2.0
lucia-auth: 0.6.0
svelte: 3.55.1
dev: false
/@noble/hashes/1.2.0:
resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==}
dev: false
/@nodelib/fs.scandir/2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@ -320,17 +349,17 @@ packages:
fastq: 1.15.0
dev: true
/@picocss/pico/1.5.6:
resolution: {integrity: sha512-9R+OdtMuHijKa7AQKBrng/1Q/Cd3BnEigYJXmOxI10Eka2qGGDa4b0hua8UeYu01BTtAiO70K7CQuHffU4YXGA==}
/@picocss/pico/1.5.7:
resolution: {integrity: sha512-RygdXNlSXieAs9jMw/AeqA1ki1kldgEYbRn8BnYZIPfRTM5NWZ4uVzMK6uMPhYlRjoT5wD/OplZvIefnCqyDCQ==}
dev: false
/@playwright/test/1.29.2:
resolution: {integrity: sha512-+3/GPwOgcoF0xLz/opTnahel1/y42PdcgZ4hs+BZGIUjtmEFSXGg+nFoaH3NSmuc7a6GSFwXDJ5L7VXpqzigNg==}
/@playwright/test/1.30.0:
resolution: {integrity: sha512-SVxkQw1xvn/Wk/EvBnqWIq6NLo1AppwbYOjNLmyU0R1RoQ3rLEBtmjTnElcnz8VEtn11fptj1ECxK0tgURhajw==}
engines: {node: '>=14'}
hasBin: true
dependencies:
'@types/node': 18.11.18
playwright-core: 1.29.2
'@types/node': 18.11.19
playwright-core: 1.30.0
dev: true
/@polka/url/1.0.0-next.21:
@ -407,17 +436,17 @@ packages:
dev: true
optional: true
/@sveltejs/adapter-auto/1.0.1_@sveltejs+kit@1.1.3:
resolution: {integrity: sha512-IGek24xN1wJb+gz0hyGSxbIvM7q2K+BXquyycteCWbH9MPosjw8+LuIB2HIH20thE/647UEQBNqCM9R73lAUXA==}
/@sveltejs/adapter-auto/1.0.2_@sveltejs+kit@1.3.10:
resolution: {integrity: sha512-UXpEO/gutERZnD+Z5Vi4J/ifD3WSRuCI7xwtLJTcKNQvJ6t5Xsj1X3Mw2F8Vv/XTUuxf7xPLYUgThU331r0Y9w==}
peerDependencies:
'@sveltejs/kit': ^1.0.0
dependencies:
'@sveltejs/kit': 1.1.3_svelte@3.55.1+vite@4.0.4
'@sveltejs/kit': 1.3.10_svelte@3.55.1+vite@4.1.1
import-meta-resolve: 2.2.1
dev: true
/@sveltejs/kit/1.1.3_svelte@3.55.1+vite@4.0.4:
resolution: {integrity: sha512-LVsJjJmimUf+p26EpBEZ6lDdwk+WqNGPyy9MQ1HVYLgj5AEECATMeg8OlmUujh7bW2Tib0Cag1UWI7zMMe66WA==}
/@sveltejs/kit/1.3.10_svelte@3.55.1+vite@4.1.1:
resolution: {integrity: sha512-I3DgWCwTYbTz4ZPCJIRkSDrKkMu0bsdk6ghqsOBVNqesf1wBdTdfkXhag3ESWgIEjUV3VUIWPQF7fnt7328mhQ==}
engines: {node: ^16.14 || >=18}
hasBin: true
requiresBuild: true
@ -425,10 +454,10 @@ packages:
svelte: ^3.54.0
vite: ^4.0.0
dependencies:
'@sveltejs/vite-plugin-svelte': 2.0.2_svelte@3.55.1+vite@4.0.4
'@sveltejs/vite-plugin-svelte': 2.0.2_svelte@3.55.1+vite@4.1.1
'@types/cookie': 0.5.1
cookie: 0.5.0
devalue: 4.2.2
devalue: 4.2.3
esm-env: 1.0.0
kleur: 4.1.5
magic-string: 0.27.0
@ -438,13 +467,13 @@ packages:
sirv: 2.0.2
svelte: 3.55.1
tiny-glob: 0.2.9
undici: 5.15.0
vite: 4.0.4
undici: 5.16.0
vite: 4.1.1
transitivePeerDependencies:
- supports-color
dev: true
/@sveltejs/vite-plugin-svelte/2.0.2_svelte@3.55.1+vite@4.0.4:
/@sveltejs/vite-plugin-svelte/2.0.2_svelte@3.55.1+vite@4.1.1:
resolution: {integrity: sha512-xCEan0/NNpQuL0l5aS42FjwQ6wwskdxC3pW1OeFtEKNZwRg7Evro9lac9HesGP6TdFsTv2xMes5ASQVKbCacxg==}
engines: {node: ^14.18.0 || >= 16}
peerDependencies:
@ -452,13 +481,13 @@ packages:
vite: ^4.0.0
dependencies:
debug: 4.3.4
deepmerge: 4.2.2
deepmerge: 4.3.0
kleur: 4.1.5
magic-string: 0.27.0
svelte: 3.55.1
svelte-hmr: 0.15.1_svelte@3.55.1
vite: 4.0.4
vitefu: 0.2.4_vite@4.0.4
vite: 4.1.1
vitefu: 0.2.4_vite@4.1.1
transitivePeerDependencies:
- supports-color
dev: true
@ -481,8 +510,8 @@ packages:
resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
dev: true
/@types/node/18.11.18:
resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==}
/@types/node/18.11.19:
resolution: {integrity: sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==}
dev: true
/@types/pug/2.0.6:
@ -492,15 +521,15 @@ packages:
/@types/sass/1.43.1:
resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==}
dependencies:
'@types/node': 18.11.18
'@types/node': 18.11.19
dev: true
/@types/semver/7.3.13:
resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==}
dev: true
/@typescript-eslint/eslint-plugin/5.48.2_caon6io6stgpr7lz2rtbhekxqy:
resolution: {integrity: sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg==}
/@typescript-eslint/eslint-plugin/5.50.0_go4drrxstycfikanvu45pi4vgq:
resolution: {integrity: sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
'@typescript-eslint/parser': ^5.0.0
@ -510,24 +539,25 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/parser': 5.48.2_7uibuqfxkfaozanbtbziikiqje
'@typescript-eslint/scope-manager': 5.48.2
'@typescript-eslint/type-utils': 5.48.2_7uibuqfxkfaozanbtbziikiqje
'@typescript-eslint/utils': 5.48.2_7uibuqfxkfaozanbtbziikiqje
'@typescript-eslint/parser': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64
'@typescript-eslint/scope-manager': 5.50.0
'@typescript-eslint/type-utils': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64
'@typescript-eslint/utils': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64
debug: 4.3.4
eslint: 8.32.0
eslint: 8.33.0
grapheme-splitter: 1.0.4
ignore: 5.2.4
natural-compare-lite: 1.4.0
regexpp: 3.2.0
semver: 7.3.8
tsutils: 3.21.0_typescript@4.9.4
typescript: 4.9.4
tsutils: 3.21.0_typescript@4.9.5
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/parser/5.48.2_7uibuqfxkfaozanbtbziikiqje:
resolution: {integrity: sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==}
/@typescript-eslint/parser/5.50.0_4vsywjlpuriuw3tl5oq6zy5a64:
resolution: {integrity: sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
@ -536,26 +566,26 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/scope-manager': 5.48.2
'@typescript-eslint/types': 5.48.2
'@typescript-eslint/typescript-estree': 5.48.2_typescript@4.9.4
'@typescript-eslint/scope-manager': 5.50.0
'@typescript-eslint/types': 5.50.0
'@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5
debug: 4.3.4
eslint: 8.32.0
typescript: 4.9.4
eslint: 8.33.0
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/scope-manager/5.48.2:
resolution: {integrity: sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==}
/@typescript-eslint/scope-manager/5.50.0:
resolution: {integrity: sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
'@typescript-eslint/types': 5.48.2
'@typescript-eslint/visitor-keys': 5.48.2
'@typescript-eslint/types': 5.50.0
'@typescript-eslint/visitor-keys': 5.50.0
dev: true
/@typescript-eslint/type-utils/5.48.2_7uibuqfxkfaozanbtbziikiqje:
resolution: {integrity: sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==}
/@typescript-eslint/type-utils/5.50.0_4vsywjlpuriuw3tl5oq6zy5a64:
resolution: {integrity: sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: '*'
@ -564,23 +594,23 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/typescript-estree': 5.48.2_typescript@4.9.4
'@typescript-eslint/utils': 5.48.2_7uibuqfxkfaozanbtbziikiqje
'@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5
'@typescript-eslint/utils': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64
debug: 4.3.4
eslint: 8.32.0
tsutils: 3.21.0_typescript@4.9.4
typescript: 4.9.4
eslint: 8.33.0
tsutils: 3.21.0_typescript@4.9.5
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/types/5.48.2:
resolution: {integrity: sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==}
/@typescript-eslint/types/5.50.0:
resolution: {integrity: sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
/@typescript-eslint/typescript-estree/5.48.2_typescript@4.9.4:
resolution: {integrity: sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==}
/@typescript-eslint/typescript-estree/5.50.0_typescript@4.9.5:
resolution: {integrity: sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
typescript: '*'
@ -588,52 +618,52 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/types': 5.48.2
'@typescript-eslint/visitor-keys': 5.48.2
'@typescript-eslint/types': 5.50.0
'@typescript-eslint/visitor-keys': 5.50.0
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
semver: 7.3.8
tsutils: 3.21.0_typescript@4.9.4
typescript: 4.9.4
tsutils: 3.21.0_typescript@4.9.5
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/utils/5.48.2_7uibuqfxkfaozanbtbziikiqje:
resolution: {integrity: sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==}
/@typescript-eslint/utils/5.50.0_4vsywjlpuriuw3tl5oq6zy5a64:
resolution: {integrity: sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
'@types/json-schema': 7.0.11
'@types/semver': 7.3.13
'@typescript-eslint/scope-manager': 5.48.2
'@typescript-eslint/types': 5.48.2
'@typescript-eslint/typescript-estree': 5.48.2_typescript@4.9.4
eslint: 8.32.0
'@typescript-eslint/scope-manager': 5.50.0
'@typescript-eslint/types': 5.50.0
'@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5
eslint: 8.33.0
eslint-scope: 5.1.1
eslint-utils: 3.0.0_eslint@8.32.0
eslint-utils: 3.0.0_eslint@8.33.0
semver: 7.3.8
transitivePeerDependencies:
- supports-color
- typescript
dev: true
/@typescript-eslint/visitor-keys/5.48.2:
resolution: {integrity: sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==}
/@typescript-eslint/visitor-keys/5.50.0:
resolution: {integrity: sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
'@typescript-eslint/types': 5.48.2
'@typescript-eslint/types': 5.50.0
eslint-visitor-keys: 3.3.0
dev: true
/acorn-jsx/5.3.2_acorn@8.8.1:
/acorn-jsx/5.3.2_acorn@8.8.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
acorn: 8.8.1
acorn: 8.8.2
dev: true
/acorn-walk/8.2.0:
@ -641,8 +671,8 @@ packages:
engines: {node: '>=0.4.0'}
dev: true
/acorn/8.8.1:
resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==}
/acorn/8.8.2:
resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==}
engines: {node: '>=0.4.0'}
hasBin: true
dev: true
@ -820,8 +850,8 @@ packages:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
dev: true
/deepmerge/4.2.2:
resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
/deepmerge/4.3.0:
resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==}
engines: {node: '>=0.10.0'}
dev: true
@ -830,8 +860,8 @@ packages:
engines: {node: '>=8'}
dev: true
/devalue/4.2.2:
resolution: {integrity: sha512-Pkwd8qrI9O20VJ14fBNHu+on99toTNZFbgWRpZbC0zbDXpnE2WHYcrC1fHhMsF/3Ee+2yaW7vEujAT7fCYgqrA==}
/devalue/4.2.3:
resolution: {integrity: sha512-JG6Q248aN0pgFL57e3zqTVeFraBe+5W2ugvv1mLXsJP6YYIYJhRZhAl7QP8haJrqob6X10F9NEkuCvNILZTPeQ==}
dev: true
/dir-glob/3.0.1:
@ -887,22 +917,22 @@ packages:
engines: {node: '>=10'}
dev: true
/eslint-config-prettier/8.6.0_eslint@8.32.0:
/eslint-config-prettier/8.6.0_eslint@8.33.0:
resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==}
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
dependencies:
eslint: 8.32.0
eslint: 8.33.0
dev: true
/eslint-plugin-svelte3/4.0.0_tmo5zkisvhu6htudosk5k7m6pu:
/eslint-plugin-svelte3/4.0.0_4omm2ewoudhgnmf7aocafatnc4:
resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==}
peerDependencies:
eslint: '>=8.0.0'
svelte: ^3.2.0
dependencies:
eslint: 8.32.0
eslint: 8.33.0
svelte: 3.55.1
dev: true
@ -922,13 +952,13 @@ packages:
estraverse: 5.3.0
dev: true
/eslint-utils/3.0.0_eslint@8.32.0:
/eslint-utils/3.0.0_eslint@8.33.0:
resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
peerDependencies:
eslint: '>=5'
dependencies:
eslint: 8.32.0
eslint: 8.33.0
eslint-visitor-keys: 2.1.0
dev: true
@ -942,8 +972,8 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
/eslint/8.32.0:
resolution: {integrity: sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==}
/eslint/8.33.0:
resolution: {integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
hasBin: true
dependencies:
@ -958,7 +988,7 @@ packages:
doctrine: 3.0.0
escape-string-regexp: 4.0.0
eslint-scope: 7.1.1
eslint-utils: 3.0.0_eslint@8.32.0
eslint-utils: 3.0.0_eslint@8.33.0
eslint-visitor-keys: 3.3.0
espree: 9.4.1
esquery: 1.4.0
@ -967,14 +997,14 @@ packages:
file-entry-cache: 6.0.1
find-up: 5.0.0
glob-parent: 6.0.2
globals: 13.19.0
globals: 13.20.0
grapheme-splitter: 1.0.4
ignore: 5.2.4
import-fresh: 3.3.0
imurmurhash: 0.1.4
is-glob: 4.0.3
is-path-inside: 3.0.3
js-sdsl: 4.2.0
js-sdsl: 4.3.0
js-yaml: 4.1.0
json-stable-stringify-without-jsonify: 1.0.1
levn: 0.4.1
@ -998,8 +1028,8 @@ packages:
resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
acorn: 8.8.1
acorn-jsx: 5.3.2_acorn@8.8.1
acorn: 8.8.2
acorn-jsx: 5.3.2_acorn@8.8.2
eslint-visitor-keys: 3.3.0
dev: true
@ -1140,8 +1170,8 @@ packages:
path-is-absolute: 1.0.1
dev: true
/globals/13.19.0:
resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==}
/globals/13.20.0:
resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
engines: {node: '>=8'}
dependencies:
type-fest: 0.20.2
@ -1259,8 +1289,8 @@ packages:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true
/js-sdsl/4.2.0:
resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==}
/js-sdsl/4.3.0:
resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==}
dev: true
/js-yaml/4.1.0:
@ -1291,8 +1321,8 @@ packages:
type-check: 0.4.0
dev: true
/local-pkg/0.4.2:
resolution: {integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==}
/local-pkg/0.4.3:
resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
engines: {node: '>=14'}
dev: true
@ -1320,6 +1350,13 @@ packages:
yallist: 4.0.0
dev: true
/lucia-auth/0.6.0:
resolution: {integrity: sha512-8j5nPl3RbbqGoZWULER4q+2PP7i8F3Eq3OeN7EnL+bxi4YAn5I+5FcNq/ikUCj8neOxGZyzJiRzFJq+t3r28+g==}
dependencies:
'@noble/hashes': 1.2.0
nanoid: 4.0.1
dev: false
/magic-string/0.27.0:
resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
engines: {node: '>=12'}
@ -1388,6 +1425,12 @@ packages:
hasBin: true
dev: true
/nanoid/4.0.1:
resolution: {integrity: sha512-udKGtCCUafD3nQtJg9wBhRP3KMbPglUsgV5JVsXhvyBs/oefqb4sqMEhKBBgqZncYowu58p1prsZQBYvAj/Gww==}
engines: {node: ^14 || ^16 || >=18}
hasBin: true
dev: false
/natural-compare-lite/1.4.0:
resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
dev: true
@ -1477,8 +1520,8 @@ packages:
engines: {node: '>=8.6'}
dev: true
/playwright-core/1.29.2:
resolution: {integrity: sha512-94QXm4PMgFoHAhlCuoWyaBYKb92yOcGVHdQLoxQ7Wjlc7Flg4aC/jbFW7xMR52OfXMVkWicue4WXE7QEegbIRA==}
/playwright-core/1.30.0:
resolution: {integrity: sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g==}
engines: {node: '>=14'}
hasBin: true
dev: true
@ -1521,8 +1564,8 @@ packages:
dependencies:
'@prisma/engines': 4.9.0
/punycode/2.2.0:
resolution: {integrity: sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw==}
/punycode/2.3.0:
resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
engines: {node: '>=6'}
dev: true
@ -1575,8 +1618,8 @@ packages:
glob: 7.2.3
dev: true
/rollup/3.10.0:
resolution: {integrity: sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==}
/rollup/3.13.0:
resolution: {integrity: sha512-HJwQtrXAc0AmyDohTJ/2c+Bx/sWPScJLlAUJ1kuD7rAkCro8Cr2SnVB2gVYBiSLxpgD2kZ24jbyXtG++GumrYQ==}
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
hasBin: true
optionalDependencies:
@ -1657,14 +1700,14 @@ packages:
engines: {node: '>=8'}
dev: true
/sorcery/0.10.0:
resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==}
/sorcery/0.11.0:
resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==}
hasBin: true
dependencies:
'@jridgewell/sourcemap-codec': 1.4.14
buffer-crc32: 0.2.13
minimist: 1.2.7
sander: 0.5.1
sourcemap-codec: 1.4.8
dev: true
/source-map-js/1.0.2:
@ -1677,11 +1720,6 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/sourcemap-codec/1.4.8:
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
deprecated: Please use @jridgewell/sourcemap-codec instead
dev: true
/streamsearch/1.1.0:
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
engines: {node: '>=10.0.0'}
@ -1706,10 +1744,10 @@ packages:
engines: {node: '>=8'}
dev: true
/strip-literal/1.0.0:
resolution: {integrity: sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==}
/strip-literal/1.0.1:
resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==}
dependencies:
acorn: 8.8.1
acorn: 8.8.2
dev: true
/supports-color/7.2.0:
@ -1724,8 +1762,8 @@ packages:
engines: {node: '>= 0.4'}
dev: true
/svelte-check/3.0.2_svelte@3.55.1:
resolution: {integrity: sha512-DkhKhV0Jt0gh7q9DBB26+J2Vfb9y4/4JWxnbkXBZha7542LOhwvj3edJFjyJ+xjdaXyInZ+YRRYc3V6wytP2ew==}
/svelte-check/3.0.3_svelte@3.55.1:
resolution: {integrity: sha512-ByBFXo3bfHRGIsYEasHkdMhLkNleVfszX/Ns1oip58tPJlKdo5Ssr8kgVIuo5oq00hss8AIcdesuy0Xt0BcTvg==}
hasBin: true
peerDependencies:
svelte: ^3.55.0
@ -1737,8 +1775,8 @@ packages:
picocolors: 1.0.0
sade: 1.8.1
svelte: 3.55.1
svelte-preprocess: 5.0.0_atrrhq7vg4ekua4nnyrpuardle
typescript: 4.9.4
svelte-preprocess: 5.0.1_4x7phaipmicbaooxtnresslofa
typescript: 4.9.5
transitivePeerDependencies:
- '@babel/core'
- coffeescript
@ -1760,8 +1798,8 @@ packages:
svelte: 3.55.1
dev: true
/svelte-preprocess/5.0.0_atrrhq7vg4ekua4nnyrpuardle:
resolution: {integrity: sha512-q7lpa7i2FBu8Pa+G0MmuQQWETBwCKgsGmuq1Sf6n8q4uaG9ZLcLP0Y+etC6bF4sE6EbLxfiI38zV6RfPe3RSfg==}
/svelte-preprocess/5.0.1_4x7phaipmicbaooxtnresslofa:
resolution: {integrity: sha512-0HXyhCoc9rsW4zGOgtInylC6qj259E1hpFnJMJWTf+aIfeqh4O/QHT31KT2hvPEqQfdjmqBR/kO2JDkkciBLrQ==}
engines: {node: '>= 14.10.0'}
requiresBuild: true
peerDependencies:
@ -1802,16 +1840,15 @@ packages:
'@types/sass': 1.43.1
detect-indent: 6.1.0
magic-string: 0.27.0
sorcery: 0.10.0
sorcery: 0.11.0
strip-indent: 3.0.0
svelte: 3.55.1
typescript: 4.9.4
typescript: 4.9.5
dev: true
/svelte/3.55.1:
resolution: {integrity: sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ==}
engines: {node: '>= 8'}
dev: true
/text-table/0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
@ -1828,8 +1865,8 @@ packages:
resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==}
dev: true
/tinypool/0.3.0:
resolution: {integrity: sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==}
/tinypool/0.3.1:
resolution: {integrity: sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==}
engines: {node: '>=14.0.0'}
dev: true
@ -1854,18 +1891,18 @@ packages:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
dev: true
/tslib/2.4.1:
resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==}
/tslib/2.5.0:
resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
dev: true
/tsutils/3.21.0_typescript@4.9.4:
/tsutils/3.21.0_typescript@4.9.5:
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
engines: {node: '>= 6'}
peerDependencies:
typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
dependencies:
tslib: 1.14.1
typescript: 4.9.4
typescript: 4.9.5
dev: true
/type-check/0.4.0:
@ -1885,14 +1922,14 @@ packages:
engines: {node: '>=10'}
dev: true
/typescript/4.9.4:
resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==}
/typescript/4.9.5:
resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
engines: {node: '>=4.2.0'}
hasBin: true
dev: true
/undici/5.15.0:
resolution: {integrity: sha512-wCAZJDyjw9Myv+Ay62LAoB+hZLPW9SmKbQkbHIhMw/acKSlpn7WohdMUc/Vd4j1iSMBO0hWwU8mjB7a5p5bl8g==}
/undici/5.16.0:
resolution: {integrity: sha512-KWBOXNv6VX+oJQhchXieUznEmnJMqgXMbs0xxH2t8q/FUAWSJvOSr/rMaZKnX5RIVq7JDn0JbP4BOnKG2SGXLQ==}
engines: {node: '>=12.18'}
dependencies:
busboy: 1.6.0
@ -1901,11 +1938,11 @@ packages:
/uri-js/4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
dependencies:
punycode: 2.2.0
punycode: 2.3.0
dev: true
/vite/4.0.4:
resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==}
/vite/4.1.1:
resolution: {integrity: sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
@ -1932,13 +1969,13 @@ packages:
esbuild: 0.16.17
postcss: 8.4.21
resolve: 1.22.1
rollup: 3.10.0
rollup: 3.13.0
optionalDependencies:
fsevents: 2.3.2
dev: true
/vite/4.0.4_@types+node@18.11.18:
resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==}
/vite/4.1.1_@types+node@18.11.19:
resolution: {integrity: sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
@ -1962,16 +1999,16 @@ packages:
terser:
optional: true
dependencies:
'@types/node': 18.11.18
'@types/node': 18.11.19
esbuild: 0.16.17
postcss: 8.4.21
resolve: 1.22.1
rollup: 3.10.0
rollup: 3.13.0
optionalDependencies:
fsevents: 2.3.2
dev: true
/vitefu/0.2.4_vite@4.0.4:
/vitefu/0.2.4_vite@4.1.1:
resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==}
peerDependencies:
vite: ^3.0.0 || ^4.0.0
@ -1979,7 +2016,7 @@ packages:
vite:
optional: true
dependencies:
vite: 4.0.4
vite: 4.1.1
dev: true
/vitest/0.25.8:
@ -2006,18 +2043,18 @@ packages:
dependencies:
'@types/chai': 4.3.4
'@types/chai-subset': 1.3.3
'@types/node': 18.11.18
acorn: 8.8.1
'@types/node': 18.11.19
acorn: 8.8.2
acorn-walk: 8.2.0
chai: 4.3.7
debug: 4.3.4
local-pkg: 0.4.2
local-pkg: 0.4.3
source-map: 0.6.1
strip-literal: 1.0.0
strip-literal: 1.0.1
tinybench: 2.3.1
tinypool: 0.3.0
tinypool: 0.3.1
tinyspy: 1.0.2
vite: 4.0.4_@types+node@18.11.18
vite: 4.1.1_@types+node@18.11.19
transitivePeerDependencies:
- less
- sass

View File

@ -14,4 +14,39 @@ model Article {
id Int @id @default(autoincrement())
title String
content String
User User @relation(fields: [userId], references: [id])
userId String
}
model User {
id String @id @unique
name String
username String @unique
articles Article[]
session Session[]
Key Key[]
@@map("user")
}
model Session {
id String @id @unique
user_id String
active_expires BigInt
idle_expires BigInt
user User @relation(references: [id], fields: [user_id], onDelete: Cascade)
@@index([user_id])
@@map("session")
}
model Key {
id String @id @unique
hashed_password String?
user_id String
primary Boolean
user User @relation(references: [id], fields: [user_id], onDelete: Cascade)
@@index([user_id])
@@map("key")
}

15
src/app.d.ts vendored
View File

@ -3,11 +3,24 @@ import type { PrismaClient } from "@prisma/client"
declare global {
namespace App {
// interface Error {}
// interface Locals {}
interface Locals {
validate: import("@lucia-auth/sveltekit").Validate
validateUser: import("@lucia-auth/sveltekit").ValidateUser
setSession: import("@lucia-auth/sveltekit").SetSession
}
// interface PageData {}
// interface Platform {}
}
var __prisma: PrismaClient
/// <reference types="lucia-auth" />
declare namespace Lucia {
type Auth = import("$lib/server/lucia").Auth
type UserAttributes = {
username: string
name: string
}
}
}
export {}

10
src/hooks.server.ts Normal file
View File

@ -0,0 +1,10 @@
import { handleHooks } from "@lucia-auth/sveltekit"
import { auth } from "$lib/server/lucia"
import type { Handle } from "@sveltejs/kit"
import { sequence } from "@sveltejs/kit/hooks"
export const customHandle: Handle = async ({ resolve, event }) => {
return resolve(event)
}
export const handle: Handle = sequence(handleHooks(auth), customHandle)

18
src/lib/server/lucia.ts Normal file
View File

@ -0,0 +1,18 @@
import lucia from "lucia-auth"
import prismaAdapter from "@lucia-auth/adapter-prisma"
import { dev } from "$app/environment"
import { prisma } from "$lib/server/prisma"
export const auth = lucia({
adapter: prismaAdapter(prisma),
env: dev ? "DEV" : "PROD",
transformUserData: (userData) => {
return {
userId: userData.id,
username: userData.username,
name: userData.name,
}
},
})
export type Auth = typeof auth

View File

@ -1,8 +1,9 @@
import { PrismaClient } from "@prisma/client"
import { env } from "$env/dynamic/private"
const prisma = global.__prisma || new PrismaClient()
if (process.env.NODE_ENV === "development") {
if (env.NODE_ENV === "development") {
global.__prisma = prisma
}

View File

@ -0,0 +1,6 @@
import type { LayoutServerLoad } from "./$types"
export const load: LayoutServerLoad = async ({ locals }) => {
const { user, session } = await locals.validateUser()
return { user }
}

View File

@ -1,5 +1,7 @@
<script lang="ts">
import '@picocss/pico'
import type { PageData } from './$types'
export let data: PageData
</script>
<div class="container">
@ -12,9 +14,17 @@
</li>
</ul>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/register">Register</a></li>
<li><a href="/login" role="button">Login</a></li>
<form method="POST">
<li><a href="/">Home</a></li>
{#if !data.user}
<li><a href="/register">Register</a></li>
<li><a href="/login" role="button">Login</a></li>
{:else}
<li>
<button formaction="/logout" type="submit" role="button">Logout</button>
</li>
{/if}
</form>
</ul>
</nav>
<slot />

View File

@ -1,6 +1,6 @@
import type { Actions, PageServerLoad } from "./$types"
import { prisma } from "$lib/server/prisma"
import { fail } from "@sveltejs/kit"
import { error, fail, redirect } from "@sveltejs/kit"
export const load: PageServerLoad = async () => {
return {
@ -9,7 +9,12 @@ export const load: PageServerLoad = async () => {
}
export const actions: Actions = {
createArticle: async ({ request }) => {
createArticle: async ({ request, locals }) => {
const { user, session } = await locals.validateUser()
if (!(user && session)) {
throw redirect(302, "/")
}
const { title, content } = Object.fromEntries(
await request.formData(),
) as Record<string, string>
@ -19,6 +24,7 @@ export const actions: Actions = {
data: {
title,
content,
userId: user.userId,
},
})
} catch (err) {
@ -30,13 +36,27 @@ export const actions: Actions = {
status: 201,
}
},
deleteArticle: async ({ url }) => {
deleteArticle: async ({ url, locals }) => {
const { user, session } = await locals.validateUser()
if (!(user && session)) {
throw redirect(302, "/")
}
const id = url.searchParams.get("id")
if (!id) {
return fail(400, { message: "Invalid request" })
}
try {
const article = await prisma.article.findUniqueOrThrow({
where: {
id: Number(id),
},
})
if (article.userId !== user.userId) {
throw error(403, "Not authorized")
}
await prisma.article.delete({
where: {
id: Number(id),

View File

@ -15,21 +15,25 @@
<p>
{article.content}
</p>
<form action="?/deleteArticle&id={article.id}" method="POST">
<button type="submit" class="outline secondary">Delete Article</button>
</form>
<a href="/{article.id}" role="button" class="outline constrast" style="width: 100%;"
>Edit Article</a
>
{#if article.userId === data.user?.userId}
<form action="?/deleteArticle&id={article.id}" method="POST">
<button type="submit" class="outline secondary">Delete Article</button>
</form>
<a href="/{article.id}" role="button" class="outline constrast" style="width: 100%;"
>Edit Article</a
>
{/if}
</article>
{/each}
</div>
<form action="?/createArticle" method="POST">
<h3>New Article</h3>
<label for="title"> Title </label>
<input type="text" id="title" name="title" />
<label for="title"> Title </label>
<textarea id="content" name="content" rows={5} />
<button type="submit">Add Article</button>
</form>
{#if data.user}
<form action="?/createArticle" method="POST">
<h3>New Article</h3>
<label for="title"> Title </label>
<input type="text" id="title" name="title" />
<label for="title"> Content </label>
<textarea id="content" name="content" rows={5} />
<button type="submit">Add Article</button>
</form>
{/if}
</div>

View File

@ -2,8 +2,13 @@ import type { Actions, PageServerLoad } from "./$types"
import { prisma } from "$lib/server/prisma"
import { error, fail } from "@sveltejs/kit"
export const load: PageServerLoad = async ({ params }) => {
const getArticle = async () => {
export const load: PageServerLoad = async ({ params, locals }) => {
const { user, session } = await locals.validateUser()
if (!(user && session)) {
throw error(401, "Unauthorized")
}
const getArticle = async (userId: string) => {
const article = await prisma.article.findUnique({
where: {
id: Number(params.articleId),
@ -12,21 +17,39 @@ export const load: PageServerLoad = async ({ params }) => {
if (!article) {
throw error(404, "Article not found")
}
if (article.userId !== user.userId) {
throw error(403, "Unauthorized")
}
return article
}
return {
article: getArticle(),
article: getArticle(user.userId),
}
}
export const actions: Actions = {
updateArticle: async ({ request, params }) => {
updateArticle: async ({ request, params, locals }) => {
const { user, session } = await locals.validateUser()
if (!(user && session)) {
throw error(401, "Unauthorized")
}
const { title, content } = Object.fromEntries(
await request.formData(),
) as Record<string, string>
try {
const article = await prisma.article.findUniqueOrThrow({
where: {
id: Number(params.articleId),
},
})
if (article.userId !== user.userId) {
throw error(403, "Forbidden to edit this article.")
}
await prisma.article.update({
where: {
id: Number(params.articleId),

View File

@ -0,0 +1,28 @@
import { auth } from "$lib/server/lucia"
import { fail, redirect } from "@sveltejs/kit"
import type { Actions, PageServerLoad } from "./$types"
export const load: PageServerLoad = async ({ locals }) => {
const session = await locals.validate()
if (session) {
throw redirect(302, "/")
}
}
export const actions: Actions = {
default: async ({ request, locals }) => {
const { username, password } = Object.fromEntries(
await request.formData(),
) as Record<string, string>
try {
const key = await auth.validateKeyPassword("username", username, password)
const session = await auth.createSession(key.userId)
locals.setSession(session)
} catch (err) {
console.error(err)
return fail(400, { message: "Could not login user." })
}
throw redirect(302, "/")
},
}

View File

@ -0,0 +1,15 @@
import { auth } from "$lib/server/lucia"
import { redirect } from "@sveltejs/kit"
import type { RequestHandler } from "./$types"
export const POST: RequestHandler = async ({ locals }) => {
const session = await locals.validate()
if (!session) {
throw redirect(302, "/")
}
await auth.invalidateSession(session.sessionId)
locals.setSession(null)
throw redirect(302, "/")
}

View File

@ -0,0 +1,36 @@
import { auth } from "$lib/server/lucia"
import { fail, redirect } from "@sveltejs/kit"
import type { Actions, PageServerLoad } from "./$types"
export const load: PageServerLoad = async ({ locals }) => {
const session = await locals.validate()
if (session) {
throw redirect(302, "/")
}
}
export const actions: Actions = {
default: async ({ request }) => {
const { name, username, password } = Object.fromEntries(
await request.formData(),
) as Record<string, string>
try {
await auth.createUser({
key: {
providerId: "username",
providerUserId: username,
password,
},
attributes: {
name,
username,
},
})
} catch (err) {
console.error(err)
return fail(400, { message: "Could not register user" })
}
throw redirect(302, "/login")
},
}