gencow 0.1.95 → 0.1.96

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"] }
@@ -2402,6 +2422,28 @@ ${BOLD}Examples:${RESET}
2402
2422
  }
2403
2423
  }
2404
2424
 
2425
+ // 1-0b. 로컬 drizzle-kit generate 실행 (프롬프트 패스스루)
2426
+ // 서버에서 generate 시 stdin이 없어 rename 프롬프트에 막히던 문제 해결
2427
+ const schemaPath = resolve(backendRoot, "gencow", "schema.ts");
2428
+ if (existsSync(schemaPath)) {
2429
+ info("스키마 마이그레이션 생성 중...");
2430
+ try {
2431
+ execSync("npx drizzle-kit generate", {
2432
+ cwd: backendRoot,
2433
+ stdio: "inherit", // ← 프롬프트 패스스루!
2434
+ });
2435
+ success("마이그레이션 생성 완료");
2436
+ } catch (e) {
2437
+ const msg = e.stderr?.toString() || e.message || "";
2438
+ if (msg.includes("No schema changes") || msg.includes("nothing to migrate")) {
2439
+ info("스키마 변경 없음 — 기존 마이그레이션 사용");
2440
+ } else {
2441
+ warn(`마이그레이션 생성 실패: ${msg.split("\\n")[0]}`);
2442
+ info("서버에서 기존 방식으로 스키마 적용을 시도합니다.");
2443
+ }
2444
+ }
2445
+ }
2446
+
2405
2447
  // 1. tar.gz 패키징 (백엔드)
2406
2448
  info("백엔드 패키징 중...");
2407
2449
  const { execSync: exec } = await import("child_process");
@@ -3834,18 +3876,27 @@ process.exit(0);
3834
3876
  log(`${DIM}${ts}${RESET} ${CYAN}[deploy]${RESET} ${reason} 변경 감지 → 배포 중...`);
3835
3877
  }
3836
3878
 
3837
- // 스키마 변경 push 자동 실행 (마이그레이션 생성)
3838
- if (isSchema) {
3839
- log(`${DIM}${ts}${RESET} ${YELLOW}[migrate]${RESET} 스키마 변경 감지 → 마이그레이션 생성 중...`);
3879
+ // 스키마 변경 또는 초기 배포 마이그레이션 생성
3880
+ // initial 배포에서도 migrations/ 포함을 위해 generate 실행
3881
+ const schemaExists = existsSync(resolve(process.cwd(), functionsDir, "schema.ts"));
3882
+ if (schemaExists && (isSchema || reason === "initial")) {
3883
+ if (isSchema) {
3884
+ log(`${DIM}${ts}${RESET} ${YELLOW}[migrate]${RESET} 스키마 변경 감지 → 마이그레이션 생성 중...`);
3885
+ }
3840
3886
  try {
3841
3887
  const { execSync } = await import("child_process");
3842
- execSync("npx drizzle-kit generate 2>&1", {
3888
+ execSync("npx drizzle-kit generate", {
3843
3889
  cwd: process.cwd(),
3844
- stdio: "pipe",
3890
+ stdio: "inherit",
3845
3891
  });
3846
3892
  log(`${DIM}${ts}${RESET} ${GREEN}[migrate]${RESET} ✔ 마이그레이션 생성 완료`);
3847
3893
  } catch (e) {
3848
- warn(`[migrate] 마이그레이션 생성 실패 (무시 가능): ${e.message?.split("\n")[0]}`);
3894
+ const msg = e.stderr?.toString() || e.message || "";
3895
+ if (msg.includes("No schema changes") || msg.includes("nothing to migrate")) {
3896
+ // 스키마 변경 없음 — 정상
3897
+ } else {
3898
+ warn(`[migrate] 마이그레이션 생성 실패 (무시 가능): ${msg.split("\n")[0]}`);
3899
+ }
3849
3900
  }
3850
3901
  }
3851
3902
 
@@ -3889,6 +3940,15 @@ process.exit(0);
3889
3940
  const errMsg = data.error || "Unknown error";
3890
3941
  log(` ${RED}${errMsg}${RESET}`);
3891
3942
 
3943
+ // 서버 crash 로그 표시
3944
+ if (data.crashLogs && Array.isArray(data.crashLogs) && data.crashLogs.length > 0) {
3945
+ log(`\n ${YELLOW}── Crash Logs ──${RESET}`);
3946
+ for (const line of data.crashLogs) {
3947
+ log(` ${DIM}${line}${RESET}`);
3948
+ }
3949
+ log(``);
3950
+ }
3951
+
3892
3952
  // 스키마 관련 에러 힌트
3893
3953
  if (errMsg.includes("does not exist") || errMsg.includes("relation")) {
3894
3954
  log(` ${YELLOW}💡 스키마가 변경되었나요? schema.ts를 수정하면 자동으로 마이그레이션이 실행됩니다.${RESET}`);