@g1cloud/entity-modeler-next 5.0.0-alpha.20 → 5.0.0-alpha.22

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.
@@ -0,0 +1,57 @@
1
+ import { Entity, ModelId, MultiLangText, SuperClassCatalog } from './types';
2
+ /**
3
+ * 상속 컬럼 참조 네임스페이스 접두사. 합성 modelId 형식 = `inherited:<BaseClass>:<field>`.
4
+ * 실제 modelId는 crypto.randomUUID()(하이픈 UUID, 콜론 없음)라 이 접두사 공간과 disjoint —
5
+ * IndexColumn.columnRef가 로컬 dbAttr modelId(UUID)와 상속 컬럼(합성)을 단일 ModelId 형태로
6
+ * 균일하게 담을 수 있다(D2 = 2a 합성 stable modelId, IndexColumn 유니온화 회피).
7
+ */
8
+ export declare const INHERITED_REF_PREFIX = "inherited:";
9
+ /** `inherited:<baseClass>:<field>` 합성 modelId 생성. */
10
+ export declare function makeInheritedColumnRef(baseClass: string, field: string): ModelId;
11
+ /** ref가 상속 컬럼 합성 modelId인지. UUID(로컬 dbAttr)면 false. */
12
+ export declare function isInheritedColumnRef(ref: string): boolean;
13
+ /**
14
+ * 합성 modelId를 `{baseClass, field}`로 분해. 상속 ref가 아니거나 형식이 깨졌으면 null.
15
+ * baseClass/field는 자바 식별자라 콜론을 포함하지 않으므로 접두사 뒤 **첫 콜론**으로 분할한다.
16
+ */
17
+ export declare function parseInheritedColumnRef(ref: string): {
18
+ baseClass: string;
19
+ field: string;
20
+ } | null;
21
+ /**
22
+ * 파생(비저장) 상속 컬럼 — `Entity.superClass`가 카탈로그로 기여하는 컬럼을 인덱스 대상으로 참조
23
+ * 가능하게 하는 투영 결과. `entity.attributes`에 넣지 않는다(G4 보존). 뷰 picker·라벨, codegen,
24
+ * 검증이 온디맨드로 이 함수를 호출해 소비한다.
25
+ */
26
+ export interface InheritedColumn {
27
+ /** 합성 modelId(`inherited:<baseClass>:<field>`) — IndexColumn.columnRef가 참조하는 값. */
28
+ modelId: ModelId;
29
+ /** 기여한 슈퍼클래스명(= 카탈로그 name = Entity.superClass). */
30
+ baseClass: string;
31
+ /** 논리 필드명(합성 id 키, D6). */
32
+ field: string;
33
+ /** 물리 컬럼명(@Index columnList 코드젠·라벨용). */
34
+ physicalName: string;
35
+ /** dbTypes 카탈로그 값. */
36
+ dataType: string;
37
+ logicalName?: MultiLangText;
38
+ length?: number;
39
+ scale?: number;
40
+ }
41
+ /**
42
+ * 엔티티의 `superClass`를 카탈로그로 해소해 상속 컬럼을 투영한다(파생·비저장).
43
+ *
44
+ * - `entity.superClass`가 **비어 있으면** 카탈로그의 **default base**(`SuperClassDef.default`)로 폴백한다.
45
+ * 레거시 관례상 superClass 미명시 = 코드젠 암묵 default(`extends BaseEntity`)라, 빈 값은 default 상속으로
46
+ * 해석해야 상속 컬럼이 점등된다. default가 지정 안 된 카탈로그면 빈 값은 여전히 빈 배열(opt-in 보존).
47
+ * - 명시적 `superClass='Object'`(자바 `extends Object` = default 상속 opt-out 트릭)는 non-empty라
48
+ * default 폴백에 안 걸리고 카탈로그 미스 → 빈 배열. opt-out이 자연 보존된다.
49
+ * - D7 스킵: `stereotype === 'JPA_EMBEDDABLE'`(임베더블은 엔티티 상속 안 함), 엔티티 자신이
50
+ * 카탈로그 base(= 상속의 원천)면 스킵(자기 자신에게 투영하는 순환 방지).
51
+ * - 각 투영 컬럼에 합성 modelId(§4.3)를 부여한다.
52
+ * - 초기엔 1단 투영만(대부분 BaseEntity 단일 단계). base가 또 다른 base를 상속하는 다단 체인은
53
+ * 카탈로그가 상위 참조를 표현하도록 확장한 뒤 재귀 활성(범위 밖).
54
+ *
55
+ * 카탈로그가 비어 있거나 매칭 base가 없으면 빈 배열(inert 게이트 — groupCodeCatalog 동일 관례).
56
+ */
57
+ export declare function projectInheritedColumns(entity: Entity, catalog: SuperClassCatalog): InheritedColumn[];
@@ -0,0 +1,42 @@
1
+ import { LogicalModel, ModelId, SuperClassCatalog, EmbeddableCatalog } from './types';
2
+ import { JavaTypeDef } from './javaTypes';
3
+ export interface ScaffoldOptions {
4
+ /** 저장값→소스 타입 역해소 카탈로그. 미주입 시 lib 내장 `JAVA_TYPES` 폴백(호스트 javaTypeCatalog 미러). */
5
+ javaTypeCatalog?: readonly JavaTypeDef[];
6
+ /** 임베더블 타입 해소용(EMBED_PREDEF 필드 타입·클래스명). 미주입 시 모델 type 폴백 + fillIn. */
7
+ embeddableCatalog?: EmbeddableCatalog;
8
+ /**
9
+ * `extends <superClass>` + 상속 컬럼 인덱스 해소용. 핸드오프 O3 — `SuperClassDef.packageName`이
10
+ * "코드젠 forward 슬롯"으로 예약돼 있고 이 emitter가 그 첫 소비처다. 미주입 시 상속 컬럼/extends 미방출.
11
+ */
12
+ superClassCatalog?: SuperClassCatalog;
13
+ /**
14
+ * Lombok 방출 모드(기본 `true` — 모델러 사용 프로젝트가 사실상 전부 Lombok). true면 **필드 단위**
15
+ * `@Getter`(스칼라·단일 임베드·owner 관계, 대형 엔티티 SalesOrch류 관례) + 클래스 `@NoArgsConstructor
16
+ * (access = AccessLevel.PROTECTED)`를 방출하고 수동 getter·protected 생성자를 생략한다. **컬렉션 관계**
17
+ * getter는 @Getter가 raw 컬렉션을 반환해 애그리거트 보호가 깨지므로 예외 — 수동 `Collections.unmodifiable…`
18
+ * 유지(@Getter 미부착). **@Version**은 JPA 관리 내부 필드라 getter 제외(실측 37/38 무 getter).
19
+ * `{Entity}PK`는 필드 @Getter만, equals/hashCode·생성자는 수동. `false` = 수동 전량(생성기/코퍼스 패리티,
20
+ * 바이트 골든 앵커 모드 — @Version getter 포함).
21
+ */
22
+ lombok?: boolean;
23
+ }
24
+ export interface ScaffoldedEntity {
25
+ modelId: ModelId;
26
+ /** `{ClassName}.java` */
27
+ fileName: string;
28
+ /** 컴파일 가능 최소 골격 자바 소스(`// TODO [손채움]` 포함). */
29
+ source: string;
30
+ /** 사람이 채울 지점 목록(라벨) — reconcile 보고용. */
31
+ fillIns: string[];
32
+ /** 신규 엔티티 경로에서만 write(기존엔 재추가 금지, §4.4) — reconcile 판단. */
33
+ repository?: {
34
+ fileName: string;
35
+ source: string;
36
+ };
37
+ }
38
+ /**
39
+ * 대상 엔티티들을 JPA 자바 소스로 렌더한다. `logical`은 참조 폐포(FK 대상 등) 해소를 위해 전체를 받고,
40
+ * `targetIds`가 실제 산출(파일 생성) 스코프다. 스코프 밖 엔티티는 읽기(폐포)에만 쓰이고 산출되지 않는다.
41
+ */
42
+ export declare function scaffoldEntityJava(logical: LogicalModel, targetIds: readonly ModelId[], opts?: ScaffoldOptions): ScaffoldedEntity[];
@@ -103,6 +103,52 @@ export interface GroupCodeCatalogEntry {
103
103
  codes: GroupCodeValue[];
104
104
  }
