@keq-request/exception 5.0.0-alpha.7 → 5.0.0-beta.1

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 CHANGED
@@ -1,5 +1,327 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.0.0-beta.1
4
+
5
+ ### Major Changes
6
+
7
+ - 214ae66: **BREAKING CHANGE:** RequestException third parameter changed from retry: boolean to options: { fatal: boolean, response: Response }
8
+
9
+ ```javascript
10
+ // Before
11
+ new RequestException(400, "Error message", true);
12
+
13
+ // After
14
+ new RequestException(400, "Error message", {
15
+ fatal: false,
16
+ response: someResponseObject,
17
+ });
18
+ ```
19
+
20
+ - 5175097: **BREAKING CHANGE:** group all packages under the @keq-request scope
21
+
22
+ - keq-cache => @keq-request/cache
23
+ - keq-headers => @keq-request/headers
24
+ - keq-cli => @keq-request/cli
25
+ - keq-url => @keq-request/url
26
+ - keq-exception => @keq-request/exception
27
+
28
+ - 153244f: **BREAKING CHANGE:** move `RequestException` form `@keq-request/exception` to `keq`
29
+ - 0a04864: **Fix:** fix: update browser targets to chrome91/firefox90/safari15/edge91 to resolve esbuild 0.27 destructuring build errors.
30
+
31
+ ### Minor Changes
32
+
33
+ - 74803c8: export `createExceptionByStatusCode` to create HTTP exceptions from a `Response` object
34
+ - 241a2ca: **Feat:** add a validateStatusCode middleware and plugin use to validate http response and throw standard exception
35
+
36
+ ### Patch Changes
37
+
38
+ - b36df33: ValidateStatusCode plugin generate wrong code
39
+ - 2686b8d: build with turbo
40
+ - 2686b8d: remove private dependencies
41
+ - e7eb9dc: Don't publish .turbo and jest.config.cts to npm
42
+ - 0873c7e: Incorrect build before release.
43
+ - 153244f: remove override `retryOn`.
44
+ - 30b0848: rename validateResponse to validateStatusCode
45
+ - 581815a: ensure compatibility
46
+ - 7343445: Incorrect build before release
47
+ - Updated dependencies [cbc5d17]
48
+ - Updated dependencies [153244f]
49
+ - Updated dependencies [153244f]
50
+ - Updated dependencies [153244f]
51
+ - Updated dependencies [0a2eb2f]
52
+ - Updated dependencies [153244f]
53
+ - Updated dependencies [214ae66]
54
+ - Updated dependencies [c7ffd1f]
55
+ - Updated dependencies [90311b3]
56
+ - Updated dependencies [1f367c0]
57
+ - Updated dependencies [0c7db81]
58
+ - Updated dependencies [df114d1]
59
+ - Updated dependencies [2686b8d]
60
+ - Updated dependencies [842e555]
61
+ - Updated dependencies [153244f]
62
+ - Updated dependencies [2686b8d]
63
+ - Updated dependencies [9290139]
64
+ - Updated dependencies [7873a0a]
65
+ - Updated dependencies [e7eb9dc]
66
+ - Updated dependencies [7ff2162]
67
+ - Updated dependencies [22ce01a]
68
+ - Updated dependencies [0873c7e]
69
+ - Updated dependencies [153244f]
70
+ - Updated dependencies [a7a83da]
71
+ - Updated dependencies [f194c41]
72
+ - Updated dependencies [153244f]
73
+ - Updated dependencies [153244f]
74
+ - Updated dependencies [d076b76]
75
+ - Updated dependencies [f8abc63]
76
+ - Updated dependencies [153244f]
77
+ - Updated dependencies [ca6c879]
78
+ - Updated dependencies [63161c4]
79
+ - Updated dependencies [d472648]
80
+ - Updated dependencies [b8d02ca]
81
+ - Updated dependencies [0a04864]
82
+ - Updated dependencies [581815a]
83
+ - Updated dependencies [7343445]
84
+ - Updated dependencies [153244f]
85
+ - Updated dependencies [eed26f9]
86
+ - keq@5.0.0-beta.1
87
+
88
+ ## 5.0.0-alpha.36
89
+
90
+ ### Patch Changes
91
+
92
+ - keq@5.0.0-alpha.36
93
+
94
+ ## 5.0.0-alpha.35
95
+
96
+ ### Major Changes
97
+
98
+ - 0a04864: **Fix:** fix: update browser targets to chrome91/firefox90/safari15/edge91 to resolve esbuild 0.27 destructuring build errors.
99
+
100
+ ### Patch Changes
101
+
102
+ - Updated dependencies [0a04864]
103
+ - keq@5.0.0-alpha.35
104
+
105
+ ## 5.0.0-alpha.34
106
+
107
+ ### Patch Changes
108
+
109
+ - Updated dependencies [a7a83da]
110
+ - Updated dependencies [f8abc63]
111
+ - keq@5.0.0-alpha.34
112
+
113
+ ## 5.0.0-alpha.33
114
+
115
+ ### Patch Changes
116
+
117
+ - keq@5.0.0-alpha.33
118
+
119
+ ## 5.0.0-alpha.32
120
+
121
+ ### Minor Changes
122
+
123
+ - 74803c8: export `createExceptionByStatusCode` to create HTTP exceptions from a `Response` object
124
+
125
+ ### Patch Changes
126
+
127
+ - Updated dependencies [f194c41]
128
+ - Updated dependencies [b8d02ca]
129
+ - keq@5.0.0-alpha.32
130
+
131
+ ## 5.0.0-alpha.31
132
+
133
+ ### Patch Changes
134
+
135
+ - keq@5.0.0-alpha.31
136
+
137
+ ## 5.0.0-alpha.30
138
+
139
+ ### Patch Changes
140
+
141
+ - keq@5.0.0-alpha.30
142
+
143
+ ## 5.0.0-alpha.29
144
+
145
+ ### Patch Changes
146
+
147
+ - keq@5.0.0-alpha.29
148
+
149
+ ## 5.0.0-alpha.28
150
+
151
+ ### Patch Changes
152
+
153
+ - Updated dependencies [d076b76]
154
+ - keq@5.0.0-alpha.28
155
+
156
+ ## 5.0.0-alpha.27
157
+
158
+ ### Patch Changes
159
+
160
+ - Updated dependencies [0c7db81]
161
+ - keq@5.0.0-alpha.27
162
+
163
+ ## 5.0.0-alpha.26
164
+
165
+ ### Patch Changes
166
+
167
+ - Updated dependencies [22ce01a]
168
+ - Updated dependencies [63161c4]
169
+ - keq@5.0.0-alpha.26
170
+
171
+ ## 5.0.0-alpha.25
172
+
173
+ ### Major Changes
174
+
175
+ - 214ae66: **BREAKING CHANGE:** RequestException third parameter changed from retry: boolean to options: { fatal: boolean, response: Response }
176
+
177
+ ```javascript
178
+ // Before
179
+ new RequestException(400, "Error message", true);
180
+
181
+ // After
182
+ new RequestException(400, "Error message", {
183
+ fatal: false,
184
+ response: someResponseObject,
185
+ });
186
+ ```
187
+
188
+ ### Patch Changes
189
+
190
+ - Updated dependencies [214ae66]
191
+ - Updated dependencies [9290139]
192
+ - keq@5.0.0-alpha.25
193
+
194
+ ## 5.0.0-alpha.24
195
+
196
+ ### Patch Changes
197
+
198
+ - Updated dependencies [0a2eb2f]
199
+ - keq@5.0.0-alpha.24
200
+
201
+ ## 5.0.0-alpha.23
202
+
203
+ ### Patch Changes
204
+
205
+ - Updated dependencies [842e555]
206
+ - Updated dependencies [7873a0a]
207
+ - keq@5.0.0-alpha.23
208
+
209
+ ## 5.0.0-alpha.22
210
+
211
+ ### Patch Changes
212
+
213
+ - Updated dependencies [df114d1]
214
+ - keq@5.0.0-alpha.22
215
+
216
+ ## 5.0.0-alpha.21
217
+
218
+ ### Patch Changes
219
+
220
+ - b36df33: ValidateStatusCode plugin generate wrong code
221
+ - Updated dependencies [90311b3]
222
+ - keq@5.0.0-alpha.21
223
+
224
+ ## 5.0.0-alpha.20
225
+
226
+ ### Patch Changes
227
+
228
+ - Updated dependencies [1f367c0]
229
+ - keq@5.0.0-alpha.20
230
+
231
+ ## 5.0.0-alpha.19
232
+
233
+ ### Patch Changes
234
+
235
+ - 30b0848: rename validateResponse to validateStatusCode
236
+ - keq@5.0.0-alpha.19
237
+
238
+ ## 5.0.0-alpha.18
239
+
240
+ ### Minor Changes
241
+
242
+ - 241a2ca: **Feat:** add a validateResponse middleware and plugin use to validate http response and throw standard exception
243
+
244
+ ### Patch Changes
245
+
246
+ - Updated dependencies [cbc5d17]
247
+ - keq@5.0.0-alpha.18
248
+
249
+ ## 5.0.0-alpha.17
250
+
251
+ ### Patch Changes
252
+
253
+ - Updated dependencies [d472648]
254
+ - Updated dependencies [eed26f9]
255
+ - keq@5.0.0-alpha.17
256
+
257
+ ## 5.0.0-alpha.16
258
+
259
+ ### Patch Changes
260
+
261
+ - Updated dependencies [ca6c879]
262
+ - keq@5.0.0-alpha.16
263
+
264
+ ## 5.0.0-alpha.15
265
+
266
+ ### Patch Changes
267
+
268
+ - keq@5.0.0-alpha.15
269
+
270
+ ## 5.0.0-alpha.14
271
+
272
+ ### Patch Changes
273
+
274
+ - keq@5.0.0-alpha.14
275
+
276
+ ## 5.0.0-alpha.13
277
+
278
+ ### Patch Changes
279
+
280
+ - keq@5.0.0-alpha.13
281
+
282
+ ## 5.0.0-alpha.12
283
+
284
+ ### Patch Changes
285
+
286
+ - 581815a: ensure compatibility
287
+ - Updated dependencies [581815a]
288
+ - keq@5.0.0-alpha.12
289
+
290
+ ## 5.0.0-alpha.11
291
+
292
+ ### Patch Changes
293
+
294
+ - Updated dependencies [c7ffd1f]
295
+ - keq@5.0.0-alpha.11
296
+
297
+ ## 5.0.0-alpha.10
298
+
299
+ ### Patch Changes
300
+
301
+ - e7eb9dc: Don't publish .turbo and jest.config.cts to npm
302
+ - 7343445: Incorrect build before release
303
+ - Updated dependencies [e7eb9dc]
304
+ - Updated dependencies [7343445]
305
+ - keq@5.0.0-alpha.10
306
+
307
+ ## 5.0.0-alpha.9
308
+
309
+ ### Patch Changes
310
+
311
+ - 2686b8d: build with burbo
312
+ - 2686b8d: remove private dependencies
313
+ - Updated dependencies [2686b8d]
314
+ - Updated dependencies [2686b8d]
315
+ - keq@5.0.0-alpha.9
316
+
317
+ ## 5.0.0-alpha.8
318
+
319
+ ### Patch Changes
320
+
321
+ - 0873c7e: Incorrect build before release.
322
+ - Updated dependencies [0873c7e]
323
+ - keq@5.0.0-alpha.8
324
+
3
325
  ## 5.0.0-alpha.7
