@codewithagents/api-errors 1.0.6 → 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/dist/index.d.ts CHANGED
@@ -5,6 +5,63 @@ export interface FieldError {
5
5
  field: string;
6
6
  message: string;
7
7
  }
8
+ /**
9
+ * The format/shape that was recognized when parsing an error body.
10
+ *
11
+ * - `'rfc7807-map'` - RFC 7807 / RFC 9457 `errors` map: `{ errors: { field: [...] } }`
12
+ * - `'spring-array'` - Spring Boot array: `{ errors: [{ field, defaultMessage }] }`
13
+ * - `'violations'` - RFC 9457 / Spring `violations` array: `{ violations: [{ field, message }] }`
14
+ * - `'invalid-params'` - RFC 9457 `invalid-params` array: `{ "invalid-params": [{ name, reason }] }`
15
+ * - `'json-api'` - JSON:API errors array: `{ errors: [{ source: { pointer }, detail }] }`
16
+ * - `'laravel-drf'` - Laravel / DRF top-level field map: `{ field: ["msg1", ...] }`
17
+ * - `'flat-object'` - Simple flat object: `{ field, message }`
18
+ * - `'flat-array'` - Array of flat objects: `[{ field, message }]`
19
+ * - `'rfc9457-detail'` - RFC 9457 top-level `detail` string (last-resort fallback)
20
+ * - `'custom'` - Matched a caller-provided custom parser
21
+ */
22
+ export type ErrorFormat = 'rfc7807-map' | 'spring-array' | 'violations' | 'invalid-params' | 'json-api' | 'laravel-drf' | 'flat-object' | 'flat-array' | 'rfc9457-detail' | 'custom';
23
+ /**
24
+ * Rich result returned by `extractErrors`.
25
+ */
26
+ export interface ExtractResult {
27
+ /**
28
+ * Field-level errors extracted from the response body.
29
+ */
30
+ fieldErrors: FieldError[];
31
+ /**
32
+ * Non-field (global/form-level) error messages.
33
+ * These are messages that could not be attributed to a specific field,
34
+ * such as RFC 9457 `detail`, JSON:API errors without a source pointer,
35
+ * or violations/invalid-params entries without a field name.
36
+ */
37
+ formErrors: string[];
38
+ /**
39
+ * The format that was recognized.
40
+ * `null` when no supported format matched (both `fieldErrors` and `formErrors` are empty).
41
+ *
42
+ * Use this to distinguish "unrecognized shape" from "recognized but genuinely no errors".
43
+ */
44
+ format: ErrorFormat | null;
45
+ }
46
+ /**
47
+ * A custom parser that callers can register to handle application-specific
48
+ * error shapes not covered by the built-in parsers.
49
+ *
50
+ * Return `null` to indicate "not recognized" and let the next parser try.
51
+ * Return a `ParsedErrors` object (even if both arrays are empty) to signal
52
+ * that this shape was recognized.
53
+ */
54
+ export interface CustomParser {
55
+ (body: unknown): ParsedErrors | null;
56
+ }
57
+ /**
58
+ * Raw parse result used internally and returned by custom parsers.
59
+ * Both arrays may be empty if the shape was recognized but contained no errors.
60
+ */
61
+ export interface ParsedErrors {
62
+ fieldErrors: FieldError[];
63
+ formErrors: string[];
64
+ }
8
65
  /**
9
66
  * Options for mapApiErrors and extractFieldErrors.
10
67
  */
