@g1cloud/entity-modeler-next 5.2.52 → 5.2.54

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.
@@ -38,7 +38,7 @@ export interface PDbAttr {
38
38
  multiValue?: boolean;
39
39
  /** 레거시 AttributeDatabaseAttribute.multiValueSeparator(기본 "|"). 라운드트립 보존 전용. */
40
40
  multiValueSeparator?: string;
41
- /** 레거시 AttributeDatabaseAttribute.sequenceName. 라운드트립 보존 전용. */
41
+ /** 레거시 AttributeDatabaseAttribute.sequenceName → 논리 `DbColumn.sequenceName`(오버라이드·애플리케이션 채번 두 용법 · 그쪽 주석). */
42
42
  sequenceName?: string;
43
43
  /** FK 컬럼이 참조하는 부모 PK 컬럼 modelId. 식별자 전파(derivedFrom) 재구성의 명시 링크. */
44
44
  targetModelId?: string;
@@ -342,6 +342,36 @@ export type ResolveError = {
342
342
  entity: Handle;
343
343
  handle: Handle;
344
344
  }
345
+ /**
346
+ * `@MapsId` 파생 식별이 **방출 시점에 합성하는 스칼라 `@Id` 필드명**과 같은 이름으로 속성을 만들려 함.
347
+ *
348
+ * ★그 필드는 **모델 속성이 아니다** — 모델은 FK 속성 «하나»만 갖고 코드젠이 두 필드를 낸다
349
+ * (`core/scaffoldJava.derivedIdScalarNameOf`). 그대로 통과시키면 관용구⑤(FK-as-PK) 형상이 되어
350
+ * 같은 물리 컬럼을 두 속성이 쓰고 `CHK-NAME-2`(컬럼 중복) error + DDL 중복으로 착지한다.
351
+ *
352
+ * ⚠️★**유입 경로는 「오독」이 아니라 「규칙 준수」다** — sync 의 diff 규칙이 「코드에 있고 모델에
353
+ * 없음 → `attribute.add`」이고 코드에는 그 스칼라가 실재한다. 그래서 방어가 **세 겹**이다:
354
+ * `/text` 의 `derivedIdField=` 표시(읽는 쪽이 존재를 안다) · playbook 예외(규칙이 스스로 면제한다) ·
355
+ * **이 거부**(둘 다 안 읽혔을 때의 구조적 차단). 앞 둘은 준수에 기대고 이것만 기대지 않는다.
356
+ *
357
+ * ★★**거부는 «갈 곳»을 함께 말한다** — `fk` 가 그 스칼라를 내는 FK 속성명이다. 필드명을 바꾸려는
358
+ * 의도였다면 답은 새 속성이 아니라 그 FK 에 대한 `attribute.update {derivedIdFieldName}` 이다.
359
+ *
360
+ * ⚠️★**`attribute.update {name}` 의 rename 은 «의도적으로» 막지 않는다** — 이 축의 유입원인 sync 는
361
+ * 속성을 **이름으로 매칭**하므로 rename op 자체를 낼 수 없다(이름이 다르면 add/remove 로 갈린다 —
362
+ * playbook §4 의 「수정」 비교 필드에 `name` 이 없는 이유가 그것이다) ⇒ 남는 경로는 **사람이 지시한
363
+ * AI 조작**뿐이고 그때는 의도가 있다. 발동 근거 0 인 가드를 세우지 않는 것이 이 리포 규율이다.
364
+ * ⚠️단 그 경로의 착지점은 **무신호**다(물리명은 안 겹쳐 `CHK-NAME-2` 가 안 울리고, 스칼라는 모델에
365
+ * 없어 `CHK-NAME-1` 도 못 본다 — 코드젠 산출에서 필드명이 겹쳐 컴파일이 깨진다).
366
+ * 트리거 = **사람 지시 rename 으로 그 형상이 실제로 관측될 때**.
367
+ */
368
+ | {
369
+ code: 'derived-id-scalar-conflict';
370
+ opIndex: number;
371
+ entity: Handle;
372
+ handle: Handle;
373
+ fk: string;
374
+ }
345
375
  /** EMBED_PREDEF SHARED_REF 서브컬럼의 공유 대상 물리명이 소속 엔터티 내 컬럼과 0개 매칭. */
346
376
  | {
347
377
  code: 'shared-column-target-not-found';
@@ -102,6 +102,11 @@ export interface AttrSpec {
102
102
  length?: number;
103
103
  /** dbAttr 소수 자릿수(DECIMAL/NUMERIC scale). length 동반이 일반적. 0/미설정은 미지정. */
104
104
  scale?: number;
105
+ /**
106
+ * dbAttr 채번 시퀀스명(`DbColumn.sequenceName`). autoIncrement 없는 비PK 컬럼이면 «애플리케이션 채번»이고 여러
107
+ * 속성이 같은 이름을 공유해도 정상(공유 채번기). 컬럼 생성 트리거 필드(dataType 동반 필수).
108
+ */
109
+ sequenceName?: string;
105
110
  /**
106
111
  * 코드성 속성의 group code 바인딩(레거시 AttributeModel.groupCode). `type:'GroupCodeEnum'`이면 필수.
107
112
  * 모델→모델 복사·코드 동기화에서 GroupCodeEnum 속성을 온전히 재현하는 핵심 필드(없으면 깨진 파생 타입).
@@ -187,6 +187,21 @@ export declare function isMapsIdFk(fk: Attribute, assoc: Association | undefined
187
187
  * (호출부가 fillIn으로 표면화).
188
188
  */
189
189
  export declare function mapsIdScalarName(fk: Attribute, assoc: Association, byId: Map<ModelId, Entity>): string;
190
+ /**
191
+ * 이 속성이 **방출 시점에 합성되는** `@MapsId` 스칼라 `@Id` 를 낳으면 그 **필드명**, 아니면 빈 문자열.
192
+ *
193
+ * ★**「모델 속성 하나가 Java 필드 «둘» 을 낸다」의 단일 출처**다 — 판정(`isMapsIdFk`)·관계 조달
194
+ * (`findFkOwningAssociation`)·이름 파생(`mapsIdScalarName`) 셋을 한 자리에 묶어, 소비처가 조건을
195
+ * 재기술하지 않게 한다. 재기술하면 축이 갈린다(이 리포가 반복해서 대가를 치른 형태).
196
+ *
197
+ * ⚠️**소비처는 같은 술어를 쓰되 처방이 다르다**: 코드젠은 **방출**하고(`buildClassFieldPlan`),
198
+ * 캔버스는 코드명으로 **표시**하며(`view/columnResolution`), `/text` 는 `derivedIdField=` 로
199
+ * **자기기술**하고(`core/text`), AI 쓰기 경로는 같은 이름의 속성 생성을 **거부**한다(`agent/resolver`).
200
+ * 넷이 한 술어를 공유하는 것이 이 함수의 목적이다.
201
+ *
202
+ * 근거=`.claude/docs/MapsIdIdiom-entry_2026-08-26.md` §3.A
203
+ */
204
+ export declare function derivedIdScalarNameOf(attr: Attribute, entity: Entity, logical: LogicalModel, byId?: Map<ModelId, Entity>): string;
190
205
  /**
191
206
  * `@MapsId` 스칼라 @Id의 **Java 타입** — 이름과 **같은 경로**(`derivedFrom.sourceAttributeRef`)로 조달한다.
192
207
  *
@@ -0,0 +1,26 @@
1
+ import { DbColumn } from './types';
2
+ export type SequenceClaim =
3
+ /** 관례형 파생 — 사람이 고르지 않은 이름. 충돌 판정의 **지목 대상**(고치는 비용이 1편집 = 이름 명시). */
4
+ {
5
+ kind: 'derived';
6
+ name: string;
7
+ }
8
+ /** 명시 — `sequenceName`. `autoIncrement` 는 ①오버라이드 / ②애플리케이션 채번을 가른다. */
9
+ | {
10
+ kind: 'explicit';
11
+ name: string;
12
+ autoIncrement: boolean;
13
+ };
14
+ /** 관례형 시퀀스명 = `<table>_<column>_seq`(PG serial 관례). 절단하지 않는다(헤더 ①~④). */
15
+ export declare function defaultSequenceName(table: string, column: string): string;
16
+ /** 컬럼 `DEFAULT nextval` 이 성립하는가 — `autoIncrement` × 수치형. 비수치형 자동증가는 타입이 맞지 않는다. */
17
+ export declare function isDbDefaultSequence(col: Pick<DbColumn, 'autoIncrement' | 'dataType'>): boolean;
18
+ /**
19
+ * 이 컬럼이 차지하는 시퀀스명과 그 출처. 아무 시퀀스도 쓰지 않으면 `null`.
20
+ *
21
+ * - `sequenceName` 이 비공백이면 **explicit** — 타입·`autoIncrement` 와 무관하게 그 이름을 차지한다
22
+ * (애플리케이션 채번은 문자열 컬럼이 지배 형상이므로 수치형 게이트를 두면 그 용법이 통째로 사라진다).
23
+ * - 아니면 `autoIncrement` × 수치형일 때만 **derived**. 비수치형 자동증가는 `DEFAULT nextval` 을 낼 수 없어
24
+ * 시퀀스를 차지하지 않는다(DDL 이 주석으로 신호하는 자리).
25
+ */
26
+ export declare function sequenceClaim(col: Pick<DbColumn, 'autoIncrement' | 'sequenceName' | 'dataType'>, table: string, column: string): SequenceClaim | null;
@@ -226,7 +226,14 @@ export interface DbColumn {
226
226
  multiValue?: boolean;
227
227
  /** 다중값 직렬화 구분자(레거시 기본 "|"). multiValue=false여도 원형 보존 위해 verbatim 유지. */
228
228
  multiValueSeparator?: string;
229
- /** 시퀀스명(레거시 AttributeDatabaseAttribute.sequenceName). 라운드트립 보존 전용. */
229
+ /**
230
+ * 이 컬럼이 번호를 받는 시퀀스의 이름(레거시 AttributeDatabaseAttribute.sequenceName). 두 용법을 한 필드가 담는다:
231
+ * ① `autoIncrement` 동반 — 관례형 `<table>_<column>_seq` 를 **오버라이드**(DDL `CREATE SEQUENCE` + `DEFAULT nextval`).
232
+ * ② `autoIncrement` 없음 — **애플리케이션 채번**. DB 는 시퀀스만 제공하고 값은 채번기가 접두어를 입혀 만든다
233
+ * (문자열 컬럼이 지배 형상). 여러 컬럼이 **같은 이름을 공유**하는 것이 정상(공유 채번기).
234
+ * 산식·충돌 판정(CHK-NAME-12)·소비처 형상은 `sequenceName.ts` 헤더가 소유한다. ⚠️종전 주석 「라운드트립 보존
235
+ * 전용」은 2026-09 DDL 배선 이후 거짓이었다(2026-09-16 정정).
236
+ */
230
237
  sequenceName?: string;
231
238
  }
232
239
  export interface Attribute {