import { EditorState } from '../command/types'; import { ModelId } from '../core/types'; import { PDiagram, PDiagramV2 } from './persisted'; export interface DiagramMeta { id?: string; version?: number; diagramVersion?: string; size?: { width: number; height: number; }; packageName?: string; /** 데이터 형태 세대 — 1=legacy flat, 2=logical/layout(op API 대상). 부재 시 1. */ schemaVersion?: number; /** op 쓰기 롤아웃 게이트(불변식: true ⟹ schemaVersion>=2). v2 && false = read-only 프리즈(B-0-1). */ opWriteEnabled?: boolean; /** * 문서 단위 「참고 전용」(v2 doc 루트 마커) — 문서 전체가 산출·검증 대상 밖. 엔티티 단위는 논리 모델의 * `Entity.referenceOnly` 이고 판정은 **OR** 다(둘 중 하나면 대상 외). v1 은 undefined. */ referenceOnly?: boolean; /** * v2 doc일 때 RevCache 시드(컨테이너 rev + layout/logical version). v1은 undefined. * controller가 OpSyncAdapter.seed로 주입(base rev 라이브 캐시 초기화). */ revSeed?: { revs: Record; layoutVersion: number; logicalVersion: number; }; } /** * ★**MultiLangText 정규형 자리 명세** — 영속 논리 모델이 다국어 텍스트를 갖는 «모든» 자리. * * `core/types.ts` 의 `MultiLangText` 자리 중 **영속 모델**분만 담는다(카탈로그 `label`·`SuperClassColumnDef` * 는 **호스트 주입**이라 저장 doc 에 없고 이 스윕의 대상이 아니다). 손 나열이라 새 필드가 생기면 조용히 * 빠지므로 `diagramAdapter.multiLang.test.ts` 의 **정적 배리어**가 `types.ts` 원문과 이 표를 대조한다 * (이 리포가 *「축이 늘면 그 축의 모든 필드를 함께」* 를 세 번 나눠 맞은 그 실패의 기계화). */ 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"]]; /** * 마커 분기 파서 — `schemaVersion`을 보고 v1(legacy flat) vs v2(logical/layout) 경로 선택(B-0). * reload(프리즈 후 재적재)도 이 진입점을 경유해 동일 분기를 탄다. * * 산출 state는 입력 doc과 **참조 비공유**(계약) — 진입 시 deep-clone한다. 로드 자가치유 * (heal/normalize)와 이후 편집(commands의 in-place 변형)이 모두 사본 위에서 일어나므로, * 호출자 소유 객체(호스트 useFetch payload 등 리액티브 소스)를 오염시키지 않는다. * reactive proxy에 structuredClone은 throw할 수 있어 JSON deep-clone(controller 클립보드와 * 동일 패턴). undefined 값 키는 탈락하나 부재와 의미 동치. */ export declare function fromPersisted(doc: PDiagram | PDiagramV2): { state: EditorState; meta: DiagramMeta; }; export declare function toPersisted(state: EditorState, meta?: DiagramMeta): PDiagram; /** * v2 직렬화기 — `fromPersistedV2`의 역(near-identity). element는 core 모델 그대로 기록하고 * 컨테이너 rev·logical/layout version만 `meta.revSeed`에서 되붙인다(부재 시 0 시드). * * 마이그레이션(v1→v2 fork)은 revSeed 없는 meta로 호출 → 전 컨테이너 rev 0, version 0 시드. * `id`·`opWriteEnabled`는 호출자가 meta로 제어(마이그레이션은 _id 미주입 + opWriteEnabled=true). * 서버는 클라 전송 doc을 신뢰 없이 재검증(schemaVersion·sourceDiagramId·_id) — M4 §3 단위 1. */ export declare function toPersistedV2(state: EditorState, meta?: DiagramMeta): PDiagramV2;