gencow 0.1.95 → 0.1.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/gencow.mjs CHANGED
@@ -253,7 +253,7 @@ function buildEnv(config) {
253
253
  GENCOW_FUNCTIONS: resolve(cwd, config.functionsDir),
254
254
  GENCOW_DB_URL: resolve(cwd, config.db.url), // ← 절대 경로로 변환 (서버 CWD와 무관)
255
255
  GENCOW_STORAGE: resolve(cwd, config.storage),
256
- GENCOW_MIGRATIONS: resolve(cwd, "migrations"), // ← 프로젝트 로컬 migrations 폴더
256
+ GENCOW_MIGRATIONS: resolve(cwd, config.functionsDir, "migrations"), // ← gencow/migrations 폴더
257
257
  GENCOW_SCHEMA: resolve(cwd, config.schema), // ← drizzle-kit이 올바른 스키마 참조
258
258
  };
259
259
  }
@@ -772,7 +772,9 @@ export default crons;
772
772
  export default defineConfig({
773
773
  dialect: "postgresql",
774
774
  schema: ["./gencow/schema.ts", "./gencow/auth-schema.ts"],
775
- out: "./migrations",
775
+ out: "./gencow/migrations",
776
+ // generate는 DB 연결 없이 스키마 파일만 비교하여 SQL 생성.
777
+ // push(로컬 전용)는 DB 연결 필요.
776
778
  ...(process.env.DATABASE_URL
777
779
  ? { dbCredentials: { url: process.env.DATABASE_URL } }
778
780
  : { driver: "pglite", dbCredentials: { url: "./.gencow/data" } }),
@@ -1166,7 +1168,7 @@ ${hasPrompt ? `
1166
1168
  const functionsAbsolute = resolve(cwd, config.functionsDir);
1167
1169
  const dbDir = resolve(cwd, config.db.url);
1168
1170
  const storageDir = resolve(cwd, config.storage);
1169
- const migrationsDir = resolve(cwd, "migrations");
1171
+ const migrationsDir = resolve(cwd, config.functionsDir, "migrations");
1170
1172
  mkdirSync(functionsAbsolute, { recursive: true });
1171
1173
  mkdirSync(dbDir, { recursive: true });
1172
1174
  mkdirSync(storageDir, { recursive: true });
@@ -1236,14 +1238,14 @@ ${hasPrompt ? `
1236
1238
  execSync("pnpm db:generate", {
1237
1239
  cwd: findServerRoot(),
1238
1240
  env: genEnv,
1239
- stdio: ["ignore", "pipe", "pipe"],
1241
+ stdio: "inherit", // 프롬프트 패스스루 (rename 등)
1240
1242
  });
1241
1243
  } else {
1242
1244
  // Standalone: use npx drizzle-kit directly
1243
1245
  execSync("npx drizzle-kit generate", {
1244
1246
  cwd: process.cwd(),
1245
1247
  env: genEnv,
1246
- stdio: ["ignore", "pipe", "pipe"],
1248
+ stdio: "inherit", // 프롬프트 패스스루 (rename 등)
1247
1249
  });
1248
1250
  }
1249
1251
  success("Schema → migrations synced");
@@ -1413,10 +1415,28 @@ ${hasPrompt ? `
1413
1415
  process.exit(1);
1414
1416
  }
1415
1417
 
1418
+ // 🆕 로컬 drizzle-kit generate 실행 (프롬프트 패스스루)
1419
+ info("스키마 마이그레이션 생성 중...");
1420
+ try {
1421
+ execSync("npx drizzle-kit generate", {
1422
+ cwd: process.cwd(),
1423
+ stdio: "inherit",
1424
+ });
1425
+ success("마이그레이션 생성 완료");
1426
+ } catch (e) {
1427
+ const msg = e.stderr?.toString() || e.message || "";
1428
+ if (msg.includes("No schema changes") || msg.includes("nothing to migrate")) {
1429
+ info("스키마 변경 없음 — 기존 마이그레이션 사용");
1430
+ } else {
1431
+ warn(`마이그레이션 생성 실패: ${msg.split("\n")[0]}`);
1432
+ info("서버에서 기존 방식으로 스키마 적용을 시도합니다.");
1433
+ }
1434
+ }
1435
+
1416
1436
  const tmpBundle = resolve(process.cwd(), ".gencow", "schema-bundle.tar.gz");
1417
1437
  mkdirSync(dirname(tmpBundle), { recursive: true });
1418
1438
 
1419
- // tar.gz 생성: gencow/ 폴더 전체 (schema.ts + import된 파일들)
1439
+ // tar.gz 생성: gencow/ 폴더 전체 (schema.ts + migrations/ + import된 파일들)
1420
1440
  execSync(
1421
1441
  `COPYFILE_DISABLE=1 tar -czf "${tmpBundle}" -C "${process.cwd()}" "${functionsDir.replace(/^\.\//,'')}/"`,
1422
1442
  { stdio: ["ignore", "pipe", "pipe"] }
@@ -1460,9 +1480,16 @@ ${hasPrompt ? `
1460
1480
  const config = loadConfig();
1461
1481
  log(`\n${BOLD}${CYAN}Gencow DB Generate${RESET}\n`);
1462
1482
  info("Generating migration files from schema.ts...");
1463
- runInServer("pnpm db:generate", buildEnv(config));
1464
- success("Migration files generated in migrations/");
1465
- log(` ${DIM}Run 'gencow db:migrate' to apply, or let the server apply on startup${RESET}\n`);
1483
+ if (isMonorepo()) {
1484
+ runInServer("pnpm db:generate", buildEnv(config));
1485
+ } else {
1486
+ // Standalone: npx drizzle-kit generate (프롬프트 패스스루)
1487
+ execSync("npx drizzle-kit generate", {
1488
+ cwd: process.cwd(),
1489
+ stdio: "inherit",
1490
+ });
1491
+ }
1492
+ success("Migration files generated in gencow/migrations/");
1466
1493
  },
1467
1494
 
1468
1495
  // ── db:migrate ───────────────────────────────────────
@@ -2402,6 +2429,28 @@ ${BOLD}Examples:${RESET}
2402
2429
  }
2403
2430
  }
