Контекст
Продолжение домен-экстракции #516. Второй из трёх пакетов после @rpaforge/activities (#527).
Анализ: [[openflowkit-integration-analysis]] (ревизия 4, фаза 0) — база знаний проекта.
Разведка зависимостей от React Flow
Три файла в src/domain/diagram/ имеют runtime-связи с React Flow через import type { Node, Edge } from @reactflow/core, которые нужно разорвать:
| Файл |
Зависит от |
Решение |
types.ts |
import type { Node } from @reactflow/core в StartNodePredicate |
Заменить на RpaNode из @rpaforge/domain-model (тип StartNodePredicate<D = unknown> уже есть в domain-model!) |
operations.ts |
import type { Edge, Node } from @reactflow/core в сигнатурах всех функций |
Заменить на RpaNode<RpaNodeData> / RpaEdge из @rpaforge/domain-model |
circular-dependency.ts |
import type { DiagramMetadata } from ../../stores/diagramStore |
Заменить на минимальный локальный тип (нужны только id: string) |
circular-reference.ts |
import type { DiagramMetadata } from ../../stores/diagramStore |
Заменить на минимальный локальный тип (нужны id, name, type) |
Что нужно сделать
Шаг 1 — Создать пакет packages/diagram-core
По шаблону packages/domain-model:
src/types.ts — доменные типы для операций над графом:
// Минимальный интерфейс для DiagramMetadata (только то, что нужно circular-dependency/reference)
export interface DiagramRef {
id: string;
name: string;
type: main | sub-diagram | library;
}
export interface SubDiagramNode {
id: string;
type: string;
data: { activityId?: string; diagramId?: string };
}
src/operations.ts — operations.ts из domain/diagram/:
- Заменить
Node → RpaNode во всех сигнатурах
- Заменить
Edge → RpaEdge во всех сигнатурах
isStartNode, countStartNodes, findStartNode, getReachableNodes, findOrphanedNodes, validateDiagram, buildGraph, findReachableDistances, findCommonMergeNode, cloneNodes, cloneEdges, normalizeEdge
Важно: В operations.ts cloneNodes и cloneEdges используют structuredClone и работают со структурно-совместимыми объектами — после замены типов на RpaNode/RpaEdge код не требует изменений (оба структурно похожи).
src/circular-dependency.ts — circular-dependency.ts:
- Заменить
DiagramMetadata → DiagramRef (локальный тип)
- Зависит только от собственных типов и Node.js
src/circular-reference.ts — circular-reference.ts:
- Заменить
DiagramMetadata → DiagramRef
CircularReferenceError, detectCircularReference, validateSubDiagramCall, getDiagramCallDepth, validateNestingDepth
getDiagramNodes callback принимает SubDiagramNode[] вместо домен-специфичного типа
src/index.ts — re-export всего публичного API.
Шаг 2 — Обновить шимы в studio
src/domain/diagram/types.ts → переписать как re-export из @rpaforge/diagram-core (дублирующиеся типы) + из @rpaforge/domain-model
src/domain/diagram/index.ts → re-export из @rpaforge/diagram-core
- Файлы
operations.ts, circular-dependency.ts, circular-reference.ts → удалить
- В
src/stores/processStore.ts — адаптировать вызовы import { validateDiagram, isStartNode, ... } from ../domain/diagram — они должны продолжать работать через шим
Шаг 3 — Обновить тесты
src/domain/diagram/circular-dependency.test.ts — перенести в пакет, заменить импорты DiagramMetadata на DiagramRef
src/utils/diagramValidation.test.ts — НЕ входит в этот issue (отдельный пакет validation)
Шаг 4 — Верификация
Шаг 5 — Зависимости package.json
{
"dependencies": {
"@rpaforge/domain-model": "workspace:^"
}
}
Не входит в этот issue
Связанные знания
Связано с #513, #516.
Контекст
Продолжение домен-экстракции #516. Второй из трёх пакетов после
@rpaforge/activities(#527).Анализ: [[openflowkit-integration-analysis]] (ревизия 4, фаза 0) — база знаний проекта.
Разведка зависимостей от React Flow
Три файла в
src/domain/diagram/имеют runtime-связи с React Flow черезimport type { Node, Edge } from @reactflow/core, которые нужно разорвать:types.tsimport type { Node } from @reactflow/coreвStartNodePredicateRpaNodeиз@rpaforge/domain-model(типStartNodePredicate<D = unknown>уже есть в domain-model!)operations.tsimport type { Edge, Node } from @reactflow/coreв сигнатурах всех функцийRpaNode<RpaNodeData>/RpaEdgeиз@rpaforge/domain-modelcircular-dependency.tsimport type { DiagramMetadata } from ../../stores/diagramStoreid: string)circular-reference.tsimport type { DiagramMetadata } from ../../stores/diagramStoreid,name,type)Что нужно сделать
Шаг 1 — Создать пакет
packages/diagram-coreПо шаблону
packages/domain-model:src/types.ts— доменные типы для операций над графом:src/operations.ts—operations.tsизdomain/diagram/:Node→RpaNodeво всех сигнатурахEdge→RpaEdgeво всех сигнатурахisStartNode,countStartNodes,findStartNode,getReachableNodes,findOrphanedNodes,validateDiagram,buildGraph,findReachableDistances,findCommonMergeNode,cloneNodes,cloneEdges,normalizeEdgeВажно: В
operations.tscloneNodesиcloneEdgesиспользуютstructuredCloneи работают со структурно-совместимыми объектами — после замены типов наRpaNode/RpaEdgeкод не требует изменений (оба структурно похожи).src/circular-dependency.ts—circular-dependency.ts:DiagramMetadata→DiagramRef(локальный тип)src/circular-reference.ts—circular-reference.ts:DiagramMetadata→DiagramRefCircularReferenceError,detectCircularReference,validateSubDiagramCall,getDiagramCallDepth,validateNestingDepthgetDiagramNodescallback принимаетSubDiagramNode[]вместо домен-специфичного типаsrc/index.ts— re-export всего публичного API.Шаг 2 — Обновить шимы в studio
src/domain/diagram/types.ts→ переписать как re-export из@rpaforge/diagram-core(дублирующиеся типы) + из@rpaforge/domain-modelsrc/domain/diagram/index.ts→ re-export из@rpaforge/diagram-coreoperations.ts,circular-dependency.ts,circular-reference.ts→ удалитьsrc/stores/processStore.ts— адаптировать вызовыimport { validateDiagram, isStartNode, ... } from ../domain/diagram— они должны продолжать работать через шимШаг 3 — Обновить тесты
src/domain/diagram/circular-dependency.test.ts— перенести в пакет, заменить импортыDiagramMetadataнаDiagramRefsrc/utils/diagramValidation.test.ts— НЕ входит в этот issue (отдельный пакет validation)Шаг 4 — Верификация
tsc --noEmitизpackages/diagram-core— чистоtsc --noEmitизpackages/studio— чистоpnpm testизpackages/studio— все тесты проходят (включая circular-dependency.test.ts)Шаг 5 — Зависимости package.json
{ "dependencies": { "@rpaforge/domain-model": "workspace:^" } }Не входит в этот issue
@rpaforge/validation— следующий issue ([#516] Пакет @rpaforge/validation — валидация sub-diagram вызовов и проекта #529)Связанные знания
Связано с #513, #516.