@@ -17,7 +74,7 @@ export interface MapApiErrorsOptions {
17
74
  /**
18
75
  * Optional transform applied to every field name before it is returned.
19
76
  * Useful for mapping backend camelCase field names to nested React Hook Form
20
- * paths, e.g. `"addressCity"` → `"address.city"`.
77
+ * paths, e.g. `"addressCity"` to `"address.city"`.
21
78
  */
22
79
  transformField?: (field: string) => string;
23
80
  /**
@@ -32,19 +89,68 @@ export interface MapApiErrorsOptions {
32
89
  * extractFieldErrors(err, { statusCodes: [422] })
33
90
  */
34
91
  statusCodes?: number[];
92
+ /**
93
+ * Optional message resolver / i18n hook.
94
+ * Called for every error message (both field errors and form errors) before
95
+ * the message is included in the result. Return a replacement string to
96
+ * translate or reformat the message.
97
+ *
98
+ * `field` is `null` for global/form-level errors.
99
+ *
100
+ * @example
101
+ * resolveMessage: (msg, field) => t(`errors.${msg}`) ?? msg
102
+ */
103
+ resolveMessage?: (message: string, field: string | null) => string;
104
+ /**
105
+ * Custom parsers to try before the built-in parsers.
106
+ * Parsers are tried in order; the first one that returns a non-null result wins.
107
+ * Return `null` to indicate "not recognized by this parser".
108
+ *
109
+ * Custom parsers receive the already-unwrapped body (after ApiError / Axios
110
+ * unwrapping), so they do not need to re-implement body unwrapping.
111
+ */
112
+ parsers?: ReadonlyArray<CustomParser>;
35
113
  }
114
+ /**
115
+ * Extract errors from an unknown API error response, returning a rich result
116
+ * that includes field errors, form-level (non-field) errors, and the matched format.
117
+ *
118
+ * Use `format` to distinguish "unrecognized shape" (format is null) from
119
+ * "recognized but genuinely no errors" (format is non-null, both arrays empty).
120
+ *
121
+ * `formErrors` contains global / non-field error messages that cannot be
122
+ * attributed to a specific field (e.g. RFC 9457 `detail`, JSON:API errors
123
+ * without a source pointer, violations without a field name).
124
+ *
125
+ * Supports all formats recognized by `extractFieldErrors`, plus:
126
+ * - `violations: [{ field, message }]`
127
+ * - `"invalid-params": [{ name, reason }]`
128
+ * - JSON:API `errors: [{ source: { pointer }, detail }]`
129
+ * - Laravel / DRF top-level field map `{ field: ["msg", ...] }`
130
+ *
131
+ * Use `options.parsers` to register custom parsers for application-specific shapes.
132
+ *
133
+ * Never throws.
134
+ */
135
+ export declare function extractErrors(error: unknown, options?: MapApiErrorsOptions): ExtractResult;
36
136
  /**
37
137
  * Extract normalized field errors from an unknown API error response.
38
138
  *
39
139
  * Supports:
40
140
  * - RFC 7807 / RFC 9457 Problem Details (Spring Boot 3+) with `errors` map
41
141
  * - RFC 9457 top-level `detail` field as a root-level error
142
+ * - RFC 9457 `violations: [{ field, message }]` array
143
+ * - RFC 9457 `"invalid-params": [{ name, reason }]` array
144
+ * - JSON:API `errors: [{ source: { pointer }, detail }]` array
145
+ * - Laravel / DRF top-level field map `{ field: ["msg", ...] }`
42
146
  * - Spring Boot default validation format (array of `{ field, defaultMessage }`)
43
147
  * - Simple flat `{ field, message }` object
44
148
  * - Array of `{ field, message }` objects
45
149
  *
46
- * Use `statusCodes` to restrict extraction to specific HTTP status codes —
47
- * avoids parsing 404 or 500 bodies as field errors.
150
+ * Use `statusCodes` to restrict extraction to specific HTTP status codes.
151
+ *
152
+ * For a richer result that includes non-field errors and the matched format,
153
+ * use `extractErrors` instead.
48
154
  *
49
155
  * Never throws — returns an empty array for unrecognized shapes.
50
156
  */
@@ -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;IAC1C;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AA8KD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,UAAU,EAAE,CA0E9F;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"}
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;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,WAAW,GACnB,aAAa,GACb,cAAc,GACd,YAAY,GACZ,gBAAgB,GAChB,UAAU,GACV,aAAa,GACb,aAAa,GACb,YAAY,GACZ,gBAAgB,GAChB,QAAQ,CAAA;AAEZ;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB;;;;;OAKG;IACH,MAAM,EAAE,WAAW,GAAG,IAAI,CAAA;CAC3B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAAA;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;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;IACtB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAA;IAClE;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;CACtC;AA6gBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,aAAa,CA2B1F;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,UAAU,EAAE,CAqB9F;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
@@ -8,13 +8,191 @@ function isStringArray(value) {
8
8
  return Array.isArray(value) && value.every((v) => typeof v === 'string');
9
9
  }
10
10
  // ---------------------------------------------------------------------------
11
+ // Shared helper: keyed-array parser (violations + invalid-params)
12
+ // ---------------------------------------------------------------------------
13
+ /** Extract field + message from a single keyed-array item. Returns null when message is absent. */
14
+ function parseKeyedItem(item, fieldKey, messageKey) {
15
+ const message = typeof item[messageKey] === 'string' ? item[messageKey] : null;
16
+ if (message === null)
17
+ return null;
18
+ const field = typeof item[fieldKey] === 'string' && item[fieldKey] !== '' ? item[fieldKey] : null;
19
+ return { field, message };
20
+ }
21
+ /**
22
+ * Parse an array of objects where each item carries a field key and a message key.
23
+ * Items whose field value is absent or empty are treated as global (form-level) errors.
24
+ * Items without a message value are silently skipped.
25
+ */
26
+ function parseKeyedArray(items, fieldKey, messageKey) {
27
+ const fieldErrors = [];
28
+ const formErrors = [];
29
+ for (const item of items) {
30
+ if (!isObject(item))
31
+ continue;
32
+ const parsed = parseKeyedItem(item, fieldKey, messageKey);
33
+ if (parsed === null)
34
+ continue;
35
+ if (parsed.field !== null) {
36
+ fieldErrors.push({ field: parsed.field, message: parsed.message });
37
+ }
38
+ else {
39
+ formErrors.push(parsed.message);
40
+ }
41
+ }
42
+ return { fieldErrors, formErrors };
43
+ }
44
+ // ---------------------------------------------------------------------------
11
45
  // Format detectors + parsers
12
46
  // ---------------------------------------------------------------------------