105
105
  export type GroupCodeCatalog = GroupCodeCatalogEntry[];
106
+ /**
107
+ * 슈퍼클래스 카탈로그 — `Entity.superClass`(예: BaseEntity)가 상속시키는 컬럼(감사필드 createdBy/
108
+ * createdAt/updatedBy/updatedAt 등)의 정의. 상속 컬럼은 모델에 물질화되지 않으므로(syncPlaybook §G4
109
+ * 상속필드 의도적 부재) 인덱스 대상으로 참조하려면 이 카탈로그로 파생 투영한다(`inheritedColumns.ts`).
110
+ * EmbeddableCatalog와 동형으로 **호스트가 주입**하며(shared/ 하드코딩 상수, 완전 통합 시 superClassCatalog
111
+ * 엔드포인트) 코어는 소비만 한다. 빈 배열이면 상속 컬럼 투영이 나오지 않는다(inert — 인덱스는 로컬
112
+ * dbAttr만 참조 가능).
113
+ */
114
+ export interface SuperClassColumnDef {
115
+ /** 논리 필드명 = 합성 modelId(`inherited:<class>:<field>`) 키. 카탈로그 물리명이 바뀌어도 안정(D6). 예: 'createdAt'. */
116
+ field: string;
117
+ /** 물리 컬럼명(@Index columnList 코드젠용). 예: 'created_at'. */
118
+ physicalName: string;
119
+ /** dbTypes 카탈로그 값. 예: 'TIMESTAMP'. */
120
+ dataType: string;
121
+ /** 표시용 논리명(선택). */
122
+ logicalName?: MultiLangText;
123
+ length?: number;
124
+ scale?: number;
125
+ }
126
+ export interface SuperClassDef {
127
+ /** `Entity.superClass`와 매칭되는 클래스명(예: BaseEntity). 카탈로그 내 유일. */
128
+ name: string;
129
+ /**
130
+ * JPA 상속 종류. 초기엔 mapped-superclass만 — @Index(columnList=)가 상속 물리 컬럼을 유효하게
131
+ * 참조하는 전제(상속 컬럼이 자식 테이블에 병합됨). 다른 전략(JOINED 등)은 별도 트랙.
132
+ */
133
+ kind: 'MAPPED_SUPERCLASS';
134
+ /**
135
+ * base 클래스의 자바 패키지(FQN 구성용). 예: 'net.g1project.ecp.common.domain'.
136
+ * **현재 lib 소비처 없음** — 상속 컬럼 인덱스 모델링은 field/physicalName/dataType만 쓴다.
137
+ * 코드젠이 `import <packageName>.<name>;` + `extends <name>`를 낼 때를 위한 forward 슬롯(호스트 소유).
138
+ * 카탈로그를 base 클래스 단일 SoT로 키우려는 방향(embeddable/javaType 카탈로그 계열)의 provisioning.
139
+ */
140
+ packageName?: string;
141
+ /**
142
+ * 이 base가 프로젝트 **암묵 default**인지. `Entity.superClass`가 비어 있으면(레거시 관례상
143
+ * 명시 안 함 = 코드젠이 `extends <default>`를 냄) 이 base가 상속 컬럼을 기여한다.
144
+ * 카탈로그 내 최대 하나만 표시(여럿이면 첫 항목). 명시적 `superClass='Object'`는 non-empty라
145
+ * 이 폴백에 걸리지 않고 카탈로그 미스 → 상속 없음(자바 `extends Object` = default 상속 opt-out 트릭).
146
+ */
147
+ default?: boolean;
148
+ /** 이 슈퍼클래스가 기여하는 컬럼(선언 순서 보존). */
149
+ columns: SuperClassColumnDef[];
150
+ }
151
+ export type SuperClassCatalog = SuperClassDef[];
106
152
  export interface DbColumn {
107
153
  modelId: ModelId;
108
154
  physicalName: string;
@@ -1,4 +1,4 @@
1
- import { EmbeddableCatalog, LogicalModel, ModelId } from './types';
1
+ import { EmbeddableCatalog, LogicalModel, ModelId, SuperClassCatalog } from './types';
2
2
  export declare const PHYSICAL_NAME_MAX_LENGTH = 63;
3
3
  /**
4
4
  * 물리명이 이식성 권장 한도를 초과하면 경고 메시지, 아니면 null(비차단 — 호출부는 저장을 막지 않는다).
@@ -43,6 +43,13 @@ export interface ValidationContext {
43
43
  * 타입 출처. 호스트/dev 주입(reservedWords와 동형 ctx 게이트). 미주입/빈 배열이면 CHK-TYPE-3 skip.
44
44
  */
45
45
  embeddableCatalog?: EmbeddableCatalog;
46
+ /**
47
+ * 슈퍼클래스 카탈로그 — CHK-DSN-5(dangling 인덱스 대상)가 인덱스 columnRef의 상속 컬럼(`inherited:`
48
+ * 합성 ref)을 유효한 대상으로 인지하는 화이트리스트 출처. 호스트/dev 주입(embeddableCatalog 동형 ctx
49
+ * 게이트). 미주입/빈 배열이면 상속 컬럼을 인지하지 못하므로, superClass 상속 컬럼을 참조하는 인덱스가
50
+ * dangling으로 오탐될 수 있다 — 카탈로그가 주입돼야 정확 판정(로컬 컬럼만 참조하는 모델은 무영향).
51
+ */
52
+ superClassCatalog?: SuperClassCatalog;
46
53
  }
