@g1cloud/entity-modeler-next 5.2.16 → 5.2.18

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.
@@ -29,6 +29,15 @@ export interface DiagramMeta {
29
29
  logicalVersion: number;
30
30
  };
31
31
  }
32
+ /**
33
+ * ★**MultiLangText 정규형 자리 명세** — 영속 논리 모델이 다국어 텍스트를 갖는 «모든» 자리.
34
+ *
35
+ * `core/types.ts` 의 `MultiLangText` 자리 중 **영속 모델**분만 담는다(카탈로그 `label`·`SuperClassColumnDef`
36
+ * 는 **호스트 주입**이라 저장 doc 에 없고 이 스윕의 대상이 아니다). 손 나열이라 새 필드가 생기면 조용히
37
+ * 빠지므로 `diagramAdapter.multiLang.test.ts` 의 **정적 배리어**가 `types.ts` 원문과 이 표를 대조한다
38
+ * (이 리포가 *「축이 늘면 그 축의 모든 필드를 함께」* 를 세 번 나눠 맞은 그 실패의 기계화).
39
+ */
40
+ export declare const MULTILANG_MODEL_SITES: readonly [readonly ["LogicalGroup", "name"], readonly ["Entity", "classLogicalName"], readonly ["Entity", "description"], readonly ["Entity", "table.logicalName"], readonly ["Attribute", "fieldLogicalName"], readonly ["Attribute", "description"], readonly ["DbColumn", "logicalName"], readonly ["Operation", "description"]];
32
41
  /**
33
42
  * 마커 분기 파서 — `schemaVersion`을 보고 v1(legacy flat) vs v2(logical/layout) 경로 선택(B-0).
34
43
  * reload(프리즈 후 재적재)도 이 진입점을 경유해 동일 분기를 탄다.
@@ -1,16 +1,6 @@
1
1
  import { ModelId } from '../core/types';
2
2
  import { OpShape } from '../command/op';
3
3
  import { PDiagram, PDiagramV2 } from './persisted';
4
- /**
5
- * 로드 경로가 파생하는 **속성 스칼라 필드** 목록 — 이 플래너가 raw↔healed diff로 정렬하는 축.
6
- *
7
- * 전체 필드를 무조건 diff하지 않는 이유: 로드 경로가 의도적으로 바꾸지 않는 필드까지 잡아
8
- * 오탐(JSON 왕복의 `null`↔부재 등)을 낼 수 있다. **선언된 목록**이 곧 "무엇이 파생값인가"의
9
- * 레지스트리이며, 새 파생 축 추가 = 여기에 이름 한 줄(라우트·플래너 신설 불요).
10
- *
11
- * - `notNull` : FK는 부모 end 다중성 파생(`deriveFkNotNull`, CC-4). 비-FK 속성은 파생 대상이
12
- * 아니지만 파생기가 FK만 건드리므로 diff도 자연히 FK에서만 발생한다.
13
- */
14
4
  declare const DERIVED_ATTRIBUTE_FIELDS: readonly ["notNull"];