4
326
 
5
327
  ### Major Changes
@@ -0,0 +1,18 @@
1
+ import { KeqContext, KeqMiddleware } from "keq";
2
+ import { Promisable } from "type-fest";
3
+
4
+ //#region src/throw-exception.d.ts
5
+ type Check = (ctx: KeqContext) => Promisable<void>;
6
+ declare function throwException(check: Check): KeqMiddleware;
7
+ //#endregion
8
+ //#region src/catch-exception.d.ts
9
+ declare function catchException(handler: (e: unknown) => Promisable<void>): KeqMiddleware;
10
+ //#endregion
11
+ //#region src/validate-status-code.d.ts
12
+ declare function validateStatusCode(): KeqMiddleware;
13
+ //#endregion
14
+ //#region src/create-exception-by-status-code.d.ts
15
+ declare function createExceptionByStatusCode(response: Response): Error;
16
+ //#endregion
17
+ export { Check, catchException, createExceptionByStatusCode, throwException, validateStatusCode };
18
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/throw-exception.ts","../src/catch-exception.ts","../src/validate-status-code.ts","../src/create-exception-by-status-code.ts"],"mappings":";;;;KAIY,KAAA,IAAS,GAAA,EAAK,UAAA,KAAe,UAAA;AAAA,iBAEzB,cAAA,CAAe,KAAA,EAAO,KAAA,GAAQ,aAAA;;;iBCF9B,cAAA,CAAe,OAAA,GAAU,CAAA,cAAe,UAAA,SAAmB,aAAA;;;iBCD3D,kBAAA,CAAA,GAAsB,aAAA;;;iBCqBtB,2BAAA,CAA4B,QAAA,EAAU,QAAA,GAAW,KAAA"}
@@ -0,0 +1,18 @@
1
+ import { KeqContext, KeqMiddleware } from "keq";
2
+ import { Promisable } from "type-fest";
3
+
4
+ //#region src/throw-exception.d.ts
5
+ type Check = (ctx: KeqContext) => Promisable<void>;
6
+ declare function throwException(check: Check): KeqMiddleware;
7
+ //#endregion
8
+ //#region src/catch-exception.d.ts
9
+ declare function catchException(handler: (e: unknown) => Promisable<void>): KeqMiddleware;
10
+ //#endregion
11
+ //#region src/validate-status-code.d.ts
12
+ declare function validateStatusCode(): KeqMiddleware;
13
+ //#endregion
14
+ //#region src/create-exception-by-status-code.d.ts
15
+ declare function createExceptionByStatusCode(response: Response): Error;
16
+ //#endregion
17
+ export { Check, catchException, createExceptionByStatusCode, throwException, validateStatusCode };
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/throw-exception.ts","../src/catch-exception.ts","../src/validate-status-code.ts","../src/create-exception-by-status-code.ts"],"mappings":";;;;KAIY,KAAA,IAAS,GAAA,EAAK,UAAA,KAAe,UAAA;AAAA,iBAEzB,cAAA,CAAe,KAAA,EAAO,KAAA,GAAQ,aAAA;;;iBCF9B,cAAA,CAAe,OAAA,GAAU,CAAA,cAAe,UAAA,SAAmB,aAAA;;;iBCD3D,kBAAA,CAAA,GAAsB,aAAA;;;iBCqBtB,2BAAA,CAA4B,QAAA,EAAU,QAAA,GAAW,KAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,81 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let keq = require("keq");
3
+ //#region src/throw-exception.ts
4
+ function throwException(check) {
5
+ return async function throwException(ctx, next) {
6
+ await next();
7
+ await check(ctx);
8
+ };
9
+ }
10
+ //#endregion
11
+ //#region src/catch-exception.ts
12
+ function catchException(handler) {
13
+ return async function catchException(ctx, next) {
14
+ try {
15
+ await next();
16
+ } catch (err) {
17
+ await handler(err);
18
+ }
19
+ };
20
+ }
21
+ //#endregion
22
+ //#region src/create-exception-by-status-code.ts
23
+ function createExceptionByStatusCode(response) {
24
+ const { status, statusText } = response;
25
+ if (status >= 400 && status < 500) switch (status) {
26
+ case 400: return new keq.BadRequestException(statusText, { response });
27
+ case 401: return new keq.UnauthorizedException(statusText, { response });
28
+ case 403: return new keq.ForbiddenException(statusText, { response });
29
+ case 404: return new keq.NotFoundedException(statusText, { response });
30
+ case 405: return new keq.MethodNotAllowedException(statusText, { response });
31
+ case 406: return new keq.NotAcceptableException(statusText, { response });
32
+ case 407: return new keq.ProxyAuthenticationRequiredException(statusText, { response });
33
+ case 408: return new keq.RequestTimeoutException(statusText, { response });
34
+ case 409: return new keq.ConflictException(statusText, { response });
35
+ case 412: return new keq.PreconditionFailedException(statusText, { response });
36
+ case 413: return new keq.ContentTooLargeException(statusText, { response });
37
+ case 414: return new keq.UriTooLongException(statusText, { response });
38
+ case 415: return new keq.UnsupportedMediaTypeException(statusText, { response });
39
+ case 418: return new keq.ImATeapotException(statusText, { response });
40
+ case 429: return new keq.TooManyRequestsException(statusText, { response });
41
+ default: return new keq.RequestException(status, statusText, {
42
+ fatal: true,
43
+ response
44
+ });
45
+ }
46
+ if (status >= 500) switch (status) {
47
+ case 500: return new keq.InternalServerErrorException(statusText, { response });
48
+ case 501: return new keq.NotImplementedException(statusText, { response });
49
+ case 502: return new keq.BadGatewayException(statusText, { response });
50
+ case 503: return new keq.ServiceUnavailableException(statusText, { response });
51
+ case 504: return new keq.GatewayTimeoutException(statusText, { response });
52
+ default: return new keq.RequestException(status, statusText, {
53
+ fatal: false,
54
+ response
55
+ });
56
+ }
57
+ return new keq.RequestException(status, statusText, {
58
+ fatal: false,
59
+ response
60
+ });
61
+ }
62
+ //#endregion
63
+ //#region src/validate-status-code.ts
64
+ function validateStatusCode() {
65
+ return async function validateStatusCode(context, next) {
66
+ await next();
67
+ const response = context.response;
68
+ if (!response) return;
69
+ const { status } = response;
70
+ if (status >= 200 && status < 300) return;
71
+ if (status >= 300 && status < 400) return;
72
+ throw createExceptionByStatusCode(response);
73
+ };
74
+ }
75
+ //#endregion
76
+ exports.catchException = catchException;
77
+ exports.createExceptionByStatusCode = createExceptionByStatusCode;
78
+ exports.throwException = throwException;
79
+ exports.validateStatusCode = validateStatusCode;
80
+
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["BadRequestException","UnauthorizedException","ForbiddenException","NotFoundedException","MethodNotAllowedException","NotAcceptableException","ProxyAuthenticationRequiredException","RequestTimeoutException","ConflictException","PreconditionFailedException","ContentTooLargeException","UriTooLongException","UnsupportedMediaTypeException","ImATeapotException","TooManyRequestsException","RequestException","InternalServerErrorException","NotImplementedException","BadGatewayException","ServiceUnavailableException","GatewayTimeoutException"],"sources":["../src/throw-exception.ts","../src/catch-exception.ts","../src/create-exception-by-status-code.ts","../src/validate-status-code.ts"],"sourcesContent":["import { KeqContext, KeqMiddleware } from 'keq'\nimport { Promisable } from 'type-fest'\n\n\nexport type Check = (ctx: KeqContext) => Promisable<void>\n\nexport function throwException(check: Check): KeqMiddleware {\n return async function throwException(ctx, next) {\n await next()\n\n await check(ctx)\n }\n}\n","import { KeqMiddleware } from 'keq'\nimport { Promisable } from 'type-fest'\n\n\nexport function catchException(handler: (e: unknown) => Promisable<void>): KeqMiddleware {\n return async function catchException(ctx, next) {\n try {\n await next()\n } catch (err) {\n await handler(err)\n }\n }\n}\n","import {\n BadGatewayException,\n BadRequestException,\n ConflictException,\n ForbiddenException,\n GatewayTimeoutException,\n InternalServerErrorException,\n NotAcceptableException,\n NotFoundedException,\n PreconditionFailedException,\n RequestException,\n ServiceUnavailableException,\n UnauthorizedException,\n ImATeapotException,\n MethodNotAllowedException,\n UriTooLongException,\n ContentTooLargeException,\n ProxyAuthenticationRequiredException,\n RequestTimeoutException,\n TooManyRequestsException,\n NotImplementedException,\n UnsupportedMediaTypeException,\n} from 'keq'\n\nexport function createExceptionByStatusCode(response: Response): Error {\n const { status, statusText } = response\n\n // 4xx client errors\n if (status >= 400 && status < 500) {\n switch (status) {\n case 400:\n return new BadRequestException(statusText, { response })\n case 401:\n return new UnauthorizedException(statusText, { response })\n case 403:\n return new ForbiddenException(statusText, { response })\n case 404:\n return new NotFoundedException(statusText, { response })\n case 405:\n return new MethodNotAllowedException(statusText, { response })\n case 406:\n return new NotAcceptableException(statusText, { response })\n case 407:\n return new ProxyAuthenticationRequiredException(statusText, { response })\n case 408:\n return new RequestTimeoutException(statusText, { response })\n case 409:\n return new ConflictException(statusText, { response })\n case 412:\n return new PreconditionFailedException(statusText, { response })\n case 413:\n return new ContentTooLargeException(statusText, { response })\n case 414:\n return new UriTooLongException(statusText, { response })\n case 415:\n return new UnsupportedMediaTypeException(statusText, { response })\n case 418:\n return new ImATeapotException(statusText, { response })\n case 429:\n return new TooManyRequestsException(statusText, { response })\n default:\n // Other 4xx errors, don't retry by default\n return new RequestException(status, statusText, { fatal: true, response })\n }\n }\n\n // 5xx server errors\n if (status >= 500) {\n switch (status) {\n case 500:\n return new InternalServerErrorException(statusText, { response })\n case 501:\n return new NotImplementedException(statusText, { response })\n case 502:\n return new BadGatewayException(statusText, { response })\n case 503:\n return new ServiceUnavailableException(statusText, { response })\n case 504:\n return new GatewayTimeoutException(statusText, { response })\n default:\n // Other 5xx errors, retry by default\n return new RequestException(status, statusText, { fatal: false, response })\n }\n }\n\n return new RequestException(status, statusText, { fatal: false, response })\n}\n","import { KeqMiddleware } from 'keq'\nimport { createExceptionByStatusCode } from './create-exception-by-status-code.js'\n\nexport function validateStatusCode(): KeqMiddleware {\n return async function validateStatusCode(context, next) {\n await next()\n\n const response = context.response\n if (!response) return\n\n const { status } = response\n\n // 2xx success status codes - no error\n if (status >= 200 && status < 300) return\n\n // 3xx redirection status codes - no error (handled by fetch)\n if (status >= 300 && status < 400) return\n\n throw createExceptionByStatusCode(response)\n }\n}\n"],"mappings":";;;AAMA,SAAgB,eAAe,OAA6B;AAC1D,QAAO,eAAe,eAAe,KAAK,MAAM;AAC9C,QAAM,MAAM;AAEZ,QAAM,MAAM,IAAI;;;;;ACNpB,SAAgB,eAAe,SAA0D;AACvF,QAAO,eAAe,eAAe,KAAK,MAAM;AAC9C,MAAI;AACF,SAAM,MAAM;WACL,KAAK;AACZ,SAAM,QAAQ,IAAI;;;;;;ACexB,SAAgB,4BAA4B,UAA2B;CACrE,MAAM,EAAE,QAAQ,eAAe;AAG/B,KAAI,UAAU,OAAO,SAAS,IAC5B,SAAQ,QAAR;EACE,KAAK,IACH,QAAO,IAAIA,IAAAA,oBAAoB,YAAY,EAAE,UAAU,CAAC;EAC1D,KAAK,IACH,QAAO,IAAIC,IAAAA,sBAAsB,YAAY,EAAE,UAAU,CAAC;EAC5D,KAAK,IACH,QAAO,IAAIC,IAAAA,mBAAmB,YAAY,EAAE,UAAU,CAAC;EACzD,KAAK,IACH,QAAO,IAAIC,IAAAA,oBAAoB,YAAY,EAAE,UAAU,CAAC;EAC1D,KAAK,IACH,QAAO,IAAIC,IAAAA,0BAA0B,YAAY,EAAE,UAAU,CAAC;EAChE,KAAK,IACH,QAAO,IAAIC,IAAAA,uBAAuB,YAAY,EAAE,UAAU,CAAC;EAC7D,KAAK,IACH,QAAO,IAAIC,IAAAA,qCAAqC,YAAY,EAAE,UAAU,CAAC;EAC3E,KAAK,IACH,QAAO,IAAIC,IAAAA,wBAAwB,YAAY,EAAE,UAAU,CAAC;EAC9D,KAAK,IACH,QAAO,IAAIC,IAAAA,kBAAkB,YAAY,EAAE,UAAU,CAAC;EACxD,KAAK,IACH,QAAO,IAAIC,IAAAA,4BAA4B,YAAY,EAAE,UAAU,CAAC;EAClE,KAAK,IACH,QAAO,IAAIC,IAAAA,yBAAyB,YAAY,EAAE,UAAU,CAAC;EAC/D,KAAK,IACH,QAAO,IAAIC,IAAAA,oBAAoB,YAAY,EAAE,UAAU,CAAC;EAC1D,KAAK,IACH,QAAO,IAAIC,IAAAA,8BAA8B,YAAY,EAAE,UAAU,CAAC;EACpE,KAAK,IACH,QAAO,IAAIC,IAAAA,mBAAmB,YAAY,EAAE,UAAU,CAAC;EACzD,KAAK,IACH,QAAO,IAAIC,IAAAA,yBAAyB,YAAY,EAAE,UAAU,CAAC;EAC/D,QAEE,QAAO,IAAIC,IAAAA,iBAAiB,QAAQ,YAAY;GAAE,OAAO;GAAM;GAAU,CAAC;;AAKhF,KAAI,UAAU,IACZ,SAAQ,QAAR;EACE,KAAK,IACH,QAAO,IAAIC,IAAAA,6BAA6B,YAAY,EAAE,UAAU,CAAC;EACnE,KAAK,IACH,QAAO,IAAIC,IAAAA,wBAAwB,YAAY,EAAE,UAAU,CAAC;EAC9D,KAAK,IACH,QAAO,IAAIC,IAAAA,oBAAoB,YAAY,EAAE,UAAU,CAAC;EAC1D,KAAK,IACH,QAAO,IAAIC,IAAAA,4BAA4B,YAAY,EAAE,UAAU,CAAC;EAClE,KAAK,IACH,QAAO,IAAIC,IAAAA,wBAAwB,YAAY,EAAE,UAAU,CAAC;EAC9D,QAEE,QAAO,IAAIL,IAAAA,iBAAiB,QAAQ,YAAY;GAAE,OAAO;GAAO;GAAU,CAAC;;AAIjF,QAAO,IAAIA,IAAAA,iBAAiB,QAAQ,YAAY;EAAE,OAAO;EAAO;EAAU,CAAC;;;;AClF7E,SAAgB,qBAAoC;AAClD,QAAO,eAAe,mBAAmB,SAAS,MAAM;AACtD,QAAM,MAAM;EAEZ,MAAM,WAAW,QAAQ;AACzB,MAAI,CAAC,SAAU;EAEf,MAAM,EAAE,WAAW;AAGnB,MAAI,UAAU,OAAO,SAAS,IAAK;AAGnC,MAAI,UAAU,OAAO,SAAS,IAAK;AAEnC,QAAM,4BAA4B,SAAS"}
package/dist/index.mjs ADDED
@@ -0,0 +1,77 @@
1
+ import { BadGatewayException, BadRequestException, ConflictException, ContentTooLargeException, ForbiddenException, GatewayTimeoutException, ImATeapotException, InternalServerErrorException, MethodNotAllowedException, NotAcceptableException, NotFoundedException, NotImplementedException, PreconditionFailedException, ProxyAuthenticationRequiredException, RequestException, RequestTimeoutException, ServiceUnavailableException, TooManyRequestsException, UnauthorizedException, UnsupportedMediaTypeException, UriTooLongException } from "keq";
2
+ //#region src/throw-exception.ts
3
+ function throwException(check) {
4
+ return async function throwException(ctx, next) {
5
+ await next();
6
+ await check(ctx);
7
+ };
8
+ }
9
+ //#endregion
10
+ //#region src/catch-exception.ts
11
+ function catchException(handler) {
12
+ return async function catchException(ctx, next) {
13
+ try {
14
+ await next();
15
+ } catch (err) {
16
+ await handler(err);
17
+ }
18
+ };
19
+ }
20
+ //#endregion
21
+ //#region src/create-exception-by-status-code.ts
22
+ function createExceptionByStatusCode(response) {
23
+ const { status, statusText } = response;
24
+ if (status >= 400 && status < 500) switch (status) {
25
+ case 400: return new BadRequestException(statusText, { response });
26
+ case 401: return new UnauthorizedException(statusText, { response });
27
+ case 403: return new ForbiddenException(statusText, { response });
28
+ case 404: return new NotFoundedException(statusText, { response });
29
+ case 405: return new MethodNotAllowedException(statusText, { response });
30
+ case 406: return new NotAcceptableException(statusText, { response });
31
+ case 407: return new ProxyAuthenticationRequiredException(statusText, { response });
32
+ case 408: return new RequestTimeoutException(statusText, { response });
33
+ case 409: return new ConflictException(statusText, { response });
34
+ case 412: return new PreconditionFailedException(statusText, { response });
35
+ case 413: return new ContentTooLargeException(statusText, { response });
36
+ case 414: return new UriTooLongException(statusText, { response });
37
+ case 415: return new UnsupportedMediaTypeException(statusText, { response });
38
+ case 418: return new ImATeapotException(statusText, { response });
39
+ case 429: return new TooManyRequestsException(statusText, { response });
40
+ default: return new RequestException(status, statusText, {
41
+ fatal: true,
42
+ response
43
+ });
44
+ }
45
+ if (status >= 500) switch (status) {
46
+ case 500: return new InternalServerErrorException(statusText, { response });
47
+ case 501: return new NotImplementedException(statusText, { response });
48
+ case 502: return new BadGatewayException(statusText, { response });
49
+ case 503: return new ServiceUnavailableException(statusText, { response });
50
+ case 504: return new GatewayTimeoutException(statusText, { response });
51
+ default: return new RequestException(status, statusText, {
52
+ fatal: false,
53
+ response
54
+ });
55
+ }
56
+ return new RequestException(status, statusText, {
57
+ fatal: false,
58
+ response
59
+ });
60
+ }
61
+ //#endregion
62
+ //#region src/validate-status-code.ts
63
+ function validateStatusCode() {
64
+ return async function validateStatusCode(context, next) {
65
+ await next();
66
+ const response = context.response;
67
+ if (!response) return;
68
+ const { status } = response;
69
+ if (status >= 200 && status < 300) return;
70
+ if (status >= 300 && status < 400) return;
71
+ throw createExceptionByStatusCode(response);
72
+ };
73
+ }
74
+ //#endregion
75
+ export { catchException, createExceptionByStatusCode, throwException, validateStatusCode };
76
+
77
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/throw-exception.ts","../src/catch-exception.ts","../src/create-exception-by-status-code.ts","../src/validate-status-code.ts"],"sourcesContent":["import { KeqContext, KeqMiddleware } from 'keq'\nimport { Promisable } from 'type-fest'\n\n\nexport type Check = (ctx: KeqContext) => Promisable<void>\n\nexport function throwException(check: Check): KeqMiddleware {\n return async function throwException(ctx, next) {\n await next()\n\n await check(ctx)\n }\n}\n","import { KeqMiddleware } from 'keq'\nimport { Promisable } from 'type-fest'\n\n\nexport function catchException(handler: (e: unknown) => Promisable<void>): KeqMiddleware {\n return async function catchException(ctx, next) {\n try {\n await next()\n } catch (err) {\n await handler(err)\n }\n }\n}\n","import {\n BadGatewayException,\n BadRequestException,\n ConflictException,\n ForbiddenException,\n GatewayTimeoutException,\n InternalServerErrorException,\n NotAcceptableException,\n NotFoundedException,\n PreconditionFailedException,\n RequestException,\n ServiceUnavailableException,\n UnauthorizedException,\n ImATeapotException,\n MethodNotAllowedException,\n UriTooLongException,\n ContentTooLargeException,\n ProxyAuthenticationRequiredException,\n RequestTimeoutException,\n TooManyRequestsException,\n NotImplementedException,\n UnsupportedMediaTypeException,\n} from 'keq'\n\nexport function createExceptionByStatusCode(response: Response): Error {\n const { status, statusText } = response\n\n // 4xx client errors\n if (status >= 400 && status < 500) {\n switch (status) {\n case 400:\n return new BadRequestException(statusText, { response })\n case 401:\n return new UnauthorizedException(statusText, { response })\n case 403:\n return new ForbiddenException(statusText, { response })\n case 404:\n return new NotFoundedException(statusText, { response })\n case 405:\n return new MethodNotAllowedException(statusText, { response })\n case 406:\n return new NotAcceptableException(statusText, { response })\n case 407:\n return new ProxyAuthenticationRequiredException(statusText, { response })\n case 408:\n return new RequestTimeoutException(statusText, { response })\n case 409:\n return new ConflictException(statusText, { response })\n case 412:\n return new PreconditionFailedException(statusText, { response })\n case 413:\n return new ContentTooLargeException(statusText, { response })\n case 414:\n return new UriTooLongException(statusText, { response })\n case 415:\n return new UnsupportedMediaTypeException(statusText, { response })\n case 418:\n return new ImATeapotException(statusText, { response })\n case 429:\n return new TooManyRequestsException(statusText, { response })\n default:\n // Other 4xx errors, don't retry by default\n return new RequestException(status, statusText, { fatal: true, response })\n }\n }\n\n // 5xx server errors\n if (status >= 500) {\n switch (status) {\n case 500:\n return new InternalServerErrorException(statusText, { response })\n case 501:\n return new NotImplementedException(statusText, { response })\n case 502:\n return new BadGatewayException(statusText, { response })\n case 503:\n return new ServiceUnavailableException(statusText, { response })\n case 504:\n return new GatewayTimeoutException(statusText, { response })\n default:\n // Other 5xx errors, retry by default\n return new RequestException(status, statusText, { fatal: false, response })\n }\n }\n\n return new RequestException(status, statusText, { fatal: false, response })\n}\n","import { KeqMiddleware } from 'keq'\nimport { createExceptionByStatusCode } from './create-exception-by-status-code.js'\n\nexport function validateStatusCode(): KeqMiddleware {\n return async function validateStatusCode(context, next) {\n await next()\n\n const response = context.response\n if (!response) return\n\n const { status } = response\n\n // 2xx success status codes - no error\n if (status >= 200 && status < 300) return\n\n // 3xx redirection status codes - no error (handled by fetch)\n if (status >= 300 && status < 400) return\n\n throw createExceptionByStatusCode(response)\n }\n}\n"],"mappings":";;AAMA,SAAgB,eAAe,OAA6B;AAC1D,QAAO,eAAe,eAAe,KAAK,MAAM;AAC9C,QAAM,MAAM;AAEZ,QAAM,MAAM,IAAI;;;;;ACNpB,SAAgB,eAAe,SAA0D;AACvF,QAAO,eAAe,eAAe,KAAK,MAAM;AAC9C,MAAI;AACF,SAAM,MAAM;WACL,KAAK;AACZ,SAAM,QAAQ,IAAI;;;;;;ACexB,SAAgB,4BAA4B,UAA2B;CACrE,MAAM,EAAE,QAAQ,eAAe;AAG/B,KAAI,UAAU,OAAO,SAAS,IAC5B,SAAQ,QAAR;EACE,KAAK,IACH,QAAO,IAAI,oBAAoB,YAAY,EAAE,UAAU,CAAC;EAC1D,KAAK,IACH,QAAO,IAAI,sBAAsB,YAAY,EAAE,UAAU,CAAC;EAC5D,KAAK,IACH,QAAO,IAAI,mBAAmB,YAAY,EAAE,UAAU,CAAC;EACzD,KAAK,IACH,QAAO,IAAI,oBAAoB,YAAY,EAAE,UAAU,CAAC;EAC1D,KAAK,IACH,QAAO,IAAI,0BAA0B,YAAY,EAAE,UAAU,CAAC;EAChE,KAAK,IACH,QAAO,IAAI,uBAAuB,YAAY,EAAE,UAAU,CAAC;EAC7D,KAAK,IACH,QAAO,IAAI,qCAAqC,YAAY,EAAE,UAAU,CAAC;EAC3E,KAAK,IACH,QAAO,IAAI,wBAAwB,YAAY,EAAE,UAAU,CAAC;EAC9D,KAAK,IACH,QAAO,IAAI,kBAAkB,YAAY,EAAE,UAAU,CAAC;EACxD,KAAK,IACH,QAAO,IAAI,4BAA4B,YAAY,EAAE,UAAU,CAAC;EAClE,KAAK,IACH,QAAO,IAAI,yBAAyB,YAAY,EAAE,UAAU,CAAC;EAC/D,KAAK,IACH,QAAO,IAAI,oBAAoB,YAAY,EAAE,UAAU,CAAC;EAC1D,KAAK,IACH,QAAO,IAAI,8BAA8B,YAAY,EAAE,UAAU,CAAC;EACpE,KAAK,IACH,QAAO,IAAI,mBAAmB,YAAY,EAAE,UAAU,CAAC;EACzD,KAAK,IACH,QAAO,IAAI,yBAAyB,YAAY,EAAE,UAAU,CAAC;EAC/D,QAEE,QAAO,IAAI,iBAAiB,QAAQ,YAAY;GAAE,OAAO;GAAM;GAAU,CAAC;;AAKhF,KAAI,UAAU,IACZ,SAAQ,QAAR;EACE,KAAK,IACH,QAAO,IAAI,6BAA6B,YAAY,EAAE,UAAU,CAAC;EACnE,KAAK,IACH,QAAO,IAAI,wBAAwB,YAAY,EAAE,UAAU,CAAC;EAC9D,KAAK,IACH,QAAO,IAAI,oBAAoB,YAAY,EAAE,UAAU,CAAC;EAC1D,KAAK,IACH,QAAO,IAAI,4BAA4B,YAAY,EAAE,UAAU,CAAC;EAClE,KAAK,IACH,QAAO,IAAI,wBAAwB,YAAY,EAAE,UAAU,CAAC;EAC9D,QAEE,QAAO,IAAI,iBAAiB,QAAQ,YAAY;GAAE,OAAO;GAAO;GAAU,CAAC;;AAIjF,QAAO,IAAI,iBAAiB,QAAQ,YAAY;EAAE,OAAO;EAAO;EAAU,CAAC;;;;AClF7E,SAAgB,qBAAoC;AAClD,QAAO,eAAe,mBAAmB,SAAS,MAAM;AACtD,QAAM,MAAM;EAEZ,MAAM,WAAW,QAAQ;AACzB,MAAI,CAAC,SAAU;EAEf,MAAM,EAAE,WAAW;AAGnB,MAAI,UAAU,OAAO,SAAS,IAAK;AAGnC,MAAI,UAAU,OAAO,SAAS,IAAK;AAEnC,QAAM,4BAA4B,SAAS"}
@@ -0,0 +1,14 @@
1
+ import { Compiler, Plugin } from "@keq-request/cli";
2
+
3
+ //#region plugins/validate-status-code.d.ts
4
+ interface Options {
5
+ modules?: string[];
6
+ }
7
+ declare class ValidateStatusCodePlugin implements Plugin {
8
+ private options;
9
+ constructor(options?: Options);
10
+ apply(compiler: Compiler): void;
11
+ }
12
+ //#endregion
13
+ export { ValidateStatusCodePlugin };
14
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../plugins/validate-status-code.ts"],"mappings":";;;UAIU,OAAA;EACR,OAAA;AAAA;AAAA,cAGW,wBAAA,YAAoC,MAAA;EAAA,QAC3B,OAAA;cAAA,OAAA,GAAS,OAAA;EAE7B,KAAA,CAAM,QAAA,EAAU,QAAA;AAAA"}
@@ -0,0 +1,14 @@
1
+ import { Compiler, Plugin } from "@keq-request/cli";
2
+
3
+ //#region plugins/validate-status-code.d.ts
4
+ interface Options {
5
+ modules?: string[];
6
+ }
7
+ declare class ValidateStatusCodePlugin implements Plugin {
8
+ private options;
9
+ constructor(options?: Options);
10
+ apply(compiler: Compiler): void;
11
+ }
12
+ //#endregion
13
+ export { ValidateStatusCodePlugin };
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../plugins/validate-status-code.ts"],"mappings":";;;UAIU,OAAA;EACR,OAAA;AAAA;AAAA,cAGW,wBAAA,YAAoC,MAAA;EAAA,QAC3B,OAAA;cAAA,OAAA,GAAS,OAAA;EAE7B,KAAA,CAAM,QAAA,EAAU,QAAA;AAAA"}
@@ -0,0 +1,54 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let _keq_request_cli = require("@keq-request/cli");
3
+ //#region plugins/validate-status-code.ts
4
+ var ValidateStatusCodePlugin = class ValidateStatusCodePlugin {
5
+ constructor(options = {}) {
6
+ this.options = options;
7
+ }
8
+ apply(compiler) {
9
+ if (this.options.modules && this.options.modules.length === 0) return;
10
+ compiler.hooks.afterDownload.tap(ValidateStatusCodePlugin.name, () => {
11
+ const documents = compiler.context.documents;
12
+ compiler.context.documents = documents.map((document) => {
13
+ if (this.options.modules && !this.options.modules.includes(document.module.name)) return document;
14
+ const spec = document.specification;
15
+ if (!spec.paths || typeof spec.paths !== "object" || spec.paths === null) return document;
16
+ const paths = Object.fromEntries(Object.entries(spec.paths).map(([path, pathItem]) => {
17
+ if (!pathItem || typeof pathItem !== "object" || pathItem === null) return [path, pathItem];
18
+ return [path, Object.fromEntries(Object.entries(pathItem).map(([method, operation]) => {
19
+ if (!operation || typeof operation !== "object" || operation === null) return [method, operation];
20
+ const responses = operation.responses;
21
+ if (!responses) return [method, operation];
22
+ return [method, {
23
+ ...operation,
24
+ responses: Object.fromEntries(Object.entries(responses).filter(([statusCode]) => parseInt(statusCode, 10) < 400))
25
+ }];
26
+ }))];
27
+ }));
28
+ return new _keq_request_cli.ApiDocumentV3_1({
29
+ ...spec,
30
+ paths
31
+ }, document.module);
32
+ });
33
+ });
34
+ compiler.hooks.afterCompile.tap(ValidateStatusCodePlugin.name, () => {
35
+ const artifact = compiler.context.artifacts.find((artifact) => artifact.id === "request");
36
+ if (!artifact) return;
37
+ if (!this.options.modules) {
38
+ artifact.anchor.append("file:start", "import { validateStatusCode } from '@keq-request/exception'\n");
39
+ artifact.anchor.prepend("file:end", "request.use(validateStatusCode())\n");
40
+ } else {
41
+ artifact.anchor.append("file:start", "import { validateStatusCode } from '@keq-request/exception'\n");
42
+ artifact.anchor.prepend("file:end", [
43
+ "request",
44
+ " .useRouter()",
45
+ ...this.options.modules.map((moduleName) => ` .module(${JSON.stringify(moduleName)}, validateStatusCode())`),
46
+ ""
47
+ ].join("\n"));
48
+ }
49
+ return artifact;
50
+ });
51
+ }
52
+ };
53
+ //#endregion
54
+ exports.ValidateStatusCodePlugin = ValidateStatusCodePlugin;
@@ -0,0 +1,55 @@
1
+ import { ApiDocumentV3_1 } from "@keq-request/cli";
2
+ //#region plugins/validate-status-code.ts
3
+ var ValidateStatusCodePlugin = class ValidateStatusCodePlugin {
4
+ constructor(options = {}) {
5
+ this.options = options;
6
+ }
7
+ apply(compiler) {
8
+ if (this.options.modules && this.options.modules.length === 0) return;
9
+ compiler.hooks.afterDownload.tap(ValidateStatusCodePlugin.name, () => {
10
+ const documents = compiler.context.documents;
11
+ compiler.context.documents = documents.map((document) => {
12
+ if (this.options.modules && !this.options.modules.includes(document.module.name)) return document;
13
+ const spec = document.specification;
14
+ if (!spec.paths || typeof spec.paths !== "object" || spec.paths === null) return document;
15
+ const paths = Object.fromEntries(Object.entries(spec.paths).map(([path, pathItem]) => {
16
+ if (!pathItem || typeof pathItem !== "object" || pathItem === null) return [path, pathItem];
17
+ return [path, Object.fromEntries(Object.entries(pathItem).map(([method, operation]) => {
18
+ if (!operation || typeof operation !== "object" || operation === null) return [method, operation];
19
+ const responses = operation.responses;
20
+ if (!responses) return [method, operation];
21
+ return [method, {
22
+ ...operation,
23
+ responses: Object.fromEntries(Object.entries(responses).filter(([statusCode]) => parseInt(statusCode, 10) < 400))
24
+ }];
25
+ }))];
26
+ }));
27
+ return new ApiDocumentV3_1({
28
+ ...spec,
29
+ paths
30
+ }, document.module);
31
+ });
32
+ });
33
+ compiler.hooks.afterCompile.tap(ValidateStatusCodePlugin.name, () => {
34
+ const artifact = compiler.context.artifacts.find((artifact) => artifact.id === "request");
35
+ if (!artifact) return;
36
+ if (!this.options.modules) {
37
+ artifact.anchor.append("file:start", "import { validateStatusCode } from '@keq-request/exception'\n");
38
+ artifact.anchor.prepend("file:end", "request.use(validateStatusCode())\n");
39
+ } else {
40
+ artifact.anchor.append("file:start", "import { validateStatusCode } from '@keq-request/exception'\n");
41
+ artifact.anchor.prepend("file:end", [
42
+ "request",
43
+ " .useRouter()",
44
+ ...this.options.modules.map((moduleName) => ` .module(${JSON.stringify(moduleName)}, validateStatusCode())`),
45
+ ""
46
+ ].join("\n"));
47
+ }
48
+ return artifact;
49
+ });
50
+ }
51
+ };
52
+ //#endregion
53
+ export { ValidateStatusCodePlugin };
54
+
55
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../plugins/validate-status-code.ts"],"sourcesContent":["import { ApiDocumentV3_1, Artifact, Compiler, Plugin } from '@keq-request/cli'\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\n\ninterface Options {\n modules?: string[]\n}\n\nexport class ValidateStatusCodePlugin implements Plugin {\n constructor(private options: Options = {}) {}\n\n apply(compiler: Compiler): void {\n if (this.options.modules && this.options.modules.length === 0) return\n\n // remove 4xx and 5xx responses from OpenAPI documents\n compiler.hooks.afterDownload.tap(ValidateStatusCodePlugin.name, () => {\n const documents = compiler.context.documents!\n\n compiler.context.documents = documents.map((document: ApiDocumentV3_1): ApiDocumentV3_1 => {\n if (this.options.modules && !this.options.modules.includes(document.module.name)) {\n return document\n }\n\n const spec: OpenAPIV3_1.Document = document.specification\n\n if (!spec.paths || typeof spec.paths !== 'object' || spec.paths === null) return document\n\n const paths = Object.fromEntries(\n Object.entries(spec.paths)\n .map(([path, pathItem]) => {\n if (!pathItem || typeof pathItem !== 'object' || pathItem === null) return [path, pathItem]\n\n return [\n path,\n Object.fromEntries(\n Object.entries(pathItem)\n .map(([method, operation]) => {\n if (!operation || typeof operation !== 'object' || operation === null) return [method, operation]\n\n const responses = operation.responses\n if (!responses) return [method, operation]\n\n return [\n method,\n {\n ...operation,\n\n responses: Object.fromEntries(\n Object.entries(responses)\n .filter(([statusCode]) => parseInt(statusCode, 10) < 400),\n ),\n },\n ]\n }),\n ),\n ]\n }),\n )\n\n return new ApiDocumentV3_1({ ...spec, paths }, document.module)\n })\n })\n\n // inject validateStatusCode middleware into generated code\n compiler.hooks.afterCompile.tap(ValidateStatusCodePlugin.name, () => {\n const artifact = compiler.context.artifacts!.find((artifact) => artifact.id === 'request')\n if (!artifact) return\n\n if (!this.options.modules) {\n artifact.anchor.append('file:start', \"import { validateStatusCode } from '@keq-request/exception'\\n\")\n artifact.anchor.prepend('file:end', 'request.use(validateStatusCode())\\n')\n } else {\n artifact.anchor.append('file:start', \"import { validateStatusCode } from '@keq-request/exception'\\n\")\n artifact.anchor.prepend(\n 'file:end',\n [\n 'request',\n ' .useRouter()',\n ...this.options.modules.map((moduleName) => ` .module(${JSON.stringify(moduleName)}, validateStatusCode())`),\n '',\n ].join('\\n'),\n )\n }\n\n return artifact\n })\n }\n}\n"],"mappings":";;AAQA,IAAa,2BAAb,MAAa,yBAA2C;CACtD,YAAY,UAA2B,EAAE,EAAE;AAAvB,OAAA,UAAA;;CAEpB,MAAM,UAA0B;AAC9B,MAAI,KAAK,QAAQ,WAAW,KAAK,QAAQ,QAAQ,WAAW,EAAG;AAG/D,WAAS,MAAM,cAAc,IAAI,yBAAyB,YAAY;GACpE,MAAM,YAAY,SAAS,QAAQ;AAEnC,YAAS,QAAQ,YAAY,UAAU,KAAK,aAA+C;AACzF,QAAI,KAAK,QAAQ,WAAW,CAAC,KAAK,QAAQ,QAAQ,SAAS,SAAS,OAAO,KAAK,CAC9E,QAAO;IAGT,MAAM,OAA6B,SAAS;AAE5C,QAAI,CAAC,KAAK,SAAS,OAAO,KAAK,UAAU,YAAY,KAAK,UAAU,KAAM,QAAO;IAEjF,MAAM,QAAQ,OAAO,YACnB,OAAO,QAAQ,KAAK,MAAM,CACvB,KAAK,CAAC,MAAM,cAAc;AACzB,SAAI,CAAC,YAAY,OAAO,aAAa,YAAY,aAAa,KAAM,QAAO,CAAC,MAAM,SAAS;AAE3F,YAAO,CACL,MACA,OAAO,YACL,OAAO,QAAQ,SAAS,CACrB,KAAK,CAAC,QAAQ,eAAe;AAC5B,UAAI,CAAC,aAAa,OAAO,cAAc,YAAY,cAAc,KAAM,QAAO,CAAC,QAAQ,UAAU;MAEjG,MAAM,YAAY,UAAU;AAC5B,UAAI,CAAC,UAAW,QAAO,CAAC,QAAQ,UAAU;AAE1C,aAAO,CACL,QACA;OACE,GAAG;OAEH,WAAW,OAAO,YAChB,OAAO,QAAQ,UAAU,CACtB,QAAQ,CAAC,gBAAgB,SAAS,YAAY,GAAG,GAAG,IAAI,CAC5D;OACF,CACF;OACD,CACL,CACF;MACD,CACL;AAED,WAAO,IAAI,gBAAgB;KAAE,GAAG;KAAM;KAAO,EAAE,SAAS,OAAO;KAC/D;IACF;AAGF,WAAS,MAAM,aAAa,IAAI,yBAAyB,YAAY;GACnE,MAAM,WAAW,SAAS,QAAQ,UAAW,MAAM,aAAa,SAAS,OAAO,UAAU;AAC1F,OAAI,CAAC,SAAU;AAEf,OAAI,CAAC,KAAK,QAAQ,SAAS;AACzB,aAAS,OAAO,OAAO,cAAc,gEAAgE;AACrG,aAAS,OAAO,QAAQ,YAAY,sCAAsC;UACrE;AACL,aAAS,OAAO,OAAO,cAAc,gEAAgE;AACrG,aAAS,OAAO,QACd,YACA;KACE;KACA;KACA,GAAG,KAAK,QAAQ,QAAQ,KAAK,eAAe,aAAa,KAAK,UAAU,WAAW,CAAC,yBAAyB;KAC7G;KACD,CAAC,KAAK,KAAK,CACb;;AAGH,UAAO;IACP"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keq-request/exception",
3
- "version": "5.0.0-alpha.7",
3
+ "version": "5.0.0-beta.1",
4
4
  "description": "Request exception for keq",
5
5
  "keywords": [
6
6
  "keq",
@@ -9,7 +9,7 @@
9
9
  "error",
10
10
  "fetch"
11
11
  ],
12
- "homepage": "https://github.com/keq-request/keq#readme",
12
+ "homepage": "https://keq-request.github.io",
13
13
  "bugs": {
14
14
  "url": "https://github.com/keq-request/keq/issues"
15
15
  },
@@ -26,22 +26,31 @@
26
26
  "types": "./dist/index.d.ts",
27
27
  "require": "./dist/index.js",
28
28
  "import": "./dist/index.mjs"
29
+ },
30
+ "./plugins": {
31
+ "types": "./dist/plugins/index.d.ts",
32
+ "require": "./dist/plugins/index.js",
33
+ "import": "./dist/plugins/index.mjs"
29
34
  }
30
35
  },
31
36
  "dependencies": {
32
- "type-fest": "^5.2.0"
37
+ "type-fest": "^5.6.0"
33
38
  },
34
39
  "devDependencies": {
35
- "@types/node": "^20.19.24",
36
- "keq": "5.0.0-alpha.7",
37
- "@keq-request/test": "5.0.0-alpha.7"
40
+ "@scalar/openapi-types": "^0.8.0",
41
+ "@types/node": "^20.19.39",
42
+ "@keq-request/cli": "5.0.0-beta.1",
43
+ "keq": "5.0.0-beta.1"
38
44
  },
39
45
  "peerDependencies": {
40
- "keq": "^5.0.0-alpha.7"
46
+ "keq": "^5.0.0-beta.1"
47
+ },
48
+ "optionalDependencies": {
49
+ "@keq-request/cli": "5.0.0-beta.1"
41
50
  },
42
51
  "scripts": {
43
- "build": "tsup",
44
- "dev": "tsup --watch",
52
+ "build": "tsdown",
53
+ "dev": "tsdown --watch",
45
54
  "test": "jest",
46
55
  "test:update": "jest -u"
47
56
  }
@@ -0,0 +1 @@
1
+ export * from './validate-status-code.js'
@@ -0,0 +1,88 @@
1
+ import { ApiDocumentV3_1, Artifact, Compiler, Plugin } from '@keq-request/cli'
2
+ import type { OpenAPIV3_1 } from '@scalar/openapi-types'
3
+
4
+
5
+ interface Options {
6
+ modules?: string[]
7
+ }
8
+
9
+ export class ValidateStatusCodePlugin implements Plugin {
10
+ constructor(private options: Options = {}) {}
11
+
12
+ apply(compiler: Compiler): void {
13
+ if (this.options.modules && this.options.modules.length === 0) return
14
+
15
+ // remove 4xx and 5xx responses from OpenAPI documents
16
+ compiler.hooks.afterDownload.tap(ValidateStatusCodePlugin.name, () => {
17
+ const documents = compiler.context.documents!
18
+
19
+ compiler.context.documents = documents.map((document: ApiDocumentV3_1): ApiDocumentV3_1 => {
20
+ if (this.options.modules && !this.options.modules.includes(document.module.name)) {
21
+ return document
22
+ }
23
+
24
+ const spec: OpenAPIV3_1.Document = document.specification
25
+
26
+ if (!spec.paths || typeof spec.paths !== 'object' || spec.paths === null) return document
27
+
28
+ const paths = Object.fromEntries(
29
+ Object.entries(spec.paths)
30
+ .map(([path, pathItem]) => {
31
+ if (!pathItem || typeof pathItem !== 'object' || pathItem === null) return [path, pathItem]
32
+
33
+ return [
34
+ path,
35
+ Object.fromEntries(
36
+ Object.entries(pathItem)
37
+ .map(([method, operation]) => {
38
+ if (!operation || typeof operation !== 'object' || operation === null) return [method, operation]
39
+
40
+ const responses = operation.responses
41
+ if (!responses) return [method, operation]
42
+
43
+ return [
44
+ method,
45
+ {
46
+ ...operation,
47
+
48
+ responses: Object.fromEntries(
49
+ Object.entries(responses)
50
+ .filter(([statusCode]) => parseInt(statusCode, 10) < 400),
51
+ ),
52
+ },
53
+ ]
54
+ }),
55
+ ),
56
+ ]
57
+ }),
58
+ )
59
+
60
+ return new ApiDocumentV3_1({ ...spec, paths }, document.module)
61
+ })
62
+ })
63
+
64
+ // inject validateStatusCode middleware into generated code
65
+ compiler.hooks.afterCompile.tap(ValidateStatusCodePlugin.name, () => {
66
+ const artifact = compiler.context.artifacts!.find((artifact) => artifact.id === 'request')
67
+ if (!artifact) return
68
+
69
+ if (!this.options.modules) {
70
+ artifact.anchor.append('file:start', "import { validateStatusCode } from '@keq-request/exception'\n")
71
+ artifact.anchor.prepend('file:end', 'request.use(validateStatusCode())\n')
72
+ } else {
73
+ artifact.anchor.append('file:start', "import { validateStatusCode } from '@keq-request/exception'\n")
74
+ artifact.anchor.prepend(
75
+ 'file:end',
76
+ [
77
+ 'request',
78
+ ' .useRouter()',
79
+ ...this.options.modules.map((moduleName) => ` .module(${JSON.stringify(moduleName)}, validateStatusCode())`),
80
+ '',
81
+ ].join('\n'),
82
+ )
83
+ }
84
+
85
+ return artifact
86
+ })
87
+ }
88
+ }
@@ -0,0 +1,25 @@
1
+ import { defineConfig } from 'tsdown'
2
+
3
+ export default defineConfig([
4
+ {
5
+ entry: ['src/index.ts'],
6
+ format: ['cjs', 'esm'],
7
+ target: ['chrome91', 'firefox90', 'safari15', 'edge91', 'node20'],
8
+ outDir: 'dist',
9
+ platform: 'neutral',
10
+ tsconfig: 'tsconfig.lib.json',
11
+ dts: { sourcemap: true },
12
+ sourcemap: true,
13
+ clean: true,
14
+ },
15
+ {
16
+ entry: ['./plugins/index.ts'],
17
+ format: ['cjs', 'esm'],
18
+ outDir: 'dist/plugins',
19
+ platform: 'neutral',
20
+ target: ['node20'],
21
+ dts: true,
22
+ tsconfig: './plugins/tsconfig.json',
23
+ deps: { neverBundle: ['@keq-request/cli', '@scalar/openapi-types'] },
24
+ },
25
+ ])
package/jest.config.cts DELETED
@@ -1,14 +0,0 @@
1
- import type { Config } from 'jest'
2
- import { pathsToModuleNameMapper } from 'ts-jest'
3
- import { compilerOptions } from './tsconfig.json'
4
-
5
-
6
- export default async (): Promise<Config> => ({
7
- preset: 'ts-jest',
8
- // setupFilesAfterEnv: ['<rootDir>/__tests__/setup.ts'],
9
- moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { prefix: '<rootDir>/src', useESM: true }),
10
- testMatch: [
11
- '<rootDir>/__tests__/**/*.spec.ts',
12
- '<rootDir>/src/**/*.spec.ts',
13
- ],
14
- })