Skip to content

[#516] Пакет @rpaforge/diagram-core — операции с графом и циклические зависимости #528

@chelslava

Description

@chelslava

Контекст

Продолжение домен-экстракции #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.tsoperations.ts из domain/diagram/:

  • Заменить NodeRpaNode во всех сигнатурах
  • Заменить EdgeRpaEdge во всех сигнатурах
  • isStartNode, countStartNodes, findStartNode, getReachableNodes, findOrphanedNodes, validateDiagram, buildGraph, findReachableDistances, findCommonMergeNode, cloneNodes, cloneEdges, normalizeEdge

Важно: В operations.ts cloneNodes и cloneEdges используют structuredClone и работают со структурно-совместимыми объектами — после замены типов на RpaNode/RpaEdge код не требует изменений (оба структурно похожи).

src/circular-dependency.tscircular-dependency.ts:

  • Заменить DiagramMetadataDiagramRef (локальный тип)
  • Зависит только от собственных типов и Node.js

src/circular-reference.tscircular-reference.ts:

  • Заменить DiagramMetadataDiagramRef
  • 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 — Верификация

  • tsc --noEmit из packages/diagram-core — чисто
  • tsc --noEmit из packages/studio — чисто
  • pnpm test из packages/studio — все тесты проходят (включая circular-dependency.test.ts)
  • Ручная проверка: создание/валидация sub-diagram вызовов (UI)

Шаг 5 — Зависимости package.json

{
  "dependencies": {
    "@rpaforge/domain-model": "workspace:^"
  }
}

Не входит в этот issue

Связанные знания

Связано с #513, #516.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    Status
    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions