@g1cloud/entity-modeler-next 5.0.0-beta.1 → 5.0.0-beta.10
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/agent/resolver.d.ts +46 -0
- package/dist/agent/symbolicOp.d.ts +9 -1
- package/dist/command/commands.d.ts +4 -3
- package/dist/core/associationNav.d.ts +16 -0
- package/dist/core/attributeOrder.d.ts +9 -0
- package/dist/core/fkDerived.d.ts +17 -0
- package/dist/core/projectSeqDiff.d.ts +41 -0
- package/dist/core/stereotype.d.ts +2 -0
- package/dist/core/types.d.ts +10 -4
- package/dist/entity-modeler-next.css +1 -1
- package/dist/entity-modeler.js +12799 -12019
- package/dist/entity-modeler.umd.cjs +35 -35
- package/dist/i18n/ko.d.ts +11 -0
- package/dist/index.d.ts +3 -0
- package/dist/view/DiagramCanvas.vue.d.ts +3 -0
- package/dist/view/HistoryPanel.vue.d.ts +3 -0
- package/dist/view/diffOverlay.d.ts +14 -0
- package/package.json +1 -1
package/dist/agent/resolver.d.ts
CHANGED
|
@@ -84,6 +84,28 @@ export type ResolveError = {
|
|
|
84
84
|
handle: Handle;
|
|
85
85
|
matches: ModelId[];
|
|
86
86
|
}
|
|
87
|
+
/** reorder order 목록의 핸들이 엔티티 내 속성/메서드와 0개 매칭(D7 — 부분 재배치 안 함, 전체 거부). */
|
|
88
|
+
| {
|
|
89
|
+
code: 'reorder-handle-not-found';
|
|
90
|
+
opIndex: number;
|
|
91
|
+
entity: Handle;
|
|
92
|
+
handle: Handle;
|
|
93
|
+
}
|
|
94
|
+
/** reorder order 목록의 핸들이 복수 매칭(모호). */
|
|
95
|
+
| {
|
|
96
|
+
code: 'reorder-handle-ambiguous';
|
|
97
|
+
opIndex: number;
|
|
98
|
+
entity: Handle;
|
|
99
|
+
handle: Handle;
|
|
100
|
+
matches: ModelId[];
|
|
101
|
+
}
|
|
102
|
+
/** reorder order 목록에 같은 요소가 두 번(중복 핸들) — 배열 재배치 모호. */
|
|
103
|
+
| {
|
|
104
|
+
code: 'reorder-handle-duplicate';
|
|
105
|
+
opIndex: number;
|
|
106
|
+
entity: Handle;
|
|
107
|
+
handle: Handle;
|
|
108
|
+
}
|
|
87
109
|
/**
|
|
88
110
|
* index.update patch에 `columns` 키 — columnRef(dbAttr modelId)는 사람 핸들로 표현 불가라 패스스루 시
|
|
89
111
|
* 깨진 인덱스가 된다. 컬럼 변경은 index.remove + index.add(컬럼 핸들 해소 구현)로 유도(거부 권고안).
|
|
@@ -129,6 +151,30 @@ export type ResolveError = {
|
|
|
129
151
|
entity: Handle;
|
|
130
152
|
handle: Handle;
|
|
131
153
|
matches: ModelId[];
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* attribute.update patch의 평탄 dbAttr 키를 스칼라 단일 컬럼으로 매핑할 수 없음. 스칼라(NORMAL·단일 dbAttr)면
|
|
157
|
+
* `dbAttrs[0]`로 자동 매핑되지만, 모호/불가한 대상은 거부한다: EMBED_PREDEF/다중 dbAttr(어느 컬럼인지 모호 →
|
|
158
|
+
* `embeddableOverrides`), dbAttrs 0개/transient(머지할 컬럼 없음), `sharedColumnRef` 평탄(opaque modelId),
|
|
159
|
+
* flat + dotted-dbAttrs 혼용($set 충돌). 통과 시 논리 노드 blind-write로 orphan 오염이라 거부.
|
|
160
|
+
*/
|
|
161
|
+
| {
|
|
162
|
+
code: 'attribute-patch-dbattr-flat-key';
|
|
163
|
+
opIndex: number;
|
|
164
|
+
entity: Handle;
|
|
165
|
+
handle: Handle;
|
|
166
|
+
keys: string[];
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* attribute.update patch에 Attribute 논리 노드에 실재하지 않는 미지 키 — 통과 시 orphan blind-write.
|
|
170
|
+
* 오탈자/스키마 밖 키를 조용히 흡수하지 않고 명시 거부(자기증식 오염 원천 차단).
|
|
171
|
+
*/
|
|
172
|
+
| {
|
|
173
|
+
code: 'attribute-patch-unknown-key';
|
|
174
|
+
opIndex: number;
|
|
175
|
+
entity: Handle;
|
|
176
|
+
handle: Handle;
|
|
177
|
+
keys: string[];
|
|
132
178
|
};
|
|
133
179
|
export type ResolveResult = {
|
|
134
180
|
ok: true;
|
|
@@ -231,6 +231,10 @@ export type SymbolicOp = {
|
|
|
231
231
|
kind: 'attribute.remove';
|
|
232
232
|
entity: Handle;
|
|
233
233
|
attribute: Handle;
|
|
234
|
+
} | {
|
|
235
|
+
kind: 'attribute.reorder';
|
|
236
|
+
entity: Handle;
|
|
237
|
+
order: Handle[];
|
|
234
238
|
} | {
|
|
235
239
|
kind: 'association.add';
|
|
236
240
|
spec: AssocSpec;
|
|
@@ -272,6 +276,10 @@ export type SymbolicOp = {
|
|
|
272
276
|
kind: 'operation.remove';
|
|
273
277
|
entity: Handle;
|
|
274
278
|
operation: Handle;
|
|
279
|
+
} | {
|
|
280
|
+
kind: 'operation.reorder';
|
|
281
|
+
entity: Handle;
|
|
282
|
+
operations: Handle[];
|
|
275
283
|
} | {
|
|
276
284
|
kind: 'group.add';
|
|
277
285
|
spec: GroupSpec;
|
|
@@ -280,5 +288,5 @@ export type SymbolicOp = {
|
|
|
280
288
|
* v1이 다루는 심볼릭 op 종류의 닫힌 집합(단일 출처). resolver·JSON Schema(`schema.ts`)가 공유한다.
|
|
281
289
|
* 아래 컴파일타임 단언이 이 튜플과 `SymbolicOp['kind']`의 일치를 강제 — 한쪽만 늘리면 타입 에러.
|
|
282
290
|
*/
|
|
283
|
-
export declare const SYMBOLIC_OP_KINDS: readonly ["entity.add", "entity.update", "entity.remove", "attribute.add", "attribute.update", "attribute.remove", "association.add", "association.remove", "association.update", "associationEnd.update", "index.add", "index.update", "index.remove", "operation.add", "operation.update", "operation.remove", "group.add"];
|
|
291
|
+
export declare const SYMBOLIC_OP_KINDS: readonly ["entity.add", "entity.update", "entity.remove", "attribute.add", "attribute.update", "attribute.remove", "association.add", "association.remove", "association.update", "associationEnd.update", "index.add", "index.update", "index.remove", "operation.add", "operation.update", "operation.remove", "attribute.reorder", "operation.reorder", "group.add"];
|
|
284
292
|
export type SymbolicOpKind = (typeof SYMBOLIC_OP_KINDS)[number];
|
|
@@ -60,10 +60,11 @@ export declare function updateAttribute(entityId: ModelId, attributeId: ModelId,
|
|
|
60
60
|
export declare function removeAttribute(entityId: ModelId, attributeId: ModelId): Command;
|
|
61
61
|
/**
|
|
62
62
|
* 속성 재정렬 — 대상(attrIds)을 현재 표시 순서를 유지한 채 toIndex로 이동.
|
|
63
|
-
* 표시 순서
|
|
64
|
-
*
|
|
65
|
-
* toIndex = 대상을 모두 제거한 뒤의 배열(rest) 기준 삽입 위치.
|
|
63
|
+
* 표시 순서 SoT는 `order` 필드다(S1 이후 전 뷰가 order sort). 배열도 splice로 함께 맞춰 두 표현을
|
|
64
|
+
* 일관 유지하고(캔버스 노드가 배열도 참조하는 전환기 안전), order 필드를 0..n-1로 전체 재인덱싱한다
|
|
65
|
+
* (중간 삭제로 생긴 기존 갭도 함께 치유). toIndex = 대상을 모두 제거한 뒤의 배열(rest) 기준 삽입 위치.
|
|
66
66
|
* invert는 변경 전 배열 스냅샷(order 포함 얕은 복사)으로 통째 복원 → 재인덱싱 손실 없이 원자 원복.
|
|
67
|
+
* emit은 order 패치(S3, orderPatchEmission) — 배열 $set 아님.
|
|
67
68
|
*/
|
|
68
69
|
export declare function reorderAttributes(entityId: ModelId, attrIds: ModelId[], toIndex: number): Command;
|
|
69
70
|
export declare function addOperation(entityId: ModelId, operation: Operation): Command;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Multiplicity } from './types';
|
|
2
|
+
/** end2 multiplicity가 컬렉션(0..* / 1..*)인가 — 코드젠의 @OneToMany vs @OneToOne 분기와 동일 기준. */
|
|
3
|
+
export declare function isCollectionMultiplicity(m: Multiplicity): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* 다중성 표시 기호(0..1 / 1 / 0..* / 1..*) — 영속용 enum(`*_INSTANCE(S)`)의 단일 표시 SoT.
|
|
6
|
+
* 기호는 언어 무관 UML 표기라 i18n 대상이 아니다. 캔버스 관계선 라벨·인스펙터 select·mermaid
|
|
7
|
+
* 라벨이 모두 이 함수로 위임한다(과거 multSymbol/multHuman으로 중복 정의되던 것 통합).
|
|
8
|
+
*/
|
|
9
|
+
export declare function multiplicityLabel(m: Multiplicity): string;
|
|
10
|
+
/**
|
|
11
|
+
* inverse nav 기본 이름: 자식 엔티티명(camel). 컬렉션이면 복수형.
|
|
12
|
+
* 예: Order→OrderItem 컬렉션 → `orderItems`, 단일 → `orderItem`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function defaultInverseNavName(childEntityName: string, isCollection: boolean): string;
|
|
15
|
+
/** 엔티티 내 속성명 유일화 — 충돌 시 숫자 suffix(addEmbedAssociation 필드명 패턴과 동형). */
|
|
16
|
+
export declare function uniqueAttributeName(base: string, existing: ReadonlySet<string>): string;
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { Attribute, Entity } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 다음 표시 순서 값 = 현재 최대 `order` + 1(비어 있으면 0). 표시 순서가 `order` 필드 단일 SoT이므로
|
|
4
|
+
* add-side는 반드시 이 값을 써야 order가 항상 distinct하다. 배열 `.length`를 쓰면
|
|
5
|
+
* `removeAttribute`/`removeOperation`가 재인덱싱하지 않아(splice만) 남은 order와 length가 충돌할 수
|
|
6
|
+
* 있다(order [0,2] + length 2 → 신규 order 2 = 중복). [[attribute-display-order-array-vs-order-field]]
|
|
7
|
+
*/
|
|
8
|
+
export declare function nextOrder(items: readonly {
|
|
9
|
+
order: number;
|
|
10
|
+
}[]): number;
|
|
2
11
|
/** 물리 FK 컬럼을 가진 FK 여부 — derivedFrom(관계 파생) + dbAttrs(물리 컬럼) 보유. */
|
|
3
12
|
export declare function isPhysicalFk(a: Attribute): boolean;
|
|
4
13
|
/**
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Association, Attribute, DbColumn, Entity } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* FK 유래 컬럼 = 물리 컬럼을 보유한 관계 속성(RELATION* + dbAttrs). 형상(dataType/length/scale/
|
|
4
|
+
* physicalName/notNull 등)은 부모 식별자(PK) + 관계 identifying에서 파생된다.
|
|
5
|
+
* derivedFrom이 아니라 이 불변식을 쓰는 이유: derivedFrom은 세션 중 live propagation으로 만든 FK에만
|
|
6
|
+
* 붙고 어댑터가 로드 시 복원하지 않아(영속 데이터엔 0건) 로드된 다이어그램에선 FK 판정에서 통째로 누락된다.
|
|
7
|
+
* RELATION_REF(inverse nav, dbAttrs=0)는 물리 컬럼이 없어 제외.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isFkDerivedColumn(attr: Attribute): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* FK 유래 컬럼 i의 원본(부모 식별자) 컬럼 — 물리명·타입·길이·스케일이 여기서 파생된다. FK 컬럼 자신의
|
|
12
|
+
* dbAttrs가 비어 있을 때(v1→v2 로드/레거시 데이터, 어댑터가 재전파를 하지 않음) placeholder·캔버스
|
|
13
|
+
* 표시에 쓴다(레거시 getForeignDatabaseAttributePlaceholder 동형). 1순위 derivedFrom.sourceAttributeRef
|
|
14
|
+
* (전파가 심은 권위), 2순위 관계 역참조로 부모 식별자 컬럼(derivedFrom 부재하는 레거시 v1 로드 FK 폴백).
|
|
15
|
+
* 못 찾으면 undefined.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveFkOriginColumn(attr: Attribute, childEntity: Entity | null | undefined, entities: readonly Entity[], associations: readonly Association[], i?: number): DbColumn | undefined;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ModelId } from './types';
|
|
2
|
+
import { FieldAuditRecord } from './projectFieldAudit';
|
|
3
|
+
import { ActionFieldChange, ActionSubject } from './projectActionLog';
|
|
4
|
+
/** 한 대상의 구간 net 결과 — verb + net 필드 변경(최초 old→최종 new). */
|
|
5
|
+
export interface SeqDiffEntry {
|
|
6
|
+
subject: ActionSubject;
|
|
7
|
+
/** added=구간 내 생성되어 B에 존재 / removed=A에 존재했고 구간 내 삭제 / modified=양쪽 존재+내용 변경. */
|
|
8
|
+
verb: 'added' | 'modified' | 'removed';
|
|
9
|
+
/** net 필드 변경. added=최종값(요약), removed=빈 배열(tombstone), modified=old→new(수렴分 제외). */
|
|
10
|
+
fields: ActionFieldChange[];
|
|
11
|
+
}
|
|
12
|
+
export interface SeqDiff {
|
|
13
|
+
fromSeq: number;
|
|
14
|
+
/** 실효 상한 — 옵션 미지정 시 스트림 최신 seq(레코드 없으면 fromSeq). */
|
|
15
|
+
toSeq: number;
|
|
16
|
+
/** subject 최초 등장 순(결정적). */
|
|
17
|
+
entries: SeqDiffEntry[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* op 이력 스트림을 구간 `(fromSeq, toSeq]`의 subject별 net diff로 투영한다.
|
|
21
|
+
*
|
|
22
|
+
* @param records seq 정렬 이력 레코드(전체 스트림 — old 파생 정확성을 위해 구간 밖 레코드도 포함해 전달).
|
|
23
|
+
* @param range fromSeq(비포함)·toSeq(포함, 생략=최신). D1: 투영기는 일반형, UI는 "과거↔현재"부터.
|
|
24
|
+
*/
|
|
25
|
+
export declare function projectSeqDiff(records: readonly FieldAuditRecord[], range: {
|
|
26
|
+
fromSeq: number;
|
|
27
|
+
toSeq?: number;
|
|
28
|
+
}): SeqDiff;
|
|
29
|
+
/** 캔버스 오버레이 마크 — 엔티티 노드 단위(removed 대상은 캔버스에 없어 패널 전용, D3). */
|
|
30
|
+
export interface DiffMark {
|
|
31
|
+
verb: 'added' | 'modified';
|
|
32
|
+
/** 구간 내 추가/변경된 속성 행(하이라이트 대상). 삭제 속성은 행이 없어 제외. */
|
|
33
|
+
changedAttributeIds: Set<ModelId>;
|
|
34
|
+
/** 구간 내 추가/변경된 연산 행. */
|
|
35
|
+
changedOperationIds: Set<ModelId>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* SeqDiff → 캔버스 마크 맵. 엔티티 subject는 자기 verb로, 자식(속성/연산/인덱스) 변경은 부모 엔티티를
|
|
39
|
+
* modified로 승격(이미 added면 유지)한다. 연관/그룹은 S3 스코프 밖(엔티티 오버레이 전용).
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildDiffMarks(diff: SeqDiff): Map<ModelId, DiffMark>;
|
package/dist/core/types.d.ts
CHANGED
|
@@ -315,13 +315,19 @@ export interface AssociationEnd {
|
|
|
315
315
|
multiplicity: Multiplicity;
|
|
316
316
|
navigable: boolean;
|
|
317
317
|
composition: boolean;
|
|
318
|
-
/**
|
|
318
|
+
/**
|
|
319
|
+
* FK/조인 또는 inverse nav를 표현하는 속성. owner end=RELATION_OWN(FK), 부모(navigable) end=
|
|
320
|
+
* RELATION_REF(inverse nav). 레거시 crossed nav는 로드 시 소유 엔티티에 RELATION_REF로 승격되고
|
|
321
|
+
* 이 ref가 그것을 가리킨다(diagramAdapter.assocFromHydrated). 레이아웃 앵커는 layout.sourceColumnRef로 분리.
|
|
322
|
+
*/
|
|
319
323
|
attributeRef?: ModelId;
|
|
320
324
|
/**
|
|
321
|
-
*
|
|
322
|
-
*
|
|
325
|
+
* inverse nav(RELATION_REF) 미실체화 시 마지막 nav 필드명 기억용. navigable=false면 nav 속성 자체는
|
|
326
|
+
* 삭제되어(불변식 "navigable=true ⟺ nav 속성 존재" 유지·코드젠 무영향) 저장된 이름이 없다 — 이 힌트가
|
|
327
|
+
* 사용자가 편집했던 이름을 보관해, 인스펙터 비활성 필드 표시 및 재활성화 시 기본명 대신 복원에 쓰인다.
|
|
328
|
+
* 실체화되면 속성 name이 SoT이므로 이 힌트는 정리(재-off 시 현재 name을 다시 캡처).
|
|
323
329
|
*/
|
|
324
|
-
|
|
330
|
+
navFieldNameHint?: string;
|
|
325
331
|
/**
|
|
326
332
|
* 라운드트립 전용 — 레거시 EMBED 직렬화의 인라인 속성 원형(EMBED_REF/EMBED_OWN).
|
|
327
333
|
* EMBED hydration은 load-only라 저장 시 소유자로 펼친 표시 속성을 버리고 이 원형을 verbatim 환원한다
|