Skip to content

Commit 855cafa

Browse files
committed
Refactor project configuration by removing unnecessary console logs in alchemy.run.ts, updating package.json to consolidate dependencies, and enhancing CSS with new animation styles. Improve error handling in various routes and ensure better performance metrics tracking in the application.
1 parent 938996b commit 855cafa

File tree

14 files changed

+733
-155
lines changed

14 files changed

+733
-155
lines changed

alchemy.run.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ export const WORKER = await Worker(`${projectName}-worker`, {
3939
url: false
4040
});
4141

42-
console.log("Worker:", WORKER.url);
43-
4442
export const APP = await SvelteKit(`${projectName}-app`, {
4543
name: `${projectName}-app`,
4644
bindings: {
@@ -51,10 +49,9 @@ export const APP = await SvelteKit(`${projectName}-app`, {
5149
url: true,
5250
adopt: true,
5351
env: {
52+
BETTER_AUTH_SECRET: process.env.BETTER_AUTH_SECRET || "default-secret",
5453
BETTER_AUTH_URL: process.env.BETTER_AUTH_URL || "http://localhost:5173",
5554
}
5655
});
5756

58-
console.log("App:", APP.url);
59-
6057
await project.finalize();

bun.lock

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
"workspaces": {
44
"": {
55
"name": "remote",
6-
"dependencies": {
7-
"wrangler": "^4.28.1",
8-
},
96
"devDependencies": {
107
"@sveltejs/adapter-cloudflare": "^7.1.3",
118
"@sveltejs/kit": "^2.27.3",
@@ -22,6 +19,7 @@
2219
"tailwindcss": "^4.1.11",
2320
"typescript": "^5.9.2",
2421
"vite": "^7.1.1",
22+
"wrangler": "^4.28.1",
2523
},
2624
},
2725
},

package.json

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,10 @@
11
{
22
"name": "remote",
3-
"description": "Barebones starter for authenticated apps with persistent edge state - SvelteKit + Better Auth + Durable Objects",
43
"version": "1.0.0",
5-
"type": "module",
6-
"keywords": ["sveltekit", "better-auth", "cloudflare", "durable-objects", "alchemy", "remote-functions", "typescript"],
74
"repository": {
85
"type": "git",
96
"url": "https://github.com/acoyfellow/remote"
107
},
11-
"scripts": {
12-
"dev": "alchemy dev",
13-
"deploy": "alchemy deploy",
14-
"destroy": "alchemy destroy",
15-
"build": "vite build",
16-
"preview": "vite preview",
17-
"prepare": "svelte-kit sync || echo ''",
18-
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
19-
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
20-
"db:better-auth": "bunx @better-auth/cli generate",
21-
"db:generate": "drizzle-kit generate",
22-
"db:migrate": "drizzle-kit migrate",
23-
"db:studio": "drizzle-kit studio",
24-
"db:local": "wrangler d1 migrations apply remote-db --local",
25-
"db:remote": "wrangler d1 migrations apply remote-db --remote"
26-
},
278
"devDependencies": {
289
"@sveltejs/adapter-cloudflare": "^7.1.3",
2910
"@sveltejs/kit": "^2.27.3",
@@ -39,9 +20,26 @@
3920
"svelte-check": "^4.3.1",
4021
"tailwindcss": "^4.1.11",
4122
"typescript": "^5.9.2",
42-
"vite": "^7.1.1"
43-
},
44-
"dependencies": {
23+
"vite": "^7.1.1",
4524
"wrangler": "^4.28.1"
46-
}
25+
},
26+
"description": "Barebones starter for authenticated apps with persistent edge state - SvelteKit + Better Auth + Durable Objects",
27+
"keywords": ["sveltekit", "better-auth", "cloudflare", "durable-objects", "alchemy", "remote-functions", "typescript"],
28+
"scripts": {
29+
"dev": "alchemy dev",
30+
"deploy": "alchemy deploy",
31+
"destroy": "alchemy destroy",
32+
"build": "vite build",
33+
"preview": "vite preview",
34+
"prepare": "svelte-kit sync || echo ''",
35+
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
36+
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
37+
"db:better-auth": "bunx @better-auth/cli generate",
38+
"db:generate": "drizzle-kit generate",
39+
"db:migrate": "drizzle-kit migrate",
40+
"db:studio": "drizzle-kit studio",
41+
"db:local": "wrangler d1 migrations apply remote-db --local",
42+
"db:remote": "wrangler d1 migrations apply remote-db --remote"
43+
},
44+
"type": "module"
4745
}

src/app.css

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,64 @@ body {
99
line-height: 1.2;
1010
font-weight: 400;
1111
}
12+
13+
/* Futuristic Brutalist Animations */
14+
@keyframes slide-right {
15+
0% { transform: translateX(-100%); }
16+
100% { transform: translateX(100vw); }
17+
}
18+
19+
@keyframes slide-down {
20+
0% { transform: translateY(-100%); }
21+
100% { transform: translateY(100vh); }
22+
}
23+
24+
@keyframes float-1 {
25+
0%, 100% { transform: translate(0, 0) rotate(0deg); }
26+
25% { transform: translate(20px, -10px) rotate(90deg); }
27+
50% { transform: translate(-10px, -20px) rotate(180deg); }
28+
75% { transform: translate(-20px, 10px) rotate(270deg); }
29+
}
30+
31+
@keyframes float-2 {
32+
0%, 100% { transform: translate(0, 0) rotate(0deg) scale(1); }
33+
33% { transform: translate(-15px, 15px) rotate(120deg) scale(0.8); }
34+
66% { transform: translate(15px, -15px) rotate(240deg) scale(1.2); }
35+
}
36+
37+
@keyframes pulse-slow {
38+
0%, 100% { opacity: 0.5; transform: scale(1); }
39+
50% { opacity: 1; transform: scale(1.5); }
40+
}
41+
42+
@keyframes scan {
43+
0% { transform: translateY(-100%); opacity: 0; }
44+
10% { opacity: 1; }
45+
90% { opacity: 1; }
46+
100% { transform: translateY(100vh); opacity: 0; }
47+
}
48+
49+
/* Animation classes */
50+
.animate-slide-right {
51+
animation: slide-right 8s linear infinite;
52+
}
53+
54+
.animate-slide-down {
55+
animation: slide-down 12s linear infinite;
56+
}
57+
58+
.animate-float-1 {
59+
animation: float-1 6s ease-in-out infinite;
60+
}
61+
62+
.animate-float-2 {
63+
animation: float-2 8s ease-in-out infinite;
64+
}
65+
66+
.animate-pulse-slow {
67+
animation: pulse-slow 3s ease-in-out infinite;
68+
}
69+
70+
.animate-scan {
71+
animation: scan 4s ease-in-out infinite;
72+
}

src/hooks.server.ts

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,41 @@ import { error } from "@sveltejs/kit";
66
import type { Handle } from "@sveltejs/kit";
77

88
export const handle: Handle = async ({ event, resolve }) => {
9-
const db = event.platform?.env?.DB;
10-
11-
if (!db) return error(500, 'D1 database not available');
12-
13-
// Initialize auth once, then reuse
14-
const auth = initAuth(db, event.platform?.env);
15-
169
try {
17-
const session = await auth.api.getSession({
18-
headers: event.request.headers,
19-
});
20-
event.locals.user = session?.user || null;
21-
event.locals.session = session?.session || null;
22-
} catch (error) {
23-
console.error('Session loading error:', error);
10+
const db = event.platform?.env?.DB;
11+
12+
if (!db) return error(500, 'D1 database not available');
13+
14+
// Initialize auth once, then reuse
15+
const auth = initAuth(db, event.platform?.env);
16+
17+
try {
18+
const session = await auth.api.getSession({
19+
headers: event.request.headers,
20+
});
21+
event.locals.user = session?.user || null;
22+
event.locals.session = session?.session || null;
23+
} catch (sessionError) {
24+
console.error('Session loading error:', sessionError);
25+
event.locals.user = null;
26+
event.locals.session = null;
27+
}
28+
29+
const response = await svelteKitHandler({ event, resolve, auth, building });
30+
return response;
31+
32+
} catch (criticalError) {
33+
console.error('Critical error in handle:', criticalError);
34+
35+
// Graceful fallback - serve app without auth
2436
event.locals.user = null;
2537
event.locals.session = null;
38+
39+
try {
40+
return await resolve(event);
41+
} catch (resolveError) {
42+
console.error('Failed to resolve even without auth:', resolveError);
43+
return error(500, 'Service temporarily unavailable');
44+
}
2645
}
27-
28-
const response = await svelteKitHandler({ event, resolve, auth, building });
29-
return response;
3046
};

src/lib/auth-store.svelte.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { browser } from '$app/environment';
22
import { signIn, signOut as signOutClient, signUp } from '$lib/auth-client';
3-
import type { User, Session } from '$lib/types';
3+
import type { User, Session } from 'better-auth';
44

55
interface AuthState {
66
user: User | null; // User object from Better Auth
@@ -89,3 +89,8 @@ class AuthStore {
8989

9090
// Export singleton instance
9191
export const authStore = new AuthStore();
92+
93+
// Individual getters for convenience
94+
export const getUser = () => authStore.user;
95+
export const getSession = () => authStore.session;
96+
export const getIsAuthenticated = () => !!authStore.user;

src/lib/auth.ts

Lines changed: 47 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { getRequestEvent } from '$app/server';
88
import type { D1Database } from '@cloudflare/workers-types';
99

1010
let authInstance: ReturnType<typeof betterAuth> | null = null;
11+
let drizzleInstance: ReturnType<typeof drizzle> | null = null;
1112

1213
export function getAuth(): ReturnType<typeof betterAuth> {
1314
if (!authInstance) {
@@ -16,55 +17,67 @@ export function getAuth(): ReturnType<typeof betterAuth> {
1617
return authInstance;
1718
}
1819

20+
export function getDrizzle(): ReturnType<typeof drizzle> {
21+
if (!drizzleInstance) {
22+
throw new Error('Database not initialized. Call initAuth() first.');
23+
}
24+
return drizzleInstance;
25+
}
26+
1927
export function initAuth(db: D1Database, env?: any) {
2028
if (!db) {
2129
throw new Error('D1 database is required for Better Auth');
2230
}
2331

2432
// Only create once
25-
if (authInstance) {
33+
if (authInstance && drizzleInstance) {
2634
return authInstance;
2735
}
2836

29-
const drizzleDb = drizzle(db, {
30-
schema: {
31-
user,
32-
session,
33-
account,
34-
verification,
35-
},
36-
});
37-
38-
authInstance = betterAuth({
39-
trustedOrigins: [
40-
"http://localhost:5173",
41-
"https://*.coey.dev",
42-
"https://*-remote-app.coy.workers.dev",
43-
],
44-
database: drizzleAdapter(drizzleDb, {
45-
provider: 'sqlite',
37+
// Create singleton Drizzle instance (connection pooling)
38+
if (!drizzleInstance) {
39+
drizzleInstance = drizzle(db, {
4640
schema: {
4741
user,
4842
session,
4943
account,
5044
verification,
5145
},
52-
}),
53-
emailAndPassword: {
54-
enabled: true,
55-
autoSignIn: true,
56-
requireEmailVerification: false,
57-
},
58-
session: {
59-
expiresIn: 60 * 60 * 24 * 7, // 7 days
60-
updateAge: 60 * 60 * 24, // 1 day
61-
},
62-
secret: env?.BETTER_AUTH_SECRET || (() => {
63-
throw new Error('BETTER_AUTH_SECRET environment variable is required');
64-
})(),
65-
baseURL: env?.BETTER_AUTH_URL || 'http://localhost:5173',
66-
plugins: [sveltekitCookies(getRequestEvent as any)],
67-
});
46+
});
47+
}
48+
49+
if (!authInstance) {
50+
authInstance = betterAuth({
51+
trustedOrigins: [
52+
"http://localhost:5173",
53+
"https://*.coey.dev",
54+
"https://*-remote-app.coy.workers.dev",
55+
],
56+
database: drizzleAdapter(drizzleInstance, {
57+
provider: 'sqlite',
58+
schema: {
59+
user,
60+
session,
61+
account,
62+
verification,
63+
},
64+
}),
65+
emailAndPassword: {
66+
enabled: true,
67+
autoSignIn: true,
68+
requireEmailVerification: false,
69+
},
70+
session: {
71+
expiresIn: 60 * 60 * 24 * 7, // 7 days
72+
updateAge: 60 * 60 * 24, // 1 day
73+
},
74+
secret: env?.BETTER_AUTH_SECRET || (() => {
75+
throw new Error('BETTER_AUTH_SECRET environment variable is required');
76+
})(),
77+
baseURL: env?.BETTER_AUTH_URL || 'http://localhost:5173',
78+
plugins: [sveltekitCookies(getRequestEvent as any)],
79+
});
80+
}
6881

6982
return authInstance;
7083
}

src/routes/+layout.server.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import type { LayoutServerLoad } from './$types';
2+
import type { User, Session } from '$lib/schema';
23

34
export const load: LayoutServerLoad = async ({ locals }) => {
45
return {
5-
user: locals.user,
6-
session: locals.session,
6+
user: locals.user as User,
7+
session: locals.session as Session,
78
};
89
};

src/routes/+layout.svelte

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
<script lang="ts">
22
import "../app.css";
33
import { authStore } from "$lib/auth-store.svelte";
4+
import type { User, Session } from "$lib/schema";
45
56
let { data, children } = $props();
67
7-
authStore.initialize(data.user, data.session);
8+
authStore.initialize(data.user as User, data.session as Session);
89
</script>
910

1011
{@render children?.()}

0 commit comments

Comments
 (0)