@codewithagents/api-errors 0.3.1 → 0.4.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/dist/index.d.ts +18 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -20,16 +20,32 @@ export interface MapApiErrorsOptions {
|
|
|
20
20
|
* paths, e.g. `"addressCity"` → `"address.city"`.
|
|
21
21
|
*/
|
|
22
22
|
transformField?: (field: string) => string;
|
|
23
|
+
/**
|
|
24
|
+
* Restrict field error extraction to specific HTTP status codes.
|
|
25
|
+
* If provided, the error's `status` (or `response.status`) is checked first.
|
|
26
|
+
* If the status is not in this list, `extractFieldErrors` returns `[]` immediately
|
|
27
|
+
* without attempting to parse the body.
|
|
28
|
+
*
|
|
29
|
+
* Useful to avoid trying to extract field errors from 404 or 500 responses.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* extractFieldErrors(err, { statusCodes: [422] })
|
|
33
|
+
*/
|
|
34
|
+
statusCodes?: number[];
|
|
23
35
|
}
|
|
24
36
|
/**
|
|
25
37
|
* Extract normalized field errors from an unknown API error response.
|
|
26
38
|
*
|
|
27
39
|
* Supports:
|
|
28
|
-
* - RFC 7807 Problem Details (Spring Boot 3+)
|
|
29
|
-
* -
|
|
40
|
+
* - RFC 7807 / RFC 9457 Problem Details (Spring Boot 3+) with `errors` map
|
|
41
|
+
* - RFC 9457 top-level `detail` field as a root-level error
|
|
42
|
+
* - Spring Boot default validation format (array of `{ field, defaultMessage }`)
|
|
30
43
|
* - Simple flat `{ field, message }` object
|
|
31
44
|
* - Array of `{ field, message }` objects
|
|
32
45
|
*
|
|
46
|
+
* Use `statusCodes` to restrict extraction to specific HTTP status codes —
|
|
47
|
+
* avoids parsing 404 or 500 bodies as field errors.
|
|
48
|
+
*
|
|
33
49
|
* Never throws — returns an empty array for unrecognized shapes.
|
|
34
50
|
*/
|
|
35
51
|
export declare function extractFieldErrors(error: unknown, options?: MapApiErrorsOptions): FieldError[];
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC1C;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAiJD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC5B,UAAU,EAAE,CA+Dd;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,EAC3E,OAAO,CAAC,EAAE,mBAAmB,GAC5B,IAAI,CAKN"}
|
package/dist/index.js
CHANGED
|
@@ -84,6 +84,18 @@ function tryParseFlatArray(body, fallbackField, transformField) {
|
|
|
84
84
|
}
|
|
85
85
|
return result.length > 0 ? result : null;
|
|
86
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* RFC 9457 / RFC 7807 top-level detail field:
|
|
89
|
+
* { "title": "Bad Request", "detail": "Email is already taken.", "status": 422 }
|
|
90
|
+
*
|
|
91
|
+
* Fires as a last-resort fallback when no field-specific errors are found.
|
|
92
|
+
*/
|
|
93
|
+
function tryParseRfc9457Detail(body, fallbackField, transformField) {
|
|
94
|
+
const detail = body['detail'];
|
|
95
|
+
if (typeof detail !== 'string')
|
|
96
|
+
return null;
|
|
97
|
+
return [{ field: transformField(fallbackField), message: detail }];
|
|
98
|
+
}
|
|
87
99
|
// ---------------------------------------------------------------------------
|
|
88
100
|
// Public API
|
|
89
101
|
// ---------------------------------------------------------------------------
|
|
@@ -91,17 +103,40 @@ function tryParseFlatArray(body, fallbackField, transformField) {
|
|
|
91
103
|
* Extract normalized field errors from an unknown API error response.
|
|
92
104
|
*
|
|
93
105
|
* Supports:
|
|
94
|
-
* - RFC 7807 Problem Details (Spring Boot 3+)
|
|
95
|
-
* -
|
|
106
|
+
* - RFC 7807 / RFC 9457 Problem Details (Spring Boot 3+) with `errors` map
|
|
107
|
+
* - RFC 9457 top-level `detail` field as a root-level error
|
|
108
|
+
* - Spring Boot default validation format (array of `{ field, defaultMessage }`)
|
|
96
109
|
* - Simple flat `{ field, message }` object
|
|
97
110
|
* - Array of `{ field, message }` objects
|
|
98
111
|
*
|
|
112
|
+
* Use `statusCodes` to restrict extraction to specific HTTP status codes —
|
|
113
|
+
* avoids parsing 404 or 500 bodies as field errors.
|
|
114
|
+
*
|
|
99
115
|
* Never throws — returns an empty array for unrecognized shapes.
|
|
100
116
|
*/
|
|
101
117
|
export function extractFieldErrors(error, options) {
|
|
102
118
|
const fallbackField = options?.fallbackField ?? 'root';
|
|
103
119
|
const transformField = options?.transformField ?? ((f) => f);
|
|
104
120
|
try {
|
|
121
|
+
// Status-code filtering: if statusCodes is provided, check error.status
|
|
122
|
+
// (or error.response.status for Axios-style errors) before doing anything.
|
|
123
|
+
if (options?.statusCodes !== undefined) {
|
|
124
|
+
let status;
|
|
125
|
+
if (isObject(error)) {
|
|
126
|
+
const e = error;
|
|
127
|
+
if (typeof e['status'] === 'number') {
|
|
128
|
+
status = e['status'];
|
|
129
|
+
}
|
|
130
|
+
else if (isObject(e['response'])) {
|
|
131
|
+
const r = e['response'];
|
|
132
|
+
if (typeof r['status'] === 'number')
|
|
133
|
+
status = r['status'];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (status !== undefined && !options.statusCodes.includes(status)) {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
}
|
|
105
140
|
// Unwrap common error wrapper shapes (e.g. Axios response, fetch response body)
|
|
106
141
|
let body = error;
|
|
107
142
|
// Support objects with a `response.data` shape (Axios-style)
|
|
@@ -130,6 +165,10 @@ export function extractFieldErrors(error, options) {
|
|
|
130
165
|
const flat = tryParseFlatObject(body, fallbackField, transformField);
|
|
131
166
|
if (flat !== null)
|
|
132
167
|
return flat;
|
|
168
|
+
// Try RFC 9457 top-level detail as a last-resort root error
|
|
169
|
+
const rfc9457 = tryParseRfc9457Detail(body, fallbackField, transformField);
|
|
170
|
+
if (rfc9457 !== null)
|
|
171
|
+
return rfc9457;
|
|
133
172
|
return [];
|
|
134
173
|
}
|
|
135
174
|
catch {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED