refactor: Co-locate server artifacts under apps/server/

Move drizzle/, dist/, and coverage/ into apps/server/ so all
server-specific artifacts live alongside the source they belong to.

- git mv drizzle/ → apps/server/drizzle/
- drizzle.config.ts: out → ./apps/server/drizzle
- tsconfig.json: outDir → ./apps/server/dist, exclude drizzle dir
- package.json: main/bin/clean point to apps/server/dist/
- vitest.config.ts: reportsDirectory → ./apps/server/coverage
- .gitignore: add coverage/ entry
- ensure-schema.ts: update getMigrationsPath() for new layout
- docs/database-migrations.md: update drizzle/ references
This commit is contained in:
Lukas May
2026-03-03 11:55:12 +01:00
parent 04c212da92
commit b11cae998c
44 changed files with 15 additions and 13 deletions

1
.gitignore vendored
View File

@@ -3,6 +3,7 @@ node_modules/
# Build output
dist/
coverage/
# Environment files
.env

View File

@@ -20,10 +20,10 @@ const log = createModuleLogger('db');
*/
function getMigrationsPath(): string {
const currentDir = dirname(fileURLToPath(import.meta.url));
// In dev (tsx): apps/server/db/ — need 3 levels up to workspace root
// In dist (tsc): dist/db/ — need 2 levels up to workspace root
const upThree = join(currentDir, '..', '..', '..', 'drizzle');
if (existsSync(upThree)) return upThree;
// Dev: apps/server/db/ → 1 up → apps/server/drizzle/
// Dist: apps/server/dist/db/ → 2 up → apps/server/drizzle/
const upOne = join(currentDir, '..', 'drizzle');
if (existsSync(upOne)) return upOne;
return join(currentDir, '..', '..', 'drizzle');
}

View File

@@ -5,13 +5,13 @@ This project uses [drizzle-kit](https://orm.drizzle.team/kit-docs/overview) for
## Overview
- **Schema definition:** `apps/server/db/schema.ts` (drizzle-orm table definitions)
- **Migration output:** `drizzle/` directory (SQL files + meta journal)
- **Migration output:** `apps/server/drizzle/` directory (SQL files + meta journal)
- **Config:** `drizzle.config.ts`
- **Runtime migrator:** `apps/server/db/ensure-schema.ts` (calls `drizzle-orm/better-sqlite3/migrator`)
## How It Works
On every server startup, `ensureSchema(db)` runs all pending migrations from the `drizzle/` folder. Drizzle tracks applied migrations in a `__drizzle_migrations` table so only new migrations are applied. This is safe to call repeatedly.
On every server startup, `ensureSchema(db)` runs all pending migrations from the `apps/server/drizzle/` folder. Drizzle tracks applied migrations in a `__drizzle_migrations` table so only new migrations are applied. This is safe to call repeatedly.
## Workflow
@@ -22,7 +22,7 @@ On every server startup, `ensureSchema(db)` runs all pending migrations from the
```bash
npx drizzle-kit generate
```
3. Review the generated SQL in `drizzle/NNNN_*.sql`
3. Review the generated SQL in `apps/server/drizzle/NNNN_*.sql`
4. Commit the migration file along with your schema change
### Applying migrations

View File

@@ -4,7 +4,7 @@ import { homedir } from 'node:os';
export default defineConfig({
schema: './apps/server/db/schema.ts',
out: './drizzle',
out: './apps/server/drizzle',
dialect: 'sqlite',
dbCredentials: {
url: process.env.CW_DB_PATH ?? join(homedir(), '.cw', 'data', 'cw.db'),

View File

@@ -7,14 +7,14 @@
"apps/*",
"packages/*"
],
"main": "./dist/index.js",
"main": "./apps/server/dist/index.js",
"bin": {
"cw": "./dist/bin/cw.js"
"cw": "./apps/server/dist/bin/cw.js"
},
"scripts": {
"build": "tsc",
"dev": "tsx watch apps/server/bin/cw.ts",
"clean": "rimraf dist",
"clean": "rimraf apps/server/dist",
"test": "vitest run",
"test:watch": "vitest",
"test:coverage": "vitest run --coverage",

View File

@@ -3,7 +3,7 @@
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"outDir": "./dist",
"outDir": "./apps/server/dist",
"rootDir": "./apps/server",
"strict": true,
"esModuleInterop": true,
@@ -13,5 +13,5 @@
"resolveJsonModule": true
},
"include": ["apps/server/**/*"],
"exclude": ["node_modules", "dist"]
"exclude": ["node_modules", "apps/server/dist", "apps/server/drizzle"]
}

View File

@@ -15,6 +15,7 @@ export default defineConfig({
coverage: {
provider: 'v8',
reporter: ['text', 'json', 'html'],
reportsDirectory: './apps/server/coverage',
},
},
});