From c7fa882f57bcdefbed783b5c0da4bacbb24a072a Mon Sep 17 00:00:00 2001 From: Yuri Tatishchev Date: Wed, 30 Oct 2024 19:20:55 -0700 Subject: [PATCH] initial commit --- .env.example | 1 + .gitignore | 24 +++++++++++++ .npmrc | 1 + .prettierignore | 4 +++ .prettierrc | 15 ++++++++ README.md | 38 ++++++++++++++++++++ bun.lockb | Bin 0 -> 157246 bytes drizzle.config.ts | 14 ++++++++ eslint.config.js | 33 ++++++++++++++++++ package.json | 48 ++++++++++++++++++++++++++ postcss.config.js | 6 ++++ src/app.css | 3 ++ src/app.d.ts | 12 +++++++ src/app.html | 12 +++++++ src/hooks.server.ts | 32 +++++++++++++++++ src/lib/index.ts | 1 + src/lib/server/auth.ts | 67 ++++++++++++++++++++++++++++++++++++ src/lib/server/db/index.ts | 6 ++++ src/lib/server/db/schema.ts | 18 ++++++++++ src/routes/+layout.svelte | 6 ++++ src/routes/+page.svelte | 2 ++ static/favicon.png | Bin 0 -> 1571 bytes svelte.config.js | 18 ++++++++++ tailwind.config.ts | 14 ++++++++ tsconfig.json | 19 ++++++++++ vite.config.ts | 6 ++++ 26 files changed, 400 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 drizzle.config.ts create mode 100644 eslint.config.js create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 src/app.css create mode 100644 src/app.d.ts create mode 100644 src/app.html create mode 100644 src/hooks.server.ts create mode 100644 src/lib/index.ts create mode 100644 src/lib/server/auth.ts create mode 100644 src/lib/server/db/index.ts create mode 100644 src/lib/server/db/schema.ts create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+page.svelte create mode 100644 static/favicon.png create mode 100644 svelte.config.js create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..d59bf33 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +DATABASE_URL=local.db diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fd850af --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +node_modules + +# Output +.output +.vercel +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* + +# SQLite +*.db diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true 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..7ebb855 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,15 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..b5b2950 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# sv + +Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```bash +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```bash +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```bash +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..13a878bfeb5f8477fe3d967dfb545e74b5f64a7c GIT binary patch literal 157246 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�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 + + + + + + %sveltekit.head% + + +

%sveltekit.body%
+ + diff --git a/src/hooks.server.ts b/src/hooks.server.ts new file mode 100644 index 0000000..03a9d14 --- /dev/null +++ b/src/hooks.server.ts @@ -0,0 +1,32 @@ +import type { Handle } from '@sveltejs/kit'; +import { dev } from '$app/environment'; +import * as auth from '$lib/server/auth.js'; + +const handleAuth: Handle = async ({ event, resolve }) => { + const sessionId = event.cookies.get(auth.sessionCookieName); + if (!sessionId) { + event.locals.user = null; + event.locals.session = null; + return resolve(event); + } + + const { session, user } = await auth.validateSession(sessionId); + if (session) { + event.cookies.set(auth.sessionCookieName, session.id, { + path: '/', + sameSite: 'lax', + httpOnly: true, + expires: session.expiresAt, + secure: !dev + }); + } else { + event.cookies.delete(auth.sessionCookieName, { path: '/' }); + } + + event.locals.user = user; + event.locals.session = session; + + return resolve(event); +}; + +export const handle: Handle = handleAuth; diff --git a/src/lib/index.ts b/src/lib/index.ts new file mode 100644 index 0000000..856f2b6 --- /dev/null +++ b/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts new file mode 100644 index 0000000..213e8d8 --- /dev/null +++ b/src/lib/server/auth.ts @@ -0,0 +1,67 @@ +import { eq } from 'drizzle-orm'; +import { sha256 } from '@oslojs/crypto/sha2'; +import { encodeBase32LowerCaseNoPadding, encodeHexLowerCase } from '@oslojs/encoding'; +import { db } from '$lib/server/db'; +import * as table from '$lib/server/db/schema'; + +const DAY_IN_MS = 1000 * 60 * 60 * 24; + +export const sessionCookieName = 'auth-session'; + +function generateSessionToken(): string { + const bytes = crypto.getRandomValues(new Uint8Array(20)); + const token = encodeBase32LowerCaseNoPadding(bytes); + return token; +} + +export async function createSession(userId: string): Promise { + const token = generateSessionToken(); + const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token))); + const session: table.Session = { + id: sessionId, + userId, + expiresAt: new Date(Date.now() + DAY_IN_MS * 30) + }; + await db.insert(table.session).values(session); + return session; +} + +export async function invalidateSession(sessionId: string): Promise { + await db.delete(table.session).where(eq(table.session.id, sessionId)); +} + +export async function validateSession(sessionId: string) { + const [result] = await db + .select({ + // Adjust user table here to tweak returned data + user: { id: table.user.id, username: table.user.username }, + session: table.session + }) + .from(table.session) + .innerJoin(table.user, eq(table.session.userId, table.user.id)) + .where(eq(table.session.id, sessionId)); + + if (!result) { + return { session: null, user: null }; + } + const { session, user } = result; + + const sessionExpired = Date.now() >= session.expiresAt.getTime(); + if (sessionExpired) { + await db.delete(table.session).where(eq(table.session.id, session.id)); + return { session: null, user: null }; + } + + const renewSession = Date.now() >= session.expiresAt.getTime() - DAY_IN_MS * 15; + if (renewSession) { + session.expiresAt = new Date(Date.now() + DAY_IN_MS * 30); + await db + .update(table.session) + .set({ expiresAt: session.expiresAt }) + .where(eq(table.session.id, session.id)); + } + + return { session, user }; +} + +export type SessionValidationResult = Awaited>; diff --git a/src/lib/server/db/index.ts b/src/lib/server/db/index.ts new file mode 100644 index 0000000..205b05b --- /dev/null +++ b/src/lib/server/db/index.ts @@ -0,0 +1,6 @@ +import { drizzle } from 'drizzle-orm/better-sqlite3'; +import Database from 'better-sqlite3'; +import { env } from '$env/dynamic/private'; +if (!env.DATABASE_URL) throw new Error('DATABASE_URL is not set'); +const client = new Database(env.DATABASE_URL); +export const db = drizzle(client); diff --git a/src/lib/server/db/schema.ts b/src/lib/server/db/schema.ts new file mode 100644 index 0000000..32f9328 --- /dev/null +++ b/src/lib/server/db/schema.ts @@ -0,0 +1,18 @@ +import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'; + +export const user = sqliteTable('user', { + id: text('id').primaryKey(), + age: integer('age') +}); + +export const session = sqliteTable('session', { + id: text('id').primaryKey(), + userId: text('user_id') + .notNull() + .references(() => user.id), + expiresAt: integer('expires_at', { mode: 'timestamp' }).notNull() +}); + +export type Session = typeof session.$inferSelect; + +export type User = typeof user.$inferSelect; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..9b776b7 --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,6 @@ + + +{@render children()} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..cc88df0 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,2 @@ +

Welcome to SvelteKit

+

Visit svelte.dev/docs/kit to read the documentation

diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..825b9e65af7c104cfb07089bb28659393b4f2097 GIT binary patch literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH