aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--README.md19
-rw-r--r--docs/dev/architecture.md63
-rw-r--r--docs/dev/roadmap.md4
-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.json36
-rw-r--r--pkgs/client/package.json13
-rw-r--r--pkgs/client/tsconfig.json10
-rw-r--r--pkgs/server/package.json35
-rw-r--r--pkgs/server/src/middleware/index.ts2
-rw-r--r--pkgs/server/src/repositories/index.ts3
-rw-r--r--pkgs/server/src/routes/index.ts1
-rw-r--r--pkgs/server/tsconfig.json9
-rw-r--r--pkgs/shared/package.json23
-rw-r--r--pkgs/shared/src/index.ts2
-rw-r--r--pkgs/shared/tsconfig.json9
-rw-r--r--pnpm-lock.yaml29
-rw-r--r--pnpm-workspace.yaml2
-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.ts2
-rw-r--r--src/server/repositories/index.ts3
-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.ts1
-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.json5
-rw-r--r--vitest.config.ts (renamed from pkgs/server/vitest.config.ts)0
43 files changed, 120 insertions, 205 deletions
diff --git a/README.md b/README.md
index 4d90b2f..eab12fc 100644
--- a/README.md
+++ b/README.md
@@ -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