15
5
  export interface HealBackfillPlan {
16
6
  /** backfill op 배치 (비면 정렬 대상 없음 — 문서 skip). */
@@ -223,6 +223,22 @@ export type ResolveError = {
223
223
  entity: Handle;
224
224
  handle: Handle;
225
225
  }
226
+ /**
227
+ * reorder 목록이 비었다 — 재배치 의도가 없는 요청.
228
+ *
229
+ * ★종전엔 **스키마 `minItems:1`** 이 막던 자리인데, 그 제약은 Anthropic structured-outputs 엄격
230
+ * 서브셋 밖이라(수치·문자열·복합 배열 제약 미지원 · SDK 가 떼어내고 클라이언트에서 검증한다)
231
+ * 스키마 헤더가 스스로 *「미사용」* 이라 선언해 놓고 두 자리만 쓰고 있었다 ⇒ 집행을 이리로 옮겼다.
232
+ * 규율: **스키마는 형(shape)만 선언하고 카디널리티·내용 제약은 resolver 가 집행한다.**
233
+ *
234
+ * ⚠️막지 않으면 조용히 쓰기가 난다 — 빈 목록은 `picked=[]` 로 흘러 «지목되지 않은» 전 요소를
235
+ * `order` 0..n−1 로 **재번호**하는 op 을 방출한다(기존 order 에 구멍이 있으면 실제 쓰기).
236
+ */
237
+ | {
238
+ code: 'reorder-empty';
239
+ opIndex: number;
240
+ entity: Handle;
241
+ }
226
242
  /**
227
243
  * index.update patch에 `columns` 키 — columnRef(dbAttr modelId)는 사람 핸들로 표현 불가라 패스스루 시
228
244
  * 깨진 인덱스가 된다. 컬럼 변경은 index.remove + index.add(컬럼 핸들 해소 구현)로 유도(거부 권고안).
@@ -510,4 +526,4 @@ export declare const INDEX_SPEC_KEYS: ReadonlySet<string>;
510
526
  export declare const OPERATION_SPEC_KEYS: ReadonlySet<string>;
511
527
  export declare const ASSOC_SPEC_KEYS: ReadonlySet<string>;
512
528
  export declare const GROUP_SPEC_KEYS: ReadonlySet<string>;
513
- export declare function resolveSymbolicOps(model: LogicalModel, ops: SymbolicOp[], options?: ResolverOptions): ResolveResult;
529
+ export declare function resolveSymbolicOps(model: LogicalModel, rawOps: SymbolicOp[], options?: ResolverOptions): ResolveResult;
@@ -62,14 +62,6 @@ export interface ColumnResolveContext {
62
62
  * 대다수 정상 데이터가 도로 빈 값이 된다. 캔버스 `EntityNode.effectiveAttr`가 쓰던 시맨틱과 동일.
63
63
  */
64
64
  export declare function resolveEffectiveColumn(attr: Attribute, col: DbColumn, index: number, entity: Entity | undefined, model: LogicalModel, ctx?: ColumnResolveContext): DbColumn;
65
- /**
66
- * MultiLangText 에 실제로 값이 있는가 — 빈 객체·전 로케일 공백은 없는 것으로 본다.
67
- *
68
- * ★**모듈 밖으로 열어 둔다**(종전 비공개 `hasText`) — 논리명은 객체 축이라 `||`·`??` 로는 갈리지 않고,
69
- * 그 판정을 소비처가 각자 재기술하면 어긋난다. 지금 셋이 같은 것을 물어야 한다: 실효 컬럼 해소(아래),
70
- * 스테레오타입 전환 시 논리명 이전(`editor/commandPlans`), 편집·표시 뷰의 폴백 판정.
71
- */
72
- export declare function hasMultiLangText(t: MultiLangText | undefined): boolean;
73
65
  /**
74
66
  * **실효 논리명** — 컬럼 논리명이 있으면 그것, 없으면 «필드» 논리명(`Attribute.logicalName`).
75
67
  *
@@ -61,6 +61,20 @@ export declare function javaTypeFromDataType(dataType: string | undefined): stri
61
61
  * 무시하므로 어노테이션은 *의도*일 뿐이다.
62
62
  */
63
63
  export declare function isJavaDataTypeCompatible(javaType: string | undefined, dataType: string | undefined): boolean | undefined;
64
+ /** 저장값 → 박싱 타입명(`PrimitiveInt`→`Integer`). 원시가 아니면 undefined. */
65
+ export declare function boxedJavaTypeOf(value: string | undefined): string | undefined;
66
+ /**
67
+ * Y/N 문자 플래그 컨버터가 붙는 boolean 형상 판정 — **코드젠 방출 조건과 검증 면제의 단일 출처**.
68
+ *
69
+ * 조건은 `!multiValue && dataType === 'VARCHAR'` 그대로다(코드젠 ynAxis 가 쓰던 술어를 승격):
70
+ * - CHAR 를 넓히지 않는 근거 = 레거시에 CHAR 사례가 없어 컨버터 관행을 확인할 수 없다(모르는 값 규약).
71
+ * - multiValue 는 컬럼 전체를 다중값 컨버터가 소유하므로 이 축과 겹치지 않는다(@Convert 중복 금지).
72
+ * 검증(`CHK-TYPE-8`)이 이 형상을 NULL-안전으로 면제하는 근거는 실물 컨버터다 —
73
+ * `PrimitiveBooleanToYNStringConverter.convertToEntityAttribute` 가 `"Y".equals(dbData)` 라
74
+ * **NULL → false 로 흡수**된다(bsp-shared/ecp-common · 2026-09-02 실물 인용). 재기술하면 어긋난다.
75
+ */
76
+ export declare function ynBooleanConverterKind(javaType: string | undefined, dataType: string | undefined, multiValue?: boolean): 'primitive' | 'boxed' | null;
77
+ export declare function isNullLoadUnsafePrimitive(javaType: string | undefined, dataType: string | undefined, multiValue?: boolean): boolean;
64
78
  /**
65
79
  * ① 스칼라 자바 타입 셀렉트 후보(단일 출처). JAVA_TYPES에서 비후보(⑤·레거시 표시용)를 빼고
66
80
  * ④ CustomType은 "사용자정의" 안내 라벨로 노출. ②embeddable·③customtype은 애초에 JAVA_TYPES에 없음.
@@ -0,0 +1,33 @@
1
+ import { LangCode, MultiLangText } from './types';
2
+ /**
3
+ * 소비처가 로케일을 고르는 **기본 순서**. `agent/schema.ts` 의 `MULTI_LANG` 키 순서와 같고,
4
+ * 종전 소비처들이 각자 `?.ko ?? ?.en ?? ?.ja ?? ?.zh` 로 재기술하던 그 순서다.
5
+ */
6
+ export declare const LANG_ORDER: readonly LangCode[];
7
+ /**
8
+ * MultiLangText 에 실제로 값이 있는가 — 빈 객체·전 로케일 공백은 없는 것으로 본다.
9
+ *
10
+ * ★**단일 출처**(종전 `columnResolve` 소유 · 그 앞은 비공개 `hasText`) — 논리명은 객체 축이라 `||`·`??` 로는
11
+ * 갈리지 않고, 그 판정을 소비처가 각자 재기술하면 어긋난다. 지금 넷이 같은 것을 물어야 한다: 실효 컬럼 해소
12
+ * (`columnResolve`), 스테레오타입 전환 시 논리명 이전(`editor/commandPlans`), 코드젠 javadoc(`scaffoldJava`),
13
+ * 편집·표시 뷰의 폴백 판정.
14
+ *
15
+ * ⚠️`normalizeMultiLangText(t) !== undefined` 와 **항상 같은 답**이어야 한다(테스트가 고정한다). 술어를 싸게
16
+ * 두려고 두 산식으로 나눠 놓은 것이므로, 한쪽만 고치면 어긋난다.
17
+ */
18
+ export declare function hasMultiLangText(t: MultiLangText | undefined): boolean;
19
+ /**
20
+ * 저장·전송 표현을 **정규형**으로 접는다 — 빈 로케일 키를 떼고, 남는 것이 없으면 `undefined`(=부재).
21
+ *
22
+ * ★**참조 안정**: 뗄 것이 없으면 **원본을 그대로 돌려준다**. 로드 경로가 전 필드를 통과시키므로 매번 새
23
+ * 객체를 만들면 왕복 diff·재렌더가 이유 없이 늘어난다(`columnResolution` 이 같은 이유로 참조 안정을 지킨다).
24
+ */
25
+ export declare function normalizeMultiLangText(t: MultiLangText | undefined | null): MultiLangText | undefined;
26
+ /**
27
+ * 표시할 문자열 하나를 고른다 — `prefer`(유저·콘텐츠 언어) 우선, 없으면 `LANG_ORDER` 순으로 **첫 비어있지 않은 값**.
28
+ *
29
+ * ★소비처가 `?.[lang] ?? ?.ko ?? ?.en` 으로 재기술하던 자리의 단일 출처다. 손 나열은 두 관용구로 갈렸고
30
+ * (`??` 8자리 / `||` 5자리) **`??` 쪽만 빈 문자열에서 멈춰** 뒤 로케일 값을 잃었다. 폴백 «꼬리»(그룹 패키지명·
31
+ * i18n 기본 문구 등)는 자리마다 다르므로 여기서 정하지 않고 `undefined` 를 돌려 호출자가 잇게 한다.
32
+ */
33
+ export declare function pickMultiLangText(t: MultiLangText | undefined | null, prefer?: LangCode): string | undefined;