@g1cloud/entity-modeler-next 5.2.17 → 5.2.19
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/dist/adapter/diagramAdapter.d.ts +9 -0
- package/dist/adapter/healBackfill.d.ts +0 -10
- package/dist/agent/resolver.d.ts +26 -3
- package/dist/core/columnResolve.d.ts +0 -8
- package/dist/core/indexCleanup.d.ts +7 -1
- package/dist/core/javaTypes.d.ts +13 -4
- package/dist/core/multiLang.d.ts +33 -0
- package/dist/editor/attribute.d.ts +1 -1
- package/dist/editor/commandPlans.d.ts +2 -1
- package/dist/editor/controller.d.ts +6 -0
- package/dist/entity-modeler-next.css +1 -1
- package/dist/entity-modeler.js +11005 -10890
- package/dist/entity-modeler.umd.cjs +29 -29
- package/dist/i18n/ko.d.ts +1 -0
- package/package.json +3 -2
|
@@ -29,6 +29,15 @@ export interface DiagramMeta {
|
|
|
29
29
|
logicalVersion: number;
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* ★**MultiLangText 정규형 자리 명세** — 영속 논리 모델이 다국어 텍스트를 갖는 «모든» 자리.
|
|
34
|
+
*
|
|
35
|
+
* `core/types.ts` 의 `MultiLangText` 자리 중 **영속 모델**분만 담는다(카탈로그 `label`·`SuperClassColumnDef`
|
|
36
|
+
* 는 **호스트 주입**이라 저장 doc 에 없고 이 스윕의 대상이 아니다). 손 나열이라 새 필드가 생기면 조용히
|
|
37
|
+
* 빠지므로 `diagramAdapter.multiLang.test.ts` 의 **정적 배리어**가 `types.ts` 원문과 이 표를 대조한다
|
|
38
|
+
* (이 리포가 *「축이 늘면 그 축의 모든 필드를 함께」* 를 세 번 나눠 맞은 그 실패의 기계화).
|
|
39
|
+
*/
|
|
40
|
+
export declare const MULTILANG_MODEL_SITES: readonly [readonly ["LogicalGroup", "name"], readonly ["Entity", "classLogicalName"], readonly ["Entity", "description"], readonly ["Entity", "table.logicalName"], readonly ["Attribute", "fieldLogicalName"], readonly ["Attribute", "description"], readonly ["DbColumn", "logicalName"], readonly ["Operation", "description"]];
|
|
32
41
|
/**
|
|
33
42
|
* 마커 분기 파서 — `schemaVersion`을 보고 v1(legacy flat) vs v2(logical/layout) 경로 선택(B-0).
|
|
34
43
|
* reload(프리즈 후 재적재)도 이 진입점을 경유해 동일 분기를 탄다.
|
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
import { ModelId } from '../core/types';
|
|
2
2
|
import { OpShape } from '../command/op';
|
|
3
3
|
import { PDiagram, PDiagramV2 } from './persisted';
|
|
4
|
-
/**
|
|
5
|
-
* 로드 경로가 파생하는 **속성 스칼라 필드** 목록 — 이 플래너가 raw↔healed diff로 정렬하는 축.
|
|
6
|
-
*
|
|
7
|
-
* 전체 필드를 무조건 diff하지 않는 이유: 로드 경로가 의도적으로 바꾸지 않는 필드까지 잡아
|
|
8
|
-
* 오탐(JSON 왕복의 `null`↔부재 등)을 낼 수 있다. **선언된 목록**이 곧 "무엇이 파생값인가"의
|
|
9
|
-
* 레지스트리이며, 새 파생 축 추가 = 여기에 이름 한 줄(라우트·플래너 신설 불요).
|
|
10
|
-
*
|
|
11
|
-
* - `notNull` : FK는 부모 end 다중성 파생(`deriveFkNotNull`, CC-4). 비-FK 속성은 파생 대상이
|
|
12
|
-
* 아니지만 파생기가 FK만 건드리므로 diff도 자연히 FK에서만 발생한다.
|
|
13
|
-
*/
|
|
14
4
|
declare const DERIVED_ATTRIBUTE_FIELDS: readonly ["notNull"];
|
|
15
5
|
export interface HealBackfillPlan {
|
|
16
6
|
/** backfill op 배치 (비면 정렬 대상 없음 — 문서 skip). */
|
package/dist/agent/resolver.d.ts
CHANGED
|
@@ -223,6 +223,22 @@ export type ResolveError = {
|
|
|
223
223
|
entity: Handle;
|
|
224
224
|
handle: Handle;
|
|
225
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* reorder 목록이 비었다 — 재배치 의도가 없는 요청.
|
|
228
|
+
*
|
|
229
|
+
* ★종전엔 **스키마 `minItems:1`** 이 막던 자리인데, 그 제약은 Anthropic structured-outputs 엄격
|
|
230
|
+
* 서브셋 밖이라(수치·문자열·복합 배열 제약 미지원 · SDK 가 떼어내고 클라이언트에서 검증한다)
|
|
231
|
+
* 스키마 헤더가 스스로 *「미사용」* 이라 선언해 놓고 두 자리만 쓰고 있었다 ⇒ 집행을 이리로 옮겼다.
|
|
232
|
+
* 규율: **스키마는 형(shape)만 선언하고 카디널리티·내용 제약은 resolver 가 집행한다.**
|
|
233
|
+
*
|
|
234
|
+
* ⚠️막지 않으면 조용히 쓰기가 난다 — 빈 목록은 `picked=[]` 로 흘러 «지목되지 않은» 전 요소를
|
|
235
|
+
* `order` 0..n−1 로 **재번호**하는 op 을 방출한다(기존 order 에 구멍이 있으면 실제 쓰기).
|
|
236
|
+
*/
|
|
237
|
+
| {
|
|
238
|
+
code: 'reorder-empty';
|
|
239
|
+
opIndex: number;
|
|
240
|
+
entity: Handle;
|
|
241
|
+
}
|
|
226
242
|
/**
|
|
227
243
|
* index.update patch에 `columns` 키 — columnRef(dbAttr modelId)는 사람 핸들로 표현 불가라 패스스루 시
|
|
228
244
|
* 깨진 인덱스가 된다. 컬럼 변경은 index.remove + index.add(컬럼 핸들 해소 구현)로 유도(거부 권고안).
|
|
@@ -271,9 +287,16 @@ export type ResolveError = {
|
|
|
271
287
|
}
|
|
272
288
|
/**
|
|
273
289
|
* attribute.update patch의 평탄 dbAttr 키를 스칼라 단일 컬럼으로 매핑할 수 없음. 스칼라(NORMAL·단일 dbAttr)면
|
|
274
|
-
* `dbAttrs[0]`로 자동 매핑되지만, 모호/불가한 대상은 거부한다: EMBED_PREDEF/다중 dbAttr(어느 컬럼인지 모호
|
|
275
|
-
*
|
|
290
|
+
* `dbAttrs[0]`로 자동 매핑되지만, 모호/불가한 대상은 거부한다: EMBED_PREDEF/다중 dbAttr(어느 컬럼인지 모호),
|
|
291
|
+
* dbAttrs 0개/transient(머지할 컬럼 없음), `sharedColumnRef` 평탄(opaque modelId),
|
|
276
292
|
* flat + dotted-dbAttrs 혼용($set 충돌). 통과 시 논리 노드 blind-write로 orphan 오염이라 거부.
|
|
293
|
+
*
|
|
294
|
+
* ★★**거부는 «갈 곳»을 함께 말해야 한다**(2026-09-02 정정 — 「모르는 값을 발명하지 말 것」의 짝):
|
|
295
|
+
* - **다중 dbAttr** → *바인딩* 축(물리명·정밀도·공유)은 `embeddableOverrides`, **개별 컬럼 필드**(논리명 등)는
|
|
296
|
+
* **dotted `dbAttrs.<i>.<field>`**. ⚠️종전엔 이 분기가 `embeddableOverrides` «만» 지목했는데 그 배열엔
|
|
297
|
+
* 논리명 축이 없어 **열린 문(dotted) 옆에서 막힌 문을 가리키고** 있었다(실사용에서 raw `/ops` 우회를
|
|
298
|
+
* 유발했다 — 불필요했다). dotted 는 아래 `attribute-patch-unknown-key` 가 이미 허용하는 접두다.
|
|
299
|
+
* - **dbAttrs 0개** → `fieldLogicalName`(아래 주석 — 이쪽은 처음부터 대안을 지목하고 있었다).
|
|
277
300
|
*/
|
|
278
301
|
| {
|
|
279
302
|
code: 'attribute-patch-dbattr-flat-key';
|
|
@@ -510,4 +533,4 @@ export declare const INDEX_SPEC_KEYS: ReadonlySet<string>;
|
|
|
510
533
|
export declare const OPERATION_SPEC_KEYS: ReadonlySet<string>;
|
|
511
534
|
export declare const ASSOC_SPEC_KEYS: ReadonlySet<string>;
|
|
512
535
|
export declare const GROUP_SPEC_KEYS: ReadonlySet<string>;
|
|
513
|
-
export declare function resolveSymbolicOps(model: LogicalModel,
|
|
536
|
+
export declare function resolveSymbolicOps(model: LogicalModel, rawOps: SymbolicOp[], options?: ResolverOptions): ResolveResult;
|
|
@@ -62,14 +62,6 @@ export interface ColumnResolveContext {
|
|
|
62
62
|
* 대다수 정상 데이터가 도로 빈 값이 된다. 캔버스 `EntityNode.effectiveAttr`가 쓰던 시맨틱과 동일.
|
|
63
63
|
*/
|
|
64
64
|
export declare function resolveEffectiveColumn(attr: Attribute, col: DbColumn, index: number, entity: Entity | undefined, model: LogicalModel, ctx?: ColumnResolveContext): DbColumn;
|
|
65
|
-
/**
|
|
66
|
-
* MultiLangText 에 실제로 값이 있는가 — 빈 객체·전 로케일 공백은 없는 것으로 본다.
|
|
67
|
-
*
|
|
68
|
-
* ★**모듈 밖으로 열어 둔다**(종전 비공개 `hasText`) — 논리명은 객체 축이라 `||`·`??` 로는 갈리지 않고,
|
|
69
|
-
* 그 판정을 소비처가 각자 재기술하면 어긋난다. 지금 셋이 같은 것을 물어야 한다: 실효 컬럼 해소(아래),
|
|
70
|
-
* 스테레오타입 전환 시 논리명 이전(`editor/commandPlans`), 편집·표시 뷰의 폴백 판정.
|
|
71
|
-
*/
|
|
72
|
-
export declare function hasMultiLangText(t: MultiLangText | undefined): boolean;
|
|
73
65
|
/**
|
|
74
66
|
* **실효 논리명** — 컬럼 논리명이 있으면 그것, 없으면 «필드» 논리명(`Attribute.logicalName`).
|
|
75
67
|
*
|
|
@@ -12,5 +12,11 @@ export type IndexColumnCleanup = {
|
|
|
12
12
|
*
|
|
13
13
|
* ⚠️한 조작에서 여러 속성이 사라지면 **한 번에** 넘길 것 — 속성마다 따로 호출하면 각 산출이 원본 기준이라
|
|
14
14
|
* 나중 패치가 앞의 정리를 되돌린다.
|
|
15
|
+
*
|
|
16
|
+
* ★`survivingColumnIds` — **속성은 사라지지만 그 컬럼은 살아남는** 조작용(`convertToPredefinedEmbed` 의
|
|
17
|
+
* 자리 보존 전환이 그렇다: 삭제+추가 합성이라 속성 id 는 갈리는데 승계된 dbAttr 은 modelId 째 다음
|
|
18
|
+
* 속성으로 넘어간다). 그 id 는 «이번 조작이 깨뜨린 ref» 가 아니므로 위 규율대로 정리 대상이 아니다 —
|
|
19
|
+
* 빼지 않으면 살아있는 컬럼을 가리키던 인덱스가 조용히 비고, 그것이 이 모듈이 막으려던 **무신호 소실**
|
|
20
|
+
* 그 자체가 된다. 미지정이면 종전과 같다(전부 고아).
|
|
15
21
|
*/
|
|
16
|
-
export declare function planIndexColumnCleanup(entity: Entity, removedAttributeIds: readonly ModelId[]): IndexColumnCleanup[];
|
|
22
|
+
export declare function planIndexColumnCleanup(entity: Entity, removedAttributeIds: readonly ModelId[], survivingColumnIds?: ReadonlySet<ModelId>): IndexColumnCleanup[];
|
package/dist/core/javaTypes.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Entity, Association, Attribute, DisplayMode, PredefinedCustomTypeCatalog } from './types';
|
|
1
|
+
import { Entity, Association, Attribute, DisplayMode, EmbeddableCatalog, PredefinedCustomTypeCatalog } from './types';
|
|
2
2
|
export interface JavaTypeDef {
|
|
3
3
|
/** 저장값 = 레거시 enum 상수명. Attribute.type에 그대로 들어간다. */
|
|
4
4
|
value: string;
|
|
@@ -81,10 +81,19 @@ export declare function isNullLoadUnsafePrimitive(javaType: string | undefined,
|
|
|
81
81
|
*/
|
|
82
82
|
export declare const SELECTABLE_JAVA_TYPES: readonly JavaTypeDef[];
|
|
83
83
|
/**
|
|
84
|
-
* 타입 셀렉트 items — ① 스칼라 후보 + ③ 주입 customtype 카탈로그 + 현재값 폴백 합성.
|
|
84
|
+
* 타입 셀렉트 items — ① 스칼라 후보 + ③ 주입 customtype 카탈로그 + ② 임베더블 + 현재값 폴백 합성.
|
|
85
85
|
*
|
|
86
86
|
* ③ `predefinedCustomTypes`(호스트 주입)는 ① 후보 뒤에 병합 노출한다 — 단일 컬럼이라 ①과 컬럼 구조가
|
|
87
|
-
* 같고
|
|
87
|
+
* 같고 ④ CustomType과 동질이므로 별도 진입이 아니라 같은 셀렉트에 둔다.
|
|
88
|
+
*
|
|
89
|
+
* ★②`embeddables`는 **컬럼 개수가 바뀌는** 선택지라 성격이 다르지만 그래도 여기 둔다(2026-09-02) —
|
|
90
|
+
* 목록에 없으면 EMBED_PREDEF 속성의 현재값이 아래 폴백으로만 보이고 **다른 타입으로 바꾸는 순간
|
|
91
|
+
* 되돌아갈 수 없다**. 그것이 직렬화 타입에서 실사용 보고로 드러났던 바로 그 함정이고(`serializedTypes`
|
|
92
|
+
* 주석), ②는 그 **두 번째 사본**이었다. 선택 시 부수효과(자리 보존 전환 = 삭제+추가 합성)는
|
|
93
|
+
* `editor/attribute.convertToPredefinedEmbed`가 소유한다 — 이 함수는 «고를 수 있게» 할 뿐이다.
|
|
94
|
+
* ⇒ 부수효과로 레거시 ③`CustomMoneyType`(1컬럼, 라벨 `Money`) 속성을 GUI에서 ②`Money`(2컬럼)로
|
|
95
|
+
* 승격할 수 있게 된다 — 종전엔 v1→v2 마이그레이션(`migrateLegacyMoney`)만이 그 경로였다. 두 항목은
|
|
96
|
+
* `Money` ↔ `Money (금액)` 로 갈려 보이고, 그것이 **레거시 값을 잃지 않으면서 옮겨 갈 수 있는** 상태다.
|
|
88
97
|
*
|
|
89
98
|
* open-bluesea BSSelect는 model-value가 items에 없으면 placeholder로 떨어뜨려 값이 빈칸으로 보인다(표시
|
|
90
99
|
* 손상). 현재값이 후보(① + 주입 ③) 밖(②임베더블 타입명·미주입 ③ customtype명·⑤ GroupCodeEnum·미지
|
|
@@ -100,7 +109,7 @@ export declare const SELECTABLE_JAVA_TYPES: readonly JavaTypeDef[];
|
|
|
100
109
|
* 타입으로 돌릴수 없는 상태」*). 폴백은 **밖에서 들어온 미지 타입**을 잃지 않기 위한 안전망이지
|
|
101
110
|
* «선택 가능한 타입»의 출처가 아니다 — 그 둘을 섞으면 편집이 한 방향으로만 흐른다.
|
|
102
111
|
*/
|
|
103
|
-
export declare function typeSelectItems(currentType: string, predefinedCustomTypes?: PredefinedCustomTypeCatalog, serializedTypes?: readonly string[]): JavaTypeDef[];
|
|
112
|
+
export declare function typeSelectItems(currentType: string, predefinedCustomTypes?: PredefinedCustomTypeCatalog, serializedTypes?: readonly string[], embeddables?: EmbeddableCatalog): JavaTypeDef[];
|
|
104
113
|
/**
|
|
105
114
|
* EMBED 표시 속성의 컬렉션 모드(`@ElementCollection`)를 판정한다 — 컬렉션이면 `collectionType`(기본
|
|
106
115
|
* LIST), 단일(`@Embedded`)이거나 EMBED가 아니면 undefined. 판정 권위는 임베더블을 가리키는 end의
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { LangCode, MultiLangText } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 소비처가 로케일을 고르는 **기본 순서**. `agent/schema.ts` 의 `MULTI_LANG` 키 순서와 같고,
|
|
4
|
+
* 종전 소비처들이 각자 `?.ko ?? ?.en ?? ?.ja ?? ?.zh` 로 재기술하던 그 순서다.
|
|
5
|
+
*/
|
|
6
|
+
export declare const LANG_ORDER: readonly LangCode[];
|
|
7
|
+
/**
|
|
8
|
+
* MultiLangText 에 실제로 값이 있는가 — 빈 객체·전 로케일 공백은 없는 것으로 본다.
|
|
9
|
+
*
|
|
10
|
+
* ★**단일 출처**(종전 `columnResolve` 소유 · 그 앞은 비공개 `hasText`) — 논리명은 객체 축이라 `||`·`??` 로는
|
|
11
|
+
* 갈리지 않고, 그 판정을 소비처가 각자 재기술하면 어긋난다. 지금 넷이 같은 것을 물어야 한다: 실효 컬럼 해소
|
|
12
|
+
* (`columnResolve`), 스테레오타입 전환 시 논리명 이전(`editor/commandPlans`), 코드젠 javadoc(`scaffoldJava`),
|
|
13
|
+
* 편집·표시 뷰의 폴백 판정.
|
|
14
|
+
*
|
|
15
|
+
* ⚠️`normalizeMultiLangText(t) !== undefined` 와 **항상 같은 답**이어야 한다(테스트가 고정한다). 술어를 싸게
|
|
16
|
+
* 두려고 두 산식으로 나눠 놓은 것이므로, 한쪽만 고치면 어긋난다.
|
|
17
|
+
*/
|
|
18
|
+
export declare function hasMultiLangText(t: MultiLangText | undefined): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* 저장·전송 표현을 **정규형**으로 접는다 — 빈 로케일 키를 떼고, 남는 것이 없으면 `undefined`(=부재).
|
|
21
|
+
*
|
|
22
|
+
* ★**참조 안정**: 뗄 것이 없으면 **원본을 그대로 돌려준다**. 로드 경로가 전 필드를 통과시키므로 매번 새
|
|
23
|
+
* 객체를 만들면 왕복 diff·재렌더가 이유 없이 늘어난다(`columnResolution` 이 같은 이유로 참조 안정을 지킨다).
|
|
24
|
+
*/
|
|
25
|
+
export declare function normalizeMultiLangText(t: MultiLangText | undefined | null): MultiLangText | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* 표시할 문자열 하나를 고른다 — `prefer`(유저·콘텐츠 언어) 우선, 없으면 `LANG_ORDER` 순으로 **첫 비어있지 않은 값**.
|
|
28
|
+
*
|
|
29
|
+
* ★소비처가 `?.[lang] ?? ?.ko ?? ?.en` 으로 재기술하던 자리의 단일 출처다. 손 나열은 두 관용구로 갈렸고
|
|
30
|
+
* (`??` 8자리 / `||` 5자리) **`??` 쪽만 빈 문자열에서 멈춰** 뒤 로케일 값을 잃었다. 폴백 «꼬리»(그룹 패키지명·
|
|
31
|
+
* i18n 기본 문구 등)는 자리마다 다르므로 여기서 정하지 않고 `undefined` 를 돌려 호출자가 잇게 한다.
|
|
32
|
+
*/
|
|
33
|
+
export declare function pickMultiLangText(t: MultiLangText | undefined | null, prefer?: LangCode): string | undefined;
|
|
@@ -22,4 +22,4 @@ export interface AttributeContext {
|
|
|
22
22
|
/** 삭제된 행을 선택이 가리키지 않도록 해제하는 쓰기(`removeAttributes`). */
|
|
23
23
|
selection: Ref<Selection>;
|
|
24
24
|
}
|
|
25
|
-
export declare function createAttributeApi(ctx: AttributeContext): Pick<EditorController, 'addPredefinedEmbed' | 'addSerializedTypeAttribute' | 'addAttribute' | 'addDivider' | 'updateAttribute' | 'setAttributeGroupCode' | 'setEmbedColumns' | 'removeAttribute' | 'removeAttributes' | 'setAttributeSwatch' | 'setAttributeSwatches' | 'reorderAttributes'>;
|
|
25
|
+
export declare function createAttributeApi(ctx: AttributeContext): Pick<EditorController, 'addPredefinedEmbed' | 'convertToPredefinedEmbed' | 'addSerializedTypeAttribute' | 'addAttribute' | 'addDivider' | 'updateAttribute' | 'setAttributeGroupCode' | 'setEmbedColumns' | 'removeAttribute' | 'removeAttributes' | 'setAttributeSwatch' | 'setAttributeSwatches' | 'reorderAttributes'>;
|
|
@@ -23,8 +23,9 @@ export declare function removeAttributeCommands(entityId: ModelId, attributeIds:
|
|
|
23
23
|
/**
|
|
24
24
|
* 누산된 제거가 남길 인덱스 dangling 정리 명령 — 조작의 서브명령 **맨 끝**에 한 번 붙인다.
|
|
25
25
|
* `logical`은 제거 **전** 상태여야 한다(사라지는 속성의 dbAttr modelId를 알아야 하므로).
|
|
26
|
+
* `survivingColumnIds`는 그대로 통과시킨다 — 의미·근거는 `core/indexCleanup.planIndexColumnCleanup` 소유.
|
|
26
27
|
*/
|
|
27
|
-
export declare function indexCleanupCommands(logical: LogicalModel, removed: RemovedAttributes): Command[];
|
|
28
|
+
export declare function indexCleanupCommands(logical: LogicalModel, removed: RemovedAttributes, survivingColumnIds?: ReadonlySet<ModelId>): Command[];
|
|
28
29
|
/**
|
|
29
30
|
* 식별자 전파 reconcile 계획을 자식 엔터티 대상 서브명령 배열로 변환.
|
|
30
31
|
* 1차 변경(관계 생성/삭제 등)과 함께 composite로 묶으면 전파 FK 동기화가 하나의 undo/redo
|
|
@@ -379,6 +379,12 @@ export interface EditorController {
|
|
|
379
379
|
* 대상 엔티티가 없으면 no-op(null).
|
|
380
380
|
*/
|
|
381
381
|
addPredefinedEmbed(entityId: ModelId, embeddableType: string): ModelId | null;
|
|
382
|
+
/**
|
|
383
|
+
* 기존 속성을 ② predefined 임베더블(EMBED_PREDEF)로 **자리 보존 전환** — 타입 셀렉트에서 임베더블을
|
|
384
|
+
* 고르는 경로. `addPredefinedEmbed`가 꼬리에 **새 행**을 만드는 것과 달리 이쪽은 그 자리에서 형상을
|
|
385
|
+
* 바꾼다(사용처 순서를 어긋내지 않는다). 대상이 없거나 전환 불가(FK 파생·식별자·이미 EMBED)면 no-op(null).
|
|
386
|
+
*/
|
|
387
|
+
convertToPredefinedEmbed(entityId: ModelId, attributeId: ModelId, embeddableType: string): ModelId | null;
|
|
382
388
|
addAttribute(entityId: ModelId, partial?: Partial<Attribute>): ModelId | null;
|
|
383
389
|
/**
|
|
384
390
|
* 시각 구획 행(DIVIDER) 추가 — 거대 엔티티에서 속성 묶음을 끊는 구분선. DB 컬럼·타입·식별자 없이
|