From 4ad3290e0420d8ab255d3b899002ffb798b4b33d Mon Sep 17 00:00:00 2001 From: Chad Freeman Date: Fri, 16 Aug 2024 23:42:18 -0400 Subject: [PATCH] Create auth page, add styling & prettier --- .prettierignore | 4 ++ .prettierrc | 18 +++++++ bun.lockb | Bin 105732 -> 125276 bytes package.json | 70 ++++++++++++++------------- postcss.config.js | 6 +++ src/app.pcss | 3 ++ src/lib/Tab.svelte | 21 ++++++++ src/lib/apiclient.ts | 10 ++++ src/lib/db.ts | 2 + src/lib/hono.ts | 6 +++ src/routes/+layout.svelte | 6 +++ src/routes/+page.svelte | 3 +- src/routes/api/[...path]/+server.ts | 5 ++ src/routes/auth/+page.server.ts | 33 +++++++++++++ src/routes/auth/+page.svelte | 71 ++++++++++++++++++++++++++++ tailwind.config.js | 11 +++++ 16 files changed, 235 insertions(+), 34 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 postcss.config.js create mode 100644 src/app.pcss create mode 100644 src/lib/Tab.svelte create mode 100644 src/lib/apiclient.ts create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/api/[...path]/+server.ts create mode 100644 src/routes/auth/+page.server.ts create mode 100644 src/routes/auth/+page.svelte create mode 100644 tailwind.config.js diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ab78a95 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..89e142b --- /dev/null +++ b/.prettierrc @@ -0,0 +1,18 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte", + "svelteStrictMode": true, + "svelteBracketNewLine": false, + "svelteIndentScriptAndStyle": true + } + } + ] +} diff --git a/bun.lockb b/bun.lockb index 77fb1983ca508b517a7e11017ed3b16e8b66b679..0d524cbd85d44ae3868883544de7d261fe4394f1 100755 GIT binary patch delta 31354 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 z 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 + import type { Snippet } from 'svelte'; + + let { tab = $bindable(), disabled = $bindable(false), map, ...props }: { + tab: string | undefined, + disabled?: boolean, + map?: Record, + class?: string, + [x: `_${string}`]: Snippet<[]>; + } = $props(); + const tabs = Object.fromEntries(Object.entries(props).filter((v) => v[0].startsWith('_')).map(([name, snippet]): [string, Snippet<[]>] => [name.replace('_', ''), snippet])); + + +
+ {#each Object.entries(tabs) as [tabID]} + + + + tab = tabID} class:tab-active={tabID == tab}>{@render tabs[tabID]()} + {/each} +
\ No newline at end of file diff --git a/src/lib/apiclient.ts b/src/lib/apiclient.ts new file mode 100644 index 0000000..c596f7a --- /dev/null +++ b/src/lib/apiclient.ts @@ -0,0 +1,10 @@ +import { type api } from "./hono" +import { hc } from "hono/client" +export const client = hc('/api', { + async fetch(input: RequestInfo | URL, init?: RequestInit): Promise { + return await fetch(input, { + ...init, + credentials: 'include', + }) + } +}) \ No newline at end of file diff --git a/src/lib/db.ts b/src/lib/db.ts index e69de29..0e8df9a 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -0,0 +1,2 @@ +import { } from "@olli/kvdex" +import { } from "@deno/kv" \ No newline at end of file diff --git a/src/lib/hono.ts b/src/lib/hono.ts index e69de29..87a3dc0 100644 --- a/src/lib/hono.ts +++ b/src/lib/hono.ts @@ -0,0 +1,6 @@ +import { Hono } from "hono" + +const api = new Hono() +export type api = typeof api + +export const hono = new Hono().route('/api', api) \ No newline at end of file diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..1af3ad6 --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,6 @@ + + +{@render children()} \ No newline at end of file diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 5982b0a..f0b453d 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,2 +1 @@ -

Welcome to SvelteKit

-

Visit kit.svelte.dev to read the documentation

+ \ No newline at end of file diff --git a/src/routes/api/[...path]/+server.ts b/src/routes/api/[...path]/+server.ts new file mode 100644 index 0000000..3efd37b --- /dev/null +++ b/src/routes/api/[...path]/+server.ts @@ -0,0 +1,5 @@ +import { hono } from '$lib/hono.js'; + +export async function fallback({ request }) { + return hono.fetch(request) +} \ No newline at end of file diff --git a/src/routes/auth/+page.server.ts b/src/routes/auth/+page.server.ts new file mode 100644 index 0000000..caef26f --- /dev/null +++ b/src/routes/auth/+page.server.ts @@ -0,0 +1,33 @@ +import { fail, message, superValidate } from 'sveltekit-superforms'; +import { zod } from 'sveltekit-superforms/adapters'; +import { z } from 'zod'; + +const schema = z.object({ + username: z.string().min(4, "must be atleast 4 characters").max(32, "must be less than 32 characters").regex(/^[a-z0-9_\-]{4,32}$/i, `must be alphanumeric, with the exception of "_" and "-"`), + password: z.string().min(8, "must be atleast 8 characters") +}); + +export async function load() { + const form = await superValidate(zod(schema)); + return { form }; +}; + +export const actions = { + login: async ({ request }) => { + const form = await superValidate(request, zod(schema)); + + if (!form.valid) return fail(400, { form }); + + // TODO: Login user + return message(form, 'Login form submitted'); + }, + signup: async ({ request }) => { + const form = await superValidate(request, zod(schema)); + + if (!form.valid) return fail(400, { form }); + + // TODO: Login user + return message(form, 'Signup form submitted'); + + } +} \ No newline at end of file diff --git a/src/routes/auth/+page.svelte b/src/routes/auth/+page.svelte new file mode 100644 index 0000000..5f61b72 --- /dev/null +++ b/src/routes/auth/+page.svelte @@ -0,0 +1,71 @@ + + +
+
+
+ + + + +
+ + +
+ {#if $message}{$message}{/if} +
+
+
+ + diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..08be3d2 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,11 @@ +import daisyui from "daisyui" + +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./src/**/*.{html,js,svelte,ts}'], + theme: { + extend: {}, + }, + plugins: [daisyui], +} +