47
+ /**
48
+ * RFC 9457 violations array (also used by some Spring Boot setups):
49
+ * { "violations": [{ "field": "email", "message": "must not be blank" }] }
50
+ */
51
+ function tryParseViolations(body) {
52
+ const { violations } = body;
53
+ if (!Array.isArray(violations))
54
+ return null;
55
+ return parseKeyedArray(violations, 'field', 'message');
56
+ }
57
+ /**
58
+ * RFC 9457 invalid-params array:
59
+ * { "invalid-params": [{ "name": "email", "reason": "must not be blank" }] }
60
+ */
61
+ function tryParseInvalidParams(body) {
62
+ const invalidParams = body['invalid-params'];
63
+ if (!Array.isArray(invalidParams))
64
+ return null;
65
+ return parseKeyedArray(invalidParams, 'name', 'reason');
66
+ }
67
+ /**
68
+ * JSON:API errors array:
69
+ * { "errors": [{ "source": { "pointer": "/data/attributes/email" }, "detail": "..." }] }
70
+ *
71
+ * Errors with a source pointer map to field errors.
72
+ * Errors without a source pointer (or with a pointer of "/") map to form errors.
73
+ *
74
+ * IMPORTANT: this parser must run BEFORE tryParseSpringArray because a JSON:API
75
+ * body also has an `errors` array and would silently match the Spring-array parser
76
+ * via the defaultMessage fallback.
77
+ */
78
+ function tryParseJsonApi(body) {
79
+ const { errors } = body;
80
+ if (!Array.isArray(errors) || !isJsonApiShape(errors))
81
+ return null;
82
+ const fieldErrors = [];
83
+ const formErrors = [];
84
+ for (const item of errors) {
85
+ if (!isObject(item))
86
+ continue;
87
+ classifyJsonApiItem(item, fieldErrors, formErrors);
88
+ }
89
+ return { fieldErrors, formErrors };
90
+ }
91
+ /** True when at least one item looks like a JSON:API error object (not Spring). */
92
+ function isJsonApiShape(errors) {
93
+ return errors.some((item) => isObject(item) &&
94
+ (isObject(item['source']) || typeof item['detail'] === 'string') &&
95
+ !('field' in item) &&
96
+ !('defaultMessage' in item));
97
+ }
98
+ /** Push one JSON:API error item into the appropriate bucket. */
99
+ function classifyJsonApiItem(item, fieldErrors, formErrors) {
100
+ const detail = typeof item['detail'] === 'string' ? item['detail'] : null;
101
+ const message = detail ?? 'Unknown error';
102
+ const source = item['source'];
103
+ if (isObject(source) && typeof source['pointer'] === 'string') {
104
+ const field = pointerToField(source['pointer']);
105
+ if (field !== null) {
106
+ fieldErrors.push({ field, message });
107
+ }
108
+ else if (detail !== null) {
109
+ formErrors.push(detail);
110
+ }
111
+ }
112
+ else if (detail !== null) {
113
+ formErrors.push(detail);
114
+ }
115
+ }
116
+ /**
117
+ * Convert a JSON Pointer (RFC 6901) used in JSON:API source.pointer to a
118
+ * dot-separated field path for form use.
119
+ *
120
+ * `/data/attributes/email` -> `email`
121
+ * `/data/attributes/address/city` -> `address.city`
122
+ * `/data/relationships/author` -> `author`
123
+ * `/email` -> `email`
124
+ * `/` -> null (root, non-field)
125
+ * `` -> null
126
+ */
127
+ function pointerToField(pointer) {
128
+ if (!pointer || pointer === '/')
129
+ return null;
130
+ const segments = pointer
131
+ .replace(/^\//, '')
132
+ .split('/')
133
+ .map((s) => s.replace(/~1/g, '/').replace(/~0/g, '~'))
134
+ .filter(Boolean);
135
+ return segments.length > 0 ? resolveJsonApiSegments(segments) : null;
136
+ }
137
+ /** Strip well-known JSON:API structural prefixes and join as dot-path. */
138
+ function resolveJsonApiSegments(segments) {
139
+ if (segments[0] !== 'data')
140
+ return segments.join('.');
141
+ if (segments[1] === 'attributes') {
142
+ const rest = segments.slice(2);
143
+ return rest.length > 0 ? rest.join('.') : null;
144
+ }
145
+ if (segments[1] === 'relationships' && segments.length > 2) {
146
+ return segments.slice(2).join('.');
147
+ }
148
+ return segments.join('.');
149
+ }
150
+ /**
151
+ * Laravel / DRF top-level field-to-messages map:
152
+ * { "email": ["must not be blank", "invalid format"], "name": ["required"] }
153
+ *
154
+ * Guard: at least one value must be a non-empty string array, and the body
155
+ * must not use keys owned by other parsers.
156
+ */
157
+ function tryParseLaravelDrf(body) {
158
+ const entries = Object.entries(body);
159
+ if (entries.length === 0 || hasReservedLaravelKey(entries))
160
+ return null;
161
+ // Require at least one non-empty string array to distinguish from generic flat objects
162
+ if (!entries.some(([, v]) => isStringArray(v) && v.length > 0))
163
+ return null;
164
+ const fieldErrors = [];
165
+ for (const [rawField, messages] of entries) {
166
+ if (isStringArray(messages)) {
167
+ for (const message of messages)
168
+ fieldErrors.push({ field: rawField, message });
169
+ }
170
+ else if (typeof messages === 'string') {
171
+ fieldErrors.push({ field: rawField, message: messages });
172
+ }
173
+ }
174
+ return fieldErrors.length > 0 ? { fieldErrors, formErrors: [] } : null;
175
+ }
176
+ /** Keys that belong to other parsers and disqualify a body from Laravel/DRF matching. */
177
+ const LARAVEL_RESERVED_KEYS = new Set([
178
+ 'errors',
179
+ 'violations',
180
+ 'invalid-params',
181
+ 'field',
182
+ 'message',
183
+ 'detail',
184
+ 'title',
185
+ 'status',
186
+ 'type',
187
+ ]);
188
+ function hasReservedLaravelKey(entries) {
189
+ return entries.some(([k]) => LARAVEL_RESERVED_KEYS.has(k));
190
+ }
13
191
  /**
14
192
  * RFC 7807 Problem Details (Spring Boot 3+ default):
15
193
  * { "errors": { "email": ["must not be blank"], "name": ["too short"] } }
16
194
  */
17
- function tryParseRfc7807(body, fallbackField, transformField) {
195
+ function tryParseRfc7807(body, transformField) {
18
196
  const { errors } = body;
19
197
  if (!isObject(errors))
20
198
  return null;
@@ -22,9 +200,8 @@ function tryParseRfc7807(body, fallbackField, transformField) {
22
200
  for (const [rawField, messages] of Object.entries(errors)) {
23
201
  const field = transformField(rawField);
24
202
  if (isStringArray(messages)) {
25
- for (const message of messages) {
203
+ for (const message of messages)
26
204
  result.push({ field, message });
27
- }
28
205
  }
29
206
  else if (typeof messages === 'string') {
30
207
  result.push({ field, message: messages });
@@ -84,18 +261,6 @@ function tryParseFlatArray(body, fallbackField, transformField) {
84
261
  }
85
262
  return result.length > 0 ? result : null;
86
263
  }
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
- }
99
264
  // ---------------------------------------------------------------------------
100
265
  // Safety
101
266
  // ---------------------------------------------------------------------------
@@ -127,20 +292,223 @@ function finalize(result) {
127
292
  return safe.length > MAX_FIELD_ERRORS ? safe.slice(0, MAX_FIELD_ERRORS) : safe;
128
293
  }
129
294
  // ---------------------------------------------------------------------------
295
+ // Body unwrapping: three independent single-step helpers
296
+ // ---------------------------------------------------------------------------
297
+ /** Unwrap `{ status: number, body: unknown }` (ApiError from generated client). */
298
+ function unwrapApiError(value) {
299
+ if (isObject(value) &&
300
+ typeof value['status'] === 'number' &&
301
+ Object.prototype.hasOwnProperty.call(value, 'body')) {
302
+ return value['body'];
303
+ }
304
+ return value;
305
+ }
306
+ /** Unwrap `{ response: { data: ... } }` (Axios-style errors). */
307
+ function unwrapAxiosResponse(value) {
308
+ if (isObject(value) && isObject(value['response']) && value['response']['data'] !== undefined) {
309
+ return value['response']['data'];
310
+ }
311
+ return value;
312
+ }
313
+ /** Unwrap `{ data: { ... } }` top-level data envelopes (no field/errors at root). */
314
+ function unwrapDataEnvelope(value) {
315
+ if (isObject(value) && isObject(value['data']) && !('field' in value) && !('errors' in value)) {
316
+ return value['data'];
317
+ }
318
+ return value;
319
+ }
320
+ /** Run all three unwrap steps in sequence to get the raw error body. */
321
+ function unwrapBody(error) {
322
+ return unwrapDataEnvelope(unwrapAxiosResponse(unwrapApiError(error)));
323
+ }
324
+ /** Wrap a ParsedErrors result with its format tag, applying transformField to field names. */
325
+ function wrapMatch(parsed, format, transformField) {
326
+ return {
327
+ parsed: {
328
+ fieldErrors: parsed.fieldErrors.map((e) => ({
329
+ field: transformField(e.field),
330
+ message: e.message,
331
+ })),
332
+ formErrors: parsed.formErrors,
333
+ },
334
+ format,
335
+ };
336
+ }
337
+ /**
338
+ * Try all object-body parsers in priority order.
339
+ * Returns the first match, or null if no parser recognized the shape.
340
+ */
341
+ function matchObjectBody(body, fallbackField, transformField) {
342
+ // Each thunk in this ordered list tries one parser and returns a MatchResult or null.
343
+ const candidates = [
344
+ () => {
345
+ const r = tryParseViolations(body);
346
+ return r && wrapMatch(r, 'violations', transformField);
347
+ },
348
+ () => {
349
+ const r = tryParseInvalidParams(body);
350
+ return r && wrapMatch(r, 'invalid-params', transformField);
351
+ },
352
+ () => {
353
+ const r = tryParseJsonApi(body);
354
+ return r && wrapMatch(r, 'json-api', transformField);
355
+ },
356
+ () => {
357
+ const r = tryParseRfc7807(body, transformField);
358
+ return r && { parsed: { fieldErrors: r, formErrors: [] }, format: 'rfc7807-map' };
359
+ },
360
+ () => {
361
+ const r = tryParseSpringArray(body, fallbackField, transformField);
362
+ return r && { parsed: { fieldErrors: r, formErrors: [] }, format: 'spring-array' };
363
+ },
364
+ () => {
365
+ const r = tryParseLaravelDrf(body);
366
+ return r && wrapMatch(r, 'laravel-drf', transformField);
367
+ },
368
+ () => {
369
+ const r = tryParseFlatObject(body, fallbackField, transformField);
370
+ return r && { parsed: { fieldErrors: r, formErrors: [] }, format: 'flat-object' };
371
+ },
372
+ () => {
373
+ const detail = body['detail'];
374
+ return typeof detail === 'string'
375
+ ? { parsed: { fieldErrors: [], formErrors: [detail] }, format: 'rfc9457-detail' }
376
+ : null;
377
+ },
378
+ ];
379
+ for (const candidate of candidates) {
380
+ const result = candidate();
381
+ if (result !== null)
382
+ return result;
383
+ }
384
+ return null;
385
+ }
386
+ /**
387
+ * Run custom parsers (if any) before the built-in ones.
388
+ * Returns the first match, or null to fall through.
389
+ */
390
+ function tryCustomParsers(body, customParsers) {
391
+ for (const parser of customParsers) {
392
+ const parsed = parser(body);
393
+ if (parsed !== null)
394
+ return { parsed, format: 'custom' };
395
+ }
396
+ return null;
397
+ }
398
+ /**
399
+ * Dispatch an array body through the flat-array parser.
400
+ */
401
+ function matchArrayBody(body, fallbackField, transformField) {
402
+ const flat = tryParseFlatArray(body, fallbackField, transformField);
403
+ return flat ? { parsed: { fieldErrors: flat, formErrors: [] }, format: 'flat-array' } : null;
404
+ }
405
+ /**
406
+ * Run all parsers (custom, array, object) against an already-unwrapped body.
407
+ * Returns the first match, or null if no parser recognized the shape.
408
+ */
409
+ function matchBody(body, fallbackField, transformField, customParsers) {
410
+ if (customParsers?.length) {
411
+ const custom = tryCustomParsers(body, customParsers);
412
+ if (custom !== null)
413
+ return custom;
414
+ }
415
+ if (Array.isArray(body))
416
+ return matchArrayBody(body, fallbackField, transformField);
417
+ if (!isObject(body))
418
+ return null;
419
+ return matchObjectBody(body, fallbackField, transformField);
420
+ }
421
+ // ---------------------------------------------------------------------------
422
+ // Status filtering helper
423
+ // ---------------------------------------------------------------------------
424
+ function extractStatus(error) {
425
+ if (!isObject(error))
426
+ return undefined;
427
+ const e = error;
428
+ if (typeof e['status'] === 'number')
429
+ return e['status'];
430
+ if (isObject(e['response'])) {
431
+ const r = e['response'];
432
+ if (typeof r['status'] === 'number')
433
+ return r['status'];
434
+ }
435
+ return undefined;
436
+ }
437
+ /** True when the error's status code is present but not in the allowed list. */
438
+ function isStatusBlocked(error, options) {
439
+ if (!options?.statusCodes)
440
+ return false;
441
+ const status = extractStatus(error);
442
+ return status !== undefined && !options.statusCodes.includes(status);
443
+ }
444
+ // ---------------------------------------------------------------------------
130
445
  // Public API
131
446
  // ---------------------------------------------------------------------------
447
+ /**
448
+ * Extract errors from an unknown API error response, returning a rich result
449
+ * that includes field errors, form-level (non-field) errors, and the matched format.
450
+ *
451
+ * Use `format` to distinguish "unrecognized shape" (format is null) from
452
+ * "recognized but genuinely no errors" (format is non-null, both arrays empty).
453
+ *
454
+ * `formErrors` contains global / non-field error messages that cannot be
455
+ * attributed to a specific field (e.g. RFC 9457 `detail`, JSON:API errors
456
+ * without a source pointer, violations without a field name).
457
+ *
458
+ * Supports all formats recognized by `extractFieldErrors`, plus:
459
+ * - `violations: [{ field, message }]`
460
+ * - `"invalid-params": [{ name, reason }]`
461
+ * - JSON:API `errors: [{ source: { pointer }, detail }]`
462
+ * - Laravel / DRF top-level field map `{ field: ["msg", ...] }`
463
+ *
464
+ * Use `options.parsers` to register custom parsers for application-specific shapes.
465
+ *
466
+ * Never throws.
467
+ */
468
+ export function extractErrors(error, options) {
469
+ const fallbackField = options?.fallbackField ?? 'root';
470
+ const transformField = options?.transformField ?? ((f) => f);
471
+ const resolveMessage = options?.resolveMessage;
472
+ try {
473
+ if (isStatusBlocked(error, options))
474
+ return { fieldErrors: [], formErrors: [], format: null };
475
+ const match = matchBody(unwrapBody(error), fallbackField, transformField, options?.parsers);
476
+ if (match === null)
477
+ return { fieldErrors: [], formErrors: [], format: null };
478
+ const { parsed, format } = match;
479
+ const fieldErrors = finalize(resolveMessage
480
+ ? parsed.fieldErrors.map((e) => ({
481
+ field: e.field,
482
+ message: resolveMessage(e.message, e.field),
483
+ }))
484
+ : parsed.fieldErrors);
485
+ const formErrors = resolveMessage
486
+ ? parsed.formErrors.map((m) => resolveMessage(m, null))
487
+ : parsed.formErrors;
488
+ return { fieldErrors, formErrors, format };
489
+ }
490
+ catch {
491
+ return { fieldErrors: [], formErrors: [], format: null };
492
+ }
493
+ }
132
494
  /**
133
495
  * Extract normalized field errors from an unknown API error response.
134
496
  *
135
497
  * Supports:
136
498
  * - RFC 7807 / RFC 9457 Problem Details (Spring Boot 3+) with `errors` map
137
499
  * - RFC 9457 top-level `detail` field as a root-level error
500
+ * - RFC 9457 `violations: [{ field, message }]` array
501
+ * - RFC 9457 `"invalid-params": [{ name, reason }]` array
502
+ * - JSON:API `errors: [{ source: { pointer }, detail }]` array
503
+ * - Laravel / DRF top-level field map `{ field: ["msg", ...] }`
138
504
  * - Spring Boot default validation format (array of `{ field, defaultMessage }`)
139
505
  * - Simple flat `{ field, message }` object
140
506
  * - Array of `{ field, message }` objects
141
507
  *
142
- * Use `statusCodes` to restrict extraction to specific HTTP status codes —
143
- * avoids parsing 404 or 500 bodies as field errors.
508
+ * Use `statusCodes` to restrict extraction to specific HTTP status codes.
509
+ *
510
+ * For a richer result that includes non-field errors and the matched format,
511
+ * use `extractErrors` instead.
144
512
  *
145
513
  * Never throws — returns an empty array for unrecognized shapes.
146
514
  */
@@ -148,66 +516,19 @@ export function extractFieldErrors(error, options) {
148
516
  const fallbackField = options?.fallbackField ?? 'root';
149
517
  const transformField = options?.transformField ?? ((f) => f);
150
518
  try {
151
- // Status-code filtering: if statusCodes is provided, check error.status
152
- // (or error.response.status for Axios-style errors) before doing anything.
153
- if (options?.statusCodes !== undefined) {
154
- let status;
155
- if (isObject(error)) {
156
- const e = error;
157
- if (typeof e['status'] === 'number') {
158
- status = e['status'];
159
- }
160
- else if (isObject(e['response'])) {
161
- const r = e['response'];
162
- if (typeof r['status'] === 'number')
163
- status = r['status'];
164
- }
165
- }
166
- if (status !== undefined && !options.statusCodes.includes(status)) {
167
- return [];
168
- }
169
- }
170
- // Unwrap common error wrapper shapes (e.g. Axios response, fetch response body)
171
- let body = error;
172
- // Support ApiError-style wrappers: { status: number, body: unknown }
173
- // Matches the ApiError class generated by @codewithagents/openapi-gen, letting
174
- // callers pass the thrown error directly: extractFieldErrors(apiError, { statusCodes: [422] })
175
- if (isObject(body) &&
176
- typeof body['status'] === 'number' &&
177
- Object.prototype.hasOwnProperty.call(body, 'body')) {
178
- body = body['body'];
179
- }
180
- // Support objects with a `response.data` shape (Axios-style)
181
- if (isObject(body) && isObject(body['response']) && body['response']['data'] !== undefined) {
182
- body = body['response']['data'];
183
- }
184
- // Support objects with a `data` property that contains the actual error body
185
- if (isObject(body) && isObject(body['data']) && !('field' in body) && !('errors' in body)) {
186
- body = body['data'];
187
- }
188
- // Array of flat error objects
189
- if (Array.isArray(body)) {
190
- return finalize(tryParseFlatArray(body, fallbackField, transformField) ?? []);
191
- }
192
- if (!isObject(body))
519
+ if (isStatusBlocked(error, options))
193
520
  return [];
194
- // Try RFC 7807 / Spring Boot 3 format first (object-style errors map)
195
- const rfc7807 = tryParseRfc7807(body, fallbackField, transformField);
196
- if (rfc7807 !== null)
197
- return finalize(rfc7807);
198
- // Try Spring Boot default format (array-style errors list)
199
- const springArray = tryParseSpringArray(body, fallbackField, transformField);
200
- if (springArray !== null)
201
- return finalize(springArray);
202
- // Try simple flat object
203
- const flat = tryParseFlatObject(body, fallbackField, transformField);
204
- if (flat !== null)
205
- return finalize(flat);
206
- // Try RFC 9457 top-level detail as a last-resort root error
207
- const rfc9457 = tryParseRfc9457Detail(body, fallbackField, transformField);
208
- if (rfc9457 !== null)
209
- return finalize(rfc9457);
210
- return [];
521
+ const match = matchBody(unwrapBody(error), fallbackField, transformField, options?.parsers);
522
+ if (match === null)
523
+ return [];
524
+ const { parsed } = match;
525
+ // In the legacy API, form-level errors fall back to fallbackField instead of
526
+ // being returned in a separate channel.
527
+ const fallbackErrors = parsed.formErrors.map((message) => ({
528
+ field: transformField(fallbackField),
529
+ message,
530
+ }));
531
+ return finalize([...parsed.fieldErrors, ...fallbackErrors]);
211
532
  }
212
533
  catch {
213
534
  return [];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codewithagents/api-errors",
3
- "version": "1.0.6",
3
+ "version": "1.1.0",
4
4
  "description": "Map backend API errors to form field errors. Framework-agnostic core with React Hook Form adapter.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,6 +18,7 @@
18
18
  "build": "tsc",
19
19
  "test": "vitest run",
20
20
  "test:coverage": "vitest run --coverage",
21
+ "test:mutation": "stryker run",
21
22
  "lint": "tsc --noEmit"
22
23
  },
23
24
  "keywords": [
@@ -41,6 +42,8 @@
41
42
  },
42
43
  "author": "CodeWithAgents (https://codewithagents.de)",
43
44
  "devDependencies": {
45
+ "@stryker-mutator/core": "catalog:",
46
+ "@stryker-mutator/vitest-runner": "catalog:",
44
47
  "@vitest/coverage-v8": "catalog:",
45
48
  "typescript": "catalog:",
46
49
  "vitest": "catalog:"