From c9b6269ce92227103dc3d07ad0e4cdb7278ba09d Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Sat, 9 Nov 2024 11:05:28 -0800 Subject: [PATCH] Cleanup code, fix IntelliJ removing star imports, move sessions to Redis. --- package.json | 8 +- pnpm-lock.yaml | 32 +-- src/app.d.ts | 10 +- src/app.html | 22 +- src/hooks.server.ts | 43 ++-- src/lib/LocalStorage.svelte | 114 ++++----- src/lib/components/Game.svelte | 17 +- src/lib/components/Header.svelte | 10 +- src/lib/components/pin-input.svelte | 25 +- .../components/search/GameSearchForm.svelte | 21 +- .../ui/alert/alert-description.svelte | 4 +- .../components/ui/alert/alert-title.svelte | 6 +- src/lib/components/ui/alert/alert.svelte | 12 +- src/lib/components/ui/alert/index.ts | 14 +- src/lib/components/ui/button/button.svelte | 5 +- src/lib/components/ui/button/index.ts | 4 +- .../components/ui/card/card-content.svelte | 4 +- .../ui/card/card-description.svelte | 4 +- src/lib/components/ui/card/card-footer.svelte | 4 +- src/lib/components/ui/card/card-header.svelte | 4 +- src/lib/components/ui/card/card-title.svelte | 6 +- src/lib/components/ui/card/card.svelte | 4 +- .../dropdown-menu-checkbox-item.svelte | 8 +- .../dropdown-menu-content.svelte | 6 +- .../dropdown-menu/dropdown-menu-item.svelte | 6 +- .../dropdown-menu/dropdown-menu-label.svelte | 4 +- .../dropdown-menu-radio-group.svelte | 2 +- .../dropdown-menu-radio-item.svelte | 8 +- .../dropdown-menu-separator.svelte | 6 +- .../dropdown-menu-shortcut.svelte | 4 +- .../dropdown-menu-sub-content.svelte | 6 +- .../dropdown-menu-sub-trigger.svelte | 8 +- src/lib/components/ui/dropdown-menu/index.ts | 2 +- src/lib/components/ui/form/form-button.svelte | 2 +- .../ui/form/form-description.svelte | 5 +- .../ui/form/form-element-field.svelte | 5 +- .../ui/form/form-field-errors.svelte | 4 +- src/lib/components/ui/form/form-field.svelte | 5 +- .../components/ui/form/form-fieldset.svelte | 5 +- src/lib/components/ui/form/form-label.svelte | 8 +- src/lib/components/ui/form/form-legend.svelte | 4 +- src/lib/components/ui/label/label.svelte | 4 +- .../ui/pagination/pagination-content.svelte | 4 +- .../ui/pagination/pagination-ellipsis.svelte | 6 +- .../ui/pagination/pagination-item.svelte | 4 +- .../ui/pagination/pagination-link.svelte | 6 +- .../pagination/pagination-next-button.svelte | 8 +- .../pagination/pagination-prev-button.svelte | 8 +- .../ui/pagination/pagination.svelte | 5 +- src/lib/components/ui/select/index.ts | 2 +- .../ui/select/select-content.svelte | 8 +- .../components/ui/select/select-item.svelte | 8 +- .../components/ui/select/select-label.svelte | 4 +- .../ui/select/select-separator.svelte | 6 +- .../ui/select/select-trigger.svelte | 8 +- src/lib/components/ui/sonner/sonner.svelte | 4 +- src/lib/page_loading_indicator.svelte | 46 ++-- .../server/api/services/sessions.service.ts | 99 ++++++-- src/lib/zodValidation.ts | 86 +++---- .../(app)/(protected)/admin/+layout.server.ts | 1 - .../(app)/(protected)/admin/+layout.svelte | 32 ++- .../(protected)/admin/users/+page.server.ts | 16 +- .../(protected)/admin/users/+page.svelte | 5 +- .../(protected)/admin/users/[id]/+page.svelte | 12 +- .../admin/users/[id]/add-roles-form.svelte | 22 +- .../admin/users/user-table-actions.svelte | 9 +- .../admin/users/user-table-checkbox.svelte | 6 +- .../(protected)/admin/users/user-table.svelte | 217 ++++++++---------- .../(protected)/collections/+page.svelte | 7 +- .../collections/[cuid]/+error.svelte | 4 +- .../collections/[cuid]/+page.svelte | 14 +- .../collections/add/+page.server.ts | 13 +- .../(protected)/collections/add/+page.svelte | 4 +- .../collections/add/bgg/+page.server.ts | 25 +- .../collections/add/bgg/+page.svelte | 6 +- .../(app)/(protected)/list/+layout.svelte | 6 +- .../(protected)/list/[id]/+page.server.ts | 1 - .../(app)/(protected)/list/[id]/+page.svelte | 10 +- .../(app)/(protected)/settings/+layout.svelte | 8 +- .../(protected)/settings/+page.server.ts | 8 +- .../settings/security/+page.server.ts | 18 +- .../settings/security/+page.svelte | 8 +- .../security/change/password/+page.server.ts | 68 +++--- .../security/change/password/+page.svelte | 34 +-- .../security/change/password/schemas.ts | 64 +++--- .../settings/security/mfa/+page.server.ts | 24 +- .../settings/security/mfa/+page.svelte | 12 +- .../mfa/recovery-codes/+page.server.ts | 26 +-- .../security/mfa/security-keys/+page.svelte | 5 + .../security/mfa/totp/+page.server.ts | 122 +++++----- .../settings/security/mfa/totp/+page.svelte | 30 ++- .../settings/security/mfa/totp/schemas.ts | 10 +- .../(app)/(protected)/wishlists/+page.svelte | 7 +- .../wishlists/[cuid]/+page.server.ts | 3 +- .../(protected)/wishlists/[cuid]/+page.svelte | 6 +- src/routes/(app)/+layout.server.ts | 12 +- src/routes/(app)/+layout.svelte | 8 +- src/routes/(app)/+page.server.ts | 32 +-- src/routes/(app)/game/[id]/+page.svelte | 17 +- src/routes/(app)/search/+page.server.ts | 150 ++++++------ src/routes/(app)/search/+page.svelte | 42 ++-- src/routes/(auth)/+layout.server.ts | 4 +- src/routes/(auth)/+layout.svelte | 9 +- .../(auth)/auth/callback/github/+server.ts | 22 +- .../(auth)/auth/callback/google/+server.ts | 22 +- src/routes/(auth)/login/+page.server.ts | 56 ++--- src/routes/(auth)/login/+page.svelte | 31 ++- src/routes/(auth)/login/github/+server.ts | 17 +- src/routes/(auth)/login/google/+server.ts | 21 +- src/routes/(auth)/login/spotify/+server.ts | 17 +- src/routes/(auth)/login/tidal/+server.ts | 17 +- src/routes/(auth)/logout/+page.server.ts | 10 +- .../(auth)/password/reset/+page.server.ts | 50 ++-- src/routes/(auth)/password/reset/+page.svelte | 54 +++-- src/routes/(auth)/signup/+page.server.ts | 50 ++-- src/routes/(auth)/signup/+page.svelte | 41 ++-- src/routes/(auth)/totp/+page.svelte | 48 ++-- src/routes/+error.svelte | 4 +- src/search/actions.ts | 41 ++-- src/server/roles.ts | 2 +- src/server/users.ts | 4 +- src/state/theme.ts | 4 +- src/styles/reset.pcss | 34 +-- src/styles/theme.pcss | 216 ++++++++--------- 124 files changed, 1343 insertions(+), 1342 deletions(-) create mode 100644 src/routes/(app)/(protected)/settings/security/mfa/security-keys/+page.svelte diff --git a/package.json b/package.json index fde1d1b..14627ed 100644 --- a/package.json +++ b/package.json @@ -40,14 +40,17 @@ "@typescript-eslint/parser": "^7.18.0", "arctic": "^1.9.2", "autoprefixer": "^10.4.20", + "bits-ui": "^0.21.16", "drizzle-kit": "^0.27.2", "eslint": "^8.57.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "2.36.0-next.13", + "formsnap": "^1.0.1", "just-clone": "^6.2.0", "just-debounce-it": "^3.2.0", "lucia": "3.2.0", "lucide-svelte": "^0.408.0", + "mode-watcher": "^0.4.1", "nodemailer": "^6.9.16", "postcss": "^8.4.47", "postcss-import": "^16.1.0", @@ -61,6 +64,7 @@ "svelte-meta-tags": "^3.1.4", "svelte-preprocess": "^6.0.3", "svelte-sequential-preprocessor": "^2.0.2", + "svelte-sonner": "^0.3.28", "sveltekit-flash-message": "^2.4.4", "sveltekit-superforms": "^2.20.0", "tailwindcss": "^3.4.14", @@ -97,7 +101,6 @@ "@sveltejs/adapter-node": "^5.2.9", "@sveltejs/adapter-vercel": "^5.4.7", "@types/feather-icons": "^4.29.4", - "bits-ui": "^0.21.16", "boardgamegeekclient": "^1.9.1", "bullmq": "^5.25.3", "class-variance-authority": "^0.7.0", @@ -108,7 +111,6 @@ "drizzle-orm": "^0.36.1", "drizzle-zod": "^0.5.1", "feather-icons": "^4.29.2", - "formsnap": "^1.0.1", "handlebars": "^4.7.8", "hono": "^4.6.9", "hono-pino": "^0.3.0", @@ -120,7 +122,6 @@ "just-capitalize": "^3.2.0", "just-kebab-case": "^4.2.0", "loader": "^2.1.1", - "mode-watcher": "^0.4.1", "open-props": "^1.7.7", "oslo": "^1.2.1", "pg": "^8.13.1", @@ -133,7 +134,6 @@ "reflect-metadata": "^0.2.2", "stoker": "^1.3.0", "svelte-lazy-loader": "^1.0.0", - "svelte-sonner": "^0.3.28", "tailwind-merge": "^2.5.4", "tailwind-variants": "^0.2.1", "tailwindcss-animate": "^1.0.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e86c86d..50b7cc0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -77,9 +77,6 @@ importers: '@types/feather-icons': specifier: ^4.29.4 version: 4.29.4 - bits-ui: - specifier: ^0.21.16 - version: 0.21.16(svelte@5.0.0-next.175) boardgamegeekclient: specifier: ^1.9.1 version: 1.9.1 @@ -110,9 +107,6 @@ importers: feather-icons: specifier: ^4.29.2 version: 4.29.2 - formsnap: - specifier: ^1.0.1 - version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.20.0(@sveltejs/kit@2.8.0(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.10(@types/node@20.17.6)))(svelte@5.0.0-next.175)(vite@5.4.10(@types/node@20.17.6)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175)(typescript@5.6.3)) handlebars: specifier: ^4.7.8 version: 4.7.8 @@ -146,9 +140,6 @@ importers: loader: specifier: ^2.1.1 version: 2.1.1 - mode-watcher: - specifier: ^0.4.1 - version: 0.4.1(svelte@5.0.0-next.175) open-props: specifier: ^1.7.7 version: 1.7.7 @@ -185,9 +176,6 @@ importers: svelte-lazy-loader: specifier: ^1.0.0 version: 1.0.0 - svelte-sonner: - specifier: ^0.3.28 - version: 0.3.28(svelte@5.0.0-next.175) tailwind-merge: specifier: ^2.5.4 version: 2.5.4 @@ -255,6 +243,9 @@ importers: autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.47) + bits-ui: + specifier: ^0.21.16 + version: 0.21.16(svelte@5.0.0-next.175) drizzle-kit: specifier: ^0.27.2 version: 0.27.2 @@ -267,6 +258,9 @@ importers: eslint-plugin-svelte: specifier: 2.36.0-next.13 version: 2.36.0-next.13(eslint@8.57.1)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)) + formsnap: + specifier: ^1.0.1 + version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.20.0(@sveltejs/kit@2.8.0(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.10(@types/node@20.17.6)))(svelte@5.0.0-next.175)(vite@5.4.10(@types/node@20.17.6)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175)(typescript@5.6.3)) just-clone: specifier: ^6.2.0 version: 6.2.0 @@ -279,6 +273,9 @@ importers: lucide-svelte: specifier: ^0.408.0 version: 0.408.0(svelte@5.0.0-next.175) + mode-watcher: + specifier: ^0.4.1 + version: 0.4.1(svelte@5.0.0-next.175) nodemailer: specifier: ^6.9.16 version: 6.9.16 @@ -318,6 +315,9 @@ importers: svelte-sequential-preprocessor: specifier: ^2.0.2 version: 2.0.2 + svelte-sonner: + specifier: ^0.3.28 + version: 0.3.28(svelte@5.0.0-next.175) sveltekit-flash-message: specifier: ^2.4.4 version: 2.4.4(@sveltejs/kit@2.8.0(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.10(@types/node@20.17.6)))(svelte@5.0.0-next.175)(vite@5.4.10(@types/node@20.17.6)))(svelte@5.0.0-next.175) @@ -3834,8 +3834,8 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} obuf@1.1.2: @@ -8339,7 +8339,7 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.2: {} + object-inspect@1.13.3: {} obuf@1.1.2: {} @@ -9122,7 +9122,7 @@ snapshots: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - object-inspect: 1.13.2 + object-inspect: 1.13.3 siginfo@2.0.0: {} diff --git a/src/app.d.ts b/src/app.d.ts index 609d7c7..f800ef8 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -1,6 +1,6 @@ -import type { User } from 'lucia'; import type { ApiClient } from '$lib/server/api'; import type { parseApiResponse } from '$lib/utils/api'; +import type { User } from 'lucia'; // See https://kit.svelte.dev/docs/types#app // for information about these interfaces @@ -24,9 +24,9 @@ declare global { } namespace Superforms { type Message = { - type: 'error' | 'success' | 'info', - text: string - } + type: 'error' | 'success' | 'info'; + text: string; + }; } interface Error { code?: string; @@ -37,7 +37,7 @@ declare global { interface Document { // eslint-disable-next-line @typescript-eslint/no-explicit-any // biome-ignore lint/suspicious/noExplicitAny: - startViewTransition: (callback: never) => void; // Add your custom property/method here + startViewTransition: (callback: never) => void; // Add your custom property/method here } } diff --git a/src/app.html b/src/app.html index 11bbdb5..d9ea2a7 100644 --- a/src/app.html +++ b/src/app.html @@ -1,16 +1,16 @@ - - - - - - + + + + + + - %sveltekit.head% - + %sveltekit.head% + - -
%sveltekit.body%
- + +
%sveltekit.body%
+ diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 6b9521d..f628343 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,10 +1,10 @@ -import 'reflect-metadata' -import { StatusCodes } from '$lib/constants/status-codes' -import type { ApiRoutes } from '$lib/server/api' -import { parseApiResponse } from '$lib/utils/api' -import { type Handle, redirect } from '@sveltejs/kit' -import { sequence } from '@sveltejs/kit/hooks' -import { hc } from 'hono/client' +import 'reflect-metadata'; +import { StatusCodes } from '$lib/constants/status-codes'; +import type { ApiRoutes } from '$lib/server/api'; +import { parseApiResponse } from '$lib/utils/api'; +import { type Handle, redirect } from '@sveltejs/kit'; +import { sequence } from '@sveltejs/kit/hooks'; +import { hc } from 'hono/client'; const apiClient: Handle = async ({ event, resolve }) => { /* ------------------------------ Register api ------------------------------ */ @@ -14,29 +14,30 @@ const apiClient: Handle = async ({ event, resolve }) => { 'x-forwarded-for': event.url.host.includes('sveltekit-prerender') ? '127.0.0.1' : event.getClientAddress(), host: event.request.headers.get('host') || '', }, - }) + }); /* ----------------------------- Auth functions ----------------------------- */ async function getAuthedUser() { - const { data } = await api.user.$get().then(parseApiResponse) - return data?.user + const { data } = await api.user.$get().then(parseApiResponse); + return data?.user; } async function getAuthedUserOrThrow() { - const { data } = await api.user.$get().then(parseApiResponse) - if (!data || !data.user) throw redirect(StatusCodes.TEMPORARY_REDIRECT, '/') - return data?.user + const { data } = await api.user.$get().then(parseApiResponse); + if (!data || !data.user) { + throw redirect(StatusCodes.TEMPORARY_REDIRECT, '/'); + } + return data?.user; } /* ------------------------------ Set contexts ------------------------------ */ - event.locals.api = api - event.locals.parseApiResponse = parseApiResponse - event.locals.getAuthedUser = getAuthedUser - event.locals.getAuthedUserOrThrow = getAuthedUserOrThrow + event.locals.api = api; + event.locals.parseApiResponse = parseApiResponse; + event.locals.getAuthedUser = getAuthedUser; + event.locals.getAuthedUserOrThrow = getAuthedUserOrThrow; /* ----------------------------- Return response ---------------------------- */ - const response = await resolve(event) - return response -} + return await resolve(event); +}; -export const handle: Handle = sequence(apiClient) +export const handle: Handle = sequence(apiClient); diff --git a/src/lib/LocalStorage.svelte b/src/lib/LocalStorage.svelte index 820a308..4ca1362 100644 --- a/src/lib/LocalStorage.svelte +++ b/src/lib/LocalStorage.svelte @@ -1,71 +1,71 @@ diff --git a/src/lib/components/Game.svelte b/src/lib/components/Game.svelte index 1c019bb..2b04d4f 100644 --- a/src/lib/components/Game.svelte +++ b/src/lib/components/Game.svelte @@ -1,14 +1,15 @@
diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte index fd33c0a..22a7f48 100644 --- a/src/lib/components/Header.svelte +++ b/src/lib/components/Header.svelte @@ -1,10 +1,12 @@
diff --git a/src/lib/components/pin-input.svelte b/src/lib/components/pin-input.svelte index a89bd2d..0ea52f5 100644 --- a/src/lib/components/pin-input.svelte +++ b/src/lib/components/pin-input.svelte @@ -1,19 +1,20 @@ - import { type Infer, superForm, type SuperValidated } from 'sveltekit-superforms'; - import { zodClient } from 'sveltekit-superforms/adapters'; - import { search_schema, type SearchSchema } from '$lib/zodValidation'; - import Input from '$components/ui/input/input.svelte'; - import Checkbox from '$components/ui/checkbox/checkbox.svelte'; +import Checkbox from '$components/ui/checkbox/checkbox.svelte'; +import * as Form from '$components/ui/form'; +import Input from '$components/ui/input/input.svelte'; +import { type SearchSchema, search_schema } from '$lib/zodValidation'; +import { type Infer, type SuperValidated, superForm } from 'sveltekit-superforms'; +import { zodClient } from 'sveltekit-superforms/adapters'; - export let data: SuperValidated>; +export let data: SuperValidated>; - const form = superForm(data, { - validators: zodClient(search_schema), - }); +const form = superForm(data, { + validators: zodClient(search_schema), +}); - const { form: formData } = form; +const { form: formData } = form; diff --git a/src/lib/components/ui/alert/alert-description.svelte b/src/lib/components/ui/alert/alert-description.svelte index 4a8eea0..aa9ed03 100644 --- a/src/lib/components/ui/alert/alert-description.svelte +++ b/src/lib/components/ui/alert/alert-description.svelte @@ -1,6 +1,6 @@ -