- 0aa51b5: Added
- Context id plugin
-
b5a9a52: Added
- Hedge plugin implemented
- Bulkhead plugin implemented
- Integration tests
Changed
- baseDispatch made context-driven so wrapDispatch plugins can inject modified request and signal per attempt
Documentation
- Reworked and improved
- 434c2f3: Documentation
- Feature matrix updated in Readme
- 8543a59: Added
- downloadProgressPlugin with streaming progress callbacks
- 77f6e07: Changed
- Replaced string-based decoration marker with a Symbol in responseShortcutsPlugin to eliminate any possibility of key collision with third-party code
-
3095282: Added
- Added first-party requestShortcutsPlugin for HTTP method shortcuts on the client (get, post, put, patch, delete, head, options)
- Added first-party responseShortcutsPlugin for response parsing shortcuts on the returned request promise (json, text, blob, arrayBuffer, formData)
Documentation
- Reworked readme
- 20c43e2: Fixed
- Retry backoff to wake immediately on abort/timeout.
-
9633916: Added
- Introduced a plugin-first architecture for optional client behavior
- Added first-party Circuit Breaker plugin
- Added first-party Deduplication plugin with configurable hashing and cleanup options
- Added plugin extension support on the client for plugin-provided runtime state
Changed
- Refactored optional features to run through plugin lifecycle hooks instead of legacy feature flags
- Improved package module structure and exports for plugin-based usage
- Updated examples and guidance to reflect current runtime behavior and compatibility expectations
Documentation
- Expanded and clarified plugin architecture docs, migration guidance, hooks semantics, and compatibility notes
- Corrected edge-case behavior descriptions around retries, circuit state/callbacks, and runtime environment support
Tests
- Increased coverage across core client flows and plugin behavior
- Added/updated tests for circuit breaker and deduplication behavior, hook ordering semantics, retry behavior, and timeout/pending request scenarios
- Strengthened regression coverage for documented behavior and migration paths
- 3e3bf19: Added
- Optional dedupe map TTL cleanup
- Test coverage improvement
- 0fa5ccf: - Allow fetchHandler to be overriden on a per-request basis
- cff44a3: Added
- Optional request deduplication with customisable hash
- 0ceab1b: Added
- Discord section to readme
- 2485bc8: Fixed
- Discord announcement format
- 5a24353: Fixed
- Github Action to post announcement to Discord
- e458152: Fixed
- Discord announcement
- 9ad99a3: Fixed
- Discord announcement
- 8f0075f: Fixed
- Discord announcement GitHub action
- 1f7a45c: Fixed
- Discord announcement
- aa8b557: Fixed
- Discord announcement
- b5b706c: Fixed
- Discord announcement
- 7ebb34c: Added
- GitHub action to announce release on Discord
- 33228f8: Fixed
- documentation
- 0c19c30: Fixed
- links to github repo in docs
- 512bd86: Added
- throwOnHttpError flag added to config
- unified and hardened error handling for all error types and edge cases
- fab14c2: Fixed
- npm references in documentation
- be108a3: Changed
- migrated to @fetchkit/ffetch
- 77d2968: Changed
- Improved circuit breaker state handling and error propagation
- Refactored CircuitBreaker logic to use recordResult for unified error/success tracking
- Updated client to expose pendingRequests and abortAll as read-only properties via Object.defineProperty
- 4c79eb3: Added
- Circuit breaker state exposed
-
504825e: Added
- onCircuitClose hook added
Changed
- Unreachable code removed
- Tests added to improve doe coverage
Docs
- Broken table in api.md fixed
-
6812b91: Added
- fetchHandler option to support pluggable/custom fetch implementations (SSR, edge, frameworks, polyfills).
Changed
- Removed manual AbortSignal combination fallback; AbortSignal.any is now required (native or polyfill).
- Removed tests and code paths relying on the old signal combination fallback.
Docs
- Updated documentation to clarify AbortSignal.any requirement and polyfill instructions.
- a8bb7d4: Added
- controller created and exposed in pendingRequests
- abortAll() helper to abort all pending requests
-
854591c: Added
- tracking of pending requests
Changed
- AbortSignal.any fallback fixed
- timeout(0) properly handled (no timeout)
- signal combining fixed
Docs
- documentation refactored and expanded
- migration guide added
- c6f94fb: Added:
- Support for the HTTP Retry-After header in the default retry logic. If a server responds with a Retry-After header (in seconds or as a date), ffetch will honor it and use the specified delay before retrying.
-
22f70cd: Added
- Support for modern AbortSignal.timeout and AbortSignal.any APIs (requires polyfill for Node <20 and older browsers).
- cause property to all custom error classes for better error provenance.
Changed
- Refactored timeout and abort logic to use only AbortSignal APIs; removed manual timeout fallback.
- Tests now strictly assert error types and .cause properties.
- Improved test coverage for edge cases and fallback branches.
Docs
- Updated README with new prerequisites, error .cause documentation, and polyfill instructions.
- 4be1694: Minified build added
- 0b8870d: Support for complex retry strategies implemented
- 057320b: - Export TypeScript types for hooks and the client function, enabling full type safety and autocompletion for consumers.
- Add
transformRequestandtransformResponsehooks to allow advanced request/response transformation and customization.
- Add
- Add core resilience features:
- Timeouts: Requests are aborted if they exceed a configurable timeout.
- Retries: Failed requests are retried with customizable policy (
shouldRetry), including exponential backoff and jitter. - Circuit Breaker: Automatically blocks requests after repeated failures, with auto-reset after cooldown.
- Hooks: New lifecycle hooks for before, after, onError, onRetry, onTimeout, onAbort, onCircuitOpen, and onComplete, enabling advanced logging, metrics, and custom behaviors.
- Scaffolded TypeScript project:
package.jsonrenamed to ffetchsrc/index.ts,src/client.ts,src/types.tscreatedtsconfig.json+tsup.config.tsfor dual ESM/CJS build
- Tooling wired:
npm run build,test,lint,formatscripts- Vitest + coverage + happy-dom env
- Prettier + ESLint + Husky pre-commit hook
.gitignoreadded
- First test passes:
test/client.test.tsassertstypeof createClient() === 'function'
- Published v0.1.0 to npm registry:
npm logindone- Manual npm version patch → v0.1.1 (changesets unused for initial setup)