diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-12-06 17:05:21 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-12-06 17:37:04 +0900 |
| commit | 811458427593a4172a2cd535cc768db375350dca (patch) | |
| tree | 6c4f46c96b6f29392dc19d591e39e03c187033a1 | |
| parent | 9736a8981fbd6c6defbd67517ca23904fc844629 (diff) | |
| download | kioku-811458427593a4172a2cd535cc768db375350dca.tar.gz kioku-811458427593a4172a2cd535cc768db375350dca.tar.zst kioku-811458427593a4172a2cd535cc768db375350dca.zip | |
feat(dev): change architecture and directory structure
| -rw-r--r-- | README.md | 19 | ||||
| -rw-r--r-- | docs/dev/architecture.md | 63 | ||||
| -rw-r--r-- | docs/dev/roadmap.md | 4 | ||||
| -rw-r--r-- | drizzle.config.ts (renamed from pkgs/server/drizzle.config.ts) | 2 | ||||
| -rw-r--r-- | drizzle/0000_cynical_zeigeist.sql (renamed from pkgs/server/drizzle/0000_cynical_zeigeist.sql) | 0 | ||||
| -rw-r--r-- | drizzle/0001_spotty_jane_foster.sql (renamed from pkgs/server/drizzle/0001_spotty_jane_foster.sql) | 0 | ||||
| -rw-r--r-- | drizzle/meta/0000_snapshot.json (renamed from pkgs/server/drizzle/meta/0000_snapshot.json) | 0 | ||||
| -rw-r--r-- | drizzle/meta/0001_snapshot.json (renamed from pkgs/server/drizzle/meta/0001_snapshot.json) | 0 | ||||
| -rw-r--r-- | drizzle/meta/_journal.json (renamed from pkgs/server/drizzle/meta/_journal.json) | 0 | ||||
| -rw-r--r-- | package.json | 36 | ||||
| -rw-r--r-- | pkgs/client/package.json | 13 | ||||
| -rw-r--r-- | pkgs/client/tsconfig.json | 10 | ||||
| -rw-r--r-- | pkgs/server/package.json | 35 | ||||
| -rw-r--r-- | pkgs/server/src/middleware/index.ts | 2 | ||||
| -rw-r--r-- | pkgs/server/src/repositories/index.ts | 3 | ||||
| -rw-r--r-- | pkgs/server/src/routes/index.ts | 1 | ||||
| -rw-r--r-- | pkgs/server/tsconfig.json | 9 | ||||
| -rw-r--r-- | pkgs/shared/package.json | 23 | ||||
| -rw-r--r-- | pkgs/shared/src/index.ts | 2 | ||||
| -rw-r--r-- | pkgs/shared/tsconfig.json | 9 | ||||
| -rw-r--r-- | pnpm-lock.yaml | 29 | ||||
| -rw-r--r-- | pnpm-workspace.yaml | 2 | ||||
| -rw-r--r-- | src/client/index.tsx (renamed from pkgs/client/src/index.ts) | 0 | ||||
| -rw-r--r-- | src/server/db/index.ts (renamed from pkgs/server/src/db/index.ts) | 4 | ||||
| -rw-r--r-- | src/server/db/schema.ts (renamed from pkgs/server/src/db/schema.ts) | 0 | ||||
| -rw-r--r-- | src/server/index.test.ts (renamed from pkgs/server/src/index.test.ts) | 2 | ||||
| -rw-r--r-- | src/server/index.ts (renamed from pkgs/server/src/index.ts) | 4 | ||||
| -rw-r--r-- | src/server/middleware/auth.test.ts (renamed from pkgs/server/src/middleware/auth.test.ts) | 4 | ||||
| -rw-r--r-- | src/server/middleware/auth.ts (renamed from pkgs/server/src/middleware/auth.ts) | 2 | ||||
| -rw-r--r-- | src/server/middleware/error-handler.test.ts (renamed from pkgs/server/src/middleware/error-handler.test.ts) | 2 | ||||
| -rw-r--r-- | src/server/middleware/error-handler.ts (renamed from pkgs/server/src/middleware/error-handler.ts) | 0 | ||||
| -rw-r--r-- | src/server/middleware/index.ts | 2 | ||||
| -rw-r--r-- | src/server/repositories/index.ts | 3 | ||||
| -rw-r--r-- | src/server/repositories/refresh-token.ts (renamed from pkgs/server/src/repositories/refresh-token.ts) | 4 | ||||
| -rw-r--r-- | src/server/repositories/types.ts (renamed from pkgs/server/src/repositories/types.ts) | 0 | ||||
| -rw-r--r-- | src/server/repositories/user.ts (renamed from pkgs/server/src/repositories/user.ts) | 10 | ||||
| -rw-r--r-- | src/server/routes/auth.test.ts (renamed from pkgs/server/src/routes/auth.test.ts) | 6 | ||||
| -rw-r--r-- | src/server/routes/auth.ts (renamed from pkgs/server/src/routes/auth.ts) | 14 | ||||
| -rw-r--r-- | src/server/routes/index.ts | 1 | ||||
| -rw-r--r-- | src/server/schemas/index.ts (renamed from pkgs/shared/src/schemas/index.ts) | 0 | ||||
| -rw-r--r-- | src/server/types/index.ts (renamed from pkgs/shared/src/types/index.ts) | 0 | ||||
| -rw-r--r-- | tsconfig.json | 5 | ||||
| -rw-r--r-- | vitest.config.ts (renamed from pkgs/server/vitest.config.ts) | 0 |
43 files changed, 120 insertions, 205 deletions
@@ -29,32 +29,31 @@ pnpm install docker compose up # Run database migrations -pnpm --filter server db:migrate +pnpm db:migrate -# Start development servers +# Start development server pnpm dev ``` ### Environment Variables -Create `.env` files in each app directory: +Create `.env` file in the root directory: -```pkgs/server/.env +``` DATABASE_URL=postgresql://user:password@localhost:5432/kioku JWT_SECRET=your-secret-key ``` -```pkgs/web/.env -PUBLIC_API_URL=http://localhost:3000 -``` - ## Scripts ```bash -pnpm dev # Start all apps in development -pnpm build # Build all apps +pnpm dev # Start server in development +pnpm dev:client # Start client in development +pnpm build # Build all pnpm test # Run tests pnpm lint # Lint code +pnpm db:migrate # Run database migrations +pnpm db:studio # Open Drizzle Studio ``` ## Documentation diff --git a/docs/dev/architecture.md b/docs/dev/architecture.md index 2ace388..6b6e21d 100644 --- a/docs/dev/architecture.md +++ b/docs/dev/architecture.md @@ -4,25 +4,24 @@ | Layer | Technology | |-------|------------| -| Frontend | SvelteKit | +| Frontend | React + Vite | | Backend | Hono + TypeScript | | Database | PostgreSQL | | ORM | Drizzle | | Client DB | Dexie.js (IndexedDB) | -| PWA | @vite-pwa/sveltekit | +| PWA | vite-plugin-pwa | | Algorithm | FSRS (ts-fsrs) | | Auth | username/password + JWT | | Test | Vitest | -| Monorepo | pnpm workspace | | Deploy | Docker + VPS | ## Architecture Diagram ``` +--------------------------------------------------+ -| Client (PWA) | +| Client (PWA) | | +-------------+ +------------+ +------------+ | -| | SvelteKit | | Dexie.js | | Service | | +| | React | | Dexie.js | | Service | | | | UI |<>| (IndexedDB)|<>| Worker | | | +-------------+ +------------+ +------------+ | | | | | @@ -35,7 +34,7 @@ | v HTTPS (REST API) +--------------------------------------------------+ -| Server | +| Server | | +----------------------------------------------+| | | Hono (TypeScript) || | | +--------+ +--------+ +--------+ +--------+ || @@ -54,32 +53,32 @@ ``` kioku/ -├── package.json # Workspace root -├── pnpm-workspace.yaml -├── docker-compose.yml -└── pkgs/ - ├── web/ # SvelteKit frontend - │ ├── src/ - │ │ ├── lib/ - │ │ │ ├── components/ - │ │ │ ├── stores/ - │ │ │ ├── db/ # Dexie IndexedDB - │ │ │ ├── sync/ # Sync engine - │ │ │ └── api/ - │ │ └── routes/ - │ └── static/ - ├── server/ # Hono backend - │ └── src/ - │ ├── routes/ - │ ├── services/ - │ ├── db/ # Drizzle schema - │ ├── middleware/ - │ └── lib/ - │ └── apkg/ # Anki import - └── shared/ # Shared types - └── src/ - ├── types/ - └── schemas/ # Zod validation +├── src/ +│ ├── server/ # Hono backend +│ │ ├── index.ts +│ │ ├── db/ # Drizzle schema +│ │ ├── middleware/ +│ │ ├── repositories/ +│ │ ├── routes/ +│ │ ├── types/ # Server types +│ │ ├── schemas/ # Zod validation +│ │ └── lib/ +│ │ └── apkg/ # Anki import +│ └── client/ # React frontend +│ ├── index.tsx +│ ├── components/ +│ ├── stores/ +│ ├── db/ # Dexie IndexedDB +│ ├── sync/ # Sync engine +│ ├── types/ # Client types +│ └── api/ +├── drizzle/ # Drizzle migrations +├── public/ # Static files (PWA manifest) +├── package.json +├── tsconfig.json +├── vite.config.ts +├── drizzle.config.ts +└── compose.yaml ``` ## Data Models diff --git a/docs/dev/roadmap.md b/docs/dev/roadmap.md index 1d6fcc4..c452a51 100644 --- a/docs/dev/roadmap.md +++ b/docs/dev/roadmap.md @@ -46,7 +46,7 @@ Smaller features first to enable early MVP validation. **Goal**: Minimal UI for user login and registration ### Frontend Foundation -- [ ] Initialize SvelteKit +- [ ] Initialize React + Vite - [ ] Setup routing - [ ] API client (fetch wrapper with auth headers) - [ ] Auth store (token management) @@ -126,7 +126,7 @@ Smaller features first to enable early MVP validation. **Goal**: Study offline ### PWA Setup -- [ ] @vite-pwa/sveltekit configuration +- [ ] vite-plugin-pwa configuration - [ ] Web manifest - [ ] Service Worker - [ ] Offline fallback page diff --git a/pkgs/server/drizzle.config.ts b/drizzle.config.ts index 0e4596b..6fe73ec 100644 --- a/pkgs/server/drizzle.config.ts +++ b/drizzle.config.ts @@ -7,7 +7,7 @@ if (!databaseUrl) { export default defineConfig({ out: "./drizzle", - schema: "./src/db/schema.ts", + schema: "./src/server/db/schema.ts", dialect: "postgresql", dbCredentials: { url: databaseUrl, diff --git a/pkgs/server/drizzle/0000_cynical_zeigeist.sql b/drizzle/0000_cynical_zeigeist.sql index 3034102..3034102 100644 --- a/pkgs/server/drizzle/0000_cynical_zeigeist.sql +++ b/drizzle/0000_cynical_zeigeist.sql diff --git a/pkgs/server/drizzle/0001_spotty_jane_foster.sql b/drizzle/0001_spotty_jane_foster.sql index 417408f..417408f 100644 --- a/pkgs/server/drizzle/0001_spotty_jane_foster.sql +++ b/drizzle/0001_spotty_jane_foster.sql diff --git a/pkgs/server/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json index 16a3f68..16a3f68 100644 --- a/pkgs/server/drizzle/meta/0000_snapshot.json +++ b/drizzle/meta/0000_snapshot.json diff --git a/pkgs/server/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json index 55c3999..55c3999 100644 --- a/pkgs/server/drizzle/meta/0001_snapshot.json +++ b/drizzle/meta/0001_snapshot.json diff --git a/pkgs/server/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index f245fa6..f245fa6 100644 --- a/pkgs/server/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json diff --git a/package.json b/package.json index 55487af..0bb6bdd 100644 --- a/package.json +++ b/package.json @@ -2,21 +2,47 @@ "name": "kioku", "version": "0.1.0", "description": "An Anki clone", - "main": "index.js", + "main": "src/server/index.ts", "scripts": { - "test": "pnpm -r run test", - "typecheck": "tsc --build pkgs/*/tsconfig.json", + "dev": "node --watch src/server/index.ts", + "build": "tsc", + "start": "node dist/server/index.js", + "test": "vitest run", + "test:watch": "vitest", + "typecheck": "tsc --noEmit", "lint": "biome check .", "lint:fix": "biome check --write .", - "format": "biome format --write ." + "format": "biome format --write .", + "db:generate": "drizzle-kit generate", + "db:migrate": "drizzle-kit migrate", + "db:push": "drizzle-kit push", + "db:studio": "drizzle-kit studio" }, "keywords": [], "author": "nsfisis", "license": "MIT", "packageManager": "pnpm@10.23.0", "type": "module", + "dependencies": { + "@hono/node-server": "^1.19.6", + "argon2": "^0.44.0", + "drizzle-orm": "^0.44.7", + "hono": "^4.10.7", + "pg": "^8.16.3", + "zod": "^4.1.13" + }, "devDependencies": { "@biomejs/biome": "^2.3.8", - "typescript": "^5.9.3" + "@types/node": "^24.10.1", + "@types/pg": "^8.15.6", + "drizzle-kit": "^0.31.7", + "typescript": "^5.9.3", + "vitest": "^4.0.14" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "argon2", + "esbuild" + ] } } diff --git a/pkgs/client/package.json b/pkgs/client/package.json deleted file mode 100644 index ec5a7ee..0000000 --- a/pkgs/client/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@kioku/client", - "version": "0.1.0", - "private": true, - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "nsfisis", - "license": "MIT", - "packageManager": "pnpm@10.23.0", - "type": "module" -} diff --git a/pkgs/client/tsconfig.json b/pkgs/client/tsconfig.json deleted file mode 100644 index 21d77ad..0000000 --- a/pkgs/client/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} diff --git a/pkgs/server/package.json b/pkgs/server/package.json deleted file mode 100644 index 4159084..0000000 --- a/pkgs/server/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "@kioku/server", - "version": "0.1.0", - "private": true, - "main": "dist/index.js", - "scripts": { - "dev": "node --watch src/index.ts", - "build": "tsc", - "start": "node dist/index.js", - "test": "vitest run", - "test:watch": "vitest", - "db:generate": "drizzle-kit generate", - "db:migrate": "drizzle-kit migrate", - "db:push": "drizzle-kit push", - "db:studio": "drizzle-kit studio" - }, - "author": "nsfisis", - "license": "MIT", - "packageManager": "pnpm@10.23.0", - "type": "module", - "dependencies": { - "@hono/node-server": "^1.19.6", - "@kioku/shared": "workspace:*", - "argon2": "^0.44.0", - "drizzle-orm": "^0.44.7", - "hono": "^4.10.7", - "pg": "^8.16.3" - }, - "devDependencies": { - "@types/node": "^24.10.1", - "@types/pg": "^8.15.6", - "drizzle-kit": "^0.31.7", - "vitest": "^4.0.14" - } -} diff --git a/pkgs/server/src/middleware/index.ts b/pkgs/server/src/middleware/index.ts deleted file mode 100644 index 57de4dd..0000000 --- a/pkgs/server/src/middleware/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { type AuthUser, authMiddleware, getAuthUser } from "./auth"; -export { AppError, Errors, errorHandler } from "./error-handler"; diff --git a/pkgs/server/src/repositories/index.ts b/pkgs/server/src/repositories/index.ts deleted file mode 100644 index f1bcfb1..0000000 --- a/pkgs/server/src/repositories/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { refreshTokenRepository } from "./refresh-token"; -export * from "./types"; -export { userRepository } from "./user"; diff --git a/pkgs/server/src/routes/index.ts b/pkgs/server/src/routes/index.ts deleted file mode 100644 index 2925e6d..0000000 --- a/pkgs/server/src/routes/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { auth } from "./auth"; diff --git a/pkgs/server/tsconfig.json b/pkgs/server/tsconfig.json deleted file mode 100644 index 038af8a..0000000 --- a/pkgs/server/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} diff --git a/pkgs/shared/package.json b/pkgs/shared/package.json deleted file mode 100644 index 8c50a8b..0000000 --- a/pkgs/shared/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "@kioku/shared", - "version": "0.1.0", - "private": true, - "main": "./src/index.ts", - "types": "./src/index.ts", - "exports": { - ".": { - "types": "./src/index.ts", - "import": "./src/index.ts" - } - }, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "nsfisis", - "license": "MIT", - "packageManager": "pnpm@10.23.0", - "type": "module", - "dependencies": { - "zod": "^4.1.13" - } -} diff --git a/pkgs/shared/src/index.ts b/pkgs/shared/src/index.ts deleted file mode 100644 index 0ca6112..0000000 --- a/pkgs/shared/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./schemas/index.js"; -export * from "./types/index.js"; diff --git a/pkgs/shared/tsconfig.json b/pkgs/shared/tsconfig.json deleted file mode 100644 index 038af8a..0000000 --- a/pkgs/shared/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ce2ee0..6f2e9e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,24 +7,10 @@ settings: importers: .: - devDependencies: - '@biomejs/biome': - specifier: ^2.3.8 - version: 2.3.8 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - - pkgs/client: {} - - pkgs/server: dependencies: '@hono/node-server': specifier: ^1.19.6 version: 1.19.6(hono@4.10.7) - '@kioku/shared': - specifier: workspace:* - version: link:../shared argon2: specifier: ^0.44.0 version: 0.44.0 @@ -37,7 +23,13 @@ importers: pg: specifier: ^8.16.3 version: 8.16.3 + zod: + specifier: ^4.1.13 + version: 4.1.13 devDependencies: + '@biomejs/biome': + specifier: ^2.3.8 + version: 2.3.8 '@types/node': specifier: ^24.10.1 version: 24.10.1 @@ -47,16 +39,13 @@ importers: drizzle-kit: specifier: ^0.31.7 version: 0.31.7 + typescript: + specifier: ^5.9.3 + version: 5.9.3 vitest: specifier: ^4.0.14 version: 4.0.14(@types/node@24.10.1) - pkgs/shared: - dependencies: - zod: - specifier: ^4.1.13 - version: 4.1.13 - packages: '@biomejs/biome@2.3.8': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 4276d04..0000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,2 +0,0 @@ -packages: - - 'pkgs/**' diff --git a/pkgs/client/src/index.ts b/src/client/index.tsx index cb0ff5c..cb0ff5c 100644 --- a/pkgs/client/src/index.ts +++ b/src/client/index.tsx diff --git a/pkgs/server/src/db/index.ts b/src/server/db/index.ts index 6730947..22da621 100644 --- a/pkgs/server/src/db/index.ts +++ b/src/server/db/index.ts @@ -1,5 +1,5 @@ import { drizzle } from "drizzle-orm/node-postgres"; -import * as schema from "./schema"; +import * as schema from "./schema.js"; const databaseUrl = process.env.DATABASE_URL; @@ -9,4 +9,4 @@ if (!databaseUrl) { export const db = drizzle(databaseUrl, { schema }); -export * from "./schema"; +export * from "./schema.js"; diff --git a/pkgs/server/src/db/schema.ts b/src/server/db/schema.ts index 4b9631f..4b9631f 100644 --- a/pkgs/server/src/db/schema.ts +++ b/src/server/db/schema.ts diff --git a/pkgs/server/src/index.test.ts b/src/server/index.test.ts index 216e965..6d2dda9 100644 --- a/pkgs/server/src/index.test.ts +++ b/src/server/index.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { app } from "./index"; +import { app } from "./index.js"; describe("Hono app", () => { describe("GET /api/health", () => { diff --git a/pkgs/server/src/index.ts b/src/server/index.ts index a0ae0a4..01a489f 100644 --- a/pkgs/server/src/index.ts +++ b/src/server/index.ts @@ -1,8 +1,8 @@ import { serve } from "@hono/node-server"; import { Hono } from "hono"; import { logger } from "hono/logger"; -import { errorHandler } from "./middleware"; -import { auth } from "./routes"; +import { errorHandler } from "./middleware/index.js"; +import { auth } from "./routes/index.js"; const app = new Hono(); diff --git a/pkgs/server/src/middleware/auth.test.ts b/src/server/middleware/auth.test.ts index 8c4286b..a8b7f3d 100644 --- a/pkgs/server/src/middleware/auth.test.ts +++ b/src/server/middleware/auth.test.ts @@ -1,8 +1,8 @@ import { Hono } from "hono"; import { sign } from "hono/jwt"; import { beforeEach, describe, expect, it } from "vitest"; -import { authMiddleware, getAuthUser } from "./auth"; -import { errorHandler } from "./error-handler"; +import { authMiddleware, getAuthUser } from "./auth.js"; +import { errorHandler } from "./error-handler.js"; const JWT_SECRET = process.env.JWT_SECRET || "test-secret"; diff --git a/pkgs/server/src/middleware/auth.ts b/src/server/middleware/auth.ts index c295834..51b4d9d 100644 --- a/pkgs/server/src/middleware/auth.ts +++ b/src/server/middleware/auth.ts @@ -1,6 +1,6 @@ import type { Context, Next } from "hono"; import { verify } from "hono/jwt"; -import { Errors } from "./error-handler"; +import { Errors } from "./error-handler.js"; const JWT_SECRET = process.env.JWT_SECRET; if (!JWT_SECRET) { diff --git a/pkgs/server/src/middleware/error-handler.test.ts b/src/server/middleware/error-handler.test.ts index 21d6fc1..d4be84f 100644 --- a/pkgs/server/src/middleware/error-handler.test.ts +++ b/src/server/middleware/error-handler.test.ts @@ -1,6 +1,6 @@ import { Hono } from "hono"; import { describe, expect, it } from "vitest"; -import { AppError, Errors, errorHandler } from "./error-handler"; +import { AppError, Errors, errorHandler } from "./error-handler.js"; function createTestApp() { const app = new Hono(); diff --git a/pkgs/server/src/middleware/error-handler.ts b/src/server/middleware/error-handler.ts index 7b92940..7b92940 100644 --- a/pkgs/server/src/middleware/error-handler.ts +++ b/src/server/middleware/error-handler.ts diff --git a/src/server/middleware/index.ts b/src/server/middleware/index.ts new file mode 100644 index 0000000..e894a42 --- /dev/null +++ b/src/server/middleware/index.ts @@ -0,0 +1,2 @@ +export { type AuthUser, authMiddleware, getAuthUser } from "./auth.js"; +export { AppError, Errors, errorHandler } from "./error-handler.js"; diff --git a/src/server/repositories/index.ts b/src/server/repositories/index.ts new file mode 100644 index 0000000..04b1f35 --- /dev/null +++ b/src/server/repositories/index.ts @@ -0,0 +1,3 @@ +export { refreshTokenRepository } from "./refresh-token.js"; +export * from "./types.js"; +export { userRepository } from "./user.js"; diff --git a/pkgs/server/src/repositories/refresh-token.ts b/src/server/repositories/refresh-token.ts index 82302df..e92a744 100644 --- a/pkgs/server/src/repositories/refresh-token.ts +++ b/src/server/repositories/refresh-token.ts @@ -1,6 +1,6 @@ import { and, eq, gt } from "drizzle-orm"; -import { db, refreshTokens } from "../db"; -import type { RefreshTokenRepository } from "./types"; +import { db, refreshTokens } from "../db/index.js"; +import type { RefreshTokenRepository } from "./types.js"; export const refreshTokenRepository: RefreshTokenRepository = { async findValidToken(tokenHash) { diff --git a/pkgs/server/src/repositories/types.ts b/src/server/repositories/types.ts index 1ab4bdc..1ab4bdc 100644 --- a/pkgs/server/src/repositories/types.ts +++ b/src/server/repositories/types.ts diff --git a/pkgs/server/src/repositories/user.ts b/src/server/repositories/user.ts index 7917632..e571409 100644 --- a/pkgs/server/src/repositories/user.ts +++ b/src/server/repositories/user.ts @@ -1,6 +1,6 @@ import { eq } from "drizzle-orm"; -import { db, users } from "../db"; -import type { UserPublic, UserRepository } from "./types"; +import { db, users } from "../db/index.js"; +import type { UserPublic, UserRepository } from "./types.js"; export const userRepository: UserRepository = { async findByUsername(username) { @@ -37,8 +37,10 @@ export const userRepository: UserRepository = { username: users.username, createdAt: users.createdAt, }); - // Insert with returning should always return the created row - return newUser!; + if (!newUser) { + throw new Error("Failed to create user"); + } + return newUser; }, async findById(id) { diff --git a/pkgs/server/src/routes/auth.test.ts b/src/server/routes/auth.test.ts index 34eb2b6..95fd6e9 100644 --- a/pkgs/server/src/routes/auth.test.ts +++ b/src/server/routes/auth.test.ts @@ -1,12 +1,12 @@ import { Hono } from "hono"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { errorHandler } from "../middleware"; +import { errorHandler } from "../middleware/index.js"; import type { RefreshTokenRepository, UserPublic, UserRepository, -} from "../repositories"; -import { createAuthRouter } from "./auth"; +} from "../repositories/index.js"; +import { createAuthRouter } from "./auth.js"; vi.mock("argon2", () => ({ hash: vi.fn((password: string) => Promise.resolve(`hashed_${password}`)), diff --git a/pkgs/server/src/routes/auth.ts b/src/server/routes/auth.ts index e1f7ebb..25c959b 100644 --- a/pkgs/server/src/routes/auth.ts +++ b/src/server/routes/auth.ts @@ -1,19 +1,19 @@ import { createHash, randomBytes } from "node:crypto"; -import { - createUserSchema, - loginSchema, - refreshTokenSchema, -} from "@kioku/shared"; import * as argon2 from "argon2"; import { Hono } from "hono"; import { sign } from "hono/jwt"; -import { Errors } from "../middleware"; +import { Errors } from "../middleware/index.js"; import { type RefreshTokenRepository, refreshTokenRepository, type UserRepository, userRepository, -} from "../repositories"; +} from "../repositories/index.js"; +import { + createUserSchema, + loginSchema, + refreshTokenSchema, +} from "../schemas/index.js"; const JWT_SECRET = process.env.JWT_SECRET; if (!JWT_SECRET) { diff --git a/src/server/routes/index.ts b/src/server/routes/index.ts new file mode 100644 index 0000000..0b89782 --- /dev/null +++ b/src/server/routes/index.ts @@ -0,0 +1 @@ +export { auth } from "./auth.js"; diff --git a/pkgs/shared/src/schemas/index.ts b/src/server/schemas/index.ts index 05b926a..05b926a 100644 --- a/pkgs/shared/src/schemas/index.ts +++ b/src/server/schemas/index.ts diff --git a/pkgs/shared/src/types/index.ts b/src/server/types/index.ts index bfba06f..bfba06f 100644 --- a/pkgs/shared/src/types/index.ts +++ b/src/server/types/index.ts diff --git a/tsconfig.json b/tsconfig.json index 564e2a2..bed26bd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,10 @@ "verbatimModuleSyntax": true, "noUncheckedIndexedAccess": true, "noImplicitOverride": true, - "forceConsistentCasingInFileNames": true + "forceConsistentCasingInFileNames": true, + "outDir": "./dist", + "rootDir": "./src" }, + "include": ["src/**/*"], "exclude": ["node_modules", "dist"] } diff --git a/pkgs/server/vitest.config.ts b/vitest.config.ts index af9649f..af9649f 100644 --- a/pkgs/server/vitest.config.ts +++ b/vitest.config.ts |
