import { EmbeddableCatalog, LangCode, LogicalModel } from './types'; export type SqlDialect = 'postgres'; export interface DdlContext { /** EMBED_PREDEF 서브컬럼의 카탈로그 기본 물리명 해석용(validateModel과 동형 주입). */ embeddableCatalog?: EmbeddableCatalog; /** * `COMMENT ON` 을 낼 **로케일**. 미주입이면 주석을 **아예 내지 않는다**. * * ★★**「옵션이냐 항상이냐」를 따로 두지 않은 이유** — DDL 주석은 본질적으로 **로케일에 묶인 값**이라 * *「어느 언어로 낼지 모른다」* 와 *「낼지 말지 모른다」* 가 같은 물음이다. 플래그를 따로 두면 두 축이 * 갈려 `commentLocale` 없이 `emitComments:true` 같은 **답 없는 조합**이 생긴다. 미주입=미방출은 * 「모르는 값 규약」의 이 축 사본이다(모르면 발명하지 않고 침묵한다). * * ★**호출자가 넘길 것은 «프로젝트 기본 언어»이지 «접속 유저 언어»가 아니다** — 레거시가 그렇게 했고 * (`AbstractSrcGen.getDefaultLanguage()` = `systemSetting.language`), DDL 주석은 **DB 에 굳는 값**이라 * 접속자에 따라 산출이 달라지면 안 된다. controller 의 `userLanguage`(접속 유저)를 그대로 넘기지 말 것. * * ⚠️**로케일 폴백을 «하지 않는다»**(`pickMultiLangText` 를 쓰지 않는 유일한 논리명 소비처다). 지정 로케일이 * 비면 그 `COMMENT` 문을 **통째로 생략**한다 — 레거시 동형(`DatabaseCommentBuilder` 가 `isBlank` 로 * 건너뛴다)이고, 폴백하면 「ja 논리명을 모른다」가 「ko 값이다」로 바뀌어 **DB 에 굳는다**. */ commentLocale?: LangCode; } /** 표시 모드 → 기본 DDL 방언. 현재는 PG 단일. */ export declare function defaultSqlDialect(): SqlDialect; /** * 논리 모델을 지정 방언의 SQL DDL로 직렬화. * * ⚠️★★**2번째 자리는 «함정»이다** — `SqlDialect` 은 값이 하나(`'postgres'`)이고 본문이 그것을 **읽지도 * 않는데**, 그 죽은 파라미터가 `ctx` 앞을 차지한다. 형제 함수들이 자리를 달리 두므로 * (`validateModel(model, ctx)`·`entityModelToText(logical, ctx)` = **2번째**) 한 파일에서 나란히 쓰면 * `entityModelToDdl(l, {embeddableCatalog})` 처럼 **ctx 가 dialect 자리로 들어가 조용히 사라진다**. * 실측 파급: 조사 하니스 **14파일 23자리**가 그렇게 물려 EMBED_PREDEF 축을 **미주입과 바이트 동일**하게 * 재고 있었고(「복구 0/392」는 하니스 자신이 만든 관측) 그 자리는 타입 검사가 없는 `.mjs` 였다. * * ⇒ ★**런타임 구제만 한다 — 선언 타입은 좁힌 채로 둔다.** 2번째가 «객체»면 그것을 ctx 로 읽는다. * 시그니처를 `(logical, ctx)` 로 정정하는 쪽이 근본이지만 이 함수는 **공개 표면**(`src/index.ts`)이라 * breaking 이고(다음 메이저 소관), 반대로 파라미터 타입을 `SqlDialect | DdlContext` 로 넓히면 **TS * 호출자가 받던 컴파일 에러가 사라진다** — 그 에러가 이 함정의 가장 강한 신호다. 그래서 타입은 그대로, * 구제는 «타입 검사가 없는 호출자»(조사 하니스)에만 닿게 한다. */ export declare function entityModelToDdl(logical: LogicalModel, dialect?: SqlDialect, ctx?: DdlContext): string;