@g1cloud/entity-modeler-next 5.2.22 → 5.2.24
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/command/op.d.ts +28 -0
- package/dist/editor/commandPlans.d.ts +22 -0
- package/dist/entity-modeler.js +8105 -8007
- package/dist/entity-modeler.umd.cjs +29 -25
- package/package.json +1 -1
package/dist/command/op.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ModelId } from '../core/types';
|
|
2
|
+
import { Command, EditorState } from './types';
|
|
2
3
|
/** rev CAS 대상 축 — logical(컨테이너 rev) / layout(layout.version, LWW). M2 §4.2 */
|
|
3
4
|
export type CasUnit = 'logical' | 'layout';
|
|
4
5
|
/**
|
|
@@ -112,3 +113,30 @@ export type OpResult = {
|
|
|
112
113
|
ok: false;
|
|
113
114
|
conflict: OpConflict;
|
|
114
115
|
};
|
|
116
|
+
/**
|
|
117
|
+
* ── Command 계획을 **op 배열**로 펼친다 — GUI composite 를 AI(op) 경로에서 재사용하는 다리 ──
|
|
118
|
+
*
|
|
119
|
+
* ★**왜 필요한가**(2026-09-03 사용자 목표: *「궁극적으로는 사람이 조작 안 하는 게 목표」*): resolver 가
|
|
120
|
+
* 구조 거부로 막아 온 전환들(`stereotype-embeddable-transition-unsupported` 등)은 *표현 불가*가 아니라
|
|
121
|
+
* **「동반 명령을 가진 composite 이고 그건 GUI 소유」**였다. 그 composite 는 이미 순수 플래너
|
|
122
|
+
* (`editor/commandPlans`)로 존재하므로, 남은 것은 **그 계획을 op 로 옮기는 한 자리**뿐이다.
|
|
123
|
+
*
|
|
124
|
+
* ★★**왜 op 를 «다시 조립»하지 않는가** — 같은 산식을 두 곳에서 쓰면 갈린다. 여기서는 **GUI 가 태우는
|
|
125
|
+
* 바로 그 `Command` 들을 그대로 태우고** 각자의 `emitOps` 를 모은다 ⇒ 두 경로가 구조적으로 같은 결과를
|
|
126
|
+
* 낸다(이 리포의 「두 소비처 단일 출처」 관용구).
|
|
127
|
+
*
|
|
128
|
+
* ⚠️**apply 후 emitOps 계약**(`types.ts` `Command.emitOps` 주석)을 지킨다 — invert op 이 apply 가 캡처한
|
|
129
|
+
* memento 에 의존하므로 순서를 바꾸면 조용히 틀린 op 이 나온다. 그래서 **초안 상태를 실제로 전진시키며**
|
|
130
|
+
* 하나씩 방출한다(계획 전체를 미리 적용한 뒤 한꺼번에 방출하는 형태가 아니다).
|
|
131
|
+
*
|
|
132
|
+
* ⚠️입력 상태는 **변형하지 않는다** — 초안 사본에만 적용한다(`fromPersisted` 의 입력 비공유 계약과 동형).
|
|
133
|
+
* ⚠️`emitOps` 미구현 명령은 op 를 내지 않는다(옵셔널 계약) ⇒ 호출부가 **누락을 감지**해야 조용히 새지
|
|
134
|
+
* 않는다. 그래서 방출 0 인 명령을 `skipped` 로 돌려준다(무신호 금지).
|
|
135
|
+
*/
|
|
136
|
+
export interface CommandOpPlan {
|
|
137
|
+
/** apply 순서의 forward op — 그대로 배치에 실으면 된다. */
|
|
138
|
+
ops: OpShape[];
|
|
139
|
+
/** `emitOps` 가 없거나 forward 가 비어 op 를 내지 않은 명령의 라벨(감사용 · 무신호 방지). */
|
|
140
|
+
skipped: string[];
|
|
141
|
+
}
|
|
142
|
+
export declare function planOpsFromCommands(state: EditorState, commands: readonly Command[]): CommandOpPlan;
|
|
@@ -126,6 +126,28 @@ export declare function flattenEmbeddableColumns(embeddable: Entity): DbColumn[]
|
|
|
126
126
|
* plan은 construction 시점 고정(결정적 redo) — childReconcileWithCascade와 동일 산식을 인라인한다.
|
|
127
127
|
*/
|
|
128
128
|
export declare function leavingEmbeddableCommands(logical: LogicalModel, id: ModelId): Command[];
|
|
129
|
+
/**
|
|
130
|
+
* 값 타입(임베더블·직렬화 타입)으로 **진입**할 때의 동반 명령 — `updateEntity(stereotype)` 앞뒤에 합성한다.
|
|
131
|
+
*
|
|
132
|
+
* ★**여기로 추출된 경위**(2026-09-03): 종전엔 `editor/entity.ts` 의 `updateEntity` 분기에 인라인돼 있었고,
|
|
133
|
+
* 그래서 **AI(op) 경로가 이 전환을 아예 표현할 수 없었다**(`stereotype-embeddable-transition-unsupported`).
|
|
134
|
+
* 조립을 순수 함수로 내리면 GUI 는 `Command` 로 실행하고 AI 는 `planOpsFromCommands` 로 op 로 펼친다 —
|
|
135
|
+
* **같은 계획을 두 소비처가 나눠 쓴다**(사용자 목표: *「궁극적으로 사람이 조작 안 하는 게 목표」*).
|
|
136
|
+
*
|
|
137
|
+
* 불변식 강제: 값 타입은 `@Id` 를 가질 수 없고(PK 해제) 자체 테이블이 없어 FK 컬럼도 보유 불가
|
|
138
|
+
* (보유 derived FK 제거 + 식별자 소멸을 자식으로 cascade).
|
|
139
|
+
*
|
|
140
|
+
* ★**직렬화 타입은 EMBED 복원을 타지 않는다** — 관계로 임베드되지 않고 소비 속성 `type` 으로 지목된다
|
|
141
|
+
* (결정 3-①). ★**컬럼 축 정리도 직렬화 타입에만** 건다(`isColumnlessStereotype`) — 임베더블은 owner
|
|
142
|
+
* 테이블로 평탄화돼 **실제로 컬럼을 가지므로** 지우면 안 된다.
|
|
143
|
+
* ★★**판정은 계획 «적용 후» 상태로 한다** — `childReconcileWithCascade` 가 보유 FK 를 **제거**하므로
|
|
144
|
+
* 전환 «전» 속성 목록으로 명령을 만들면 이미 사라진 속성을 겨냥해 composite 이 중간에 실패한다
|
|
145
|
+
* (memory `plan-diff-judgment-uses-post-plan-state` 의 세 번째 재발이었다). `embRemoved` 가 그 제거분이다.
|
|
146
|
+
*
|
|
147
|
+
* ⚠️게이트(임베드되고 있는 임베더블을 직렬화 타입으로 전환 · 관계를 가진 엔티티의 직렬화 전환)는 **호출부
|
|
148
|
+
* 소유**다 — 차단은 *안내 emit* 을 수반하고 그건 사용자 intent 층의 일이다.
|
|
149
|
+
*/
|
|
150
|
+
export declare function enteringValueTypeCommands(logical: LogicalModel, id: ModelId, to: ClassStereotype): Command[];
|
|
129
151
|
export declare function enteringEmbeddableCommands(logical: LogicalModel, id: ModelId): Command[];
|
|
130
152
|
/**
|
|
131
153
|
* 그룹 이동 명령 집합 — 그룹 박스 + 멤버 절대좌표 + 내부 관계 waypoint를 같은 delta로.
|