bytekit 1.0.31 → 2.0.6
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/README.md +58 -188
- package/bin/bytekit.js +0 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/swagger-generator.d.ts +1 -1
- package/dist/cli/swagger-generator.d.ts.map +1 -1
- package/dist/cli/swagger-generator.js +9 -5
- package/dist/cli/swagger-generator.js.map +1 -1
- package/dist/utils/core/ApiClient.d.ts +13 -12
- package/dist/utils/core/ApiClient.d.ts.map +1 -1
- package/dist/utils/core/ApiClient.js +24 -13
- package/dist/utils/core/ApiClient.js.map +1 -1
- package/dist/utils/core/SchemaAdapter.d.ts +35 -0
- package/dist/utils/core/SchemaAdapter.d.ts.map +1 -0
- package/dist/utils/core/SchemaAdapter.js +36 -0
- package/dist/utils/core/SchemaAdapter.js.map +1 -0
- package/dist/utils/core/index.d.ts +1 -1
- package/dist/utils/core/index.d.ts.map +1 -1
- package/dist/utils/core/index.js +1 -1
- package/dist/utils/core/index.js.map +1 -1
- package/dist/utils/helpers/CryptoUtils.d.ts +30 -3
- package/dist/utils/helpers/CryptoUtils.d.ts.map +1 -1
- package/dist/utils/helpers/CryptoUtils.js +83 -5
- package/dist/utils/helpers/CryptoUtils.js.map +1 -1
- package/dist/utils/helpers/QueryStringHelper.d.ts +11 -0
- package/dist/utils/helpers/QueryStringHelper.d.ts.map +1 -0
- package/dist/utils/helpers/QueryStringHelper.js +84 -0
- package/dist/utils/helpers/QueryStringHelper.js.map +1 -0
- package/dist/utils/helpers/UrlSlugHelper.d.ts +19 -0
- package/dist/utils/helpers/UrlSlugHelper.d.ts.map +1 -0
- package/dist/utils/helpers/UrlSlugHelper.js +27 -0
- package/dist/utils/helpers/UrlSlugHelper.js.map +1 -0
- package/dist/utils/helpers/index.d.ts +2 -13
- package/dist/utils/helpers/index.d.ts.map +1 -1
- package/dist/utils/helpers/index.js +2 -13
- package/dist/utils/helpers/index.js.map +1 -1
- package/dist/utils/index.d.ts +2 -8
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -8
- package/dist/utils/index.js.map +1 -1
- package/package.json +192 -249
- package/dist/color-utils.d.ts +0 -2
- package/dist/color-utils.d.ts.map +0 -1
- package/dist/color-utils.js +0 -2
- package/dist/color-utils.js.map +0 -1
- package/dist/date-utils.d.ts +0 -2
- package/dist/date-utils.d.ts.map +0 -1
- package/dist/date-utils.js +0 -2
- package/dist/date-utils.js.map +0 -1
- package/dist/number-utils.d.ts +0 -2
- package/dist/number-utils.d.ts.map +0 -1
- package/dist/number-utils.js +0 -2
- package/dist/number-utils.js.map +0 -1
- package/dist/string-utils.d.ts +0 -2
- package/dist/string-utils.d.ts.map +0 -1
- package/dist/string-utils.js +0 -2
- package/dist/string-utils.js.map +0 -1
- package/dist/utils/core/BatchRequest.d.ts +0 -79
- package/dist/utils/core/BatchRequest.d.ts.map +0 -1
- package/dist/utils/core/BatchRequest.js +0 -152
- package/dist/utils/core/BatchRequest.js.map +0 -1
- package/dist/utils/core/QueryClient.d.ts +0 -145
- package/dist/utils/core/QueryClient.d.ts.map +0 -1
- package/dist/utils/core/QueryClient.js +0 -453
- package/dist/utils/core/QueryClient.js.map +0 -1
- package/dist/utils/core/QueryState.d.ts +0 -99
- package/dist/utils/core/QueryState.d.ts.map +0 -1
- package/dist/utils/core/QueryState.js +0 -65
- package/dist/utils/core/QueryState.js.map +0 -1
- package/dist/utils/helpers/ArrayUtils.d.ts +0 -134
- package/dist/utils/helpers/ArrayUtils.d.ts.map +0 -1
- package/dist/utils/helpers/ArrayUtils.js +0 -306
- package/dist/utils/helpers/ArrayUtils.js.map +0 -1
- package/dist/utils/helpers/ColorUtils.d.ts +0 -235
- package/dist/utils/helpers/ColorUtils.d.ts.map +0 -1
- package/dist/utils/helpers/ColorUtils.js +0 -598
- package/dist/utils/helpers/ColorUtils.js.map +0 -1
- package/dist/utils/helpers/DateUtils.d.ts +0 -36
- package/dist/utils/helpers/DateUtils.d.ts.map +0 -1
- package/dist/utils/helpers/DateUtils.js +0 -131
- package/dist/utils/helpers/DateUtils.js.map +0 -1
- package/dist/utils/helpers/FormUtils.d.ts +0 -176
- package/dist/utils/helpers/FormUtils.d.ts.map +0 -1
- package/dist/utils/helpers/FormUtils.js +0 -437
- package/dist/utils/helpers/FormUtils.js.map +0 -1
- package/dist/utils/helpers/HttpStatusHelper.d.ts +0 -82
- package/dist/utils/helpers/HttpStatusHelper.d.ts.map +0 -1
- package/dist/utils/helpers/HttpStatusHelper.js +0 -174
- package/dist/utils/helpers/HttpStatusHelper.js.map +0 -1
- package/dist/utils/helpers/NumberUtils.d.ts +0 -230
- package/dist/utils/helpers/NumberUtils.d.ts.map +0 -1
- package/dist/utils/helpers/NumberUtils.js +0 -564
- package/dist/utils/helpers/NumberUtils.js.map +0 -1
- package/dist/utils/helpers/ObjectUtils.d.ts +0 -102
- package/dist/utils/helpers/ObjectUtils.d.ts.map +0 -1
- package/dist/utils/helpers/ObjectUtils.js +0 -301
- package/dist/utils/helpers/ObjectUtils.js.map +0 -1
- package/dist/utils/helpers/PaginationHelper.d.ts +0 -127
- package/dist/utils/helpers/PaginationHelper.d.ts.map +0 -1
- package/dist/utils/helpers/PaginationHelper.js +0 -295
- package/dist/utils/helpers/PaginationHelper.js.map +0 -1
- package/dist/utils/helpers/Signal.d.ts +0 -92
- package/dist/utils/helpers/Signal.d.ts.map +0 -1
- package/dist/utils/helpers/Signal.js +0 -243
- package/dist/utils/helpers/Signal.js.map +0 -1
- package/dist/utils/helpers/StringUtils.d.ts +0 -46
- package/dist/utils/helpers/StringUtils.d.ts.map +0 -1
- package/dist/utils/helpers/StringUtils.js +0 -228
- package/dist/utils/helpers/StringUtils.js.map +0 -1
- package/dist/utils/helpers/TimeUtils.d.ts +0 -87
- package/dist/utils/helpers/TimeUtils.d.ts.map +0 -1
- package/dist/utils/helpers/TimeUtils.js +0 -234
- package/dist/utils/helpers/TimeUtils.js.map +0 -1
- package/dist/utils/helpers/UrlBuilder.d.ts +0 -79
- package/dist/utils/helpers/UrlBuilder.d.ts.map +0 -1
- package/dist/utils/helpers/UrlBuilder.js +0 -161
- package/dist/utils/helpers/UrlBuilder.js.map +0 -1
- package/dist/utils/helpers/Validator.d.ts +0 -31
- package/dist/utils/helpers/Validator.d.ts.map +0 -1
- package/dist/utils/helpers/Validator.js +0 -175
- package/dist/utils/helpers/Validator.js.map +0 -1
- package/dist/utils/helpers/useSignal.d.ts +0 -11
- package/dist/utils/helpers/useSignal.d.ts.map +0 -1
- package/dist/utils/helpers/useSignal.js +0 -11
- package/dist/utils/helpers/useSignal.js.map +0 -1
- package/dist/validator.d.ts +0 -2
- package/dist/validator.d.ts.map +0 -1
- package/dist/validator.js +0 -2
- package/dist/validator.js.map +0 -1
package/README.md
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> **Previously known as:** `@sebamar88/utils` (v0.1.9 and earlier)
|
|
4
4
|
|
|
5
|
-
**EN:**
|
|
6
|
-
**ES:**
|
|
5
|
+
**EN:** A lean, high-performance TypeScript toolkit focused on **Isomorphic HTTP Networking** and **Advanced Async Utilities**. Deep-zero dependencies.
|
|
6
|
+
**ES:** Un toolkit TypeScript ligero y de alto rendimiento enfocado en **Networking HTTP Isomórfico** y **Utilidades Asíncronas Avanzadas**. Cero dependencias.
|
|
7
7
|
|
|
8
8
|
## 📊 Status / Estado
|
|
9
9
|
|
|
@@ -14,22 +14,18 @@
|
|
|
14
14
|
[](https://www.npmjs.com/package/bytekit)
|
|
15
15
|
[](https://bundlephobia.com/package/bytekit)
|
|
16
16
|
[](https://opensource.org/licenses/MIT)
|
|
17
|
-
[](https://nodejs.org)
|
|
18
|
-
[](https://www.typescriptlang.org/)
|
|
19
|
-
[](https://github.com/sebamar88/bytekit/blob/main/CONTRIBUTING.md)
|
|
20
17
|
|
|
21
18
|
---
|
|
22
19
|
|
|
23
20
|
## ✨ Highlights / Características
|
|
24
21
|
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
- 🔁 **
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
- ⚡ **EN:** Optimized for performance and small bundle size. **ES:** Optimizado para rendimiento y tamaño mínimo.
|
|
22
|
+
- 🌐 **Isomorphic ApiClient:** Works on Node.js 18+ and modern browsers (native fetch).
|
|
23
|
+
- 🛡️ **Schema Validation:** Built-in adapters for Zod and Valibot. Fully typed responses.
|
|
24
|
+
- 🔁 **HTTP Resilience:** Retries, Circuit Breaker, Rate Limiting, Request Cache, and Deduplication out of the box.
|
|
25
|
+
- ⚡ **Async Toolkit:** A powerful set of tools for concurrency (`parallel`, `race`), timing (`sleep`, `timeout`), and execution control (`retry`, `debounce`, `throttle`).
|
|
26
|
+
- 📦 **Deep-Zero Dependencies:** No external runtime packages added to your bundle.
|
|
27
|
+
- 🪵 **Observability:** Structured logging and performance profiling modules.
|
|
28
|
+
- 🎯 **95%+ Test Coverage:** Rigorously tested core.
|
|
33
29
|
|
|
34
30
|
## 🚀 Quick Start / Inicio Rápido
|
|
35
31
|
|
|
@@ -43,202 +39,80 @@ pnpm add bytekit
|
|
|
43
39
|
yarn add bytekit
|
|
44
40
|
```
|
|
45
41
|
|
|
46
|
-
###
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
npm install -g bytekit
|
|
50
|
-
# Then use / Luego usa:
|
|
51
|
-
sutils create users
|
|
52
|
-
sutils types https://api.example.com/users
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Basic Usage / Uso Básico
|
|
42
|
+
### 1. HTTP Client with Schema Validation (Zod)
|
|
56
43
|
|
|
57
44
|
```ts
|
|
58
|
-
import { ApiClient
|
|
45
|
+
import { ApiClient } from "bytekit/api-client";
|
|
46
|
+
import { zodAdapter } from "bytekit/schema-adapter";
|
|
47
|
+
import { z } from "zod";
|
|
48
|
+
|
|
49
|
+
const UserSchema = z.object({
|
|
50
|
+
id: z.number(),
|
|
51
|
+
name: z.string(),
|
|
52
|
+
});
|
|
59
53
|
|
|
60
54
|
const http = new ApiClient({
|
|
61
55
|
baseUrl: "https://api.my-service.com",
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
errorMessages: {
|
|
65
|
-
es: { 418: "Soy una tetera ☕" },
|
|
66
|
-
},
|
|
56
|
+
retryPolicy: { maxAttempts: 3 }, // Automatic retries
|
|
57
|
+
circuitBreaker: { failureThreshold: 5 } // Prevent cascading failures
|
|
67
58
|
});
|
|
68
59
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const slug = StringUtils.slugify("New Users – October 2024");
|
|
60
|
+
// The response is safely validated and typed as { id: number, name: string }
|
|
61
|
+
const user = await http.get("/users/1", {
|
|
62
|
+
validateResponse: zodAdapter(UserSchema)
|
|
63
|
+
});
|
|
75
64
|
```
|
|
76
65
|
|
|
77
|
-
###
|
|
66
|
+
### 2. Async Toolkit
|
|
78
67
|
|
|
79
68
|
```ts
|
|
80
|
-
|
|
81
|
-
// Importa módulos específicos para reducir el tamaño del bundle
|
|
82
|
-
|
|
83
|
-
// Core modules / Módulos core
|
|
84
|
-
import { ApiClient } from "bytekit/api-client";
|
|
85
|
-
import { Logger } from "bytekit/logger";
|
|
86
|
-
import { RetryPolicy } from "bytekit/retry-policy";
|
|
87
|
-
|
|
88
|
-
// Helper modules / Módulos helpers
|
|
89
|
-
import { DateUtils } from "bytekit/date-utils";
|
|
90
|
-
import { StringUtils } from "bytekit/string-utils";
|
|
91
|
-
import { ArrayUtils } from "bytekit/array-utils";
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## 🎯 Framework Support / Soporte de Frameworks
|
|
95
|
-
|
|
96
|
-
**EN:** Works seamlessly with React, Vue, Svelte, Angular, Next.js, Nuxt, SvelteKit, and more.
|
|
97
|
-
**ES:** Funciona perfectamente con React, Vue, Svelte, Angular, Next.js, Nuxt, SvelteKit y más.
|
|
98
|
-
|
|
99
|
-
### React Example / Ejemplo React
|
|
100
|
-
|
|
101
|
-
```jsx
|
|
102
|
-
import { createApiClient } from "bytekit";
|
|
103
|
-
import { useState, useEffect } from "react";
|
|
104
|
-
|
|
105
|
-
function Users() {
|
|
106
|
-
const client = createApiClient({ baseURL: "https://api.example.com" });
|
|
107
|
-
const [users, setUsers] = useState([]);
|
|
108
|
-
|
|
109
|
-
useEffect(() => {
|
|
110
|
-
client.get("/users").then(setUsers);
|
|
111
|
-
}, [client]);
|
|
112
|
-
|
|
113
|
-
return (
|
|
114
|
-
<div>
|
|
115
|
-
{users.map((u) => (
|
|
116
|
-
<div key={u.id}>{u.name}</div>
|
|
117
|
-
))}
|
|
118
|
-
</div>
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
**[📖 View More Framework Examples →](https://github.com/sebamar88/bytekit/wiki/Framework-Examples)**
|
|
124
|
-
|
|
125
|
-
## 📚 Complete Documentation / Documentación Completa
|
|
126
|
-
|
|
127
|
-
**EN:** For detailed documentation of all 28 modules, visit our comprehensive GitHub Wiki.
|
|
128
|
-
**ES:** Para documentación detallada de todos los 28 módulos, visita nuestra GitHub Wiki completa.
|
|
129
|
-
|
|
130
|
-
### 🔗 Quick Links by Category / Enlaces Rápidos por Categoría
|
|
131
|
-
|
|
132
|
-
#### 🔧 Core Modules (9) - Essential functionality / Funcionalidad esencial
|
|
69
|
+
import { parallel, retry, sleep, debounceAsync } from "bytekit/async";
|
|
133
70
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
- **[RequestCache](https://github.com/sebamar88/bytekit/wiki/RequestCache)** - RequestCache utilities and helpers
|
|
140
|
-
- **[RateLimiter](https://github.com/sebamar88/bytekit/wiki/RateLimiter)** - RateLimiter utilities and helpers
|
|
141
|
-
- **[RequestDeduplicator](https://github.com/sebamar88/bytekit/wiki/RequestDeduplicator)** - RequestDeduplicator utilities and helpers
|
|
142
|
-
- **[ErrorBoundary](https://github.com/sebamar88/bytekit/wiki/ErrorBoundary)** - ErrorBoundary utilities and helpers
|
|
143
|
-
|
|
144
|
-
#### 🛠️ Helper Modules (12) - Common utilities / Utilidades comunes
|
|
145
|
-
|
|
146
|
-
- **[DateUtils](https://github.com/sebamar88/bytekit/wiki/DateUtils)** - Safe date parsing, manipulation, and formatting (locale or custom tokens like YYYY-MM-DD)
|
|
147
|
-
- **[StringUtils](https://github.com/sebamar88/bytekit/wiki/StringUtils)** - Text processing: slugify, capitalize, mask, interpolate, and case conversions (pascalCase, camelCase, snakeCase, kebabCase)
|
|
148
|
-
- **[Validator](https://github.com/sebamar88/bytekit/wiki/Validator)** - Validation utilities for emails, phones, CUIT/CUIL, CBU, and more
|
|
149
|
-
- **[EnvManager](https://github.com/sebamar88/bytekit/wiki/EnvManager)** - EnvManager utilities and helpers
|
|
150
|
-
- **[StorageUtils](https://github.com/sebamar88/bytekit/wiki/StorageUtils)** - StorageUtils utilities and helpers
|
|
151
|
-
- **[FileUploadHelper](https://github.com/sebamar88/bytekit/wiki/FileUploadHelper)** - FileUploadHelper utilities and helpers
|
|
152
|
-
- **[StreamingHelper](https://github.com/sebamar88/bytekit/wiki/StreamingHelper)** - StreamingHelper utilities and helpers
|
|
153
|
-
- **[WebSocketHelper](https://github.com/sebamar88/bytekit/wiki/WebSocketHelper)** - WebSocketHelper utilities and helpers
|
|
154
|
-
- **[ArrayUtils](https://github.com/sebamar88/bytekit/wiki/ArrayUtils)** - Array manipulation utilities: chunk, flatten, unique, shuffle, zip
|
|
155
|
-
- **[ObjectUtils](https://github.com/sebamar88/bytekit/wiki/ObjectUtils)** - Object manipulation utilities: merge, pick, omit, flatten, groupBy
|
|
156
|
-
- **[FormUtils](https://github.com/sebamar88/bytekit/wiki/FormUtils)** - FormUtils utilities and helpers
|
|
157
|
-
- **[TimeUtils](https://github.com/sebamar88/bytekit/wiki/TimeUtils)** - TimeUtils utilities and helpers
|
|
158
|
-
|
|
159
|
-
#### ⚡ Utility Modules (7) - Advanced features / Características avanzadas
|
|
160
|
-
|
|
161
|
-
- **[EventEmitter](https://github.com/sebamar88/bytekit/wiki/EventEmitter)** - EventEmitter utilities and helpers
|
|
162
|
-
- **[DiffUtils](https://github.com/sebamar88/bytekit/wiki/DiffUtils)** - DiffUtils utilities and helpers
|
|
163
|
-
- **[PollingHelper](https://github.com/sebamar88/bytekit/wiki/PollingHelper)** - PollingHelper utilities and helpers
|
|
164
|
-
- **[CryptoUtils](https://github.com/sebamar88/bytekit/wiki/CryptoUtils)** - Token/UUID generation, base64 encoding, hashing, and HMAC
|
|
165
|
-
- **[PaginationHelper](https://github.com/sebamar88/bytekit/wiki/PaginationHelper)** - PaginationHelper utilities and helpers
|
|
166
|
-
- **[CacheManager](https://github.com/sebamar88/bytekit/wiki/CacheManager)** - Multi-tier cache with TTL, LRU eviction, and statistics
|
|
167
|
-
- **[CompressionUtils](https://github.com/sebamar88/bytekit/wiki/CompressionUtils)** - CompressionUtils utilities and helpers
|
|
168
|
-
|
|
169
|
-
**[🏠 Browse Full Wiki Index →](https://github.com/sebamar88/bytekit/wiki)**
|
|
170
|
-
|
|
171
|
-
## 🌟 Popular Use Cases / Casos de Uso Populares
|
|
172
|
-
|
|
173
|
-
### HTTP Client with Retries / Cliente HTTP con Reintentos
|
|
174
|
-
|
|
175
|
-
```ts
|
|
176
|
-
const api = new ApiClient({
|
|
177
|
-
baseUrl: "https://api.example.com",
|
|
178
|
-
retryPolicy: { maxAttempts: 3, initialDelayMs: 100 },
|
|
179
|
-
circuitBreaker: { failureThreshold: 5 },
|
|
71
|
+
// Retry an async operation automatically
|
|
72
|
+
const data = await retry(fetchDataFromUnstableAPI, {
|
|
73
|
+
maxAttempts: 5,
|
|
74
|
+
delayMs: 1000,
|
|
75
|
+
backoff: "exponential"
|
|
180
76
|
});
|
|
181
77
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
### Structured Logging / Logging Estructurado
|
|
78
|
+
// Run tasks in parallel with a concurrency limit
|
|
79
|
+
const results = await parallel(tasks, { concurrency: 3 });
|
|
186
80
|
|
|
187
|
-
|
|
188
|
-
const
|
|
189
|
-
logger.info("User created", { userId: 123, email: "user@example.com" });
|
|
81
|
+
// Debounce an async function
|
|
82
|
+
const fetchSuggestions = debounceAsync(api.getSuggestions, { waitMs: 300 });
|
|
190
83
|
```
|
|
191
84
|
|
|
192
|
-
###
|
|
85
|
+
### 3. Modular Imports / Importaciones Modulares
|
|
193
86
|
|
|
194
|
-
|
|
195
|
-
const formatted = DateUtils.format(new Date(), "es-AR");
|
|
196
|
-
const slug = StringUtils.slugify("Hello World! 🌍");
|
|
197
|
-
const masked = StringUtils.mask("1234567890", { start: 4, end: 2 });
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
### Array & Object Manipulation / Manipulación de Arrays y Objetos
|
|
87
|
+
Bytekit is fully tree-shakeable. You can import exactly what you need:
|
|
201
88
|
|
|
202
89
|
```ts
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
90
|
+
import { ApiClient } from "bytekit/api-client";
|
|
91
|
+
import { Logger } from "bytekit/logger";
|
|
92
|
+
import { retry, timeout } from "bytekit/async";
|
|
93
|
+
import { UrlSlugHelper } from "bytekit/url-slug-helper";
|
|
206
94
|
```
|
|
207
95
|
|
|
208
|
-
##
|
|
209
|
-
|
|
210
|
-
**EN:** Try bytekit in your browser with these interactive examples:
|
|
211
|
-
**ES:** Prueba bytekit en tu navegador con estos ejemplos interactivos:
|
|
212
|
-
|
|
213
|
-
- **[React Example](https://codesandbox.io/p/devbox/bytekit-react-example-gr2k2j)** - Complete React app with ApiClient
|
|
214
|
-
- **[Vue Example](https://codesandbox.io/p/devbox/df26fs)** - Vue 3 composition API usage
|
|
215
|
-
- **[Svelte Example](https://codesandbox.io/p/devbox/lxvghg)** - Svelte integration example
|
|
216
|
-
|
|
217
|
-
**[📁 View Local Examples →](https://github.com/sebamar88/bytekit/tree/main/examples)**
|
|
218
|
-
|
|
219
|
-
## � Documentation / Documentación
|
|
96
|
+
## 📚 Core Modules
|
|
220
97
|
|
|
221
|
-
|
|
222
|
-
|
|
98
|
+
### 🔧 Networking & Resilience
|
|
99
|
+
- **`ApiClient`** - Typed HTTP client with interceptors, retries, and schema validation support.
|
|
100
|
+
- **`SchemaAdapter`** - Generic adapter to plug your favorite validation library (Zod, Valibot).
|
|
101
|
+
- **`RetryPolicy` & `CircuitBreaker`** - Prevent failures and handle flaky endpoints.
|
|
102
|
+
- **`RequestCache` & `RequestDeduplicator`** - Optimize your network bandwidth.
|
|
103
|
+
- **`RateLimiter`** - Throttle your outbound requests.
|
|
223
104
|
|
|
224
|
-
|
|
225
|
-
-
|
|
226
|
-
-
|
|
227
|
-
-
|
|
105
|
+
### ⚡ Async Toolkit
|
|
106
|
+
- Concurrency: **`parallel`**, **`race`**, **`allSettled`**, **`sequential`**.
|
|
107
|
+
- Execution: **`retry`**, **`debounceAsync`**, **`throttleAsync`**.
|
|
108
|
+
- Timing: **`sleep`**, **`timeout`**.
|
|
228
109
|
|
|
229
|
-
###
|
|
230
|
-
|
|
231
|
-
-
|
|
232
|
-
-
|
|
233
|
-
-
|
|
234
|
-
|
|
235
|
-
## �🔗 Links / Enlaces
|
|
236
|
-
|
|
237
|
-
- **[📦 NPM Package](https://www.npmjs.com/package/bytekit)** - Install and version info
|
|
238
|
-
- **[📚 Full Documentation Wiki](https://github.com/sebamar88/bytekit/wiki)** - Complete API reference
|
|
239
|
-
- **[🚀 Live Examples](https://github.com/sebamar88/bytekit/tree/main/examples)** - Working code samples
|
|
240
|
-
- **[📋 Issues & Support](https://github.com/sebamar88/bytekit/issues)** - Bug reports and feature requests
|
|
241
|
-
- **[🔄 Changelog](https://github.com/sebamar88/bytekit/blob/main/CHANGELOG.md)** - Version history
|
|
110
|
+
### 🛠️ Key Helpers
|
|
111
|
+
- **`Logger` & `Profiler`** - Structured logs and performance monitoring.
|
|
112
|
+
- **`UrlSlugHelper`** - Generate SEO-friendly URL slugs.
|
|
113
|
+
- **`QueryStringHelper`** - Powerful object-to-query-string serialization.
|
|
114
|
+
- **`FileUploadHelper`**, **`StreamingHelper`**, **`WebSocketHelper`** - Specialized network tasks.
|
|
115
|
+
- **`EventEmitter`**, **`DiffUtils`**, **`CacheManager`**, **`CryptoUtils`**.
|
|
242
116
|
|
|
243
117
|
## 🤝 Contributing / Contribuir
|
|
244
118
|
|
|
@@ -248,7 +122,3 @@ const grouped = ObjectUtils.groupBy(users, "department");
|
|
|
248
122
|
## 📄 License / Licencia
|
|
249
123
|
|
|
250
124
|
MIT © [Sebastián Martinez](https://github.com/sebamar88)
|
|
251
|
-
|
|
252
|
-
---
|
|
253
|
-
|
|
254
|
-
**💡 Need help?** Check the **[Wiki](https://github.com/sebamar88/bytekit/wiki)** or **[open an issue](https://github.com/sebamar88/bytekit/issues)**.
|
package/bin/bytekit.js
CHANGED
|
File without changes
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgE1D"}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swagger-generator.d.ts","sourceRoot":"","sources":["../../src/cli/swagger-generator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"swagger-generator.d.ts","sourceRoot":"","sources":["../../src/cli/swagger-generator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACrC,OAAO,EAAE,cAAc,GACxB,OAAO,CAAC,IAAI,CAAC,CAqGf"}
|
|
@@ -5,10 +5,11 @@ import path from "node:path";
|
|
|
5
5
|
*/
|
|
6
6
|
export async function generateFromSwagger(options) {
|
|
7
7
|
const { url, output = "src/types/api-docs.ts" } = options;
|
|
8
|
-
|
|
8
|
+
const urlStr = String(url);
|
|
9
|
+
console.log(`\n📖 Attempting to resolve Swagger/OpenAPI spec from ${urlStr}...`);
|
|
9
10
|
try {
|
|
10
11
|
let spec;
|
|
11
|
-
const response = await fetch(
|
|
12
|
+
const response = await fetch(urlStr);
|
|
12
13
|
if (!response.ok) {
|
|
13
14
|
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
14
15
|
}
|
|
@@ -17,7 +18,7 @@ export async function generateFromSwagger(options) {
|
|
|
17
18
|
if (contentType.includes("text/html")) {
|
|
18
19
|
console.log("🔍 URL looks like a documentation page, trying to find spec JSON...");
|
|
19
20
|
// Try to find the spec by replacing /docs or adding common paths
|
|
20
|
-
const baseUrl =
|
|
21
|
+
const baseUrl = urlStr
|
|
21
22
|
.replace(/\/docs\/?$/, "")
|
|
22
23
|
.replace(/\/swagger-ui\/?$/, "");
|
|
23
24
|
const commonPaths = [
|
|
@@ -57,10 +58,13 @@ export async function generateFromSwagger(options) {
|
|
|
57
58
|
console.warn("⚠️ No schemas or definitions found in the specification.");
|
|
58
59
|
return;
|
|
59
60
|
}
|
|
60
|
-
|
|
61
|
+
const typeDefinitionsArray = [
|
|
62
|
+
`/**\n * Auto-generated types from Swagger/OpenAPI\n * Generated at ${new Date().toISOString()}\n */`,
|
|
63
|
+
];
|
|
61
64
|
for (const [name, schema] of Object.entries(schemas)) {
|
|
62
|
-
|
|
65
|
+
typeDefinitionsArray.push(generateInterface(name, schema));
|
|
63
66
|
}
|
|
67
|
+
const typeDefinitions = typeDefinitionsArray.join("\n\n") + "\n\n";
|
|
64
68
|
const outputPath = path.join(process.cwd(), output);
|
|
65
69
|
const outputDir = path.dirname(outputPath);
|
|
66
70
|
await fs.mkdir(outputDir, { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swagger-generator.js","sourceRoot":"","sources":["../../src/cli/swagger-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACrC,OAAuB;IAEvB,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,uBAAuB,EAAE,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"swagger-generator.js","sourceRoot":"","sources":["../../src/cli/swagger-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Logger } from "#core/Logger.js";
|
|
2
2
|
import { RetryConfig, CircuitBreakerConfig } from "#core/RetryPolicy.js";
|
|
3
3
|
import { ValidationSchema } from "#core/ResponseValidator.js";
|
|
4
|
+
import { SchemaAdapter } from "./SchemaAdapter.js";
|
|
4
5
|
export type QueryParamValue = string | number | boolean | null | undefined;
|
|
5
6
|
export type QueryParam = QueryParamValue | QueryParamValue[] | Record<string, unknown>;
|
|
6
7
|
export type Locale = "en" | "es";
|
|
@@ -9,8 +10,8 @@ export interface ApiClientInterceptors {
|
|
|
9
10
|
response?: (response: Response) => Promise<Response> | Response;
|
|
10
11
|
}
|
|
11
12
|
export interface ApiClientConfig {
|
|
12
|
-
baseUrl?: string;
|
|
13
|
-
baseURL?: string;
|
|
13
|
+
baseUrl?: string | URL;
|
|
14
|
+
baseURL?: string | URL;
|
|
14
15
|
defaultHeaders?: HeadersInit;
|
|
15
16
|
fetchImpl?: typeof fetch;
|
|
16
17
|
locale?: Locale;
|
|
@@ -24,12 +25,12 @@ export interface ApiClientConfig {
|
|
|
24
25
|
retryPolicy?: RetryConfig;
|
|
25
26
|
circuitBreaker?: CircuitBreakerConfig;
|
|
26
27
|
}
|
|
27
|
-
export interface RequestOptions extends Omit<RequestInit, "body"> {
|
|
28
|
+
export interface RequestOptions<TResponse = unknown> extends Omit<RequestInit, "body"> {
|
|
28
29
|
searchParams?: Record<string, QueryParam>;
|
|
29
30
|
body?: FormData | string | Blob | ArrayBuffer | Record<string, unknown>;
|
|
30
31
|
errorLocale?: Locale;
|
|
31
32
|
timeoutMs?: number;
|
|
32
|
-
validateResponse?: ValidationSchema
|
|
33
|
+
validateResponse?: ValidationSchema | SchemaAdapter<TResponse>;
|
|
33
34
|
skipRetry?: boolean;
|
|
34
35
|
skipInterceptors?: boolean;
|
|
35
36
|
logHeaders?: boolean;
|
|
@@ -46,7 +47,7 @@ export interface PaginationParams {
|
|
|
46
47
|
export interface FilterParams {
|
|
47
48
|
[key: string]: QueryParam;
|
|
48
49
|
}
|
|
49
|
-
export interface ListOptions<TFilter extends FilterParams = FilterParams> extends Omit<RequestOptions
|
|
50
|
+
export interface ListOptions<TFilter extends FilterParams = FilterParams, TResponse = unknown> extends Omit<RequestOptions<TResponse>, "searchParams"> {
|
|
50
51
|
pagination?: PaginationParams;
|
|
51
52
|
sort?: SortParams;
|
|
52
53
|
filters?: TFilter;
|
|
@@ -108,7 +109,7 @@ export declare class ApiClient {
|
|
|
108
109
|
private readonly retryPolicy;
|
|
109
110
|
private readonly circuitBreaker;
|
|
110
111
|
constructor({ baseUrl, baseURL, defaultHeaders, fetchImpl, locale, errorMessages, timeoutMs, interceptors, disableInterceptors, logHeaders, redactHeaderKeys, logger, retryPolicy, circuitBreaker, }: ApiClientConfig);
|
|
111
|
-
get<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
112
|
+
get<T>(path: string | URL, options?: RequestOptions<T>): Promise<T>;
|
|
112
113
|
/**
|
|
113
114
|
* POST request - Acepta body directamente o RequestOptions
|
|
114
115
|
* @example
|
|
@@ -121,17 +122,17 @@ export declare class ApiClient {
|
|
|
121
122
|
* headers: { "X-Custom": "value" }
|
|
122
123
|
* })
|
|
123
124
|
*/
|
|
124
|
-
post<T>(path: string, bodyOrOptions?: RequestOptions | unknown): Promise<T>;
|
|
125
|
+
post<T>(path: string | URL, bodyOrOptions?: RequestOptions<T> | unknown): Promise<T>;
|
|
125
126
|
/**
|
|
126
127
|
* PUT request - Acepta body directamente o RequestOptions
|
|
127
128
|
*/
|
|
128
|
-
put<T>(path: string, bodyOrOptions?: RequestOptions | unknown): Promise<T>;
|
|
129
|
+
put<T>(path: string | URL, bodyOrOptions?: RequestOptions<T> | unknown): Promise<T>;
|
|
129
130
|
/**
|
|
130
131
|
* PATCH request - Acepta body directamente o RequestOptions
|
|
131
132
|
*/
|
|
132
|
-
patch<T>(path: string, bodyOrOptions?: RequestOptions | unknown): Promise<T>;
|
|
133
|
-
delete<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
134
|
-
getList<T, TFilter extends FilterParams = FilterParams>(path: string, options?: ListOptions<TFilter
|
|
133
|
+
patch<T>(path: string | URL, bodyOrOptions?: RequestOptions<T> | unknown): Promise<T>;
|
|
134
|
+
delete<T>(path: string | URL, options?: RequestOptions<T>): Promise<T>;
|
|
135
|
+
getList<T, TFilter extends FilterParams = FilterParams>(path: string | URL, options?: ListOptions<TFilter, PaginatedResponse<T>>): Promise<PaginatedResponse<T>>;
|
|
135
136
|
/**
|
|
136
137
|
* Prepares request configuration with headers, body, and interceptors
|
|
137
138
|
*/
|
|
@@ -144,7 +145,7 @@ export declare class ApiClient {
|
|
|
144
145
|
* Handles request errors with proper logging
|
|
145
146
|
*/
|
|
146
147
|
private handleRequestError;
|
|
147
|
-
request<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
148
|
+
request<T>(path: string | URL, options?: RequestOptions<T>): Promise<T>;
|
|
148
149
|
/**
|
|
149
150
|
* Normaliza el segundo parámetro de post/put/patch para soportar:
|
|
150
151
|
* 1. Body directo: post("/path", { name: "John" })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiClient.d.ts","sourceRoot":"","sources":["../../../src/utils/core/ApiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,OAAO,EAGH,WAAW,EACX,oBAAoB,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEH,gBAAgB,EACnB,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"ApiClient.d.ts","sourceRoot":"","sources":["../../../src/utils/core/ApiClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { QueryStringHelper } from "#helpers/QueryStringHelper.js";
|
|
2
2
|
import { retry as retryFn } from "../async/retry.js";
|
|
3
3
|
import { RetryPolicy, CircuitBreaker, } from "#core/RetryPolicy.js";
|
|
4
4
|
import { ResponseValidator, } from "#core/ResponseValidator.js";
|
|
5
|
+
import { isSchemaAdapter } from "./SchemaAdapter.js";
|
|
5
6
|
export class ApiError extends Error {
|
|
6
7
|
constructor(status, statusText, message, body, isTimeout = false) {
|
|
7
8
|
super(message);
|
|
@@ -196,7 +197,8 @@ export class ApiClient {
|
|
|
196
197
|
if (!url) {
|
|
197
198
|
throw new Error("ApiClient requires either 'baseUrl' or 'baseURL' in config");
|
|
198
199
|
}
|
|
199
|
-
|
|
200
|
+
const urlStr = String(url);
|
|
201
|
+
this.baseUrl = new URL(urlStr.endsWith("/") ? urlStr : `${urlStr}/`);
|
|
200
202
|
this.headers = defaultHeaders ?? {};
|
|
201
203
|
this.fetchImpl = fetchImpl ?? globalThis.fetch.bind(globalThis);
|
|
202
204
|
this.locale = locale;
|
|
@@ -343,18 +345,25 @@ export class ApiClient {
|
|
|
343
345
|
const contentType = response.headers.get("content-type") || "";
|
|
344
346
|
let data;
|
|
345
347
|
if (/json/i.test(contentType)) {
|
|
346
|
-
data =
|
|
348
|
+
data = await response.json();
|
|
347
349
|
}
|
|
348
350
|
else {
|
|
349
|
-
data =
|
|
351
|
+
data = await response.text();
|
|
350
352
|
}
|
|
351
353
|
// Validate response if schema provided
|
|
352
354
|
if (validateResponse) {
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
355
|
+
if (isSchemaAdapter(validateResponse)) {
|
|
356
|
+
// Use SchemaAdapter (Zod/Valibot/etc.)
|
|
357
|
+
return validateResponse.parse(data);
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
// Use built-in ResponseValidator
|
|
361
|
+
const errors = ResponseValidator.validate(data, validateResponse);
|
|
362
|
+
if (errors.length > 0) {
|
|
363
|
+
throw new Error(`Response validation failed: ${errors
|
|
364
|
+
.map((e) => e.message)
|
|
365
|
+
.join(", ")}`);
|
|
366
|
+
}
|
|
358
367
|
}
|
|
359
368
|
}
|
|
360
369
|
return data;
|
|
@@ -363,13 +372,14 @@ export class ApiClient {
|
|
|
363
372
|
* Handles request errors with proper logging
|
|
364
373
|
*/
|
|
365
374
|
handleRequestError(err, path, method) {
|
|
375
|
+
const pathStr = String(path);
|
|
366
376
|
if (err instanceof Error && err.name === "AbortError") {
|
|
367
377
|
throw new ApiError(408, "Timeout", "Request timeout", null, true);
|
|
368
378
|
}
|
|
369
379
|
// Enhanced logging for ApiError
|
|
370
380
|
if (err instanceof ApiError) {
|
|
371
381
|
this.logger?.error("API Request failed", {
|
|
372
|
-
path,
|
|
382
|
+
path: pathStr,
|
|
373
383
|
method,
|
|
374
384
|
status: err.status,
|
|
375
385
|
statusText: err.statusText,
|
|
@@ -377,7 +387,7 @@ export class ApiClient {
|
|
|
377
387
|
}, err);
|
|
378
388
|
}
|
|
379
389
|
else {
|
|
380
|
-
this.logger?.error("Request failed", { path, method }, err instanceof Error ? err : new Error(String(err)));
|
|
390
|
+
this.logger?.error("Request failed", { path: pathStr, method }, err instanceof Error ? err : new Error(String(err)));
|
|
381
391
|
}
|
|
382
392
|
throw err;
|
|
383
393
|
}
|
|
@@ -552,10 +562,11 @@ export class ApiClient {
|
|
|
552
562
|
});
|
|
553
563
|
}
|
|
554
564
|
buildUrl(path, params) {
|
|
555
|
-
const
|
|
565
|
+
const pathStr = String(path);
|
|
566
|
+
const normalized = pathStr.startsWith("/") ? pathStr.slice(1) : pathStr;
|
|
556
567
|
const url = new URL(normalized, this.baseUrl);
|
|
557
568
|
if (params) {
|
|
558
|
-
const queryString =
|
|
569
|
+
const queryString = QueryStringHelper.stringify(params);
|
|
559
570
|
if (queryString) {
|
|
560
571
|
url.search = url.search
|
|
561
572
|
? `${url.search}&${queryString}`
|