@g1cloud/entity-modeler-next 5.0.0-beta.46 → 5.0.0-beta.48

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,56 @@
1
+ import { ComputedRef, InjectionKey } from 'vue';
2
+ import { Attribute, DbColumn, EmbeddableCatalog, LogicalModel, ModelId } from '../core/types';
3
+ /**
4
+ * 캔버스 행 표시에 필요한 **상속·공유 해소를 노드 밖에서 한 번에** 계산한 인덱스 (VE-7 ②).
5
+ *
6
+ * ── 왜 노드 밖으로 뺐나 ────────────────────────────────────────────────────────
7
+ * `EntityNode`가 자기 행을 그리려면 **다른 엔티티를 읽어야 한다**(FK 물리명·타입은 부모 PK에서,
8
+ * 임베드 슬롯은 임베더블 소스에서, 공유 통화 컬럼은 owner 컬럼에서 상속). 그 읽기가 렌더 이펙트
9
+ * 안에 있으면 Vue가 `logical.entities`와 **각 엔티티의 `attributes`까지** 노드의 의존으로 추적하므로,
10
+ * 무관한 엔티티 1개를 추가해도 이 경로를 타는 노드가 전부 무효화된다 — VE-1이 좁혀 둔 스코프가
11
+ * 되돌아간다. 실측(module-order 미러 시드 188노드): 엔티티 추가 1회에 EntityNode patch **124**,
12
+ * 해소 두 축을 끄면 **4**(각 축 단독으로도 발동 · 이 경로를 타는 노드 169/188).
13
+ *
14
+ * ── 무엇을 dedup 하는가 ───────────────────────────────────────────────────────
15
+ * 노드별 해소는 각자 자기 속성만 처리하므로 **중복이 아니다**(총 작업량은 같다). 실제 중복은
16
+ * `indexColumnsByModelId(collectSharedColumns(...))`를 **임베드 속성마다** 다시 만들던 것 하나이고
17
+ * (그 안의 owner 역참조는 embeddable 노드에서 전 엔티티 스캔이다) → **엔티티별 1회**로 접었다.
18
+ * 상속·스코프 계산 자체는 core 헬퍼(`collectSharedColumns`·`resolveEffectiveColumn`·
19
+ * `resolveFkOriginColumn`·`embedCollectionType`)를 **그대로 호출한다** — 시맨틱을 여기 옮겨 적으면 이
20
+ * 리포가 반복해서 싸운 미러 드리프트(VE-4 축)를 뷰 계층에 새로 만드는 셈이다. ★초안에서 owner 역참조
21
+ * 맵을 직접 만들어 `sharedColumnScopeEntities`의 규칙을 재구현했다가 **되돌렸다**: 그것이 그 규칙의 네
22
+ * 번째 사본이 되는데, 참조 안정화가 이미 성능 목표(하한)를 달성했으므로 그 최적화는 드리프트 위험만
23
+ * 남기고 얻는 게 없었다(실측 차이 없음 — 헤더 하단 수치).
24
+ *
25
+ * ── 계약 ─────────────────────────────────────────────────────────────────────
26
+ * 순수 함수다(모델을 변형하지 않고 표시용 파생값만 만든다). 값 시맨틱은 종전 `EntityNode`의 세 함수
27
+ * (`effectiveAttr`·`embedCols`·`typeCell`의 collectionType)와 **동일**해야 한다 — 이 모듈은 성능 리팩터이고
28
+ * 표시 결과를 바꾸지 않는다. 해소가 불필요한 속성은 **맵에 넣지 않는다**(호출자가 원본을 쓴다) ⇒
29
+ * 인덱스 미주입(read-only 임베드)이면 종전 `!editor` 폴백과 같은 원형 표시가 된다.
30
+ */
31
+ export interface EntityColumnResolution {
32
+ /** attr modelId → FK 상속 해소된 표시용 속성. 해소가 일어난 속성만 포함. */
33
+ effectiveAttrs: ReadonlyMap<ModelId, Attribute>;
34
+ /** attr modelId → 임베드 펼침 컬럼(상속·공유 해소 적용). EMBED 속성만 포함. */
35
+ embedCols: ReadonlyMap<ModelId, DbColumn[]>;
36
+ /** attr modelId → 컬렉션 임베드 래핑 타입. 단일 임베드(undefined)는 포함하지 않는다. */
37
+ collectionTypes: ReadonlyMap<ModelId, 'LIST' | 'SET'>;
38
+ }
39
+ /** 엔티티 modelId → 그 엔티티 행들의 해소 결과. */
40
+ export type ColumnResolutionIndex = ReadonlyMap<ModelId, EntityColumnResolution>;
41
+ /**
42
+ * 캔버스가 provide, `EntityNode`가 inject. 미주입 시 노드는 원형(raw) 표시로 graceful degrade한다
43
+ * (종전 `!editor` 분기와 동일한 폴백) — 독립 렌더·테스트에서 캔버스 없이 노드를 쓸 수 있게 유지.
44
+ */
45
+ export declare const COLUMN_RESOLUTION: InjectionKey<ComputedRef<ColumnResolutionIndex>>;
46
+ /**
47
+ * 참조 안정 인덱서 — 직전 인덱스를 기억해 **내용이 같은 엔티티는 이전 결과 객체를 재사용**한다.
48
+ * 캔버스가 computed 안에서 호출한다(모델 변경당 1회). 상태를 갖는 이유는 위 「참조 안정화」 참조.
49
+ */
50
+ export declare function createColumnResolutionIndexer(): (model: LogicalModel, catalog?: EmbeddableCatalog) => ColumnResolutionIndex;
51
+ /**
52
+ * 모델 전체의 표시 해소 인덱스를 만든다. `catalog`는 EMBED_PREDEF 서브컬럼의 선언값 출처(호스트 주입) —
53
+ * 미주입이면 그 축만 원형으로 degrade한다(종전 `editor?.embeddableCatalog` 분기 동형).
54
+ * `prev`를 주면 내용이 같은 엔티티의 결과 **객체 참조를 재사용**한다(무효화 범위 축소 — 위 문단).
55
+ */
56
+ export declare function buildColumnResolutionIndex(model: LogicalModel, catalog?: EmbeddableCatalog, prev?: ColumnResolutionIndex): ColumnResolutionIndex;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@g1cloud/entity-modeler-next",
3
3
  "private": false,
4
- "version": "5.0.0-beta.46",
4
+ "version": "5.0.0-beta.48",
5
5
  "description": "Vue 3 visual entity-modeling / class-diagram editor",
6
6
  "type": "module",
7
7
  "files": [