@g1cloud/entity-modeler-next 5.0.0-beta.8 → 5.0.0
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/README.md +19 -5
- package/dist/adapter/diagramAdapter.d.ts +6 -0
- package/dist/adapter/healBackfill.d.ts +38 -0
- package/dist/agent/resolver.d.ts +219 -7
- package/dist/agent/symbolicOp.d.ts +53 -4
- package/dist/command/op.d.ts +35 -1
- package/dist/command/opSync.d.ts +11 -1
- package/dist/command/stack.d.ts +11 -1
- package/dist/core/associationNav.d.ts +14 -0
- package/dist/core/columnResolve.d.ts +36 -0
- package/dist/core/embedSlots.d.ts +18 -0
- package/dist/core/entityPackage.d.ts +24 -0
- package/dist/core/fkDerived.d.ts +22 -2
- package/dist/core/indexCleanup.d.ts +16 -0
- package/dist/core/indexColumnRef.d.ts +27 -0
- package/dist/core/javaTypes.d.ts +5 -0
- package/dist/core/opSubject.d.ts +54 -0
- package/dist/core/projectActionLog.d.ts +7 -10
- package/dist/core/projectSeqDiff.d.ts +41 -0
- package/dist/core/propagation.d.ts +33 -2
- package/dist/core/quickFix.d.ts +9 -4
- package/dist/core/resolve.d.ts +0 -3
- package/dist/core/scaffoldJava.d.ts +30 -1
- package/dist/core/text.d.ts +2 -1
- package/dist/core/validation.d.ts +1 -13
- package/dist/editor/association.d.ts +18 -0
- package/dist/editor/attribute.d.ts +25 -0
- package/dist/editor/clipboardImport.d.ts +23 -0
- package/dist/editor/commandPlans.d.ts +111 -0
- package/dist/editor/controller.d.ts +61 -20
- package/dist/editor/entity.d.ts +19 -0
- package/dist/editor/group.d.ts +22 -0
- package/dist/editor/hostSync.d.ts +30 -0
- package/dist/editor/note.d.ts +11 -0
- package/dist/editor/selection.d.ts +22 -0
- package/dist/entity-modeler-next.css +1 -1
- package/dist/entity-modeler.js +16844 -13760
- package/dist/entity-modeler.umd.cjs +33 -29
- package/dist/i18n/ko.d.ts +64 -2
- package/dist/index.d.ts +26 -23
- package/dist/view/ColumnLangSelect.vue.d.ts +16 -0
- package/dist/view/DiagramCanvas.vue.d.ts +9 -0
- package/dist/view/DiagramExplorer.vue.d.ts +7 -2
- package/dist/view/HistoryPanel.vue.d.ts +3 -0
- package/dist/view/MultiLangTextField.vue.d.ts +7 -0
- package/dist/view/columnResolution.d.ts +91 -0
- package/dist/view/diffOverlay.d.ts +14 -0
- package/dist/view/embedSlotCollapse.d.ts +36 -0
- package/dist/view/nodeInternals.d.ts +15 -0
- package/dist/view/opConflictNotice.d.ts +8 -6
- package/dist/view/swatches.d.ts +3 -2
- package/dist/view/useAttributeEditing.d.ts +82 -0
- package/dist/view/useTreeCollapse.d.ts +16 -0
- package/package.json +9 -6
package/dist/i18n/ko.d.ts
CHANGED
|
@@ -47,6 +47,10 @@ export declare const ko: {
|
|
|
47
47
|
readonly 'em.panel.expandAll': "모두 펼치기";
|
|
48
48
|
readonly 'em.panel.lockedBanner': "편집 잠김 — 이동·수정·삭제 차단";
|
|
49
49
|
readonly 'em.panel.openNamed': "{name} 열기";
|
|
50
|
+
readonly 'em.notice.readOnly': "조회 모드에서는 편집할 수 없습니다";
|
|
51
|
+
readonly 'em.notice.entityLocked': "잠긴 엔티티입니다 — 잠금 해제 후 편집하세요";
|
|
52
|
+
readonly 'em.notice.groupLocked': "잠긴 그룹입니다 — 잠금 해제 후 편집하세요";
|
|
53
|
+
readonly 'em.notice.assocLocked': "잠긴 엔티티에 연결된 관계입니다 — 잠금 해제 후 편집하세요";
|
|
50
54
|
readonly 'em.validation.title': "검증";
|
|
51
55
|
readonly 'em.validation.noIssues': "검증 이슈가 없습니다.";
|
|
52
56
|
readonly 'em.validation.noVisibleIssues': "표시할 이슈가 없습니다 (필터 적용 중).";
|
|
@@ -74,6 +78,7 @@ export declare const ko: {
|
|
|
74
78
|
readonly 'em.export.copyFailed': "복사에 실패했습니다.";
|
|
75
79
|
readonly 'em.import.title': "가져오기";
|
|
76
80
|
readonly 'em.import.placeholder': "SQL DDL · Mermaid ER · JSON 백업을 붙여넣으세요.";
|
|
81
|
+
readonly 'em.import.formatGroup': "입력 형식";
|
|
77
82
|
readonly 'em.import.formatAuto': "자동 감지";
|
|
78
83
|
readonly 'em.import.formatMermaid': "Mermaid ER";
|
|
79
84
|
readonly 'em.import.formatDdl': "SQL DDL";
|
|
@@ -88,6 +93,11 @@ export declare const ko: {
|
|
|
88
93
|
readonly 'em.shortcuts.title': "키보드 단축키";
|
|
89
94
|
readonly 'em.shortcuts.groupEdit': "편집";
|
|
90
95
|
readonly 'em.shortcuts.groupMove': "이동 · 정렬";
|
|
96
|
+
readonly 'em.shortcuts.groupExplorer': "탐색기";
|
|
97
|
+
readonly 'em.shortcuts.descExplorerSearch': "탐색기 검색으로 포커스";
|
|
98
|
+
readonly 'em.shortcuts.descExplorerNav': "트리 이동 (←→ 접기·펼치기)";
|
|
99
|
+
readonly 'em.shortcuts.descExplorerSelect': "항목 선택 + 캔버스 이동";
|
|
100
|
+
readonly 'em.shortcuts.descExplorerDetail': "엔티티 상세 편집 열기";
|
|
91
101
|
readonly 'em.shortcuts.groupOther': "기타";
|
|
92
102
|
readonly 'em.shortcuts.keyArrows': "방향키";
|
|
93
103
|
readonly 'em.shortcuts.keyRightClick': "우클릭";
|
|
@@ -120,6 +130,14 @@ export declare const ko: {
|
|
|
120
130
|
readonly 'em.common.inherit': "기본(따름)";
|
|
121
131
|
readonly 'em.common.noneParen': "(없음)";
|
|
122
132
|
readonly 'em.swatch.none': "없음";
|
|
133
|
+
readonly 'em.swatch.red': "빨강";
|
|
134
|
+
readonly 'em.swatch.amber': "주황";
|
|
135
|
+
readonly 'em.swatch.green': "초록";
|
|
136
|
+
readonly 'em.swatch.teal': "청록";
|
|
137
|
+
readonly 'em.swatch.blue': "파랑";
|
|
138
|
+
readonly 'em.swatch.indigo': "남색";
|
|
139
|
+
readonly 'em.swatch.violet': "보라";
|
|
140
|
+
readonly 'em.swatch.pink': "분홍";
|
|
123
141
|
readonly 'em.inspector.ctxEntityAttrs': "엔티티 · {name} › 속성 · {n}개";
|
|
124
142
|
readonly 'em.inspector.ctxEntityDivider': "엔티티 · {name} › 구분선";
|
|
125
143
|
readonly 'em.inspector.ctxEntityAttr': "엔티티 · {name} › 속성 · {attr}";
|
|
@@ -136,6 +154,7 @@ export declare const ko: {
|
|
|
136
154
|
readonly 'em.assoc.cascadeAllNote': "ALL이 개별 cascade를 모두 포함합니다 (CHK-JPA-5).";
|
|
137
155
|
readonly 'em.assoc.orphanRemovalNote': "반대편이 컬렉션(@ManyToOne/@ManyToMany)이라 orphanRemoval이 무효입니다 (CHK-JPA-14).";
|
|
138
156
|
readonly 'em.assoc.navRequiredNote': "이 방향에 nav 속성이 없어(navigable 꺼짐) cascade·fetch가 적용되지 않습니다.";
|
|
157
|
+
readonly 'em.assoc.ownerNavFixed': "JPA 소유측 참조(@ManyToOne)는 관계 존재와 동치라 항상 켜집니다 — 참조 없는 FK는 관계 대신 일반 컬럼으로 모델링하세요.";
|
|
139
158
|
readonly 'em.assoc.orderByPlaceholder': "예: name ASC";
|
|
140
159
|
readonly 'em.assoc.jpaDetails': "JPA 상세";
|
|
141
160
|
readonly 'em.embed.legend': "임베드";
|
|
@@ -170,6 +189,10 @@ export declare const ko: {
|
|
|
170
189
|
readonly 'em.attr.nameless': "(이름 없음)";
|
|
171
190
|
readonly 'em.attr.selectHint': "위 목록에서 속성을 선택하면 편집 폼이 표시됩니다.";
|
|
172
191
|
readonly 'em.attr.inverseNavHint': "역방향 연관관계 필드 — 물리 컬럼이 없습니다(대상 엔티티 참조).";
|
|
192
|
+
readonly 'em.attr.fkDerivedNote': "외래키(FK)에서 파생된 컬럼입니다 — 형상은 부모 PK를 따르며, 변경은 관계선·식별관계에서 하세요.";
|
|
193
|
+
readonly 'em.attr.scaleTypeHint': "소수부(scale)는 NUMERIC·DECIMAL 타입에만 적용됩니다.";
|
|
194
|
+
readonly 'em.attr.embedFixedHint': "임베더블 정의에서 고정된 값입니다.";
|
|
195
|
+
readonly 'em.attr.embedSharedHint': "다른 컬럼과 공유하는 통화 컬럼입니다 — 대상에서 파생(읽기 전용).";
|
|
173
196
|
readonly 'em.attr.namePlaceholder': "이름";
|
|
174
197
|
readonly 'em.attr.typePlaceholder': "타입";
|
|
175
198
|
readonly 'em.attr.customTypePlaceholder': "커스텀 타입명";
|
|
@@ -218,7 +241,6 @@ export declare const ko: {
|
|
|
218
241
|
readonly 'em.attr.empty': "속성 없음 — '추가'로 생성";
|
|
219
242
|
readonly 'em.op.body': "본문";
|
|
220
243
|
readonly 'em.op.bodyDirty': "본문 ●";
|
|
221
|
-
readonly 'em.op.descPlaceholderKo': "설명(ko)";
|
|
222
244
|
readonly 'em.op.empty': "오퍼레이션 없음 — '추가'로 생성";
|
|
223
245
|
readonly 'em.index.delete': "인덱스 삭제";
|
|
224
246
|
readonly 'em.index.empty': "인덱스 없음 — '추가'로 생성";
|
|
@@ -235,6 +257,7 @@ export declare const ko: {
|
|
|
235
257
|
readonly 'em.index.noColumns': "컬럼 없음 — 좌측에서 추가";
|
|
236
258
|
readonly 'em.index.selectPrompt': "인덱스를 선택하거나 추가하세요.";
|
|
237
259
|
readonly 'em.palette.autoLayout': "자동 배치";
|
|
260
|
+
readonly 'em.cmd.title': "명령 팔레트";
|
|
238
261
|
readonly 'em.cmd.placeholder': "엔티티로 이동하거나 명령 실행…";
|
|
239
262
|
readonly 'em.cmd.sectionGoto': "이동";
|
|
240
263
|
readonly 'em.cmd.sectionActions': "명령";
|
|
@@ -242,8 +265,14 @@ export declare const ko: {
|
|
|
242
265
|
readonly 'em.cmd.groupTag': "그룹";
|
|
243
266
|
readonly 'em.canvas.emptyTitle': "빈 다이어그램입니다";
|
|
244
267
|
readonly 'em.canvas.emptyHint': "캔버스를 <strong>우클릭</strong>하거나 좌하단 <strong>+</strong> 버튼으로 첫 엔티티를 추가하세요.";
|
|
268
|
+
readonly 'em.canvas.emptyConnectHint': "엔티티를 두 개 이상 만들면, 엔티티 가장자리에서 <strong>드래그</strong>해 관계를 연결할 수 있어요.";
|
|
245
269
|
readonly 'em.canvas.emptyShortcutHint': "단축키 도움말은 <kbd>?</kbd> 키";
|
|
246
270
|
readonly 'em.canvas.emptyReadonly': "표시할 엔티티가 없습니다";
|
|
271
|
+
readonly 'em.canvas.exportFailed': "내보내기에 실패했습니다";
|
|
272
|
+
readonly 'em.conflict.lockedTitle': "편집이 잠겼습니다";
|
|
273
|
+
readonly 'em.conflict.missingDetail': "변경 사항을 저장하지 못했습니다(서버 또는 네트워크 오류). 최신 내용을 다시 불러오세요.";
|
|
274
|
+
readonly 'em.conflict.changedDetail': "다른 곳에서 변경되어 편집이 잠겼습니다. 최신 내용을 다시 불러오세요.";
|
|
275
|
+
readonly 'em.conflict.commandFailedDetail': "편집을 처리하지 못해 화면 내용이 어긋났습니다. 저장된 내용은 그대로이니 최신 내용을 다시 불러오세요.";
|
|
247
276
|
readonly 'em.ctx.addEntity': "엔티티 추가";
|
|
248
277
|
readonly 'em.ctx.addNote': "노트 추가";
|
|
249
278
|
readonly 'em.ctx.addGroup': "그룹 추가";
|
|
@@ -278,6 +307,14 @@ export declare const ko: {
|
|
|
278
307
|
readonly 'em.node.required': "필수 (NOT NULL)";
|
|
279
308
|
readonly 'em.node.logicalMissing': "(논리명)";
|
|
280
309
|
readonly 'em.node.editLock': "편집 잠금";
|
|
310
|
+
readonly 'em.node.connectHint': "드래그해 다른 엔티티와 관계 연결";
|
|
311
|
+
readonly 'em.node.embedRepeatedShow': "이 엔티티에서 값이 같아 접힌 컬럼 {count}개 보기";
|
|
312
|
+
readonly 'em.node.embedRepeatedHide': "값이 같아 반복되는 컬럼 접기";
|
|
313
|
+
readonly 'em.node.embedAttrHide': "이 임베드 컬럼 접기";
|
|
314
|
+
readonly 'em.node.embedAttrShow': "접힌 임베드 컬럼 {count}개 보기";
|
|
315
|
+
readonly 'em.node.embedAllHide': "이 엔티티의 임베드 컬럼 모두 접기";
|
|
316
|
+
readonly 'em.node.embedAllShow': "접힌 임베드 컬럼 모두 펼치기";
|
|
317
|
+
readonly 'em.node.embedAllSummary': "임베드 컬럼 {n}개 숨김";
|
|
281
318
|
readonly 'em.node.opsSummaryTitle': "오퍼레이션 {n}개 — 클래스 표시 모드에서 펼쳐 보입니다";
|
|
282
319
|
readonly 'em.node.opsSummary': "오퍼레이션 {n}개";
|
|
283
320
|
readonly 'em.node.addAttr': "+ 속성";
|
|
@@ -289,6 +326,7 @@ export declare const ko: {
|
|
|
289
326
|
readonly 'em.explorer.emptyNote': "(빈 노트)";
|
|
290
327
|
readonly 'em.explorer.diagram': "다이어그램";
|
|
291
328
|
readonly 'em.explorer.searchPlaceholder': "엔티티·속성 검색 ( / )";
|
|
329
|
+
readonly 'em.explorer.treeAria': "다이어그램 트리";
|
|
292
330
|
readonly 'em.explorer.searchAria': "엔티티·속성 검색";
|
|
293
331
|
readonly 'em.explorer.clearSearchAria': "검색어 지우기";
|
|
294
332
|
readonly 'em.explorer.clearSearchTitle': "지우기 (Esc)";
|
|
@@ -319,19 +357,36 @@ export declare const ko: {
|
|
|
319
357
|
readonly 'em.history.doRestore': "복원";
|
|
320
358
|
readonly 'em.history.cancel': "취소";
|
|
321
359
|
readonly 'em.history.restoreToHere': "이 시점으로 복원";
|
|
360
|
+
readonly 'em.history.diff.compare': "현재와 비교";
|
|
361
|
+
readonly 'em.history.diff.current': "현재";
|
|
362
|
+
readonly 'em.history.diff.exit': "비교 해제";
|
|
363
|
+
readonly 'em.history.diff.count': "누적 변경 {n}건";
|
|
364
|
+
readonly 'em.history.diff.empty': "이 구간의 누적 변경이 없습니다.";
|
|
365
|
+
readonly 'em.history.diff.restorePreview': "되돌아갈 변경 {n}건";
|
|
366
|
+
readonly 'em.history.diff.restorePreviewNone': "되돌아갈 변경이 없습니다.";
|
|
367
|
+
readonly 'em.history.loadMore': "이전 기록 더 보기 ({n})";
|
|
368
|
+
readonly 'em.history.periodLabel': "기간";
|
|
369
|
+
readonly 'em.history.periodFrom': "시작일";
|
|
370
|
+
readonly 'em.history.periodTo': "종료일";
|
|
371
|
+
readonly 'em.history.periodReset': "기간 해제";
|
|
322
372
|
readonly 'em.check.catName': "이름";
|
|
323
373
|
readonly 'em.check.catJpa': "JPA";
|
|
324
374
|
readonly 'em.check.catType': "타입";
|
|
325
375
|
readonly 'em.check.catDsn': "설계";
|
|
326
376
|
readonly 'em.check.name1': "속성 이름이 중복됩니다: \"{name}\"";
|
|
327
377
|
readonly 'em.check.name2': "컬럼 물리명이 중복됩니다: \"{name}\"";
|
|
328
|
-
readonly 'em.check.
|
|
378
|
+
readonly 'em.check.name3Entity': "엔티티 이름이 중복됩니다: \"{name}\" — 같은 이름의 엔티티가 또 있습니다. JPA는 엔티티 이름을 퍼시스턴스 유닛 전역에 등록하므로 패키지(그룹)를 나눠도 해소되지 않습니다";
|
|
379
|
+
readonly 'em.check.name3Package': "엔티티 이름이 중복됩니다: \"{name}\" — 같은 패키지에 같은 이름이 있습니다. 이름을 바꾸거나 그룹(패키지)을 나누면 해소됩니다";
|
|
329
380
|
readonly 'em.check.name4Entity': "엔티티 이름이 비어 있습니다";
|
|
330
381
|
readonly 'em.check.name4Attr': "속성 이름이 비어 있습니다";
|
|
331
382
|
readonly 'em.check.name5': "물리명이 {max}자를 초과했습니다 ({len}자) — 일부 DB에서 잘릴 수 있습니다";
|
|
332
383
|
readonly 'em.check.name6Column': "컬럼 물리명이 SQL 예약어입니다: \"{name}\"";
|
|
333
384
|
readonly 'em.check.name6Table': "테이블 물리명이 SQL 예약어입니다: \"{name}\"";
|
|
334
385
|
readonly 'em.check.name6Index': "인덱스 이름이 SQL 예약어입니다: \"{name}\"";
|
|
386
|
+
readonly 'em.check.name7': "관계/임베드 속성({attrType})의 이름이 비어 있습니다 — 이름이 곧 JPA 필드명이라 코드 생성 시 이 관계가 통째로 누락됩니다. 속성명을 채우세요";
|
|
387
|
+
readonly 'em.check.name8': "속성 \"{name}\"의 컬럼 물리명이 비어 있습니다 — DDL·코드 생성에서 이 컬럼이 통째로 누락됩니다. 물리명을 채우세요";
|
|
388
|
+
readonly 'em.check.name9': "두 엔티티가 같은 테이블 \"{name}\"에 매핑됩니다 — 컬럼이 한 테이블에 뒤섞입니다. 테이블 물리명을 구분하세요";
|
|
389
|
+
readonly 'em.check.name10': "인덱스 이름이 중복됩니다: \"{name}\" — 인덱스 이름은 DB 스키마 전역에서 유일해야 합니다";
|
|
335
390
|
readonly 'em.check.jpa1': "JPA 엔티티에 식별자(PK) 속성이 없습니다";
|
|
336
391
|
readonly 'em.check.jpa2': "임베더블 타입은 식별자 속성을 가질 수 없습니다: \"{name}\"";
|
|
337
392
|
readonly 'em.check.jpa4': "식별 관계 사이클입니다 (PK 무한 의존): {path}";
|
|
@@ -350,16 +405,23 @@ export declare const ko: {
|
|
|
350
405
|
readonly 'em.check.jpa16': "자연키(@NaturalId) 속성은 transient(@Transient)일 수 없습니다: \"{name}\"";
|
|
351
406
|
readonly 'em.check.jpa17': "자연키(@NaturalId) 속성은 not null이 권장됩니다(비즈니스 키는 non-null이 원칙): \"{name}\"";
|
|
352
407
|
readonly 'em.check.jpa18': "cascade가 관계 양쪽(부모·자식)에 모두 설정되어 양방향 전파됩니다 — 의도치 않은 연쇄 저장/삭제·전파 사이클 위험. 보통 cascade는 한쪽에만 둡니다";
|
|
408
|
+
readonly 'em.check.jpa19': "부모에 컬렉션/참조 필드가 있으나 자식({child})에 대응 관계 속성이 없어 JPA 매핑(mappedBy)을 만들 수 없습니다 — 코드젠이 이 관계를 방출하지 못합니다. 자식에 FK 속성을 만들거나 관계를 단방향으로 정리하세요";
|
|
409
|
+
readonly 'em.check.jpa20': "복합 PK(@IdClass/@EmbeddedId)에는 채번(@GeneratedValue)을 쓸 수 없습니다 — 속성 \"{name}\"에 설정되어 있습니다";
|
|
410
|
+
readonly 'em.check.jpa21Missing': "임베드 \"{name}\"의 컬럼이 임베더블({embeddable}) 선언보다 적습니다 — 슬롯 {slots} / 선언 {declared}. 뒤에 추가된 컬럼이 반영되지 않아 DDL에서 빠집니다(JPA는 임베더블 선언대로 컬럼을 만듭니다)";
|
|
411
|
+
readonly 'em.check.jpa21Extra': "임베드 \"{name}\"의 컬럼이 임베더블({embeddable}) 선언보다 많습니다 — 슬롯 {slots} / 선언 {declared}. 임베더블에서 지워진 컬럼이 남아 DDL에 없는 컬럼을 방출합니다";
|
|
353
412
|
readonly 'em.check.type1': "타겟 DB가 지원하지 않는 컬럼 타입입니다: \"{dataType}\"";
|
|
354
413
|
readonly 'em.check.type2': "{dataType} 타입에 length가 지정되지 않았습니다";
|
|
355
414
|
readonly 'em.check.type3': "공유 대상 컬럼의 타입({targetType})이 {metaName} 정의({metaType})와 다릅니다";
|
|
356
415
|
readonly 'em.check.type4': "다중값(Multi-Value) 속성은 GroupCodeEnum + VARCHAR 조합에서만 컨버터가 자동 생성됩니다 — 현재({type} / {dataType})에서는 Set<…> 필드만 생성되어 매핑이 불완전할 수 있습니다";
|
|
416
|
+
readonly 'em.check.type6': "속성 \"{name}\"의 컬럼에 데이터 타입이 지정되지 않았습니다 — DDL에서 이 컬럼이 생략됩니다";
|
|
357
417
|
readonly 'em.check.dsn1': "both-many(M:N) 관계를 조인 엔티티 없이 직접 연결했습니다 — 연관 엔티티 도입을 검토하세요";
|
|
358
418
|
readonly 'em.check.dsn2': "속성이 하나도 없는 엔티티입니다";
|
|
359
419
|
readonly 'em.check.dsn3': "모델링된 관계가 없습니다 (연관·상속·임베딩 미참여 — 의도적 생략이면 무시)";
|
|
360
420
|
readonly 'em.check.dsn4': "속성이 {count}개로 많습니다 (임계치 {threshold} 초과) — 분해를 검토하세요";
|
|
361
421
|
readonly 'em.check.dsn5Inherited': "인덱스 \"{name}\"가 참조하는 상속 컬럼을 슈퍼클래스 카탈로그에서 찾을 수 없습니다({field}).";
|
|
362
422
|
readonly 'em.check.dsn5Missing': "인덱스 \"{name}\"가 존재하지 않는 컬럼을 참조합니다.";
|
|
423
|
+
readonly 'em.check.dsn6': "인덱스 \"{name}\"에 컬럼이 없습니다 — 컬럼 없는 인덱스는 DDL·코드 생성에서 산출되지 않습니다";
|
|
424
|
+
readonly 'em.check.dsn7': "인덱스 \"{name}\"에 같은 컬럼이 두 번 이상 들어 있습니다 — 뒤의 중복 항목은 의미가 없습니다";
|
|
363
425
|
readonly 'em.check.unspecified': "미지정";
|
|
364
426
|
};
|
|
365
427
|
/** 메시지 키 — `ko` 카탈로그의 키 집합(단일 진실 소스). */
|
package/dist/index.d.ts
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
1
|
+
export type { Association, AssociationEnd, AssociationLayout, Attribute, AttributeType, ClassStereotype, DbColumn, DiagramLayout, DisplayMode, EmbeddableCatalog, EmbeddableCatalogEntry, EmbeddableCatalogField, Entity, EntityIndex, EntityJpaAttrs, EntityLayout, Geo, GroupCodeCatalog, GroupCodeCatalogEntry, GroupCodeValue, GroupLayout, IndexColumn, JpaCascadeType, JpaFetchType, LangCode, LogicalGroup, LogicalModel, ModelId, MultiLangText, Multiplicity, Note, NoteConnection, Operation, OperationVisibility, Point, PredefinedCustomTypeCatalog, PredefinedCustomTypeEntry, Size, Style, SuperClassCatalog, SuperClassColumnDef, SuperClassDef, } from './core/types';
|
|
2
|
+
export { resolveDiagram, type AutoLayoutOptions, type ResolvedAssociation, type ResolvedDiagram, type ResolvedEntity, type ResolvedGroup, type ResolvedNote, type ResolvedNoteConnection, } from './core/resolve';
|
|
3
|
+
export type { Rect, RoutingMode, SegmentMid, Side } from './core/routing';
|
|
4
|
+
export { computeAutoLayout, packEntityBoxes, type AutoLayoutGrid, type EntityBoxSpec, type PackBoxesOptions, type PackedEntityBox, } from './core/autolayout';
|
|
5
|
+
export { displayLabel, entityModelToText } from './core/text';
|
|
6
|
+
export { defaultMermaidDialect, entityModelToMermaid, type MermaidDialect } from './core/mermaid';
|
|
7
|
+
export { mermaidErToImportSource, parseMermaidEr } from './core/parseMermaid';
|
|
8
|
+
export { parseSqlDdl, sqlDdlToImportSource, type ParseSqlDdlResult } from './core/parseSqlDdl';
|
|
9
|
+
export { defaultSqlDialect, entityModelToDdl, type DdlContext, type SqlDialect, } from './core/ddl';
|
|
10
|
+
export { DIAGRAM_JSON_FORMAT, DIAGRAM_JSON_VERSION, InvalidDiagramJsonError, diagramToJson, parseDiagramJson, type DiagramJsonEnvelope, } from './core/jsonModel';
|
|
11
|
+
export { renderDiagramSvg, type Corners, type DiagramGeometry, type SvgBox, type SvgEdge, type SvgHLine, type SvgTextFrag, } from './core/svg';
|
|
12
|
+
export { PHYSICAL_NAME_MAX_LENGTH, validateModel, type IssueSeverity, type IssueTargetKind, type ValidationContext, type ValidationIssue, } from './core/validation';
|
|
13
|
+
export { resolveColumnPhysicalName, resolveEffectiveColumn, type ColumnResolveContext } from './core/columnResolve';
|
|
14
|
+
export { resolveQuickFix, type QuickFixPlan } from './core/quickFix';
|
|
15
|
+
export { collectSharedColumns, resolveSharedColumn, sharedColumnScopeEntities, type ResolvedSharedColumn, } from './core/sharedColumn';
|
|
15
16
|
export { JAVA_TYPES, SELECTABLE_JAVA_TYPES, javaTypeLabel, CUSTOM_TYPE_VALUE, GROUP_CODE_ENUM_VALUE, DEFAULT_JAVA_TYPE, type JavaTypeDef, } from './core/javaTypes';
|
|
16
|
-
export { scaffoldEntityJava, type ScaffoldOptions, type ScaffoldedEntity, } from './core/scaffoldJava';
|
|
17
|
+
export { scaffoldEntityJava, isGeneratable, type ScaffoldOptions, type ScaffoldedEntity, } from './core/scaffoldJava';
|
|
17
18
|
export { migrateLegacyMoney } from './core/migrateLegacyMoney';
|
|
18
19
|
export { multiplicityLabel } from './core/associationNav';
|
|
19
20
|
export { stereotypeLabel } from './core/stereotype';
|
|
@@ -22,19 +23,21 @@ export { synthesizeRestoreOps, deepEqual as restoreDeepEqual, type DiagramSnapsh
|
|
|
22
23
|
export { projectFieldAudit, type FieldAuditRecord, type FieldAuditTarget, type FieldAuditEntry } from './core/projectFieldAudit';
|
|
23
24
|
export { projectEntityAudit, type EntityAuditEntry, type EntityAuditSubject, type EntityAuditSubjectKind } from './core/projectEntityAudit';
|
|
24
25
|
export { projectActionLog, type ActionGroup, type SubjectAction, type ActionSubject, type ActionSubjectKind, type ActionFieldChange } from './core/projectActionLog';
|
|
26
|
+
export { projectSeqDiff, buildDiffMarks, type SeqDiff, type SeqDiffEntry, type DiffMark } from './core/projectSeqDiff';
|
|
25
27
|
export { projectInheritedColumns, makeInheritedColumnRef, isInheritedColumnRef, parseInheritedColumnRef, INHERITED_REF_PREFIX, type InheritedColumn, } from './core/inheritedColumns';
|
|
26
28
|
export { newId } from './core/id';
|
|
27
|
-
export
|
|
29
|
+
export type { Command, EditorState } from './command/types';
|
|
28
30
|
export { CommandStack, type CommandDirection, type CommandListener } from './command/stack';
|
|
29
31
|
export * as commands from './command/commands';
|
|
30
|
-
export
|
|
32
|
+
export type { CasUnit, OpCas, OpConflict, OpEmission, OpOrigin, OpResult, OpShape, PersistedOpBatch, } from './command/op';
|
|
31
33
|
export { OpSyncAdapter, RevCache, type OpSyncOptions, type OpSyncTransport } from './command/opSync';
|
|
32
|
-
export
|
|
33
|
-
export
|
|
34
|
-
export
|
|
35
|
-
export
|
|
36
|
-
export
|
|
37
|
-
export type
|
|
34
|
+
export { SYMBOLIC_OP_KINDS, type AssocHandle, type AssocSpec, type AttrSpec, type EmbeddableColumnOverride, type EntitySpec, type GroupSpec, type Handle, type IndexColumnSpec, type IndexSpec, type OperationSpec, type SymbolicOp, type SymbolicOpKind, } from './agent/symbolicOp';
|
|
35
|
+
export { resolveSymbolicOps, type ResolveError, type ResolveResult, type ResolverOptions, } from './agent/resolver';
|
|
36
|
+
export { APPLY_MODEL_OPS_INPUT_SCHEMA, SYMBOLIC_OP_SCHEMA } from './agent/schema';
|
|
37
|
+
export { buildAgentBatch, type BuildAgentBatchOptions } from './agent/buildAgentBatch';
|
|
38
|
+
export { fromPersisted, toPersisted, toPersistedV2, type DiagramMeta, } from './adapter/diagramAdapter';
|
|
39
|
+
export { planHealBackfillOps, type HealBackfillPlan } from './adapter/healBackfill';
|
|
40
|
+
export type { PAssocEnd, PAssociation, PAttribute, PDbAttr, PDiagram, PDiagramV2, PEntity, PGeo, PGroup, PIndex, PInlineAttribute, PJpaAttrs, PNote, POperation, PStyle, PV2Association, PV2Entity, PV2Group, PV2Layout, PV2Logical, } from './adapter/persisted';
|
|
38
41
|
export { default as EntityNode } from './view/EntityNode.vue';
|
|
39
42
|
export { default as GroupNode } from './view/GroupNode.vue';
|
|
40
43
|
export { default as NoteNode } from './view/NoteNode.vue';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { LangCode } from '../core/types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
modelValue: LangCode;
|
|
4
|
+
/** 입력 가능 언어셋(호스트 주입 controller.languages). */
|
|
5
|
+
languages: LangCode[];
|
|
6
|
+
/** 호스트 콘텐츠 언어(controller.userLanguage) — 초기값이자 추종 대상. */
|
|
7
|
+
defaultLang: LangCode;
|
|
8
|
+
/** 그룹 라벨로 쓸 컬럼명 요소의 id. */
|
|
9
|
+
labelledBy: string;
|
|
10
|
+
};
|
|
11
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
12
|
+
"update:modelValue": (value: "ko" | "en" | "ja" | "zh") => any;
|
|
13
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
14
|
+
"onUpdate:modelValue"?: ((value: "ko" | "en" | "ja" | "zh") => any) | undefined;
|
|
15
|
+
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
16
|
+
export default _default;
|
|
@@ -1,11 +1,20 @@
|
|
|
1
|
+
import { DiffMark } from '../core/projectSeqDiff';
|
|
1
2
|
import { EditorController } from '../editor/controller';
|
|
3
|
+
import { ModelId } from '../core/types';
|
|
2
4
|
type __VLS_Props = {
|
|
3
5
|
controller: EditorController;
|
|
6
|
+
diffMarks?: Map<ModelId, DiffMark> | null;
|
|
7
|
+
/**
|
|
8
|
+
* 임베드 반복 서브컬럼 접힘의 sessionStorage 보존 키. 생략 시 미보존(`useResizableWidth`·탐색기와
|
|
9
|
+
* 같은 opt-in 규약 — 호스트 전역 키 충돌 방지 + read-only 다중 임베드가 서로 덮지 않게).
|
|
10
|
+
*/
|
|
11
|
+
embedCollapseStorageKey?: string;
|
|
4
12
|
};
|
|
5
13
|
declare function exportSvg(): Promise<void>;
|
|
6
14
|
declare function exportPng(): Promise<void>;
|
|
7
15
|
declare const _default: import('vue').DefineComponent<__VLS_Props, {
|
|
8
16
|
exportSvg: typeof exportSvg;
|
|
9
17
|
exportPng: typeof exportPng;
|
|
18
|
+
fitView: import('@vue-flow/core').FitView;
|
|
10
19
|
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
11
20
|
export default _default;
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { EditorController } from '../editor/controller';
|
|
2
2
|
type __VLS_Props = {
|
|
3
3
|
controller: EditorController;
|
|
4
|
+
/**
|
|
5
|
+
* 트리 접힘 상태를 sessionStorage 에 보존할 키. **생략 시 보존하지 않는다**
|
|
6
|
+
* (`useResizableWidth` 규약 동형 — 호스트가 끌 수 있어야 하고, read-only 다중 임베드가
|
|
7
|
+
* 서로 덮지 않아야 한다. 실제 슬롯은 다이어그램 id 로 한 번 더 갈린다).
|
|
8
|
+
*/
|
|
9
|
+
storageKey?: string;
|
|
4
10
|
};
|
|
5
|
-
declare function toggleAll(): void;
|
|
6
11
|
declare const _default: import('vue').DefineComponent<__VLS_Props, {
|
|
7
|
-
toggleAll:
|
|
12
|
+
toggleAll: () => void;
|
|
8
13
|
allExpanded: import('vue').ComputedRef<boolean>;
|
|
9
14
|
hasExpandable: import('vue').ComputedRef<boolean>;
|
|
10
15
|
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DiffMark } from '../core/projectSeqDiff';
|
|
1
2
|
import { EditorController } from '../editor/controller';
|
|
2
3
|
type __VLS_Props = {
|
|
3
4
|
controller: EditorController;
|
|
@@ -5,7 +6,9 @@ type __VLS_Props = {
|
|
|
5
6
|
};
|
|
6
7
|
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
7
8
|
close: () => any;
|
|
9
|
+
diffChange: (marks: Map<string, DiffMark> | null) => any;
|
|
8
10
|
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
9
11
|
onClose?: (() => any) | undefined;
|
|
12
|
+
onDiffChange?: ((marks: Map<string, DiffMark> | null) => any) | undefined;
|
|
10
13
|
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
11
14
|
export default _default;
|
|
@@ -12,6 +12,13 @@ type __VLS_Props = {
|
|
|
12
12
|
placeholder?: string;
|
|
13
13
|
/** textarea 높이(multiline일 때만). */
|
|
14
14
|
height?: string;
|
|
15
|
+
/**
|
|
16
|
+
* 제어 모드(opt-in) — 활성 언어를 외부가 소유한다. 와이드 표처럼 한 컬럼에 이 필드가 N개 뜨는 곳에서
|
|
17
|
+
* 셀마다 탭바를 그리면 행이 두 줄이 되므로(실측 행 높이 36→61px), 선택 UI를 컬럼 헤더로 올리고
|
|
18
|
+
* 셀은 활성 언어 값만 그린다. 값이 오면 **탭바를 렌더하지 않는다** — 선택 UI 소유자가 둘이면
|
|
19
|
+
* role·키 계약이 중복된다. 미전달 시 현행(셀 자체 탭바) 동작이라 인스펙터 호출부는 무영향.
|
|
20
|
+
*/
|
|
21
|
+
activeLang?: LangCode;
|
|
15
22
|
};
|
|
16
23
|
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
17
24
|
"update:modelValue": (value: Partial<Record<"ko" | "en" | "ja" | "zh", string>>) => any;
|
|
@@ -0,0 +1,91 @@
|
|
|
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
|
+
* ── 반복 서브컬럼(redundantSlots) ─────────────────────────────────────────────
|
|
26
|
+
* 임베드 서브행은 캔버스 렌더 행의 큰 몫인데(실측 BNKR_SALES v2 576엔티티: 속성 6,214 + 서브행 2,683 =
|
|
27
|
+
* **30.2%**), 그중 상당수가 **엔티티 안에서 같은 값을 반복**한다. 지배적 형상은 Money의 currency 슬롯이다:
|
|
28
|
+
* - 미지정(빈 슬롯) 656건 → 카탈로그 기본명 `'currency'`로 해소되어 전부 같은 이름
|
|
29
|
+
* (그중 613건은 한 엔티티에 2개 이상이라 `CHK-NAME-2` 컬럼 충돌까지 유발한다 — OrderItem 59/59)
|
|
30
|
+
* - 공유 지정(SHARED_REF) 43건 → `Claim.order_local_currency` **하나를 43개가 함께 가리킨다**
|
|
31
|
+
* 즉 **정상 지정된 경우에도 반복**이고(오히려 더 완전한 반복이다), 그 43행이 주는 정보는 "이 엔티티의
|
|
32
|
+
* Money는 저 통화 컬럼을 공유한다" 한 줄이다. 반대로 amount 슬롯은 704건 전부 고유 물리명을 가져
|
|
33
|
+
* 같은 규칙에서 자동으로 빠진다 — 판정 축은 "상속이냐"가 아니라 **"엔티티 안에서 새 정보를 주느냐"**다.
|
|
34
|
+
*
|
|
35
|
+
* 판정: 같은 `(attrType, 임베더블 타입, 슬롯 인덱스)` 자리를 묶고, 그 안에서 실효 물리명이 **2회 이상
|
|
36
|
+
* 나오는 값**을 가진 슬롯만 반복으로 본다(자리가 2개 이상일 때). Money 하드코딩 없이 Tel·Name·Address는
|
|
37
|
+
* 사용처마다 물리명을 오버라이드하고 있어 자동으로 걸러진다(실측: Tel #0·#1은 상속 0/고유 37).
|
|
38
|
+
*
|
|
39
|
+
* ★★판정이 **값 단위**인 이유: 종전엔 그룹이 *전부* 같을 것을 요구했는데, 그러면 한 자리만 달라도 나머지
|
|
40
|
+
* 반복분까지 통째로 안 접힌다. 실 데이터가 정확히 그 형상이 됐다 — 코드↔모델 sync 로 Money currency 가
|
|
41
|
+
* SHARED_REF(공유 통화 컬럼)·OWN(고유 컬럼)·빈 슬롯으로 갈리면서 `SalesOrder` 53자리가 **14종**,
|
|
42
|
+
* `OrderItem` 66자리가 **19종**이 됐고 접힘이 꺼졌다. 그런데 그중 `order_local_currency` 40·48행은
|
|
43
|
+
* 여전히 서로 같은 말을 반복한다(새 정보 0). ⇒ 축("새 정보를 주느냐")은 자리 단위가 아니라 값 단위로
|
|
44
|
+
* 성립한다. 초기 표본(`Claim` SHARED_REF 43건이 **전부** 같은 타깃)이 균일해서 이 차이가 안 보였다.
|
|
45
|
+
*
|
|
46
|
+
* ★뷰는 이것을 **기본 접힘**으로만 쓴다(행을 지우지 않는다) — 접힌 자리에 숨긴 개수를 표시하고 캐럿으로
|
|
47
|
+
* 펼치면 전부 보인다. 위 613건처럼 `CHK-NAME-2`가 걸린 슬롯도 여기 포함되지만, 그 신호의 소유자는
|
|
48
|
+
* 검증 패널이고 이 모듈은 **표시 반복만** 접는다(미완성 상태를 지우지 않는다).
|
|
49
|
+
*
|
|
50
|
+
* ── 계약 ─────────────────────────────────────────────────────────────────────
|
|
51
|
+
* 순수 함수다(모델을 변형하지 않고 표시용 파생값만 만든다). 값 시맨틱은 종전 `EntityNode`의 세 함수
|
|
52
|
+
* (`effectiveAttr`·`embedCols`·`typeCell`의 collectionType)와 **동일**해야 한다 — 이 모듈은 성능 리팩터이고
|
|
53
|
+
* 표시 결과를 바꾸지 않는다(`redundantSlots`는 그 뒤에 얹힌 **표시 힌트**이고, 소비는 뷰가 결정한다).
|
|
54
|
+
* 해소가 불필요한 속성은 **맵에 넣지 않는다**(호출자가 원본을 쓴다) ⇒ 인덱스 미주입(read-only 임베드)이면
|
|
55
|
+
* 종전 `!editor` 폴백과 같은 원형 표시가 된다.
|
|
56
|
+
*
|
|
57
|
+
* 판정은 **엔티티 로컬**이다(다른 엔티티를 읽지 않는다) — 위 「참조 안정화」가 좁혀 둔 무효화 범위를
|
|
58
|
+
* 넓히지 않기 위해서다.
|
|
59
|
+
*/
|
|
60
|
+
export interface EntityColumnResolution {
|
|
61
|
+
/** attr modelId → FK 상속 해소된 표시용 속성. 해소가 일어난 속성만 포함. */
|
|
62
|
+
effectiveAttrs: ReadonlyMap<ModelId, Attribute>;
|
|
63
|
+
/** attr modelId → 임베드 펼침 컬럼(상속·공유 해소 적용). EMBED 속성만 포함. */
|
|
64
|
+
embedCols: ReadonlyMap<ModelId, DbColumn[]>;
|
|
65
|
+
/** attr modelId → 컬렉션 임베드 래핑 타입. 단일 임베드(undefined)는 포함하지 않는다. */
|
|
66
|
+
collectionTypes: ReadonlyMap<ModelId, 'LIST' | 'SET'>;
|
|
67
|
+
/**
|
|
68
|
+
* attr modelId → **반복 서브컬럼** 슬롯 인덱스. 같은 `(임베더블 타입, 슬롯 위치)` 자리들 중 실효 물리명이
|
|
69
|
+
* 그 엔티티 안에서 **2회 이상 나오는 값**을 가진 슬롯을 담는다 — 아래 「반복 서브컬럼」 참조. 그 자리에서
|
|
70
|
+
* 고유한 값(1회)은 새 정보이므로 포함하지 않고, 반복이 없는 속성은 맵에 아예 넣지 않는다.
|
|
71
|
+
*/
|
|
72
|
+
redundantSlots: ReadonlyMap<ModelId, ReadonlySet<number>>;
|
|
73
|
+
}
|
|
74
|
+
/** 엔티티 modelId → 그 엔티티 행들의 해소 결과. */
|
|
75
|
+
export type ColumnResolutionIndex = ReadonlyMap<ModelId, EntityColumnResolution>;
|
|
76
|
+
/**
|
|
77
|
+
* 캔버스가 provide, `EntityNode`가 inject. 미주입 시 노드는 원형(raw) 표시로 graceful degrade한다
|
|
78
|
+
* (종전 `!editor` 분기와 동일한 폴백) — 독립 렌더·테스트에서 캔버스 없이 노드를 쓸 수 있게 유지.
|
|
79
|
+
*/
|
|
80
|
+
export declare const COLUMN_RESOLUTION: InjectionKey<ComputedRef<ColumnResolutionIndex>>;
|
|
81
|
+
/**
|
|
82
|
+
* 참조 안정 인덱서 — 직전 인덱스를 기억해 **내용이 같은 엔티티는 이전 결과 객체를 재사용**한다.
|
|
83
|
+
* 캔버스가 computed 안에서 호출한다(모델 변경당 1회). 상태를 갖는 이유는 위 「참조 안정화」 참조.
|
|
84
|
+
*/
|
|
85
|
+
export declare function createColumnResolutionIndexer(): (model: LogicalModel, catalog?: EmbeddableCatalog) => ColumnResolutionIndex;
|
|
86
|
+
/**
|
|
87
|
+
* 모델 전체의 표시 해소 인덱스를 만든다. `catalog`는 EMBED_PREDEF 서브컬럼의 선언값 출처(호스트 주입) —
|
|
88
|
+
* 미주입이면 그 축만 원형으로 degrade한다(종전 `editor?.embeddableCatalog` 분기 동형).
|
|
89
|
+
* `prev`를 주면 내용이 같은 엔티티의 결과 **객체 참조를 재사용**한다(무효화 범위 축소 — 위 문단).
|
|
90
|
+
*/
|
|
91
|
+
export declare function buildColumnResolutionIndex(model: LogicalModel, catalog?: EmbeddableCatalog, prev?: ColumnResolutionIndex): ColumnResolutionIndex;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { InjectionKey, Ref } from 'vue';
|
|
2
|
+
import { ModelId } from '../core/types';
|
|
3
|
+
import { DiffMark } from '../core/projectSeqDiff';
|
|
4
|
+
/**
|
|
5
|
+
* 이력 diff 비교 모드의 캔버스 오버레이 주입 계약(RELATION_HIGHLIGHT 동형 — 일시적 시각 강조,
|
|
6
|
+
* 모델 무관). 셸(EntityModeler/DevApp)이 HistoryPanel의 비교 diff 마크를 소유하고 DiagramCanvas가
|
|
7
|
+
* prop으로 받아 provide, EntityNode가 구독한다(D4-(a) 뷰 소유 — core/controller 무변경).
|
|
8
|
+
*
|
|
9
|
+
* null = 비교 모드 아님(오버레이 없음). removed 대상은 캔버스에 노드가 없어 맵에 없다(D3 패널 전용).
|
|
10
|
+
*/
|
|
11
|
+
export interface DiffOverlay {
|
|
12
|
+
marks: Ref<Map<ModelId, DiffMark> | null | undefined>;
|
|
13
|
+
}
|
|
14
|
+
export declare const DIFF_OVERLAY: InjectionKey<DiffOverlay>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { InjectionKey } from 'vue';
|
|
2
|
+
export interface EmbedSlotCollapseApi {
|
|
3
|
+
/** 이 키가 지금 접혀 있는가. 기본값은 축마다 다르다(헤더 표 참조). */
|
|
4
|
+
isCollapsed: (key: string) => boolean;
|
|
5
|
+
/** 접힘 토글 — 조회 모드에서도 허용된다(읽기 편의이지 편집이 아니다). */
|
|
6
|
+
toggle: (key: string) => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 미주입이면 노드는 **전부 펼친 원형 표시**로 degrade 한다(`COLUMN_RESOLUTION` 폴백과 같은 방향) —
|
|
10
|
+
* 캔버스 없이 노드를 독립 렌더·테스트할 수 있게 유지한다.
|
|
11
|
+
*/
|
|
12
|
+
export declare const EMBED_SLOT_COLLAPSE: InjectionKey<EmbedSlotCollapseApi>;
|
|
13
|
+
/**
|
|
14
|
+
* 반복 슬롯 축의 키. 속성 modelId 단독이 아니라 엔티티를 접두로 붙인다 — 레거시 유래 데이터에
|
|
15
|
+
* **속성 modelId 중복**이 실재하기 때문이다(CC-V 실측: 같은 중복 id 가 v1·v2 양쪽에 존재).
|
|
16
|
+
*/
|
|
17
|
+
export declare const embedSlotKey: (entityId: string, attrId: string) => string;
|
|
18
|
+
/** 엔티티 일괄 축 키의 접두 — 기본값 분기(`defaultCollapsed`)가 이것으로 축을 가른다. */
|
|
19
|
+
export declare const ENTITY_FOLD_PREFIX = "all:";
|
|
20
|
+
/** 속성 통째 축 키의 접두. */
|
|
21
|
+
export declare const ATTR_FOLD_PREFIX = "one:";
|
|
22
|
+
/**
|
|
23
|
+
* 엔티티 일괄 축의 키. `modelId`는 UUID 라 `:` 를 담지 않으므로 접두 있는 키는 반복 축 키와
|
|
24
|
+
* 절대 겹치지 않는다(반복 축 키의 접두는 항상 엔티티 UUID 다).
|
|
25
|
+
*/
|
|
26
|
+
export declare const embedAllKey: (entityId: string) => string;
|
|
27
|
+
/**
|
|
28
|
+
* 속성 통째 축의 키. 반복 축과 **같은 (엔티티, 속성) 쌍을 가리키되 다른 축**이라 접두로만 갈린다 —
|
|
29
|
+
* 둘은 동시에 상태를 가질 수 있고(통째를 풀면 반복 접힘이 그대로 살아난다) 그것이 의도다.
|
|
30
|
+
*/
|
|
31
|
+
export declare const embedAttrKey: (entityId: string, attrId: string) => string;
|
|
32
|
+
/**
|
|
33
|
+
* 이 키의 기본 접힘 여부 — 캔버스가 `useTreeCollapse`에 그대로 넘긴다. **키의 순수 함수**여야 하며
|
|
34
|
+
* (그 헤더 ①·②), 축별 기본값 근거는 이 모듈 헤더의 표에 있다. 접두가 없는 키(=반복 축)만 접힘이다.
|
|
35
|
+
*/
|
|
36
|
+
export declare const embedDefaultCollapsed: (key: string) => boolean;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { InjectionKey } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* 노드 내부 handle 재측정 요청 수집기 (VE-1 ①) — 캔버스가 provide, EntityNode가 onUpdated마다
|
|
4
|
+
* 자기 id를 mark(무비용 후보 등록). 캔버스는 rAF 배치 flush에서 후보의 기하 시그니처(노드 높이 +
|
|
5
|
+
* 행별 y)를 비교해 **실제로 변한 노드만** `updateNodeInternals(ids)`로 재측정한다.
|
|
6
|
+
*
|
|
7
|
+
* 왜 시그니처 판정이 필수인가: Vue Flow의 updateNodeInternals는 forceUpdate로 handleBounds를
|
|
8
|
+
* 무조건 새 객체로 써 그 노드를 다시 재렌더시킨다 — 재렌더를 무조건 mark하면 측정→재렌더→측정
|
|
9
|
+
* 무한 루프. 시그니처가 무변화면 측정을 생략해 루프가 한 사이클 만에 종료된다. 부수 효과로
|
|
10
|
+
* 텍스트-only 변경·hover 강조 재렌더도 재측정에서 자연 제외된다.
|
|
11
|
+
*/
|
|
12
|
+
export interface NodeInternalsCollector {
|
|
13
|
+
mark: (nodeId: string) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare const NODE_INTERNALS: InjectionKey<NodeInternalsCollector>;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { OpConflict } from '../command/op';
|
|
2
|
+
import { MessageKey } from '../i18n';
|
|
2
3
|
export interface OpConflictNotice {
|
|
3
|
-
/** 배너 제목 — 상태 자체(무엇이 일어났는지). */
|
|
4
|
-
|
|
5
|
-
/** 배너 본문 — 원인 + 복구 방향(다시 불러오기). */
|
|
6
|
-
|
|
4
|
+
/** 배너 제목 키 — 상태 자체(무엇이 일어났는지). 뷰가 t()로 렌더. */
|
|
5
|
+
titleKey: MessageKey;
|
|
6
|
+
/** 배너 본문 키 — 원인 + 복구 방향(다시 불러오기). 뷰가 t()로 렌더. */
|
|
7
|
+
detailKey: MessageKey;
|
|
7
8
|
}
|
|
8
9
|
/**
|
|
9
|
-
* 충돌 종류 → 사용자
|
|
10
|
-
*
|
|
10
|
+
* 충돌 종류 → 사용자 문구 **키**(문구는 i18n 카탈로그 소유 — 검증 P3 code+params→뷰 지역화 패턴 동형).
|
|
11
|
+
* `missing`은 동시편집이 아니라 전송 실패(혼자 편집 중에도 발생)라 원인을 구분한다
|
|
12
|
+
* (호스트 배선 경로와 동일한 kind 오진 방지). null → null(배너 미노출).
|
|
11
13
|
*/
|
|
12
14
|
export declare function opConflictNotice(conflict: OpConflict | null | undefined): OpConflictNotice | null;
|
package/dist/view/swatches.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MessageKey } from '../i18n';
|
|
1
2
|
import { Style } from '../core/types';
|
|
2
3
|
export type SwatchToken = 'red' | 'amber' | 'green' | 'teal' | 'blue' | 'indigo' | 'violet' | 'pink';
|
|
3
4
|
/** 토큰의 컨텍스트별 렌더값 (CSS 변수 참조 — 테마는 [data-theme]로 스왑) */
|
|
@@ -31,7 +32,7 @@ export declare function resolveSwatch(token: SwatchToken | null): SwatchRender |
|
|
|
31
32
|
* @param soft 그룹처럼 반투명 칠이 필요하면 true.
|
|
32
33
|
*/
|
|
33
34
|
export declare function swatchMinimapFill(token: SwatchToken | null, soft?: boolean): string | null;
|
|
34
|
-
/** 피커 라벨 */
|
|
35
|
-
export declare function
|
|
35
|
+
/** 피커 라벨 키 — 소비처가 `t(swatchLabelKey(token))`으로 로케일 렌더 */
|
|
36
|
+
export declare function swatchLabelKey(token: SwatchToken): MessageKey;
|
|
36
37
|
/** 피커에 칠할 대표색 (바 색 — 피커도 [data-theme]에 따라 전환) */
|
|
37
38
|
export declare function swatchSwatchColor(token: SwatchToken): string;
|