@fgrzl/fetch 1.1.0-alpha.7 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/CONTRIBUTING.md +327 -0
- package/README.md +50 -21
- package/dist/cjs/index.js +1110 -105
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.min.js +2 -0
- package/dist/cjs/index.min.js.map +1 -0
- package/dist/index.d.ts +1381 -10
- package/dist/index.js +1066 -91
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +2 -0
- package/dist/index.min.js.map +1 -0
- package/package.json +14 -5
- package/dist/cjs/client/fetch-client.d.ts +0 -189
- package/dist/cjs/client/fetch-client.d.ts.map +0 -1
- package/dist/cjs/client/fetch-client.js +0 -339
- package/dist/cjs/client/fetch-client.js.map +0 -1
- package/dist/cjs/client/index.d.ts +0 -11
- package/dist/cjs/client/index.d.ts.map +0 -1
- package/dist/cjs/client/index.js +0 -14
- package/dist/cjs/client/index.js.map +0 -1
- package/dist/cjs/client/types.d.ts +0 -63
- package/dist/cjs/client/types.d.ts.map +0 -1
- package/dist/cjs/client/types.js +0 -9
- package/dist/cjs/client/types.js.map +0 -1
- package/dist/cjs/errors/index.d.ts +0 -64
- package/dist/cjs/errors/index.d.ts.map +0 -1
- package/dist/cjs/errors/index.js +0 -79
- package/dist/cjs/errors/index.js.map +0 -1
- package/dist/cjs/index.d.ts +0 -65
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/middleware/authentication/authentication.d.ts +0 -31
- package/dist/cjs/middleware/authentication/authentication.d.ts.map +0 -1
- package/dist/cjs/middleware/authentication/authentication.js +0 -93
- package/dist/cjs/middleware/authentication/authentication.js.map +0 -1
- package/dist/cjs/middleware/authentication/index.d.ts +0 -37
- package/dist/cjs/middleware/authentication/index.d.ts.map +0 -1
- package/dist/cjs/middleware/authentication/index.js +0 -42
- package/dist/cjs/middleware/authentication/index.js.map +0 -1
- package/dist/cjs/middleware/authentication/types.d.ts +0 -73
- package/dist/cjs/middleware/authentication/types.d.ts.map +0 -1
- package/dist/cjs/middleware/authentication/types.js +0 -6
- package/dist/cjs/middleware/authentication/types.js.map +0 -1
- package/dist/cjs/middleware/authorization/authorization.d.ts +0 -30
- package/dist/cjs/middleware/authorization/authorization.d.ts.map +0 -1
- package/dist/cjs/middleware/authorization/authorization.js +0 -82
- package/dist/cjs/middleware/authorization/authorization.js.map +0 -1
- package/dist/cjs/middleware/authorization/index.d.ts +0 -36
- package/dist/cjs/middleware/authorization/index.d.ts.map +0 -1
- package/dist/cjs/middleware/authorization/index.js +0 -41
- package/dist/cjs/middleware/authorization/index.js.map +0 -1
- package/dist/cjs/middleware/authorization/types.d.ts +0 -67
- package/dist/cjs/middleware/authorization/types.d.ts.map +0 -1
- package/dist/cjs/middleware/authorization/types.js +0 -6
- package/dist/cjs/middleware/authorization/types.js.map +0 -1
- package/dist/cjs/middleware/cache/cache.d.ts +0 -41
- package/dist/cjs/middleware/cache/cache.d.ts.map +0 -1
- package/dist/cjs/middleware/cache/cache.js +0 -191
- package/dist/cjs/middleware/cache/cache.js.map +0 -1
- package/dist/cjs/middleware/cache/index.d.ts +0 -44
- package/dist/cjs/middleware/cache/index.d.ts.map +0 -1
- package/dist/cjs/middleware/cache/index.js +0 -50
- package/dist/cjs/middleware/cache/index.js.map +0 -1
- package/dist/cjs/middleware/cache/types.d.ts +0 -89
- package/dist/cjs/middleware/cache/types.d.ts.map +0 -1
- package/dist/cjs/middleware/cache/types.js +0 -6
- package/dist/cjs/middleware/cache/types.js.map +0 -1
- package/dist/cjs/middleware/csrf/csrf.d.ts +0 -34
- package/dist/cjs/middleware/csrf/csrf.d.ts.map +0 -1
- package/dist/cjs/middleware/csrf/csrf.js +0 -94
- package/dist/cjs/middleware/csrf/csrf.js.map +0 -1
- package/dist/cjs/middleware/csrf/index.d.ts +0 -57
- package/dist/cjs/middleware/csrf/index.d.ts.map +0 -1
- package/dist/cjs/middleware/csrf/index.js +0 -62
- package/dist/cjs/middleware/csrf/index.js.map +0 -1
- package/dist/cjs/middleware/csrf/types.d.ts +0 -57
- package/dist/cjs/middleware/csrf/types.d.ts.map +0 -1
- package/dist/cjs/middleware/csrf/types.js +0 -6
- package/dist/cjs/middleware/csrf/types.js.map +0 -1
- package/dist/cjs/middleware/index.d.ts +0 -115
- package/dist/cjs/middleware/index.d.ts.map +0 -1
- package/dist/cjs/middleware/index.js +0 -153
- package/dist/cjs/middleware/index.js.map +0 -1
- package/dist/cjs/middleware/logging/index.d.ts +0 -42
- package/dist/cjs/middleware/logging/index.d.ts.map +0 -1
- package/dist/cjs/middleware/logging/index.js +0 -47
- package/dist/cjs/middleware/logging/index.js.map +0 -1
- package/dist/cjs/middleware/logging/logging.d.ts +0 -29
- package/dist/cjs/middleware/logging/logging.d.ts.map +0 -1
- package/dist/cjs/middleware/logging/logging.js +0 -171
- package/dist/cjs/middleware/logging/logging.js.map +0 -1
- package/dist/cjs/middleware/logging/types.d.ts +0 -90
- package/dist/cjs/middleware/logging/types.d.ts.map +0 -1
- package/dist/cjs/middleware/logging/types.js +0 -6
- package/dist/cjs/middleware/logging/types.js.map +0 -1
- package/dist/cjs/middleware/rate-limit/index.d.ts +0 -16
- package/dist/cjs/middleware/rate-limit/index.d.ts.map +0 -1
- package/dist/cjs/middleware/rate-limit/index.js +0 -21
- package/dist/cjs/middleware/rate-limit/index.js.map +0 -1
- package/dist/cjs/middleware/rate-limit/rate-limit.d.ts +0 -14
- package/dist/cjs/middleware/rate-limit/rate-limit.d.ts.map +0 -1
- package/dist/cjs/middleware/rate-limit/rate-limit.js +0 -87
- package/dist/cjs/middleware/rate-limit/rate-limit.js.map +0 -1
- package/dist/cjs/middleware/rate-limit/types.d.ts +0 -97
- package/dist/cjs/middleware/rate-limit/types.d.ts.map +0 -1
- package/dist/cjs/middleware/rate-limit/types.js +0 -6
- package/dist/cjs/middleware/rate-limit/types.js.map +0 -1
- package/dist/cjs/middleware/retry/index.d.ts +0 -6
- package/dist/cjs/middleware/retry/index.d.ts.map +0 -1
- package/dist/cjs/middleware/retry/index.js +0 -11
- package/dist/cjs/middleware/retry/index.js.map +0 -1
- package/dist/cjs/middleware/retry/retry.d.ts +0 -39
- package/dist/cjs/middleware/retry/retry.d.ts.map +0 -1
- package/dist/cjs/middleware/retry/retry.js +0 -144
- package/dist/cjs/middleware/retry/retry.js.map +0 -1
- package/dist/cjs/middleware/retry/types.d.ts +0 -61
- package/dist/cjs/middleware/retry/types.d.ts.map +0 -1
- package/dist/cjs/middleware/retry/types.js +0 -6
- package/dist/cjs/middleware/retry/types.js.map +0 -1
- package/dist/client/fetch-client.d.ts +0 -189
- package/dist/client/fetch-client.d.ts.map +0 -1
- package/dist/client/fetch-client.js +0 -335
- package/dist/client/fetch-client.js.map +0 -1
- package/dist/client/index.d.ts +0 -11
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -10
- package/dist/client/index.js.map +0 -1
- package/dist/client/types.d.ts +0 -63
- package/dist/client/types.d.ts.map +0 -1
- package/dist/client/types.js +0 -8
- package/dist/client/types.js.map +0 -1
- package/dist/errors/index.d.ts +0 -64
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js +0 -73
- package/dist/errors/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/middleware/authentication/authentication.d.ts +0 -31
- package/dist/middleware/authentication/authentication.d.ts.map +0 -1
- package/dist/middleware/authentication/authentication.js +0 -90
- package/dist/middleware/authentication/authentication.js.map +0 -1
- package/dist/middleware/authentication/index.d.ts +0 -37
- package/dist/middleware/authentication/index.d.ts.map +0 -1
- package/dist/middleware/authentication/index.js +0 -37
- package/dist/middleware/authentication/index.js.map +0 -1
- package/dist/middleware/authentication/types.d.ts +0 -73
- package/dist/middleware/authentication/types.d.ts.map +0 -1
- package/dist/middleware/authentication/types.js +0 -5
- package/dist/middleware/authentication/types.js.map +0 -1
- package/dist/middleware/authorization/authorization.d.ts +0 -30
- package/dist/middleware/authorization/authorization.d.ts.map +0 -1
- package/dist/middleware/authorization/authorization.js +0 -79
- package/dist/middleware/authorization/authorization.js.map +0 -1
- package/dist/middleware/authorization/index.d.ts +0 -36
- package/dist/middleware/authorization/index.d.ts.map +0 -1
- package/dist/middleware/authorization/index.js +0 -36
- package/dist/middleware/authorization/index.js.map +0 -1
- package/dist/middleware/authorization/types.d.ts +0 -67
- package/dist/middleware/authorization/types.d.ts.map +0 -1
- package/dist/middleware/authorization/types.js +0 -5
- package/dist/middleware/authorization/types.js.map +0 -1
- package/dist/middleware/cache/cache.d.ts +0 -41
- package/dist/middleware/cache/cache.d.ts.map +0 -1
- package/dist/middleware/cache/cache.js +0 -186
- package/dist/middleware/cache/cache.js.map +0 -1
- package/dist/middleware/cache/index.d.ts +0 -44
- package/dist/middleware/cache/index.d.ts.map +0 -1
- package/dist/middleware/cache/index.js +0 -44
- package/dist/middleware/cache/index.js.map +0 -1
- package/dist/middleware/cache/types.d.ts +0 -89
- package/dist/middleware/cache/types.d.ts.map +0 -1
- package/dist/middleware/cache/types.js +0 -5
- package/dist/middleware/cache/types.js.map +0 -1
- package/dist/middleware/csrf/csrf.d.ts +0 -34
- package/dist/middleware/csrf/csrf.d.ts.map +0 -1
- package/dist/middleware/csrf/csrf.js +0 -91
- package/dist/middleware/csrf/csrf.js.map +0 -1
- package/dist/middleware/csrf/index.d.ts +0 -57
- package/dist/middleware/csrf/index.d.ts.map +0 -1
- package/dist/middleware/csrf/index.js +0 -57
- package/dist/middleware/csrf/index.js.map +0 -1
- package/dist/middleware/csrf/types.d.ts +0 -57
- package/dist/middleware/csrf/types.d.ts.map +0 -1
- package/dist/middleware/csrf/types.js +0 -5
- package/dist/middleware/csrf/types.js.map +0 -1
- package/dist/middleware/index.d.ts +0 -115
- package/dist/middleware/index.d.ts.map +0 -1
- package/dist/middleware/index.js +0 -134
- package/dist/middleware/index.js.map +0 -1
- package/dist/middleware/logging/index.d.ts +0 -42
- package/dist/middleware/logging/index.d.ts.map +0 -1
- package/dist/middleware/logging/index.js +0 -42
- package/dist/middleware/logging/index.js.map +0 -1
- package/dist/middleware/logging/logging.d.ts +0 -29
- package/dist/middleware/logging/logging.d.ts.map +0 -1
- package/dist/middleware/logging/logging.js +0 -168
- package/dist/middleware/logging/logging.js.map +0 -1
- package/dist/middleware/logging/types.d.ts +0 -90
- package/dist/middleware/logging/types.d.ts.map +0 -1
- package/dist/middleware/logging/types.js +0 -5
- package/dist/middleware/logging/types.js.map +0 -1
- package/dist/middleware/rate-limit/index.d.ts +0 -16
- package/dist/middleware/rate-limit/index.d.ts.map +0 -1
- package/dist/middleware/rate-limit/index.js +0 -16
- package/dist/middleware/rate-limit/index.js.map +0 -1
- package/dist/middleware/rate-limit/rate-limit.d.ts +0 -14
- package/dist/middleware/rate-limit/rate-limit.d.ts.map +0 -1
- package/dist/middleware/rate-limit/rate-limit.js +0 -84
- package/dist/middleware/rate-limit/rate-limit.js.map +0 -1
- package/dist/middleware/rate-limit/types.d.ts +0 -97
- package/dist/middleware/rate-limit/types.d.ts.map +0 -1
- package/dist/middleware/rate-limit/types.js +0 -5
- package/dist/middleware/rate-limit/types.js.map +0 -1
- package/dist/middleware/retry/index.d.ts +0 -6
- package/dist/middleware/retry/index.d.ts.map +0 -1
- package/dist/middleware/retry/index.js +0 -6
- package/dist/middleware/retry/index.js.map +0 -1
- package/dist/middleware/retry/retry.d.ts +0 -39
- package/dist/middleware/retry/retry.d.ts.map +0 -1
- package/dist/middleware/retry/retry.js +0 -141
- package/dist/middleware/retry/retry.js.map +0 -1
- package/dist/middleware/retry/types.d.ts +0 -61
- package/dist/middleware/retry/types.d.ts.map +0 -1
- package/dist/middleware/retry/types.js +0 -5
- package/dist/middleware/retry/types.js.map +0 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [1.1.0-alpha.12] - 2025-08-14
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- New features and enhancements
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- Updated dependencies and improvements
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- Bug fixes and patches
|
|
16
|
+
|
|
17
|
+
All notable changes to this project will be documented in this file.
|
|
18
|
+
|
|
19
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
20
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
21
|
+
|
|
22
|
+
## [Unreleased]
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- Initial release of @fgrzl/fetch
|
|
27
|
+
- TypeScript-first HTTP client with middleware support
|
|
28
|
+
- Built-in CSRF protection middleware
|
|
29
|
+
- Smart authorization middleware with redirect handling
|
|
30
|
+
- Authentication middleware with bearer token support
|
|
31
|
+
- Retry middleware with configurable strategies
|
|
32
|
+
- Response caching middleware
|
|
33
|
+
- Rate limiting middleware
|
|
34
|
+
- Comprehensive logging middleware
|
|
35
|
+
- Pre-built middleware stacks for common use cases
|
|
36
|
+
- Excellent TypeScript support with full type safety
|
|
37
|
+
- Zero dependencies
|
|
38
|
+
- Modern build system with tsup
|
|
39
|
+
- Comprehensive test suite (99.43% coverage)
|
|
40
|
+
- Detailed documentation with examples
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
|
|
44
|
+
### Deprecated
|
|
45
|
+
|
|
46
|
+
### Removed
|
|
47
|
+
|
|
48
|
+
### Fixed
|
|
49
|
+
|
|
50
|
+
### Security
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# Contributing to @fgrzl/fetch
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing! This guide will help you get started.
|
|
4
|
+
|
|
5
|
+
## 🚀 Getting Started
|
|
6
|
+
|
|
7
|
+
### Prerequisites
|
|
8
|
+
|
|
9
|
+
- Node.js 18+ and npm 9+
|
|
10
|
+
- Git
|
|
11
|
+
- Code editor (VS Code recommended)
|
|
12
|
+
|
|
13
|
+
### Development Setup
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Clone the repository
|
|
17
|
+
git clone https://github.com/fgrzl/fetch.git
|
|
18
|
+
cd fetch
|
|
19
|
+
|
|
20
|
+
# Install dependencies
|
|
21
|
+
npm install
|
|
22
|
+
|
|
23
|
+
# Run tests to ensure everything works
|
|
24
|
+
npm test
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 📋 Development Workflow
|
|
28
|
+
|
|
29
|
+
### 1. Branch Strategy
|
|
30
|
+
|
|
31
|
+
We follow GitFlow:
|
|
32
|
+
|
|
33
|
+
- `main` - Production releases
|
|
34
|
+
- `develop` - Active development
|
|
35
|
+
- `feature/*` - New features
|
|
36
|
+
- `fix/*` - Bug fixes
|
|
37
|
+
- `hotfix/*` - Critical fixes
|
|
38
|
+
|
|
39
|
+
### 2. Making Changes
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Create feature branch from develop
|
|
43
|
+
git checkout develop
|
|
44
|
+
git pull origin develop
|
|
45
|
+
git checkout -b feature/your-feature-name
|
|
46
|
+
|
|
47
|
+
# Make your changes...
|
|
48
|
+
|
|
49
|
+
# Run the development commands
|
|
50
|
+
npm run dev # Watch mode for development
|
|
51
|
+
npm run test:watch # Watch tests
|
|
52
|
+
npm run lint # Check code style
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 3. Quality Checks
|
|
56
|
+
|
|
57
|
+
Before submitting, ensure your code passes:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npm run test:coverage # All tests with coverage
|
|
61
|
+
npm run lint:check # ESLint checks
|
|
62
|
+
npm run format:check # Prettier formatting
|
|
63
|
+
npm run build # TypeScript compilation
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 4. Commit Guidelines
|
|
67
|
+
|
|
68
|
+
We use [Conventional Commits](https://www.conventionalcommits.org/):
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
feat: add CSRF middleware
|
|
72
|
+
fix: handle network timeout correctly
|
|
73
|
+
docs: update middleware examples
|
|
74
|
+
test: add edge case for retry logic
|
|
75
|
+
chore: update dependencies
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 🧪 Testing
|
|
79
|
+
|
|
80
|
+
### Test Structure
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
test/
|
|
84
|
+
├── unit/ # Unit tests
|
|
85
|
+
├── integration/ # Integration tests
|
|
86
|
+
├── edge-cases.test.ts # Edge cases and error scenarios
|
|
87
|
+
└── test-utils.ts # Testing utilities
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Writing Tests
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { describe, it, expect } from "vitest";
|
|
94
|
+
import { FetchClient } from "../src";
|
|
95
|
+
|
|
96
|
+
describe("Feature Name", () => {
|
|
97
|
+
it("should handle expected case", async () => {
|
|
98
|
+
// Arrange
|
|
99
|
+
const client = new FetchClient();
|
|
100
|
+
|
|
101
|
+
// Act
|
|
102
|
+
const result = await client.get("/test");
|
|
103
|
+
|
|
104
|
+
// Assert
|
|
105
|
+
expect(result.ok).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("should handle error case", async () => {
|
|
109
|
+
// Test error scenarios
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Test Coverage Requirements
|
|
115
|
+
|
|
116
|
+
- Maintain **>95%** line coverage
|
|
117
|
+
- Test both success and error paths
|
|
118
|
+
- Include edge cases and error scenarios
|
|
119
|
+
|
|
120
|
+
## 🛠 Code Standards
|
|
121
|
+
|
|
122
|
+
### TypeScript Guidelines
|
|
123
|
+
|
|
124
|
+
- Use strict TypeScript settings
|
|
125
|
+
- Prefer `interface` over `type` for object shapes
|
|
126
|
+
- Export types alongside implementations
|
|
127
|
+
- Add JSDoc comments for public APIs
|
|
128
|
+
|
|
129
|
+
### Code Style
|
|
130
|
+
|
|
131
|
+
- Use Prettier for formatting (configured in `.prettierrc`)
|
|
132
|
+
- Follow ESLint rules (configured in `eslint.config.ts`)
|
|
133
|
+
- Use meaningful variable names
|
|
134
|
+
- Keep functions focused and testable
|
|
135
|
+
|
|
136
|
+
### Example Code Style
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
/**
|
|
140
|
+
* Creates a new HTTP client with smart defaults.
|
|
141
|
+
*
|
|
142
|
+
* @param config - Optional configuration
|
|
143
|
+
* @returns Configured FetchClient instance
|
|
144
|
+
*/
|
|
145
|
+
export function createClient(config?: ClientConfig): FetchClient {
|
|
146
|
+
const client = new FetchClient(config);
|
|
147
|
+
|
|
148
|
+
// Apply smart defaults
|
|
149
|
+
useCSRF(client);
|
|
150
|
+
useRetry(client);
|
|
151
|
+
|
|
152
|
+
return client;
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## 📦 Adding New Features
|
|
157
|
+
|
|
158
|
+
### 1. Middleware Development
|
|
159
|
+
|
|
160
|
+
New middleware should:
|
|
161
|
+
|
|
162
|
+
- Follow the existing patterns in `src/middleware/`
|
|
163
|
+
- Include comprehensive tests
|
|
164
|
+
- Have TypeScript types exported
|
|
165
|
+
- Include documentation
|
|
166
|
+
|
|
167
|
+
Example structure:
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
src/middleware/my-feature/
|
|
171
|
+
├── index.ts # Public exports
|
|
172
|
+
├── my-feature.ts # Implementation
|
|
173
|
+
└── types.ts # TypeScript types
|
|
174
|
+
|
|
175
|
+
test/middleware/
|
|
176
|
+
└── my-feature.test.ts # Tests
|
|
177
|
+
|
|
178
|
+
docs/middleware/
|
|
179
|
+
└── my-feature.md # Documentation
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 2. Client Features
|
|
183
|
+
|
|
184
|
+
When modifying `FetchClient`:
|
|
185
|
+
|
|
186
|
+
- Maintain backward compatibility
|
|
187
|
+
- Add appropriate TypeScript types
|
|
188
|
+
- Test integration with existing middleware
|
|
189
|
+
- Update documentation
|
|
190
|
+
|
|
191
|
+
## 📚 Documentation
|
|
192
|
+
|
|
193
|
+
### Writing Documentation
|
|
194
|
+
|
|
195
|
+
- Use clear, concise language
|
|
196
|
+
- Include code examples
|
|
197
|
+
- Cover common use cases
|
|
198
|
+
- Document error scenarios
|
|
199
|
+
|
|
200
|
+
### Documentation Structure
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
docs/
|
|
204
|
+
├── *.md # Main guides
|
|
205
|
+
└── middleware/ # Middleware-specific docs
|
|
206
|
+
└── *.md
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## 🚀 Pull Request Process
|
|
210
|
+
|
|
211
|
+
### 1. Before Submitting
|
|
212
|
+
|
|
213
|
+
- [ ] Tests pass (`npm test`)
|
|
214
|
+
- [ ] Linting passes (`npm run lint:check`)
|
|
215
|
+
- [ ] Build succeeds (`npm run build`)
|
|
216
|
+
- [ ] Documentation updated if needed
|
|
217
|
+
- [ ] CHANGELOG.md updated (for significant changes)
|
|
218
|
+
|
|
219
|
+
### 2. PR Template
|
|
220
|
+
|
|
221
|
+
```markdown
|
|
222
|
+
## Description
|
|
223
|
+
|
|
224
|
+
Brief description of changes
|
|
225
|
+
|
|
226
|
+
## Type of Change
|
|
227
|
+
|
|
228
|
+
- [ ] Bug fix
|
|
229
|
+
- [ ] New feature
|
|
230
|
+
- [ ] Breaking change
|
|
231
|
+
- [ ] Documentation update
|
|
232
|
+
|
|
233
|
+
## Testing
|
|
234
|
+
|
|
235
|
+
- [ ] Added/updated tests
|
|
236
|
+
- [ ] All tests pass
|
|
237
|
+
- [ ] Manual testing completed
|
|
238
|
+
|
|
239
|
+
## Checklist
|
|
240
|
+
|
|
241
|
+
- [ ] Code follows style guidelines
|
|
242
|
+
- [ ] Self-review completed
|
|
243
|
+
- [ ] Documentation updated
|
|
244
|
+
- [ ] No breaking changes (or properly documented)
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### 3. Review Process
|
|
248
|
+
|
|
249
|
+
1. Automated checks must pass
|
|
250
|
+
2. Maintainer review required
|
|
251
|
+
3. Address feedback
|
|
252
|
+
4. Final approval and merge
|
|
253
|
+
|
|
254
|
+
## 🐛 Reporting Issues
|
|
255
|
+
|
|
256
|
+
### Bug Reports
|
|
257
|
+
|
|
258
|
+
Include:
|
|
259
|
+
|
|
260
|
+
- Library version
|
|
261
|
+
- Node.js version
|
|
262
|
+
- Minimal reproduction code
|
|
263
|
+
- Expected vs actual behavior
|
|
264
|
+
- Error messages/stack traces
|
|
265
|
+
|
|
266
|
+
### Feature Requests
|
|
267
|
+
|
|
268
|
+
Include:
|
|
269
|
+
|
|
270
|
+
- Use case description
|
|
271
|
+
- Proposed API (if applicable)
|
|
272
|
+
- Alternative solutions considered
|
|
273
|
+
- Willing to implement? (We love contributors!)
|
|
274
|
+
|
|
275
|
+
## 🤝 Code of Conduct
|
|
276
|
+
|
|
277
|
+
### Be Respectful
|
|
278
|
+
|
|
279
|
+
- Use inclusive language
|
|
280
|
+
- Be constructive in feedback
|
|
281
|
+
- Help create a welcoming environment
|
|
282
|
+
|
|
283
|
+
### Be Collaborative
|
|
284
|
+
|
|
285
|
+
- Ask questions when unsure
|
|
286
|
+
- Share knowledge
|
|
287
|
+
- Help others learn
|
|
288
|
+
|
|
289
|
+
## 💡 Getting Help
|
|
290
|
+
|
|
291
|
+
- **Questions**: Open a discussion
|
|
292
|
+
- **Bugs**: Create an issue
|
|
293
|
+
- **Features**: Start with a discussion
|
|
294
|
+
- **Chat**: Reach out to maintainers
|
|
295
|
+
|
|
296
|
+
## 📊 Development Scripts
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
# Development
|
|
300
|
+
npm run dev # Watch mode
|
|
301
|
+
npm run test:watch # Watch tests
|
|
302
|
+
|
|
303
|
+
# Quality
|
|
304
|
+
npm run test # Run all tests
|
|
305
|
+
npm run test:coverage # Tests with coverage
|
|
306
|
+
npm run lint # Fix linting issues
|
|
307
|
+
npm run lint:check # Check linting only
|
|
308
|
+
npm run format # Fix formatting
|
|
309
|
+
npm run format:check # Check formatting only
|
|
310
|
+
|
|
311
|
+
# Building
|
|
312
|
+
npm run build # Production build
|
|
313
|
+
npm run clean # Clean build artifacts
|
|
314
|
+
|
|
315
|
+
# Documentation
|
|
316
|
+
npm run docs:serve # Serve docs locally
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
## 🏆 Recognition
|
|
320
|
+
|
|
321
|
+
Contributors are recognized in:
|
|
322
|
+
|
|
323
|
+
- Repository contributors list
|
|
324
|
+
- Release notes for significant contributions
|
|
325
|
+
- Special thanks for major features
|
|
326
|
+
|
|
327
|
+
Thank you for making @fgrzl/fetch better! 🎉
|
package/README.md
CHANGED
|
@@ -3,51 +3,55 @@
|
|
|
3
3
|
|
|
4
4
|
# @fgrzl/fetch
|
|
5
5
|
|
|
6
|
-
A
|
|
6
|
+
A production-ready HTTP client for TypeScript that **just works** out of the box.
|
|
7
7
|
|
|
8
8
|
## ✨ Features
|
|
9
9
|
|
|
10
10
|
- **Pit of Success Design**: Simple defaults that just work, customizable when needed
|
|
11
11
|
- Simple API: `api.get('/api/user')`
|
|
12
12
|
- Built-in CSRF token support (XSRF-TOKEN standard)
|
|
13
|
-
-
|
|
13
|
+
- Smart 401 redirect handling with return URL preservation
|
|
14
14
|
- Retry middleware with configurable strategies
|
|
15
15
|
- Custom middleware support (request/response)
|
|
16
16
|
- TypeScript-first, small and dependency-free
|
|
17
17
|
|
|
18
18
|
## 📦 Installation
|
|
19
19
|
|
|
20
|
+
**Install**
|
|
21
|
+
|
|
20
22
|
```bash
|
|
21
23
|
npm install @fgrzl/fetch
|
|
22
24
|
```
|
|
23
25
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
**Level 1: Just works with defaults**
|
|
26
|
+
**Use immediately** - no configuration required:
|
|
27
27
|
|
|
28
28
|
```ts
|
|
29
29
|
import api from "@fgrzl/fetch";
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
// It just works! 🎉
|
|
32
|
+
const users = await api.get("/api/users");
|
|
33
|
+
const newUser = await api.post("/api/users", { name: "John" });
|
|
34
|
+
|
|
35
|
+
// Built-in error handling
|
|
36
|
+
if (users.ok) {
|
|
37
|
+
console.log("Users:", users.data);
|
|
34
38
|
} else {
|
|
35
|
-
console.error(
|
|
39
|
+
console.error("Error:", users.error?.message);
|
|
36
40
|
}
|
|
37
41
|
```
|
|
38
42
|
|
|
39
|
-
**
|
|
43
|
+
**Need custom config?** Add it when you need it:
|
|
40
44
|
|
|
41
45
|
```ts
|
|
42
|
-
import { FetchClient,
|
|
46
|
+
import { FetchClient, useAuthentication } from "@fgrzl/fetch";
|
|
43
47
|
|
|
44
|
-
const
|
|
45
|
-
|
|
48
|
+
const authClient = useAuthentication(new FetchClient(), {
|
|
49
|
+
tokenProvider: () => localStorage.getItem("token") || "",
|
|
46
50
|
});
|
|
47
51
|
|
|
48
52
|
// Smart defaults - just works
|
|
49
53
|
useCSRF(client);
|
|
50
|
-
useAuthorization(client);
|
|
54
|
+
useAuthorization(client); // Redirects to /login with return URL
|
|
51
55
|
useRetry(client);
|
|
52
56
|
|
|
53
57
|
// All requests now return FetchResponse<T>
|
|
@@ -63,16 +67,41 @@ if (userResponse.ok) {
|
|
|
63
67
|
}
|
|
64
68
|
```
|
|
65
69
|
|
|
66
|
-
|
|
70
|
+
## ✨ What You Get Out of the Box
|
|
71
|
+
|
|
72
|
+
- **Zero Configuration** - Works immediately with smart defaults
|
|
73
|
+
- **CSRF Protection** - Automatic XSRF-TOKEN handling
|
|
74
|
+
- **Retry Logic** - Exponential backoff for failed requests
|
|
75
|
+
- **Request Logging** - Built-in observability
|
|
76
|
+
- **TypeScript First** - Full type safety and IntelliSense
|
|
77
|
+
- **Middleware System** - Composable and extensible
|
|
78
|
+
|
|
79
|
+
## 📚 Documentation
|
|
80
|
+
|
|
81
|
+
Ready to go deeper? Check out our comprehensive guides:
|
|
82
|
+
|
|
83
|
+
- **[Getting Started](docs/getting-started.md)** - Installation and basic usage
|
|
84
|
+
- **[Configuration](docs/configuration.md)** - Advanced client setup
|
|
85
|
+
- **[Middleware](docs/middleware.md)** - Authentication, caching, retries
|
|
86
|
+
- **[Error Handling](docs/error-handling.md)** - Robust error management
|
|
87
|
+
- **[TypeScript Guide](docs/typescript.md)** - Type-safe API calls
|
|
88
|
+
- **[Troubleshooting](docs/troubleshooting.md)** - Common issues and solutions
|
|
89
|
+
|
|
90
|
+
### 🔧 For Maintainers
|
|
91
|
+
|
|
92
|
+
- **[Release Guide](docs/releases.md)** - How to create releases
|
|
93
|
+
- **[Contributing](CONTRIBUTING.md)** - Development setup and guidelines
|
|
94
|
+
|
|
95
|
+
## 🏗️ Architecture
|
|
67
96
|
|
|
68
|
-
|
|
97
|
+
Built on a **"pit of success"** philosophy where:
|
|
69
98
|
|
|
70
|
-
-
|
|
71
|
-
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
99
|
+
- Simple things are simple (`api.get("/path")`)
|
|
100
|
+
- Complex things are possible (custom middleware stacks)
|
|
101
|
+
- TypeScript guides you to correct usage
|
|
102
|
+
- Smart defaults handle 80% of use cases
|
|
74
103
|
|
|
75
|
-
|
|
104
|
+
[Learn more about our architecture →](docs/architecture.md)
|
|
76
105
|
|
|
77
106
|
## License
|
|
78
107
|
|