import { Entity, IndexColumn, ModelId } from './types'; /** 한 인덱스의 정리 결과 — `columns` 는 정리 **후** 전량(패치가 통째 교체이므로). */ export type IndexColumnCleanup = { indexRef: ModelId; columns: IndexColumn[]; }; /** * `entity` 에서 `removedAttributeIds` 가 사라질 때 정리해야 할 인덱스 목록. * * 고아가 되는 ref = 사라지는 속성의 **속성 modelId + 그 dbAttr modelId 전부**(두 표기 모두 유입 가능). * 변화가 없는 인덱스는 결과에 넣지 않는다(빈 패치 방출 = INV-5 멱등 위배). * * ⚠️한 조작에서 여러 속성이 사라지면 **한 번에** 넘길 것 — 속성마다 따로 호출하면 각 산출이 원본 기준이라 * 나중 패치가 앞의 정리를 되돌린다. * * ★`survivingRefs` — **속성은 사라지지만 그것이 가리키던 자리는 살아남는** 조작용(`convertAttributeType` * 의 자리 보존 전환이 그렇다: 삭제+추가 합성이라 속성 id 는 갈리는데 승계된 dbAttr 은 modelId 째 다음 * 속성으로 넘어간다). 그런 ref 는 «이번 조작이 깨뜨린 ref» 가 아니므로 위 규율대로 정리 대상이 아니다 — * 빼면 살아있는 컬럼을 가리키던 인덱스가 조용히 비고, 그것이 이 모듈이 막으려던 **무신호 소실** 그 * 자체가 된다. 미지정이면 종전과 같다(전부 고아). * * ★★**집합이 아니라 «맵»인 이유**(2026-09-02 정정): 종전엔 `survivingColumnIds`(Set)였고 그것이 **컬럼 * 표기만 지켰다**. 그런데 `columnRef` 는 두 표기가 공존하고(`indexColumnRef.ts`) **편집 뷰가 만드는 * 인덱스는 속성 modelId 를 쓴다**(`EntityIndexSection.candidateItems`·`EntityIndexesWide.availItems`). * 전환은 속성 id 를 새로 부여하므로, 컬럼이 승계돼도 **GUI 로 만든 인덱스는 그대로 비워졌다** — * 막으려던 실패 모드가 같은 조작의 다른 표기로 재발한 형태다. 옛 ref → 새 ref 를 받아 **갈아끼운다**. * 1컬럼 승계는 정규형(dbAttr 표기)으로 접어 넘기는 것이 자연스럽다(`indexRefResolver.canon` 동형). */ export declare function planIndexColumnCleanup(entity: Entity, removedAttributeIds: readonly ModelId[], survivingRefs?: ReadonlyMap): IndexColumnCleanup[];