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:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,6 +3,7 @@ node_modules/
|
||||
|
||||
# Build output
|
||||
dist/
|
||||
coverage/
|
||||
|
||||
# Environment files
|
||||
.env
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"]
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ export default defineConfig({
|
||||
coverage: {
|
||||
provider: 'v8',
|
||||
reporter: ['text', 'json', 'html'],
|
||||
reportsDirectory: './apps/server/coverage',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user