47
54
  /**
48
55
  * 설계 품질 검증 — 논리 모델(+선택 컨텍스트)을 받아 이슈 목록을 돌려준다.
@@ -8,7 +8,7 @@ import { ResolvedDiagram } from '../core/resolve';
8
8
  import { RoutingMode } from '../core/routing';
9
9
  import { MergeDiagramSource } from '../core/mergeDiagram';
10
10
  import { ValidationIssue } from '../core/validation';
11
- import { AssociationEnd, Attribute, DisplayMode, EmbeddableCatalog, Entity, EntityIndex, Geo, GroupCodeCatalog, LangCode, LogicalGroup, ModelId, Operation, Point, PredefinedCustomTypeCatalog } from '../core/types';
11
+ import { AssociationEnd, Attribute, DisplayMode, EmbeddableCatalog, Entity, EntityIndex, Geo, GroupCodeCatalog, LangCode, LogicalGroup, ModelId, Operation, Point, PredefinedCustomTypeCatalog, SuperClassCatalog } from '../core/types';
12
12
  /**
13
13
  * 관계 파생 FK 직접 삭제 시도 시의 안내 — 뷰 tooltip(어포던스)과 차단 시 토스트(피드백)가 공유한다.
14
14
  * FK는 관계가 소유·관리하므로 컬럼을 직접 지우는 대신 연관관계선을 삭제해야 한다(Option B).
@@ -286,6 +286,15 @@ export interface EditorController {
286
286
  predefinedCustomTypeCatalog: Ref<PredefinedCustomTypeCatalog>;
287
287
  /** 카탈로그 교체(호스트 props 갱신·dev 토글). reactive하므로 셀렉트가 즉시 반영된다. */
