···11+import { useMatches } from 'react-router'
22+import type { Route } from '../+types/root'
33+44+export function useRootData() {
55+ const route = useMatches()[0]
66+ const data = route.loaderData as Route.ComponentProps['loaderData']
77+ return data
88+}
···22import { BunSqliteDialect } from 'kysely-bun-worker/normal'
33import { promises as fs } from 'fs'
44import path from 'path'
55-import env from '@/lib/env'
66-import { DB } from './schema'
55+import env from '@api/lib/env'
66+import type { DB } from './schema'
7788export const db = new Kysely<DB>({
99 dialect: new BunSqliteDialect({ url: env.DATABASE_URL }),
···11-import { db } from '@/db/db'
22-import { Accounts } from '@/db/schema'
33-import { Insertable } from 'kysely'
11+import { db } from '@api/db/db'
22+import type { Accounts } from '@api/db/schema'
33+import type { Insertable } from 'kysely'
4455export function createOrUpdateAccount(account: Insertable<Accounts>) {
66 return db
+1-1
packages/server/src/lib/profile.ts
···11import { Agent } from '@atproto/api'
22-import { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'
22+import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'
3344export function parseProfile(profile: ProfileViewDetailed) {
55 return profile.handle !== 'handle.invalid' ? null : profile
+1-1
packages/server/src/lib/redirect-validator.ts
···11-import env from '@/lib/env'
11+import env from '@api/lib/env'
2233/**
44 * Validates that a redirect URI is allowed
+1-1
packages/server/src/lib/session.ts
···11-import { db } from '@/db/db'
11+import { db } from '@api/db/db'
2233// Session configuration
44const SESSION_DURATION = 7 * 24 * 60 * 60 * 1000 // 7 days in milliseconds
+3-3
packages/server/src/oauth/client.ts
···11import { JoseKey, NodeOAuthClient } from '@atproto/oauth-client-node'
22-import type { Db } from '@/db/db'
22+import type { Db } from '@api/db/db'
33import { SessionStore, StateStore } from './storage'
44-import keys from '@/../jwks.json'
55-import env from '@/lib/env'
44+import keys from '@api/../jwks.json'
55+import env from '@api/lib/env'
6677const keyset = await Promise.all(
88 keys.map((k) => JoseKey.fromImportable(JSON.stringify(k), k.kid))
+13-9
packages/server/src/oauth/routes.ts
···11import Elysia, { redirect, status } from 'elysia'
22import { createOAuthClient } from './client'
33import { Agent } from '@atproto/api'
44-import { db } from '@/db/db'
55-import env from '@/lib/env'
66-import keys from '@/../jwks.json'
77-import { createOrUpdateAccount } from '@/lib/account'
88-import { createSession, deleteSession, type SessionData } from '@/lib/session'
99-import { authMacro } from '@/lib/middleware'
1010-import { getProfile, parseProfile } from '@/lib/profile'
1111-import { idResolver } from '@/lib/idresolver'
44+import { db } from '@api/db/db'
55+import env from '@api/lib/env'
66+import keys from '@api/../jwks.json'
77+import { createOrUpdateAccount } from '@api/lib/account'
88+import {
99+ createSession,
1010+ deleteSession,
1111+ type SessionData
1212+} from '@api/lib/session'
1313+import { authMacro } from '@api/lib/middleware'
1414+import { getProfile } from '@api/lib/profile'
1515+import { idResolver } from '@api/lib/idresolver'
1216import {
1317 isAllowedRedirectUri,
1418 getDefaultRedirectUri,
1519 parseRedirectState
1616-} from '@/lib/redirect-validator'
2020+} from '@api/lib/redirect-validator'
17211822const publicKeys = keys.map((k) => {
1923 const { kty, alg, kid, crv, x, y } = k
+1-1
packages/server/src/oauth/storage.ts
···44 NodeSavedState,
55 NodeSavedStateStore
66} from '@atproto/oauth-client-node'
77-import type { Db } from '@/db/db'
77+import type { Db } from '@api/db/db'
8899export class StateStore implements NodeSavedStateStore {
1010 constructor(private db: Db) {}