Справочник
Точки входа
| Точка входа | Для чего | Содержимое |
|---|---|---|
rest-pipeline-js | Только базовая часть | PipelineOrchestrator, createRestClient, типы, утилиты. Без Vue/React. |
rest-pipeline-js/vue | Vue-проекты | Базовая часть + Vue composables |
rest-pipeline-js/react | React-проекты | Базовая часть + React hooks |
rest-pipeline-js/testing | Тесты (любой фреймворк) | createMockAdapter() — см. Тестирование |
dist/umd/rest-pipeline.umd.min.js | Тег <script> для CDN, без бандлера | Базовая часть со встроенным axios — см. Использование через CDN |
// Только базовая часть
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-dom — peerDependencies.
Архитектура
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/vue | vue ^3.3 | Базовая часть + Vue composables |
rest-pipeline-js/react | react ^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.
Разработка
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