@g1cloud/entity-modeler-next 5.0.0-beta.34 → 5.0.0-beta.36
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 +61 -0
- package/dist/command/op.d.ts +19 -0
- package/dist/core/fkDerived.d.ts +16 -0
- package/dist/core/javaTypes.d.ts +5 -0
- package/dist/core/propagation.d.ts +1 -1
- package/dist/entity-modeler.js +9827 -9663
- package/dist/entity-modeler.umd.cjs +28 -28
- package/package.json +1 -1
package/dist/agent/resolver.d.ts
CHANGED
|
@@ -183,6 +183,67 @@ export type ResolveError = {
|
|
|
183
183
|
handle: Handle;
|
|
184
184
|
keys: string[];
|
|
185
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* entity.update patch에 Entity 논리 노드에 실재하지 않는 미지 키 — `attribute-patch-unknown-key`의 형제.
|
|
188
|
+
*
|
|
189
|
+
* ★이 op은 **스키마가 의도적으로 open**이다(dotted-key `jpaAttrs.*`가 필요해 `additionalProperties:false`로
|
|
190
|
+
* 닫지 못한다 — schema.ts §5.2 폐색 주석). 즉 LLM 가이드가 없는 경로이고 **resolver가 유일한 게이트**다.
|
|
191
|
+
* 특히 `attributes`/`indexes`/`operations`(자식 컬렉션)가 통과하면 호스트 인터프리터가 논리 노드에 통째
|
|
192
|
+
* `$set`해 **전 배열 blind-write**가 된다(모든 modelId 재발급 = 인덱스 columnRef·derivedFrom·end.attributeRef
|
|
193
|
+
* 전량 dangling). 자식 변경은 전용 op 소관.
|
|
194
|
+
*/
|
|
195
|
+
| {
|
|
196
|
+
code: 'entity-patch-unknown-key';
|
|
197
|
+
opIndex: number;
|
|
198
|
+
entity: Handle;
|
|
199
|
+
keys: string[];
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* entity.add의 논리명이 모델에 이미 있는 엔티티와 충돌. 통과시키면 **도구가 스스로 `CHK-NAME-3`(error)
|
|
203
|
+
* 상태를 만든다**(CC-5 교훈: 엔진이 검증 error 상태를 생성하지 않는다). 더 나쁜 건 같은 배치의 형제
|
|
204
|
+
* op이다 — pending 가드는 `not-found`일 때만 격상하므로(`entityErr`), 이름이 겹치면 자식 op의 핸들이
|
|
205
|
+
* **기존 엔티티로 조용히 해소돼** 사용자가 의도한 신규 엔티티가 아니라 남의 엔티티에 붙는다.
|
|
206
|
+
* 이름은 사용자·AI가 정해야 할 값이라 도구가 유일화(`Order2`)로 발명하지 않는다([[dont-invent-unknown-values]]).
|
|
207
|
+
*/
|
|
208
|
+
| {
|
|
209
|
+
code: 'entity-name-conflict';
|
|
210
|
+
opIndex: number;
|
|
211
|
+
handle: Handle;
|
|
212
|
+
matches: ModelId[];
|
|
213
|
+
}
|
|
214
|
+
/** association.update patch 미지 키(스키마는 하드 폐색 — REST 직접 호출 대비 심층 방어). */
|
|
215
|
+
| {
|
|
216
|
+
code: 'association-patch-unknown-key';
|
|
217
|
+
opIndex: number;
|
|
218
|
+
handle: AssocHandle;
|
|
219
|
+
keys: string[];
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* associationEnd.update patch 미지 키. entity.update와 같은 이유로 스키마가 open(dotted `jpa.*`)이라
|
|
223
|
+
* resolver가 유일한 게이트다. `entityRef`·`attributeRef`는 구조 참조라 patch로 바꾸면 관계가 끊긴다.
|
|
224
|
+
*/
|
|
225
|
+
| {
|
|
226
|
+
code: 'association-end-patch-unknown-key';
|
|
227
|
+
opIndex: number;
|
|
228
|
+
handle: AssocHandle;
|
|
229
|
+
keys: string[];
|
|
230
|
+
}
|
|
231
|
+
/** index.update patch 미지 키(스키마 하드 폐색 — 심층 방어). `columns`는 전용 에러가 먼저 잡는다. */
|
|
232
|
+
| {
|
|
233
|
+
code: 'index-patch-unknown-key';
|
|
234
|
+
opIndex: number;
|
|
235
|
+
entity: Handle;
|
|
236
|
+
handle: Handle;
|
|
237
|
+
keys: string[];
|
|
238
|
+
}
|
|
239
|
+
/** operation.update patch 미지 키(스키마 하드 폐색 — 심층 방어). */
|
|
240
|
+
| {
|
|
241
|
+
code: 'operation-patch-unknown-key';
|
|
242
|
+
opIndex: number;
|
|
243
|
+
entity: Handle;
|
|
244
|
+
handle: Handle;
|
|
245
|
+
keys: string[];
|
|
246
|
+
}
|
|
186
247
|
/**
|
|
187
248
|
* associationEnd.update patch의 `navigable`(양 end) — end1(from): inverse nav 실체화/철거는
|
|
188
249
|
* RELATION_REF 속성 생성·삭제가 동반되는 GUI 토글 소유(통과 시 "navigable=true ⟺ RELATION_REF 존재"
|
package/dist/command/op.d.ts
CHANGED
|
@@ -31,6 +31,25 @@ export interface OpShape {
|
|
|
31
31
|
*/
|
|
32
32
|
incidental?: boolean;
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* update patch의 **clear 표기 정규화** — 값이 `undefined`인 키(= 그 필드를 부재로 되돌린다)를 `null`로 바꾼다.
|
|
36
|
+
*
|
|
37
|
+
* ★왜 필요한가: op은 JSON으로 호스트에 전송되는데 `JSON.stringify`가 **값이 undefined인 키를 통째로 드롭**한다.
|
|
38
|
+
* 그러면 그 키가 호스트 `$set`에 도달하지 못해 **로컬은 지웠는데 서버는 그대로**인 괴리가 남는다. 발동 경로는
|
|
39
|
+
* 둘 다 일상 편집이다 —
|
|
40
|
+
* ① **undo**: 원래 비어 있던 필드를 채운 뒤 되돌리면 invert patch가 `{field: undefined}`가 된다
|
|
41
|
+
* (`updateEntity` 등이 `old[k] = e[k]`로 캡처하므로 부재 필드는 undefined로 잡힌다).
|
|
42
|
+
* ② **명시적 clear**: 컨트롤러가 `{legacyEmbedRaw: undefined}`·`{attributeRef: undefined}`·
|
|
43
|
+
* 임베드 단일 전환의 `{collectionType/collectionTable/orderColumn: undefined}`처럼 "비움"을 patch로 낸다.
|
|
44
|
+
*
|
|
45
|
+
* `null`은 wire를 통과하고 호스트가 `$set field: null`로 집행한다. 이 리포는 **null ≡ 부재** 규약을 이미
|
|
46
|
+
* 쓰고 있어(`synthesizeRestoreOps`의 `fieldPatch`가 같은 이유로 clear를 null로 표기 + `deepEqual`이 둘을 동치로
|
|
47
|
+
* 비교, FK 전파 `diffSyncedFields`도 저장 null을 undefined로 정규화해 비교) 저장값 null은 부재와 같게 읽힌다.
|
|
48
|
+
*
|
|
49
|
+
* ★**얕은 정규화만** 한다 — 중첩 객체(`jpaAttrs`·`jpa`·`dbAttrs`)는 호스트가 **통째로 `$set`**하므로 내부의
|
|
50
|
+
* undefined 키는 드롭돼도 결과가 "그 키 부재"라 의미가 그대로 보존된다. 최상위 키만 `$set` 경로로 1:1 매핑된다.
|
|
51
|
+
*/
|
|
52
|
+
export declare function toWirePatch(patch: object): Record<string, unknown>;
|
|
34
53
|
/**
|
|
35
54
|
* apply 이후 호출 계약(계약 1)의 산출 — memento가 채워진 상태에서 do/undo 양방향 op.
|
|
36
55
|
* invert는 *역방향 forward op*(계약 2) — 같은 op의 역값이 아니라 역연산 op.
|
package/dist/core/fkDerived.d.ts
CHANGED
|
@@ -9,6 +9,22 @@ import { Association, Attribute, DbColumn, Entity } from './types';
|
|
|
9
9
|
* v1은 어댑터 `assocFromHydrated`(diagramAdapter.ts:350)가 하이드레이션 시 합성한다. 두 판정은 이
|
|
10
10
|
* 데이터에서 100% 일치하므로 동작 차이는 없다.)
|
|
11
11
|
* RELATION_REF(inverse nav, dbAttrs=0)는 물리 컬럼이 없어 제외.
|
|
12
|
+
*
|
|
13
|
+
* ── FK 판정 술어 인벤토리(리포 전역) ─────────────────────────────────────────
|
|
14
|
+
* 이 술어 말고도 "FK인가"를 묻는 자리가 몇 곳 더 있고, **의도적으로 다르다**. 새 판정을 추가하기 전에
|
|
15
|
+
* 아래 중 하나로 답할 수 있는지 먼저 확인할 것(중복이면 여기로 위임).
|
|
16
|
+
*
|
|
17
|
+
* | 자리 | 술어 | 왜 다른가 |
|
|
18
|
+
* |---|---|---|
|
|
19
|
+
* | `isFkDerivedColumn`(여기) | RELATION* && dbAttrs>0 | 뷰 잠금·형상 해소. `findFkOwningAssociation`이 위임 |
|
|
20
|
+
* | `attributeOrder.isPhysicalFk` | derivedFrom && dbAttrs>0 | 표시 순서 정렬. **강등 이후** 호출 전제라 `derivedFrom`이 기준(경계 강등된 컬럼은 제자리에 남아야 한다) |
|
|
21
|
+
* | `mermaid.isForeignKey` | RELATION_OWN‖RELATION_REF‖derivedFrom | ER **FK 마커**는 nav(dbAttrs=0)까지 표시 대상이라 컬럼 보유를 안 본다 |
|
|
22
|
+
* | `ddl.ts` FK 제약 방출 | derivedFrom 단독 | 부모 컬럼을 알아야 REFERENCES를 쓸 수 있어 링크가 필수 |
|
|
23
|
+
* | `propagation` `currentFk` | derivedFrom 단독 | 판정이 아니라 reconcile diff의 **매칭 키** |
|
|
24
|
+
*
|
|
25
|
+
* 실 데이터에서 두 축(RELATION* / derivedFrom)은 100% 일치하므로(위 문단) 이 차이는 대체로 관측되지
|
|
26
|
+
* 않는다. 발산했던 유일한 경로는 mermaid 임포트가 관계 없는 RELATION_OWN을 만들던 것이고
|
|
27
|
+
* (`parseMermaid.wireForeignKeyColumns` 주석), 그건 발생원에서 닫았다.
|
|
12
28
|
*/
|
|
13
29
|
export declare function isFkDerivedColumn(attr: Attribute): boolean;
|
|
14
30
|
/**
|
package/dist/core/javaTypes.d.ts
CHANGED
|
@@ -17,6 +17,11 @@ export declare const DEFAULT_JAVA_TYPE = "String";
|
|
|
17
17
|
export declare const JAVA_TYPES: readonly JavaTypeDef[];
|
|
18
18
|
/** 저장값 → 표시 라벨. 미등록 값(임베더블 타입명·커스텀명·미지 값)은 그대로 반환(폴백). */
|
|
19
19
|
export declare function javaTypeLabel(value: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* 물리 DB 타입 → 자바 타입 저장값. 매핑 없는 타입(미지 타입·구조 타입·JDBC 추상 타입)은 undefined —
|
|
22
|
+
* 호출자가 타입을 비워 "모른다"를 보존한다. 위 `JAVA_TYPE_BY_DATA_TYPE` 주석의 결정 근거 참조.
|
|
23
|
+
*/
|
|
24
|
+
export declare function javaTypeFromDataType(dataType: string | undefined): string | undefined;
|
|
20
25
|
/**
|
|
21
26
|
* ① 스칼라 자바 타입 셀렉트 후보(단일 출처). JAVA_TYPES에서 비후보(⑤·레거시 표시용)를 빼고
|
|
22
27
|
* ④ CustomType은 "사용자정의" 안내 라벨로 노출. ②embeddable·③customtype은 애초에 JAVA_TYPES에 없음.
|
|
@@ -71,7 +71,7 @@ export declare function planChildReconcileWithCascade(futureLogical: LogicalMode
|
|
|
71
71
|
* 관계가 소유한다 — 컬럼을 직접 지우는 게 아니라 관계를 삭제/변경해 제거해야 한다. 이 판별로
|
|
72
72
|
* FK 속성의 직접 삭제를 차단(어포던스+가드)하고 사용자를 관계 삭제 경로로 유도한다.
|
|
73
73
|
*
|
|
74
|
-
* FK 컬럼 불변식(RELATION* + 물리 컬럼
|
|
74
|
+
* FK 컬럼 불변식(`isFkDerivedColumn` = RELATION* + 물리 컬럼 보유)으로 먼저 게이트해, 관계의
|
|
75
75
|
* 부모측 end가 가리키는 PK(비-RELATION) 오탐을 배제한다. 그다음 두 신호로 소유 관계를 찾는다:
|
|
76
76
|
*
|
|
77
77
|
* 1순위 `derivedFrom.associationRef` — 전파가 심은 권위 신호. v2 네이티브 doc에 보존되고 어댑터
|