@g1cloud/entity-modeler-next 5.2.28 → 5.2.30
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 +16 -0
- package/dist/core/javaTypes.d.ts +40 -4
- package/dist/core/multiLang.d.ts +16 -0
- package/dist/core/types.d.ts +18 -0
- package/dist/entity-modeler.js +9400 -9348
- package/dist/entity-modeler.umd.cjs +27 -27
- package/package.json +1 -1
package/dist/agent/resolver.d.ts
CHANGED
|
@@ -506,6 +506,22 @@ export type ResolveError = {
|
|
|
506
506
|
where: string;
|
|
507
507
|
expected: string;
|
|
508
508
|
got: string;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* 다국어(MultiLangText) 자리에 **수용할 수 없는 형상**이 왔다 — 특히 평문 문자열.
|
|
512
|
+
*
|
|
513
|
+
* ★★**조용한 오염을 막는 자리다**(2026-09-05 실사용 결함): `attribute.update {description:"설명"}` 이
|
|
514
|
+
* 어느 층에서도 안 막혀 그대로 저장됐고, 객체로 취급되는 지점에서 **문자 단위 맵**
|
|
515
|
+
* (`{"0":"회","1":"원",…}`)으로 굳었다. 스키마(`schema.ts` `MULTI_LANG`)는 형상을 규정하는데
|
|
516
|
+
* 실행 경로가 그걸 집행하지 않아 «선언과 집행이 갈려» 있었다.
|
|
517
|
+
* ⚠️`{}`·`null` 은 **정당하다**(부재·비움 동치 — `null ≡ {} ≡ 부재` 규약).
|
|
518
|
+
*/
|
|
519
|
+
| {
|
|
520
|
+
code: 'multilang-shape-invalid';
|
|
521
|
+
opIndex: number;
|
|
522
|
+
where: string;
|
|
523
|
+
expected: string;
|
|
524
|
+
got: string;
|
|
509
525
|
} | {
|
|
510
526
|
code: 'handle-by-unsupported';
|
|
511
527
|
opIndex: number;
|
package/dist/core/javaTypes.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Entity, Association, Attribute, DbColumn, DisplayMode, EmbeddableCatalog, PredefinedCustomTypeCatalog, PredefinedCustomTypeEntry } from './types';
|
|
1
|
+
import { Entity, Association, Attribute, DbColumn, DisplayMode, EmbeddableCatalog, EmbeddableCatalogEntry, PredefinedCustomTypeCatalog, PredefinedCustomTypeEntry } from './types';
|
|
2
2
|
export interface JavaTypeDef {
|
|
3
3
|
/** 저장값 = 레거시 enum 상수명. Attribute.type에 그대로 들어간다. */
|
|
4
4
|
value: string;
|
|
@@ -157,12 +157,48 @@ export declare function typeOwner(attr: Pick<Attribute, 'attrType'>): TypeOwner;
|
|
|
157
157
|
*
|
|
158
158
|
* ★소비처가 둘이고 **하는 일이 다르다**: GUI 는 `structural` 을 «자리 보존 전환»(`convertAttributeType`
|
|
159
159
|
* — 삭제+추가 합성)으로 **처리**하고 나머지는 셀렉트를 잠그며, AI(`agent/resolver`)는 patch 로 표현할
|
|
160
|
-
* 수 없으므로
|
|
161
|
-
*
|
|
162
|
-
*
|
|
160
|
+
* 수 없으므로 거부한다. 판정선만 공유하고 처방은 각자다 — 선이 갈리면 *「GUI 로는 되는데 AI 로는
|
|
161
|
+
* 조용히 반쪽 적용」* 이 된다.
|
|
162
|
+
* ⚠️★**AI 쪽 「전부 거부」는 2026-09-04 에 좁혀졌다** — 컬럼 개수가 «안 바뀌는» 자리는
|
|
163
|
+
* `columnPreservingValueTypeEntry`(아래)가 갈라 내고 그쪽은 in-place patch 로 열려 있다. 이 함수는
|
|
164
|
+
* **여전히 GUI 의 전환 판정 단일 출처**이므로 «건드리지 않았다» — 좁히면 GUI 가 그 형상을 전환이 아닌
|
|
165
|
+
* 단순 update 로 흘려 `attrType` 이 안 따라가는 회귀가 된다(두 물음이 «같은 선»이 아니다).
|
|
163
166
|
* ★같은 값 재전송(라운드트립 에코)은 변경이 아니므로 거짓이다(`attrType` 게이트의 에코 통과와 동형).
|
|
164
167
|
*/
|
|
165
168
|
export declare function isStructuralTypeChange(attr: Pick<Attribute, 'attrType' | 'type'>, targetType: string, embeddables: EmbeddableCatalog): boolean;
|
|
169
|
+
/**
|
|
170
|
+
* 이 타입 변경이 **컬럼 개수를 바꾸지 않는** ② 값 타입 재지정인가 — 맞으면 목적지 카탈로그 엔트리를,
|
|
171
|
+
* 아니면 `undefined` 를 돌려준다. AI(op) 경로가 이 자리를 **in-place `{type, attrType}` patch** 로
|
|
172
|
+
* 처리해도 되는지의 단일 출처다.
|
|
173
|
+
*
|
|
174
|
+
* ★**왜 필요했나**(2026-09-04 · 무인화 갭 ④): `isStructuralTypeChange` 는 *「목적지가 ② 임베더블」* 이기만
|
|
175
|
+
* 하면 참이라 **1필드 카탈로그 × 1컬럼 속성**까지 `attribute-type-conversion-unsupported`(reason
|
|
176
|
+
* **`column-count`**)로 막았다 — 이름이 사유를 자칭하는데 **그 사유가 성립하지 않는 자리**다. 실측
|
|
177
|
+
* 근거: 값 타입 배치 **28자리 전량**이 그 형상이라 symbolic-ops 를 못 쓰고 raw `/ops` 로 우회했다.
|
|
178
|
+
*
|
|
179
|
+
* ★★**계약을 «id 보존»(in-place)으로 정한 근거 — 취향이 아니라 손실 논거다**: 같은 착지점을 GUI 는
|
|
180
|
+
* 삭제+추가로 내는데(새 속성 id), AI 의 어휘로 그걸 흉내 내면 **데이터가 사라진다** — `AttrSpec` 에
|
|
181
|
+
* `order` 가 없어 자리가 맨 뒤로 밀리고, `EmbeddableColumnOverride` 에 `logicalName`·`dataType` 이 없어
|
|
182
|
+
* **컬럼 논리명이 조용히 소실**되며(그 배치 실측 27/28 자리 보유), agent 경로엔 `survivingRefs` 가 없어
|
|
183
|
+
* **인덱스 ref 가 끊긴다**. 컬럼 개수가 같으면 `dbAttrs` 를 **modelId 째 그대로** 두면 되므로 그 손실이
|
|
184
|
+
* **전부 발생하지 않는다** ⇒ in-place 가 우월하고, 이 술어가 그 「같을 때」를 정의한다.
|
|
185
|
+
* ★**GUI 는 그대로 «전환»(새 id)이다** — 두 경로의 최종 «모델 상태»는 속성 modelId 를 빼면 같다.
|
|
186
|
+
* 같은 배치에 같은 id 가 `$pull`·`$push` 양쪽에 등장하면 병합 순서에 의존하므로(`convertAttributeType`
|
|
187
|
+
* 헤더) GUI 쪽이 id 를 새로 다는 것도 근거가 있고, 둘 다 각자 자리에서 옳다.
|
|
188
|
+
*
|
|
189
|
+
* 성립 조건 넷 — 하나라도 어긋나면 `undefined`(= 종전 거부 유지):
|
|
190
|
+
* ① 실제 변경일 것(에코 제외) ② 출발이 **컬럼을 가진 값 속성**(`NORMAL`·`EMBED_PREDEF` — `convertAttributeType`
|
|
191
|
+
* 의 진입 규칙과 같다. `EMBED_OWN`·`EMBED_REF` 는 association 이 정체성, `RELATION_*` 은 컬럼이 관계 파생)
|
|
192
|
+
* ③ 목적지가 **② 카탈로그**에 있을 것 ④ 그 필드 수가 **현재 `dbAttrs` 길이와 같을 것**.
|
|
193
|
+
*
|
|
194
|
+
* ⚠️**되돌림(② → `NORMAL`)은 여기서 열지 않는다** — 그 방향은 ③ predefined customtype 목적지에서
|
|
195
|
+
* `seedPredefinedCustomTypeColumn` 이 컬럼 메타를 시드하는데(`convertAttributeType`), resolver 에는 그
|
|
196
|
+
* 카탈로그가 주입되지 않아 **AI 만 시드를 빠뜨린 채 착지**한다(= 조용한 비대칭). 열려면 그 카탈로그
|
|
197
|
+
* 주입이 선행이고, 그때까지는 거부가 정직하다.
|
|
198
|
+
* ⚠️**PK 카디널리티 게이트가 불필요해지는 것도 이 조건 덕분**이다 — `convertAttributeType` 이 막는 것은
|
|
199
|
+
* *컬럼 개수가 바뀌는* PK(1→2 면 자식 FK 미러가 무너진다)이고, 여기는 정의상 개수가 같다.
|
|
200
|
+
*/
|
|
201
|
+
export declare function columnPreservingValueTypeEntry(attr: Pick<Attribute, 'attrType' | 'type' | 'dbAttrs'>, targetType: string, embeddables: EmbeddableCatalog): EmbeddableCatalogEntry | undefined;
|
|
166
202
|
/**
|
|
167
203
|
* ⑤ 파생 타입 커플링이 깨졌는가 — **`GroupCodeEnum` 과 `groupCode` 결합은 «항상 함께»**다(XOR 이면 깨짐).
|
|
168
204
|
*
|
package/dist/core/multiLang.d.ts
CHANGED
|
@@ -23,6 +23,22 @@ export declare function hasMultiLangText(t: MultiLangText | undefined): boolean;
|
|
|
23
23
|
* 객체를 만들면 왕복 diff·재렌더가 이유 없이 늘어난다(`columnResolution` 이 같은 이유로 참조 안정을 지킨다).
|
|
24
24
|
*/
|
|
25
25
|
export declare function normalizeMultiLangText(t: MultiLangText | undefined | null): MultiLangText | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* 이 값을 MultiLangText 자리에 **넣어도 되는가** — 입력 경계에서 쓰는 «수용 형상» 술어.
|
|
28
|
+
*
|
|
29
|
+
* 허용: 부재(`undefined`)·비움(`null`)·빈 객체(`{}` = 부재 동치)·키가 전부 `ko|en|ja|zh` 이고 값이 문자열인 객체.
|
|
30
|
+
* 거부: 그 밖 전부 — 특히 **평문 문자열**.
|
|
31
|
+
*
|
|
32
|
+
* ★★**왜 필요한가**(2026-09-05 실사용 결함): `attribute.update {description: "설명"}` 처럼 평문을 보내면
|
|
33
|
+
* 어느 층도 막지 않아 그대로 저장되고, 그 값이 객체로 취급되는 지점에서 **문자 단위 맵**
|
|
34
|
+
* (`{"0":"회","1":"원",…}` · 공백 인덱스는 아예 누락)으로 굳는다. 「모르는 값을 발명하지 말 것」의 짝인
|
|
35
|
+
* **「형상이 틀린 값을 조용히 받지 말 것」**이고, 조용한 오염이라 에러보다 나쁘다.
|
|
36
|
+
*
|
|
37
|
+
* ⚠️`normalizeOpMultiLang`(resolver)의 `isLangShaped` 와 **묻는 것이 다르다** — 그쪽은 *「이 값이
|
|
38
|
+
* MultiLangText «인가»」*(정규화 대상 고르기)이고 이쪽은 *「이 자리에 이 값을 «받아도 되는가»」*다.
|
|
39
|
+
* 그래서 `{}` 의 답이 갈린다(전자는 아니오 = 안 접는다 / 후자는 예 = 부재 동치라 받는다).
|
|
40
|
+
*/
|
|
41
|
+
export declare function isMultiLangAssignable(v: unknown): boolean;
|
|
26
42
|
/**
|
|
27
43
|
* 표시할 문자열 하나를 고른다 — `prefer`(유저·콘텐츠 언어) 우선, 없으면 `LANG_ORDER` 순으로 **첫 비어있지 않은 값**.
|
|
28
44
|
*
|
package/dist/core/types.d.ts
CHANGED
|
@@ -69,6 +69,24 @@ export interface EmbeddableCatalogEntry {
|
|
|
69
69
|
defaultName: string;
|
|
70
70
|
/** 메뉴 표시 라벨(미지정 시 type). */
|
|
71
71
|
label?: MultiLangText;
|
|
72
|
+
/**
|
|
73
|
+
* 이 임베더블 클래스가 사는 자바 패키지(예: `net.g1project.bluecomm.model` ·
|
|
74
|
+
* `net.g1project.ecp.common.identifier`) — 코드젠이 `{packageName}.{type}` 를 **import 로 방출**한다.
|
|
75
|
+
*
|
|
76
|
+
* ★**왜 «모델»이 아니라 «카탈로그»가 이 축을 갖는가**: EMBED_OWN 은 임베더블이 문서 «안» 엔티티라
|
|
77
|
+
* `resolvePackage` 로 패키지를 도출할 수 있지만, EMBED_PREDEF 는 **모델 밖 클래스**라 도구가 알 방법이
|
|
78
|
+
* 없다. 카탈로그를 주는 쪽(호스트)만 아는 사실이므로 `converterCatalog`·`groupCodeEnumPackage` 와 같은
|
|
79
|
+
* **주입 seam** 으로 연다.
|
|
80
|
+
*
|
|
81
|
+
* ★**미주입이면 발명하지 않는다** — 코드젠은 import 를 생략하고 `fillIn`(패키지 확인)으로 표면화한다
|
|
82
|
+
* (`groupCodeEnumPackage` 미주입과 **같은 관용구**). 종전엔 그 자리가 **무신호**라 import 없는
|
|
83
|
+
* `private MemberNo memberNo;` 가 컴파일 불가인 채로 나갔다.
|
|
84
|
+
*
|
|
85
|
+
* ⚠️`Money` 는 이 축을 **안 본다** — 프레임워크 상수 FQN 세트(`Money` + `MoneyUserType` +
|
|
86
|
+
* `@CompositeType`)가 한 덩어리라 패키지만 갈아끼우는 표현이 성립하지 않는다(`scaffoldJava` 의
|
|
87
|
+
* `FQN.money`·`FQN.moneyUserType` 가 그 자리의 소유자다).
|
|
88
|
+
*/
|
|
89
|
+
packageName?: string;
|
|
72
90
|
/** 펼쳐질 컬럼 메타모델(선언 순서 = dbAttr 인덱스). */
|
|
73
91
|
fields: EmbeddableCatalogField[];
|
|
74
92
|
}
|