288
288
  setPredefinedCustomTypeCatalog(catalog: PredefinedCustomTypeCatalog): void;
289
+ /**
290
+ * 슈퍼클래스 카탈로그(호스트 주입) — `superClass`(예: BaseEntity) 상속 컬럼(감사필드)을 인덱스 대상
291
+ * picker/라벨에 파생 투영(projectInheritedColumns)하는 소스. embeddableCatalog와 동형 — dev는 프리셋,
292
+ * 완전 통합 시 호스트가 superClassCatalog API 값을 주입한다. 비어 있으면 상속 컬럼이 투영되지 않는다
293
+ * (인덱스는 로컬 컬럼만 참조 — 기능 게이트).
294
+ */
295
+ superClassCatalog: Ref<SuperClassCatalog>;
296
+ /** 카탈로그 교체(호스트 props 갱신·dev 토글). reactive하므로 인덱스 picker가 즉시 반영된다. */
297
+ setSuperClassCatalog(catalog: SuperClassCatalog): void;
289
298
  /**
290
299
  * 입력 가능 언어셋(호스트 주입) — 다국어 텍스트(설명·논리명·그룹명) 편집 UI가 노출할 언어 탭 목록·순서.
291
300
  * 비어 있으면 안 되며(입력 불가) 미주입 시 기본 4언어(ko/en/ja/zh). reactive하므로 .value 갱신 시 즉시 반영.
@@ -424,6 +433,7 @@ export declare function createEditorController(initial?: EditorState, options?:
424
433
  embeddableCatalog?: EmbeddableCatalog;
425
434
  groupCodeCatalog?: GroupCodeCatalog;
426
435
  predefinedCustomTypeCatalog?: PredefinedCustomTypeCatalog;
436
+ superClassCatalog?: SuperClassCatalog;
427
437
  languages?: LangCode[];
428
438
  userLanguage?: LangCode;
429
439
  /** `fromPersisted` 산출 meta(트랙 B 마커 + revSeed). schemaVersion·opWriteEnabled로 opMode·read-only 판정. */