2404
2431
 
2432
+ // 1-0b. 로컬 drizzle-kit generate 실행 (프롬프트 패스스루)
2433
+ // 서버에서 generate 시 stdin이 없어 rename 프롬프트에 막히던 문제 해결
2434
+ const schemaPath = resolve(backendRoot, "gencow", "schema.ts");
2435
+ if (existsSync(schemaPath)) {
2436
+ info("스키마 마이그레이션 생성 중...");
2437
+ try {
2438
+ execSync("npx drizzle-kit generate", {
2439
+ cwd: backendRoot,
2440
+ stdio: "inherit", // ← 프롬프트 패스스루!
2441
+ });
2442
+ success("마이그레이션 생성 완료");
2443
+ } catch (e) {
2444
+ const msg = e.stderr?.toString() || e.message || "";
2445
+ if (msg.includes("No schema changes") || msg.includes("nothing to migrate")) {
2446
+ info("스키마 변경 없음 — 기존 마이그레이션 사용");
2447
+ } else {
2448
+ warn(`마이그레이션 생성 실패: ${msg.split("\\n")[0]}`);
2449
+ info("서버에서 기존 방식으로 스키마 적용을 시도합니다.");
2450
+ }
2451
+ }
2452
+ }
2453
+
2405
2454
  // 1. tar.gz 패키징 (백엔드)
2406
2455
  info("백엔드 패키징 중...");
2407
2456
  const { execSync: exec } = await import("child_process");
@@ -3834,18 +3883,27 @@ process.exit(0);
3834
3883
  log(`${DIM}${ts}${RESET} ${CYAN}[deploy]${RESET} ${reason} 변경 감지 → 배포 중...`);
3835
3884
  }
3836
3885
 
3837
- // 스키마 변경 push 자동 실행 (마이그레이션 생성)
3838
- if (isSchema) {
3839
- log(`${DIM}${ts}${RESET} ${YELLOW}[migrate]${RESET} 스키마 변경 감지 → 마이그레이션 생성 중...`);
3886
+ // 스키마 변경 또는 초기 배포 마이그레이션 생성
3887
+ // initial 배포에서도 migrations/ 포함을 위해 generate 실행
3888
+ const schemaExists = existsSync(resolve(process.cwd(), functionsDir, "schema.ts"));
3889
+ if (schemaExists && (isSchema || reason === "initial")) {
3890
+ if (isSchema) {
3891
+ log(`${DIM}${ts}${RESET} ${YELLOW}[migrate]${RESET} 스키마 변경 감지 → 마이그레이션 생성 중...`);
3892
+ }
3840
3893
  try {
3841
3894
  const { execSync } = await import("child_process");
3842
- execSync("npx drizzle-kit generate 2>&1", {
3895
+ execSync("npx drizzle-kit generate", {
3843
3896
  cwd: process.cwd(),
3844
- stdio: "pipe",
3897
+ stdio: "inherit",
3845
3898
  });
3846
3899
  log(`${DIM}${ts}${RESET} ${GREEN}[migrate]${RESET} ✔ 마이그레이션 생성 완료`);
3847
3900
  } catch (e) {
3848
- warn(`[migrate] 마이그레이션 생성 실패 (무시 가능): ${e.message?.split("\n")[0]}`);
3901
+ const msg = e.stderr?.toString() || e.message || "";
3902
+ if (msg.includes("No schema changes") || msg.includes("nothing to migrate")) {
3903
+ // 스키마 변경 없음 — 정상
3904
+ } else {
3905
+ warn(`[migrate] 마이그레이션 생성 실패 (무시 가능): ${msg.split("\n")[0]}`);
3906
+ }
3849
3907
  }
3850
3908
  }
3851
3909
 
@@ -3889,6 +3947,15 @@ process.exit(0);
3889
3947
  const errMsg = data.error || "Unknown error";
3890
3948
  log(` ${RED}${errMsg}${RESET}`);
3891
3949
 
3950
+ // 서버 crash 로그 표시
3951
+ if (data.crashLogs && Array.isArray(data.crashLogs) && data.crashLogs.length > 0) {
3952
+ log(`\n ${YELLOW}── Crash Logs ──${RESET}`);
3953
+ for (const line of data.crashLogs) {
3954
+ log(` ${DIM}${line}${RESET}`);
3955
+ }
3956
+ log(``);
3957
+ }
3958
+
3892
3959
  // 스키마 관련 에러 힌트
3893
3960
  if (errMsg.includes("does not exist") || errMsg.includes("relation")) {
3894
3961
  log(` ${YELLOW}💡 스키마가 변경되었나요? schema.ts를 수정하면 자동으로 마이그레이션이 실행됩니다.${RESET}`);