Skip to content

Справочник

Точки входа

Точка входаДля чегоСодержимое
rest-pipeline-jsТолько базовая частьPipelineOrchestrator, createRestClient, типы, утилиты. Без Vue/React.
rest-pipeline-js/vueVue-проектыБазовая часть + Vue composables
rest-pipeline-js/reactReact-проектыБазовая часть + React hooks
rest-pipeline-js/testingТесты (любой фреймворк)createMockAdapter() — см. Тестирование
dist/umd/rest-pipeline.umd.min.jsТег <script> для CDN, без бандлераБазовая часть со встроенным axios — см. Использование через CDN
js
// Только базовая часть
import { createRestClient, PipelineOrchestrator } from 'rest-pipeline-js'

// Vue
import { PipelineOrchestrator, usePipelineRunVue } from 'rest-pipeline-js/vue'

// React
import { PipelineOrchestrator, usePipelineRunReact } from 'rest-pipeline-js/react'

// Тестирование (любой фреймворк — не входит в базовую точку входа)
import { createMockAdapter } from 'rest-pipeline-js/testing'

sideEffects: false — неиспользуемые точки входа удаляются tree-shaking'ом. react / react-dompeerDependencies.

Архитектура

rest-pipeline-js

├── createRestClient (HttpConfig) → RestClient
│     ├── RequestExecutor      — retry + backoff + Retry-After + таймаут через AbortController
│     ├── CacheManager         — in-memory TTL-кэш для GET-ответов
│     ├── RateLimiter          — конкурентность + скользящее окно запросы/интервал
│     ├── CircuitBreaker       — closed → open → half-open; отклоняет локально, когда открыт
│     ├── AuthProvider         — вставка Bearer; обновление по 401 + один повтор; опциональный кэш tokenTtlMs
│     ├── MetricsCollector     — коллбэки onRequestStart / onRequestEnd
│     ├── HeaderSanitizer      — маскирует чувствительные заголовки перед коллбэками метрик
│     ├── OfflineQueue         — ставит в очередь изменяющие запросы в офлайне, повторяет при восстановлении связи
│     └── HttpAdapter          — подключаемый транспорт (по умолчанию: axios; заменяется на fetch / edge)

├── PipelineOrchestrator (config, httpConfig?, sharedData?, options?)
│     ├── StageRunner          — цикл последовательного выполнения; параллельно через Promise.all
│     │     condition → pauseBefore → before → validateInput → request → after → validateOutput → pauseAfter
│     ├── MiddlewareRunner     — beforeEach / afterEach / onError для всех этапов
│     ├── EventBus             — on() / emit(); step:start|success|error|skipped|progress, log
│     ├── ProgressTracker      — subscribeProgress / subscribeStageResults / getProgress
│     ├── AbortController      — abort() отменяет текущий HTTP-запрос через AbortSignal
│     ├── PauseController      — контрольные точки между этапами pause() / resume()
│     ├── MetricsHooks         — onPipelineStart / onPipelineEnd / onStepDuration
│     ├── StateSerializer      — exportState() / importState() (stageResults + логи)
│     ├── PersistAdapter       — подключаемый save/load; автосохранение после каждого этапа
│     └── PluginManager        — жизненный цикл install() + destroy()

├── PipelineBuilder (pipe())
│     .step() / .parallel() / .subPipeline() / .stream() / .websocket() → .build() / .toConfig()

├── createPipeline()           — короткая фабрика, оборачивающая new PipelineOrchestrator()

├── validatePipelineConfig()   — дублирующиеся ключи, пустые ключи, проверка типов, рекурсивно

├── /vue   (отдельная точка входа)
│     usePipelineRunVue / usePipelineProgressVue / usePipelineLogsVue
│     usePipelineStepEventVue / useRestClientVue / usePipelineStageResultVue

├── /react (отдельная точка входа)
│     usePipelineRunReact / usePipelineProgressReact / usePipelineLogsReact
│     usePipelineStepEventReact / useRestClientReact / usePipelineStageResultReact

└── /testing (отдельная точка входа)
      createMockAdapter()   — HttpAdapter на основе определений маршрутов, без сети

Размер бандла и peer-зависимости

Точка входаPeer-зависимостиЗаметки
rest-pipeline-jsБазовая часть — оркестратор, HTTP-клиент, утилиты. Зависит от axios.
rest-pipeline-js/vuevue ^3.3Базовая часть + Vue composables
rest-pipeline-js/reactreact ^19, react-dom ^19Базовая часть + React hooks
rest-pipeline-js/testingТолько createMockAdapter() — не включает базовый клиент

Пакет поставляется как tree-shakeable ESM (dist/esm/) и CommonJS (dist/cjs/), каждый со своим package.json ({"type":"module"} / {"type":"commonjs"}), чтобы нативный ESM-резолвер Node мог загрузить его напрямую — не только через бандлеры. Каждая точка входа разбита на отдельные чанки — импорт одной не добавляет в бандл остальные. Размер контролируется в CI (см. ниже); текущий brotli-размер — около 25 КБ для точек входа core//vue//react (со всеми зависимостями — axios для core; vue/react — peer-зависимости, исключены) и заметно меньше 1 КБ для /testing.

Разработка

bash
npm install
npm run build          # tsc → dist/esm + dist/cjs, затем записывает маркеры типов dist/*/package.json
npm run verify:esm     # загружает каждую точку входа нативным ESM-резолвером Node (защита от регрессий)
npm test                # vitest — модульные тесты
npm run test:types      # vitest --typecheck — тесты уровня типов для протяжки TPrev в pipe()
npm run test:coverage   # vitest run --coverage, проверяет пороги из vitest.config.ts
npm run lint            # eslint .
npm run size             # пересобирает, затем проверяет brotli-размер каждой точки входа против .size-limit.json

.github/workflows/ci.yml запускает всё перечисленное выше (lint, сборку, проверку ESM-загрузки, тесты, тесты типов, покрытие, размер бандла) на Node 20/22/24 при каждом push и pull request. (Сам опубликованный пакет требует только Node 18+ — см. engines в package.json — но dev-инструментарий, Vite 7 / Vitest 4, нуждается в Node 20.19+/22.12+ уже просто для загрузки собственной конфигурации, поэтому CI больше не может проверять Node 18.)

Лицензия

MIT