chore: bootstrap development environment

This commit is contained in:
2026-08-14 12:24:46 +09:00
commit c3a3ff5e17
28 changed files with 4239 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
# Calculation engine
기존 스킬 로스 계산기의 계산 로직을 UI와 분리해 둘 위치입니다.
- Svelte 컴포넌트나 SvelteKit 서버 모듈을 import하지 않습니다.
- 브라우저, Web Worker, Node.js, 단위 테스트에서 공유할 수 있는 순수 TypeScript로 작성합니다.
- 공용 데이터 타입은 `src/lib/models`에서 가져옵니다.
+3
View File
@@ -0,0 +1,3 @@
# Shared models
UI, 계산 엔진, 서버가 함께 사용하는 도메인 타입과 검증 규칙을 둡니다. 특정 실행 환경에 의존하는 코드는 포함하지 않습니다.
+3
View File
@@ -0,0 +1,3 @@
# Server-only modules
SQLite/Drizzle 저장소와 SvelteKit 서버에서만 사용하는 모듈을 둡니다. 이 디렉터리의 코드는 브라우저나 계산 엔진에서 import하지 않습니다.
+24
View File
@@ -0,0 +1,24 @@
import { env } from '$env/dynamic/private';
import { mkdirSync } from 'node:fs';
import { dirname } from 'node:path';
import Database from 'better-sqlite3';
import { drizzle } from 'drizzle-orm/better-sqlite3';
import { migrate } from 'drizzle-orm/better-sqlite3/migrator';
import { sql } from 'drizzle-orm';
const databaseUrl = env.DATABASE_URL ?? './data/holodream.db';
if (databaseUrl !== ':memory:') {
mkdirSync(dirname(databaseUrl), { recursive: true });
}
const sqlite = new Database(databaseUrl);
sqlite.pragma('journal_mode = WAL');
sqlite.pragma('foreign_keys = ON');
export const db = drizzle(sqlite);
migrate(db, { migrationsFolder: './drizzle' });
export function checkDatabase(): void {
db.run(sql`select 1`);
}
+8
View File
@@ -0,0 +1,8 @@
import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';
// Infrastructure-only table. Game and user schemas will be added in later phases.
export const appMetadata = sqliteTable('app_metadata', {
key: text('key').primaryKey(),
value: text('value').notNull(),
updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull()
});
+3
View File
@@ -0,0 +1,3 @@
# Web Workers
덱 조합 탐색처럼 UI를 막을 수 있는 계산의 Web Worker 진입점을 둡니다. 실제 최적화 로직은 `src/lib/engine`을 호출하도록 구성합니다.