@bombillazo/error-x 0.1.1 → 0.2.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/README.md +41 -14
- package/dist/index.cjs +112 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +62 -24
- package/dist/index.d.ts +62 -24
- package/dist/index.js +112 -58
- package/dist/index.js.map +1 -1
- package/package.json +7 -6
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# error-x
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@bombillazo/error-x)
|
|
4
|
+
[](https://www.npmjs.com/package/@bombillazo/error-x)
|
|
5
|
+
[](https://github.com/bombillazo/error-x/blob/master/LICENSE)
|
|
6
|
+
|
|
3
7
|
A smart, isomorphic, and satisfying error library for TypeScript applications. Provides type-safe error handling with great DX, solving common pain points like unknown error types, lost stack traces, async error handling, and error serialization.
|
|
4
8
|
|
|
5
9
|
## Features
|
|
@@ -38,18 +42,26 @@ import { ErrorX, HandlingTargets, type HandlingTarget, type ErrorAction } from '
|
|
|
38
42
|
// Minimal usage (all parameters optional)
|
|
39
43
|
const error = new ErrorX()
|
|
40
44
|
|
|
41
|
-
// Simple
|
|
42
|
-
const error = new ErrorX(
|
|
45
|
+
// Simple string message
|
|
46
|
+
const error = new ErrorX('Database connection failed')
|
|
47
|
+
|
|
48
|
+
// String message with additional options
|
|
49
|
+
const error = new ErrorX('User authentication failed', {
|
|
50
|
+
name: 'AuthError',
|
|
51
|
+
code: 'AUTH_FAILED',
|
|
52
|
+
uiMessage: 'Please check your credentials and try again',
|
|
53
|
+
metadata: { userId: 123, loginAttempt: 3 }
|
|
54
|
+
})
|
|
43
55
|
|
|
44
|
-
//
|
|
56
|
+
// Options object (backward compatible)
|
|
45
57
|
const error = new ErrorX({
|
|
46
58
|
message: 'User authentication failed',
|
|
47
59
|
name: 'AuthError',
|
|
48
60
|
code: 'AUTH_FAILED',
|
|
49
61
|
uiMessage: 'Please check your credentials and try again',
|
|
50
62
|
cause: originalError, // Chain errors while preserving stack traces
|
|
51
|
-
metadata: {
|
|
52
|
-
userId: 123,
|
|
63
|
+
metadata: {
|
|
64
|
+
userId: 123,
|
|
53
65
|
loginAttempt: 3,
|
|
54
66
|
},
|
|
55
67
|
actions: [
|
|
@@ -58,6 +70,10 @@ const error = new ErrorX({
|
|
|
58
70
|
{ action: 'custom', payload: { type: 'analytics', event: 'auth_failed', userId: 123, category: 'errors', severity: 'high' } }
|
|
59
71
|
]
|
|
60
72
|
})
|
|
73
|
+
|
|
74
|
+
// Smart conversion from unknown errors
|
|
75
|
+
const apiError = { message: 'User not found', code: 404, statusText: 'Not Found' }
|
|
76
|
+
const error = new ErrorX(apiError)
|
|
61
77
|
```
|
|
62
78
|
|
|
63
79
|
## Documentation
|
|
@@ -73,6 +89,17 @@ For complete API documentation with detailed descriptions, examples, and type in
|
|
|
73
89
|
### Constructor
|
|
74
90
|
|
|
75
91
|
```typescript
|
|
92
|
+
// String message signature
|
|
93
|
+
new ErrorX(message: string, options?: {
|
|
94
|
+
name?: string // Optional: Error type
|
|
95
|
+
code?: string | number // Optional: Error code (auto-generated from name if not provided)
|
|
96
|
+
uiMessage?: string // Optional: User-friendly message
|
|
97
|
+
cause?: Error | unknown // Optional: Original error that caused this (preserves stack traces)
|
|
98
|
+
metadata?: Record<string, any> // Optional: Additional context data
|
|
99
|
+
actions?: ErrorAction[] // Optional: Configuration for application actions to perform when error occurs
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
// Options object signature (backward compatible)
|
|
76
103
|
new ErrorX(options?: {
|
|
77
104
|
name?: string // Optional: Error type
|
|
78
105
|
message?: string // Optional: Technical error message (default: 'An error occurred')
|
|
@@ -80,8 +107,11 @@ new ErrorX(options?: {
|
|
|
80
107
|
uiMessage?: string // Optional: User-friendly message
|
|
81
108
|
cause?: Error | unknown // Optional: Original error that caused this (preserves stack traces)
|
|
82
109
|
metadata?: Record<string, any> // Optional: Additional context data
|
|
83
|
-
actions?: ErrorAction[] // Optional: Configuration for application actions to perform when error occurs
|
|
110
|
+
actions?: ErrorAction[] // Optional: Configuration for application actions to perform when error occurs
|
|
84
111
|
})
|
|
112
|
+
|
|
113
|
+
// Smart conversion signature (converts any unknown input)
|
|
114
|
+
new ErrorX(input: unknown)
|
|
85
115
|
```
|
|
86
116
|
|
|
87
117
|
**All parameters are optional** - ErrorX uses sensible defaults and auto-generates missing values.
|
|
@@ -244,8 +274,7 @@ import { ErrorX } from 'error-x'
|
|
|
244
274
|
|
|
245
275
|
function validateUser(user: unknown) {
|
|
246
276
|
if (!user) {
|
|
247
|
-
throw new ErrorX({
|
|
248
|
-
message: 'User validation failed: user is required',
|
|
277
|
+
throw new ErrorX('User validation failed: user is required', {
|
|
249
278
|
name: 'ValidationError',
|
|
250
279
|
code: 'USER_REQUIRED',
|
|
251
280
|
uiMessage: 'Please provide user information',
|
|
@@ -262,8 +291,7 @@ async function fetchUser(id: string) {
|
|
|
262
291
|
try {
|
|
263
292
|
const response = await fetch(`/api/users/${id}`)
|
|
264
293
|
if (!response.ok) {
|
|
265
|
-
throw new ErrorX({
|
|
266
|
-
message: `Failed to fetch user: ${response.statusText}`,
|
|
294
|
+
throw new ErrorX(`Failed to fetch user: ${response.statusText}`, {
|
|
267
295
|
code: `HTTP_${response.status}`,
|
|
268
296
|
uiMessage: 'Unable to load user data',
|
|
269
297
|
metadata: { status: response.status, statusText: response.statusText }
|
|
@@ -272,7 +300,7 @@ async function fetchUser(id: string) {
|
|
|
272
300
|
return response.json()
|
|
273
301
|
} catch (error) {
|
|
274
302
|
// Convert any error to ErrorX and add context
|
|
275
|
-
const errorX = ErrorX
|
|
303
|
+
const errorX = new ErrorX(error)
|
|
276
304
|
throw errorX.withMetadata({
|
|
277
305
|
userId: id,
|
|
278
306
|
operation: 'fetchUser',
|
|
@@ -290,8 +318,7 @@ try {
|
|
|
290
318
|
})
|
|
291
319
|
} catch (dbError) {
|
|
292
320
|
// Create new ErrorX while preserving the original error in the cause chain
|
|
293
|
-
const error = new ErrorX({
|
|
294
|
-
message: 'User creation failed',
|
|
321
|
+
const error = new ErrorX('User creation failed', {
|
|
295
322
|
name: 'UserCreationError',
|
|
296
323
|
code: 'USER_CREATE_FAILED',
|
|
297
324
|
uiMessage: 'Unable to create user account',
|
|
@@ -301,7 +328,7 @@ try {
|
|
|
301
328
|
userData: { email: userData.email } // Don't log sensitive data
|
|
302
329
|
}
|
|
303
330
|
})
|
|
304
|
-
|
|
331
|
+
|
|
305
332
|
// Add more context while preserving the error chain
|
|
306
333
|
throw error.withMetadata({
|
|
307
334
|
requestId: generateRequestId(),
|
package/dist/index.cjs
CHANGED
|
@@ -7,6 +7,30 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
7
7
|
var safeStringify__default = /*#__PURE__*/_interopDefault(safeStringify);
|
|
8
8
|
|
|
9
9
|
// src/error.ts
|
|
10
|
+
|
|
11
|
+
// src/types.ts
|
|
12
|
+
var HandlingTargets = /* @__PURE__ */ ((HandlingTargets2) => {
|
|
13
|
+
HandlingTargets2["MODAL"] = "modal";
|
|
14
|
+
HandlingTargets2["TOAST"] = "toast";
|
|
15
|
+
HandlingTargets2["INLINE"] = "inline";
|
|
16
|
+
HandlingTargets2["BANNER"] = "banner";
|
|
17
|
+
HandlingTargets2["CONSOLE"] = "console";
|
|
18
|
+
HandlingTargets2["LOGGER"] = "logger";
|
|
19
|
+
HandlingTargets2["NOTIFICATION"] = "notification";
|
|
20
|
+
return HandlingTargets2;
|
|
21
|
+
})(HandlingTargets || {});
|
|
22
|
+
var ERROR_X_OPTION_FIELDS = [
|
|
23
|
+
"message",
|
|
24
|
+
"name",
|
|
25
|
+
"code",
|
|
26
|
+
"uiMessage",
|
|
27
|
+
"cause",
|
|
28
|
+
"metadata",
|
|
29
|
+
"actions"
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
// src/error.ts
|
|
33
|
+
var acceptedFields = new Set(ERROR_X_OPTION_FIELDS);
|
|
10
34
|
var ErrorX = class _ErrorX extends Error {
|
|
11
35
|
/** Error identifier code, auto-generated from name if not provided */
|
|
12
36
|
code;
|
|
@@ -21,44 +45,52 @@ var ErrorX = class _ErrorX extends Error {
|
|
|
21
45
|
/**
|
|
22
46
|
* Creates a new ErrorX instance with enhanced error handling capabilities.
|
|
23
47
|
*
|
|
24
|
-
* @param
|
|
25
|
-
* @param
|
|
26
|
-
* @param options.name - Error type/name (defaults to 'Error')
|
|
27
|
-
* @param options.code - Error identifier code (auto-generated from name if not provided)
|
|
28
|
-
* @param options.uiMessage - User-friendly message (defaults to undefined)
|
|
29
|
-
* @param options.cause - Original error that caused this error
|
|
30
|
-
* @param options.metadata - Additional context data (defaults to undefined)
|
|
31
|
-
* @param options.actions - Error actions for UI behavior and handling (defaults to undefined)
|
|
48
|
+
* @param messageOrOptions - Error message string, ErrorXOptions object, or any value to convert to ErrorX
|
|
49
|
+
* @param additionalOptions - Additional options when first parameter is a string (optional)
|
|
32
50
|
*
|
|
33
51
|
* @example
|
|
34
52
|
* ```typescript
|
|
35
|
-
* // Create with
|
|
36
|
-
* const
|
|
37
|
-
*
|
|
53
|
+
* // Create with string message only
|
|
54
|
+
* const error1 = new ErrorX('Database query failed')
|
|
55
|
+
*
|
|
56
|
+
* // Create with string message and additional options
|
|
57
|
+
* const error2 = new ErrorX('Database query failed', {
|
|
38
58
|
* name: 'DatabaseError',
|
|
39
59
|
* code: 'DB_QUERY_FAILED',
|
|
40
60
|
* uiMessage: 'Unable to load data. Please try again.',
|
|
41
|
-
* metadata: { query: 'SELECT * FROM users', timeout: 5000 }
|
|
61
|
+
* metadata: { query: 'SELECT * FROM users', timeout: 5000 }
|
|
62
|
+
* })
|
|
63
|
+
*
|
|
64
|
+
* // Create with options object (backward compatible)
|
|
65
|
+
* const error3 = new ErrorX({
|
|
66
|
+
* message: 'Database query failed',
|
|
67
|
+
* name: 'DatabaseError',
|
|
68
|
+
* code: 'DB_QUERY_FAILED',
|
|
42
69
|
* actions: [
|
|
43
|
-
* {
|
|
44
|
-
* action: 'notify',
|
|
45
|
-
* payload: { targets: [HandlingTargets.TOAST] }
|
|
46
|
-
* },
|
|
47
|
-
* {
|
|
48
|
-
* action: 'redirect',
|
|
49
|
-
* payload: { redirectURL: '/dashboard', delay: 1000 }
|
|
50
|
-
* }
|
|
70
|
+
* { action: 'notify', payload: { targets: [HandlingTargets.TOAST] } }
|
|
51
71
|
* ]
|
|
52
72
|
* })
|
|
53
73
|
*
|
|
54
|
-
* // Create with
|
|
55
|
-
* const
|
|
74
|
+
* // Create with unknown input (smart conversion)
|
|
75
|
+
* const apiError = { message: 'User not found', code: 404 }
|
|
76
|
+
* const error4 = new ErrorX(apiError)
|
|
56
77
|
*
|
|
57
78
|
* // Create with no options (uses defaults)
|
|
58
|
-
* const
|
|
79
|
+
* const error5 = new ErrorX()
|
|
59
80
|
* ```
|
|
60
81
|
*/
|
|
61
|
-
constructor(
|
|
82
|
+
constructor(messageOrOptions, additionalOptions) {
|
|
83
|
+
let options = {};
|
|
84
|
+
if (typeof messageOrOptions === "string") {
|
|
85
|
+
options = {
|
|
86
|
+
message: messageOrOptions,
|
|
87
|
+
...additionalOptions
|
|
88
|
+
};
|
|
89
|
+
} else if (_ErrorX.isErrorXOptions(messageOrOptions)) {
|
|
90
|
+
options = messageOrOptions;
|
|
91
|
+
} else if (messageOrOptions != null) {
|
|
92
|
+
options = _ErrorX.convertUnknownToOptions(messageOrOptions);
|
|
93
|
+
}
|
|
62
94
|
const formattedMessage = _ErrorX.formatMessage(options.message);
|
|
63
95
|
super(formattedMessage, { cause: options.cause });
|
|
64
96
|
this.name = options.name ?? _ErrorX.getDefaultName();
|
|
@@ -83,6 +115,27 @@ var ErrorX = class _ErrorX extends Error {
|
|
|
83
115
|
static getDefaultName() {
|
|
84
116
|
return "Error";
|
|
85
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Validates if an object is a valid ErrorXOptions object.
|
|
120
|
+
* Checks that the object only contains accepted ErrorXOptions fields.
|
|
121
|
+
*
|
|
122
|
+
* @param value - Value to check
|
|
123
|
+
* @returns True if value is a valid ErrorXOptions object
|
|
124
|
+
*/
|
|
125
|
+
static isErrorXOptions(value) {
|
|
126
|
+
if (value == null || typeof value !== "object" || Array.isArray(value)) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
if (value instanceof Error) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
const obj = value;
|
|
133
|
+
const keys = Object.keys(obj);
|
|
134
|
+
if (keys.length === 0) {
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
return keys.every((key) => acceptedFields.has(key));
|
|
138
|
+
}
|
|
86
139
|
/**
|
|
87
140
|
* Generates a default error code from the error name.
|
|
88
141
|
* Converts camelCase/PascalCase names to UPPER_SNAKE_CASE format.
|
|
@@ -248,31 +301,15 @@ var ErrorX = class _ErrorX extends Error {
|
|
|
248
301
|
return value instanceof _ErrorX;
|
|
249
302
|
}
|
|
250
303
|
/**
|
|
251
|
-
* Converts unknown input into
|
|
304
|
+
* Converts unknown input into ErrorXOptions with intelligent property extraction.
|
|
252
305
|
* Handles strings, regular Error objects, API response objects, and unknown values.
|
|
306
|
+
* This is a private helper method used by both the constructor and toErrorX.
|
|
253
307
|
*
|
|
254
|
-
* @param error - Value to convert to
|
|
255
|
-
* @returns
|
|
256
|
-
*
|
|
257
|
-
* @example
|
|
258
|
-
* ```typescript
|
|
259
|
-
* // Convert string error
|
|
260
|
-
* const error1 = ErrorX.toErrorX('Something went wrong')
|
|
261
|
-
*
|
|
262
|
-
* // Convert regular Error
|
|
263
|
-
* const error2 = ErrorX.toErrorX(new Error('Database failed'))
|
|
264
|
-
*
|
|
265
|
-
* // Convert API response object
|
|
266
|
-
* const apiError = {
|
|
267
|
-
* message: 'User not found',
|
|
268
|
-
* code: 'USER_404',
|
|
269
|
-
* statusText: 'Not Found'
|
|
270
|
-
* }
|
|
271
|
-
* const error3 = ErrorX.toErrorX(apiError)
|
|
272
|
-
* ```
|
|
308
|
+
* @param error - Value to convert to ErrorXOptions
|
|
309
|
+
* @returns ErrorXOptions object with extracted properties
|
|
310
|
+
* @internal
|
|
273
311
|
*/
|
|
274
|
-
static
|
|
275
|
-
if (error instanceof _ErrorX) return error;
|
|
312
|
+
static convertUnknownToOptions(error) {
|
|
276
313
|
let name = "";
|
|
277
314
|
let message = "";
|
|
278
315
|
let code = "";
|
|
@@ -316,6 +353,35 @@ var ErrorX = class _ErrorX extends Error {
|
|
|
316
353
|
if (cause) options.cause = cause;
|
|
317
354
|
if (Object.keys(metadata).length > 0) options.metadata = metadata;
|
|
318
355
|
if (actions && actions.length > 0) options.actions = actions;
|
|
356
|
+
return options;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Converts unknown input into an ErrorX instance with intelligent property extraction.
|
|
360
|
+
* Handles strings, regular Error objects, API response objects, and unknown values.
|
|
361
|
+
*
|
|
362
|
+
* @param error - Value to convert to ErrorX
|
|
363
|
+
* @returns ErrorX instance with extracted properties
|
|
364
|
+
*
|
|
365
|
+
* @example
|
|
366
|
+
* ```typescript
|
|
367
|
+
* // Convert string error
|
|
368
|
+
* const error1 = ErrorX.toErrorX('Something went wrong')
|
|
369
|
+
*
|
|
370
|
+
* // Convert regular Error
|
|
371
|
+
* const error2 = ErrorX.toErrorX(new Error('Database failed'))
|
|
372
|
+
*
|
|
373
|
+
* // Convert API response object
|
|
374
|
+
* const apiError = {
|
|
375
|
+
* message: 'User not found',
|
|
376
|
+
* code: 'USER_404',
|
|
377
|
+
* statusText: 'Not Found'
|
|
378
|
+
* }
|
|
379
|
+
* const error3 = ErrorX.toErrorX(apiError)
|
|
380
|
+
* ```
|
|
381
|
+
*/
|
|
382
|
+
static toErrorX(error) {
|
|
383
|
+
if (error instanceof _ErrorX) return error;
|
|
384
|
+
const options = _ErrorX.convertUnknownToOptions(error);
|
|
319
385
|
return new _ErrorX(options);
|
|
320
386
|
}
|
|
321
387
|
/**
|
|
@@ -516,18 +582,6 @@ ${this.stack}`;
|
|
|
516
582
|
}
|
|
517
583
|
};
|
|
518
584
|
|
|
519
|
-
// src/types.ts
|
|
520
|
-
var HandlingTargets = /* @__PURE__ */ ((HandlingTargets2) => {
|
|
521
|
-
HandlingTargets2["MODAL"] = "modal";
|
|
522
|
-
HandlingTargets2["TOAST"] = "toast";
|
|
523
|
-
HandlingTargets2["INLINE"] = "inline";
|
|
524
|
-
HandlingTargets2["BANNER"] = "banner";
|
|
525
|
-
HandlingTargets2["CONSOLE"] = "console";
|
|
526
|
-
HandlingTargets2["LOGGER"] = "logger";
|
|
527
|
-
HandlingTargets2["NOTIFICATION"] = "notification";
|
|
528
|
-
return HandlingTargets2;
|
|
529
|
-
})(HandlingTargets || {});
|
|
530
|
-
|
|
531
585
|
exports.ErrorX = ErrorX;
|
|
532
586
|
exports.HandlingTargets = HandlingTargets;
|
|
533
587
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/error.ts","../src/types.ts"],"names":["safeStringify","HandlingTargets"],"mappings":"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","file":"index.cjs","sourcesContent":["import safeStringify from 'safe-stringify'\nimport type { ErrorAction, ErrorMetadata, ErrorXOptions, SerializableError } from './types.js'\n\n/**\n * Enhanced Error class with rich metadata, type-safe error handling, and intelligent error conversion.\n *\n * @example\n * ```typescript\n * // Basic usage\n * const error = new ErrorX({ message: 'Database connection failed' })\n *\n * // With full options\n * const error = new ErrorX({\n * message: 'User authentication failed',\n * name: 'AuthError',\n * code: 'AUTH_FAILED',\n * uiMessage: 'Please check your credentials',\n * metadata: { userId: 123, loginAttempt: 3 }\n * })\n * ```\n *\n * @public\n */\nexport class ErrorX extends Error {\n /** Error identifier code, auto-generated from name if not provided */\n public readonly code: string\n /** User-friendly message suitable for display in UI */\n public readonly uiMessage: string | undefined\n /** Additional context and metadata associated with the error */\n public readonly metadata: ErrorMetadata | undefined\n /** Timestamp when the error was created */\n public readonly timestamp: Date\n /** Error actions for UI behavior and handling */\n public readonly actions: ErrorAction[] | undefined\n\n /**\n * Creates a new ErrorX instance with enhanced error handling capabilities.\n *\n * @param options - Configuration options for the error (optional)\n * @param options.message - Technical error message (defaults to 'An error occurred')\n * @param options.name - Error type/name (defaults to 'Error')\n * @param options.code - Error identifier code (auto-generated from name if not provided)\n * @param options.uiMessage - User-friendly message (defaults to undefined)\n * @param options.cause - Original error that caused this error\n * @param options.metadata - Additional context data (defaults to undefined)\n * @param options.actions - Error actions for UI behavior and handling (defaults to undefined)\n *\n * @example\n * ```typescript\n * // Create with full options\n * const error = new ErrorX({\n * message: 'Database query failed',\n * name: 'DatabaseError',\n * code: 'DB_QUERY_FAILED',\n * uiMessage: 'Unable to load data. Please try again.',\n * metadata: { query: 'SELECT * FROM users', timeout: 5000 },\n * actions: [\n * {\n * action: 'notify',\n * payload: { targets: [HandlingTargets.TOAST] }\n * },\n * {\n * action: 'redirect',\n * payload: { redirectURL: '/dashboard', delay: 1000 }\n * }\n * ]\n * })\n *\n * // Create with minimal options\n * const simpleError = new ErrorX({ message: 'Something failed' })\n *\n * // Create with no options (uses defaults)\n * const defaultError = new ErrorX()\n * ```\n */\n constructor(options: ErrorXOptions = {}) {\n const formattedMessage = ErrorX.formatMessage(options.message)\n super(formattedMessage, { cause: options.cause })\n\n this.name = options.name ?? ErrorX.getDefaultName()\n this.code =\n options.code != null ? String(options.code) : ErrorX.generateDefaultCode(options.name)\n this.uiMessage = options.uiMessage\n this.metadata = options.metadata\n this.actions = options.actions\n this.timestamp = new Date()\n\n // Handle stack trace preservation\n if (options.cause instanceof Error) {\n this.stack = ErrorX.preserveOriginalStack(options.cause, this)\n } else {\n // Node.js specific stack trace capture for clean stack\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n // Clean the stack to remove ErrorX constructor noise\n this.stack = ErrorX.cleanStack(this.stack)\n }\n }\n\n /**\n * Returns the default error name.\n * @returns Default error name 'Error'\n */\n private static getDefaultName(): string {\n return 'Error'\n }\n\n /**\n * Generates a default error code from the error name.\n * Converts camelCase/PascalCase names to UPPER_SNAKE_CASE format.\n *\n * @param name - Error name to convert\n * @returns Generated error code in UPPER_SNAKE_CASE format\n *\n * @example\n * ```typescript\n * generateDefaultCode('DatabaseError') // 'DATABASE_ERROR'\n * generateDefaultCode('userAuthError') // 'USER_AUTH_ERROR'\n * generateDefaultCode('API Timeout') // 'API_TIMEOUT'\n * ```\n */\n private static generateDefaultCode(name?: string): string {\n if (!name) return 'ERROR'\n\n // Convert camelCase/PascalCase to UPPER_SNAKE_CASE\n return name\n .replace(/([a-z])([A-Z])/g, '$1_$2') // Add underscore between camelCase\n .replace(/\\s+/g, '_') // Replace spaces with underscores\n .replace(/[^a-zA-Z0-9_]/g, '') // Remove special characters\n .toUpperCase()\n }\n\n /**\n * Preserves the original error's stack trace while updating the error message.\n * Combines the new error's message with the original error's stack trace.\n *\n * @param originalError - The original error whose stack to preserve\n * @param newError - The new error whose message to use\n * @returns Combined stack trace with new error message and original stack\n */\n private static preserveOriginalStack(originalError: Error, newError: Error): string {\n if (!originalError.stack) return newError.stack || ''\n\n // Get the new error's first line (error name + message)\n const newErrorFirstLine = `${newError.name}: ${newError.message}`\n\n // Get original stack lines (skip the first line which is the original error message)\n const originalStackLines = originalError.stack.split('\\n')\n const originalStackTrace = originalStackLines.slice(1)\n\n // Combine new error message with original stack trace\n return [newErrorFirstLine, ...originalStackTrace].join('\\n')\n }\n\n /**\n * Cleans the stack trace by removing ErrorX internal method calls.\n * This provides cleaner stack traces that focus on user code.\n *\n * @param stack - Raw stack trace to clean\n * @returns Cleaned stack trace without ErrorX internal calls\n */\n private static cleanStack(stack?: string): string {\n if (!stack) return ''\n\n const stackLines = stack.split('\\n')\n const cleanedLines: string[] = []\n\n for (const line of stackLines) {\n // Skip lines that contain ErrorX constructor or internal methods\n if (\n line.includes('new ErrorX') ||\n line.includes('ErrorX.constructor') ||\n line.includes('ErrorX.toErrorX') ||\n line.includes('error-x/dist/') ||\n line.includes('error-x/src/error.ts')\n ) {\n continue\n }\n cleanedLines.push(line)\n }\n\n return cleanedLines.join('\\n')\n }\n\n /**\n * Processes an error's stack trace to trim it after a specified delimiter.\n * Useful for removing irrelevant stack frames before a specific function.\n *\n * @param error - Error whose stack to process\n * @param delimiter - String to search for in stack lines\n * @returns Processed stack trace starting after the delimiter\n *\n * @example\n * ```typescript\n * const processed = ErrorX.processErrorStack(error, 'my-app-entry')\n * // Returns stack trace starting after the line containing 'my-app-entry'\n * ```\n */\n private static processErrorStack(error: Error, delimiter: string): string {\n let stack = error.stack ?? ''\n const stackLines = stack.split('\\n')\n\n // Find the index of the first line containing the delimiter\n const delimiterIndex = stackLines.findIndex(line => line.includes(delimiter))\n\n // If the delimiter is found, return all lines after it\n if (delimiterIndex !== -1) {\n stack = stackLines.slice(delimiterIndex + 1).join('\\n')\n }\n return stack\n }\n\n /**\n * Formats error messages with proper capitalization and punctuation.\n * Ensures consistent message formatting across all ErrorX instances.\n *\n * @param message - Raw error message to format (optional)\n * @returns Formatted message with proper capitalization and punctuation\n *\n * @example\n * ```typescript\n * formatMessage('database connection failed') // 'Database connection failed.'\n * formatMessage('user not found. please check credentials') // 'User not found. Please check credentials.'\n * formatMessage() // 'An error occurred'\n * ```\n */\n private static formatMessage(message?: string): string {\n if (!message || typeof message !== 'string' || !message.trim()) {\n return 'An error occurred'\n }\n\n // Split by sentences and capitalize each\n let formatted = message\n .split('. ')\n .map(sentence => {\n const trimmed = sentence.trim()\n if (!trimmed) return trimmed\n return trimmed.charAt(0).toUpperCase() + trimmed.slice(1)\n })\n .join('. ')\n\n // Add period at the end if it doesn't have proper punctuation\n const endsWithPunctuation = /[.!?)\\]]$/.test(formatted)\n if (!endsWithPunctuation) {\n formatted = `${formatted}.`\n }\n\n return formatted\n }\n\n /**\n * Creates a new ErrorX instance with additional metadata merged with existing metadata.\n * The original error properties are preserved while extending the metadata.\n *\n * @param additionalMetadata - Additional metadata to merge with existing metadata\n * @returns New ErrorX instance with merged metadata\n *\n * @example\n * ```typescript\n * const error = new ErrorX({\n * message: 'API request failed',\n * metadata: { endpoint: '/users' }\n * })\n *\n * const enrichedError = error.withMetadata({\n * retryCount: 3,\n * userId: 123\n * })\n * // Result: metadata = { endpoint: '/users', retryCount: 3, userId: 123 }\n * ```\n */\n public withMetadata(additionalMetadata: ErrorMetadata): ErrorX {\n const options: ErrorXOptions = {\n message: this.message,\n name: this.name,\n code: this.code,\n uiMessage: this.uiMessage,\n cause: this.cause,\n metadata: { ...(this.metadata ?? {}), ...additionalMetadata },\n }\n if (this.actions) {\n options.actions = this.actions\n }\n const newError = new ErrorX(options)\n\n // Preserve the original stack trace\n if (this.stack) {\n newError.stack = this.stack\n }\n return newError\n }\n\n /**\n * Type guard that checks if a value is an ErrorX instance.\n *\n * @param value - Value to check\n * @returns True if value is an ErrorX instance, false otherwise\n *\n * @example\n * ```typescript\n * try {\n * // some operation\n * } catch (error) {\n * if (ErrorX.isErrorX(error)) {\n * // TypeScript knows error is ErrorX\n * console.log(error.code, error.metadata)\n * }\n * }\n * ```\n */\n public static isErrorX(value: unknown): value is ErrorX {\n return value instanceof ErrorX\n }\n\n /**\n * Converts unknown input into an ErrorX instance with intelligent property extraction.\n * Handles strings, regular Error objects, API response objects, and unknown values.\n *\n * @param error - Value to convert to ErrorX\n * @returns ErrorX instance with extracted properties\n *\n * @example\n * ```typescript\n * // Convert string error\n * const error1 = ErrorX.toErrorX('Something went wrong')\n *\n * // Convert regular Error\n * const error2 = ErrorX.toErrorX(new Error('Database failed'))\n *\n * // Convert API response object\n * const apiError = {\n * message: 'User not found',\n * code: 'USER_404',\n * statusText: 'Not Found'\n * }\n * const error3 = ErrorX.toErrorX(apiError)\n * ```\n */\n public static toErrorX(error: unknown): ErrorX {\n if (error instanceof ErrorX) return error\n\n let name = ''\n let message = ''\n let code = ''\n let uiMessage = ''\n let cause: unknown\n let metadata: ErrorMetadata = {}\n let actions: ErrorAction[] | undefined\n\n if (error) {\n if (typeof error === 'string') {\n message = error\n metadata = { originalError: error }\n } else if (error instanceof Error) {\n name = error.name\n message = error.message\n cause = error.cause\n } else if (typeof error === 'object') {\n // Extract name from various properties\n if ('name' in error && error.name) name = String(error.name)\n else if ('title' in error && error.title) name = String(error.title)\n\n // Extract message from various properties\n if ('message' in error && error.message) message = String(error.message)\n else if ('details' in error && error.details) message = String(error.details)\n else if ('text' in error && error.text) message = String(error.text)\n else if ('info' in error && error.info) message = String(error.info)\n else if ('statusText' in error && error.statusText) message = String(error.statusText)\n else if ('error' in error && error.error) message = String(error.error)\n else if ('errorMessage' in error && error.errorMessage) message = String(error.errorMessage)\n\n // Extract code\n if ('code' in error && error.code) code = String(error.code)\n\n // Extract UI message\n if ('uiMessage' in error && error.uiMessage) uiMessage = String(error.uiMessage)\n else if ('userMessage' in error && error.userMessage) uiMessage = String(error.userMessage)\n\n // Extract actions\n if ('actions' in error && Array.isArray(error.actions)) {\n actions = error.actions as ErrorAction[]\n }\n\n // Store original object as metadata if it has additional properties\n metadata = { originalError: error }\n }\n }\n\n const options: ErrorXOptions = {\n message: message || 'Unknown error occurred',\n }\n\n if (name) options.name = name\n if (code) options.code = code\n if (uiMessage) options.uiMessage = uiMessage\n if (cause) options.cause = cause\n if (Object.keys(metadata).length > 0) options.metadata = metadata\n if (actions && actions.length > 0) options.actions = actions\n\n return new ErrorX(options)\n }\n\n /**\n * Public wrapper for processing error stack traces with delimiter.\n * Delegates to the private processErrorStack method for implementation.\n *\n * @param error - Error whose stack to process\n * @param delimiter - String to search for in stack lines\n * @returns Processed stack trace starting after the delimiter\n *\n * @example\n * ```typescript\n * const error = new Error('Something failed')\n * const cleanStack = ErrorX.processStack(error, 'my-app-entry')\n * // Returns stack trace starting after the line containing 'my-app-entry'\n * ```\n */\n public static processStack(error: Error, delimiter: string): string {\n return ErrorX.processErrorStack(error, delimiter)\n }\n\n /**\n * Creates a new ErrorX instance with cleaned stack trace using the specified delimiter.\n * Returns the same instance if no delimiter is provided or no stack is available.\n *\n * @param delimiter - Optional string to search for in stack lines\n * @returns New ErrorX instance with cleaned stack trace, or the same instance if no cleaning needed\n *\n * @example\n * ```typescript\n * const error = new ErrorX({ message: 'Database error' })\n * const cleanedError = error.cleanStackTrace('database-layer')\n * // Returns new ErrorX with stack trace starting after 'database-layer'\n * ```\n */\n public cleanStackTrace(delimiter?: string): ErrorX {\n if (delimiter && this.stack) {\n const options: ErrorXOptions = {\n message: this.message,\n name: this.name,\n code: this.code,\n uiMessage: this.uiMessage,\n cause: this.cause,\n }\n if (this.metadata !== undefined) {\n options.metadata = this.metadata\n }\n if (this.actions) {\n options.actions = this.actions\n }\n const newError = new ErrorX(options)\n newError.stack = ErrorX.processErrorStack(this, delimiter)\n return newError\n }\n return this\n }\n\n /**\n * Converts the ErrorX instance to a detailed string representation.\n * Includes error name, message, code, timestamp, metadata, and stack trace.\n *\n * @returns Formatted string representation of the error\n *\n * @example\n * ```typescript\n * const error = new ErrorX({\n * message: 'Database connection failed',\n * name: 'DatabaseError',\n * code: 'DB_CONN_FAILED',\n * metadata: { host: 'localhost', port: 5432 }\n * })\n *\n * console.log(error.toString())\n * // Output: \"DatabaseError: Database connection failed. [DB_CONN_FAILED] (2024-01-15T10:30:45.123Z) metadata: {...}\"\n * ```\n */\n public toString(): string {\n const parts = []\n\n // Add name and message\n parts.push(`${this.name}: ${this.message}`)\n\n // Add code if different from default\n if (this.code && this.code !== 'ERROR') {\n parts.push(`[${this.code}]`)\n }\n\n // Add timestamp\n parts.push(`(${this.timestamp.toISOString()})`)\n\n // Add metadata if present\n if (this.metadata && Object.keys(this.metadata).length > 0) {\n const metadataStr = safeStringify(this.metadata)\n parts.push(`metadata: ${metadataStr}`)\n }\n\n let result = parts.join(' ')\n\n // Add stack trace if available\n if (this.stack) {\n result += `\\n${this.stack}`\n }\n\n return result\n }\n\n /**\n * Serializes the ErrorX instance to a JSON-compatible object.\n * Recursively serializes the error chain and handles ErrorX or regular Error causes.\n *\n * @returns Serializable object representation of the error\n *\n * @example\n * ```typescript\n * const error = new ErrorX({\n * message: 'API request failed',\n * code: 'API_ERROR',\n * metadata: { endpoint: '/users', status: 500 }\n * })\n *\n * const serialized = error.toJSON()\n * // Can be safely passed to JSON.stringify() or sent over network\n * ```\n */\n public toJSON(): SerializableError {\n // Handle metadata serialization with circular reference protection\n\n // Use safe stringify to parse the metadata and remove circular references\n const safeMetadata: ErrorMetadata | undefined = this.metadata\n ? JSON.parse(safeStringify(this.metadata))\n : undefined\n\n const serialized: SerializableError = {\n name: this.name,\n message: this.message,\n code: this.code,\n uiMessage: this.uiMessage,\n metadata: safeMetadata,\n timestamp: this.timestamp.toISOString(),\n }\n\n // Include actions if present\n if (this.actions && this.actions.length > 0) {\n // Use safe stringify to parse the actions and remove circular references\n const stringified = safeStringify(this.actions)\n serialized.actions = JSON.parse(stringified)\n }\n\n // Include stack if available\n if (this.stack) {\n serialized.stack = this.stack\n }\n\n // Recursively serialize cause if it's an ErrorX\n if (this.cause) {\n if (this.cause instanceof ErrorX) {\n serialized.cause = this.cause.toJSON()\n } else if (this.cause instanceof Error) {\n const causeData: SerializableError = {\n name: this.cause.name,\n message: this.cause.message,\n code: 'ERROR',\n uiMessage: undefined,\n metadata: {},\n timestamp: new Date().toISOString(),\n }\n if (this.cause.stack) {\n causeData.stack = this.cause.stack\n }\n serialized.cause = causeData\n }\n }\n\n return serialized\n }\n\n /**\n * Deserializes a JSON object back into an ErrorX instance.\n * Recursively reconstructs the error chain and restores all properties.\n *\n * @param serialized - Serialized error object to deserialize\n * @returns Reconstructed ErrorX instance with restored properties\n *\n * @example\n * ```typescript\n * const serializedError = {\n * name: 'DatabaseError',\n * message: 'Connection failed.',\n * code: 'DB_CONN_FAILED',\n * uiMessage: 'Database is temporarily unavailable',\n * metadata: { host: 'localhost' },\n * timestamp: '2024-01-15T10:30:45.123Z'\n * }\n *\n * const error = ErrorX.fromJSON(serializedError)\n * // Fully restored ErrorX instance with all properties\n * ```\n */\n public static fromJSON(serialized: SerializableError): ErrorX {\n const options: ErrorXOptions = {\n message: serialized.message,\n name: serialized.name,\n code: serialized.code,\n uiMessage: serialized.uiMessage,\n }\n if (serialized.metadata !== undefined) {\n options.metadata = serialized.metadata\n }\n\n if (serialized.actions && serialized.actions.length > 0) {\n options.actions = serialized.actions\n }\n\n const error = new ErrorX(options)\n\n // Restore stack and timestamp\n if (serialized.stack) {\n error.stack = serialized.stack\n }\n // Use Object.defineProperty to set readonly properties\n Object.defineProperty(error, 'timestamp', {\n value: new Date(serialized.timestamp),\n writable: false,\n })\n\n // Restore cause chain\n if (serialized.cause) {\n Object.defineProperty(error, 'cause', {\n value: ErrorX.fromJSON(serialized.cause),\n writable: false,\n })\n }\n\n return error\n }\n}\n","/**\n * Metadata object containing additional context information for an error.\n * Can store any key-value pairs to provide extra debugging or business context.\n *\n * @example\n * ```typescript\n * const metadata: ErrorMetadata = {\n * userId: 123,\n * operation: 'fetchUser',\n * retryCount: 3\n * }\n * ```\n *\n * @public\n */\nexport type ErrorMetadata = Record<string, any>\n\n/**\n * Predefined display targets for error notifications and UI feedback.\n * These enum values provide consistent, type-safe options for where errors should be displayed.\n *\n * @public\n */\nexport enum HandlingTargets {\n MODAL = 'modal',\n TOAST = 'toast',\n INLINE = 'inline',\n BANNER = 'banner',\n CONSOLE = 'console',\n LOGGER = 'logger',\n NOTIFICATION = 'notification',\n}\n\n/**\n * Display target type that allows both predefined enum values and custom strings.\n * This enables flexibility for custom UI components while providing standard options.\n *\n * @example\n * ```typescript\n * // Using predefined enum values\n * targets: [HandlingTargets.MODAL, HandlingTargets.TOAST]\n *\n * // Using custom strings\n * targets: ['custom-sidebar', 'my-notification-center']\n *\n * // Mixing both\n * targets: [HandlingTargets.MODAL, 'custom-popup', HandlingTargets.CONSOLE]\n * ```\n *\n * @public\n */\nexport type HandlingTarget = HandlingTargets | string\n\n/**\n * Action to display notifications in specified UI targets.\n * Used to notify applications to handle error messages through the indicated display mechanisms.\n *\n * @example\n * ```typescript\n * {\n * action: 'notify',\n * payload: {\n * targets: [HandlingTargets.TOAST, 'custom-sidebar'],\n * title: 'Error occurred',\n * duration: 5000\n * }\n * }\n * ```\n *\n * @public\n */\nexport type NotifyAction = {\n action: 'notify'\n payload: {\n targets: HandlingTarget[]\n [key: string]: any\n }\n}\n\n/**\n * Action to log out the current user when an error occurs.\n * Useful for authentication errors or session expiration.\n *\n * @example\n * ```typescript\n * {\n * action: 'logout',\n * payload: {\n * clearStorage: true,\n * redirectURL: '/login'\n * }\n * }\n * ```\n *\n * @public\n */\nexport type LogoutAction = {\n action: 'logout'\n payload?: {\n [key: string]: any\n }\n}\n\n/**\n * Action to redirect the user to a different URL when an error occurs.\n * Commonly used for navigation after authentication errors or access denied scenarios.\n *\n * @example\n * ```typescript\n * {\n * action: 'redirect',\n * payload: {\n * redirectURL: '/login',\n * delay: 2000,\n * replace: true,\n * }\n * }\n * ```\n *\n * @public\n */\nexport type RedirectAction = {\n action: 'redirect'\n payload: {\n redirectURL: string\n [key: string]: any\n }\n}\n\n/**\n * Custom action type for application-specific actions.\n * This type is essential for proper TypeScript discrimination in the ErrorAction union.\n * Without this, TypeScript cannot properly distinguish between predefined and custom actions.\n *\n * @example\n * ```typescript\n * {\n * action: 'custom',\n * payload: {\n * type: 'analytics',\n * event: 'error_occurred',\n * category: 'authentication',\n * severity: 'high'\n * }\n * }\n *\n * {\n * action: 'custom',\n * payload: {\n * type: 'show-modal',\n * modalId: 'error-modal',\n * title: 'Error',\n * message: 'Something went wrong'\n * }\n * }\n * ```\n *\n * @public\n */\nexport type CustomAction = {\n action: 'custom'\n payload?: Record<string, any>\n}\n\n/**\n * Union type of all possible error actions.\n * Includes predefined actions (NotifyAction, LogoutAction, RedirectAction)\n * and CustomAction for application-specific actions.\n *\n * @public\n */\nexport type ErrorAction = NotifyAction | LogoutAction | RedirectAction | CustomAction\n\n/**\n * Configuration options for creating an ErrorX instance.\n * All properties are optional with sensible defaults.\n *\n * @public\n */\nexport type ErrorXOptions = {\n /** Technical error message (default: 'An error occurred') */\n message?: string\n /** Error type/name (default: 'Error') */\n name?: string\n /** Error identifier code (auto-generated from name if not provided) */\n code?: string | number\n /** User-friendly message for UI display (default: undefined) */\n uiMessage?: string | undefined\n /** Original error that caused this error (preserves error chain) */\n cause?: Error | unknown\n /** Additional context and debugging information (default: undefined) */\n metadata?: ErrorMetadata\n /** Actions to perform when this error occurs (default: undefined) */\n actions?: ErrorAction[]\n}\n\n/**\n * JSON-serializable representation of an ErrorX instance.\n * Used for transmitting errors over network or storing in databases.\n *\n * @example\n * ```typescript\n * const serialized: SerializableError = {\n * name: 'AuthError',\n * message: 'Authentication failed.',\n * code: 'AUTH_FAILED',\n * uiMessage: 'Please check your credentials',\n * stack: 'Error: Authentication failed.\\n at login (auth.ts:42:15)',\n * metadata: { userId: 123, loginAttempt: 3 },\n * timestamp: '2024-01-15T10:30:45.123Z',\n * actions: [\n * { action: 'logout', payload: { clearStorage: true } }\n * ],\n * cause: {\n * name: 'NetworkError',\n * message: 'Request timeout.',\n * code: 'NETWORK_TIMEOUT',\n * // ... other error properties\n * }\n * }\n * ```\n *\n * @public\n */\nexport type SerializableError = {\n /** Error type/name */\n name: string\n /** Technical error message */\n message: string\n /** Error identifier code */\n code: string\n /** User-friendly message for UI display */\n uiMessage: string | undefined\n /** Stack trace (optional) */\n stack?: string\n /** Additional context and debugging information */\n metadata: ErrorMetadata | undefined\n /** ISO timestamp when error was created */\n timestamp: string\n /** Actions to perform when this error occurs */\n actions?: ErrorAction[]\n /** Serialized cause error (for error chaining) */\n cause?: SerializableError\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/error.ts"],"names":["HandlingTargets","safeStringify"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Metadata object containing additional context information for an error.\n * Can store any key-value pairs to provide extra debugging or business context.\n *\n * @example\n * ```typescript\n * const metadata: ErrorMetadata = {\n * userId: 123,\n * operation: 'fetchUser',\n * retryCount: 3\n * }\n * ```\n *\n * @public\n */\nexport type ErrorMetadata = Record<string, any>\n\n/**\n * Predefined display targets for error notifications and UI feedback.\n * These enum values provide consistent, type-safe options for where errors should be displayed.\n *\n * @public\n */\nexport enum HandlingTargets {\n MODAL = 'modal',\n TOAST = 'toast',\n INLINE = 'inline',\n BANNER = 'banner',\n CONSOLE = 'console',\n LOGGER = 'logger',\n NOTIFICATION = 'notification',\n}\n\n/**\n * Display target type that allows both predefined enum values and custom strings.\n * This enables flexibility for custom UI components while providing standard options.\n *\n * @example\n * ```typescript\n * // Using predefined enum values\n * targets: [HandlingTargets.MODAL, HandlingTargets.TOAST]\n *\n * // Using custom strings\n * targets: ['custom-sidebar', 'my-notification-center']\n *\n * // Mixing both\n * targets: [HandlingTargets.MODAL, 'custom-popup', HandlingTargets.CONSOLE]\n * ```\n *\n * @public\n */\nexport type HandlingTarget = HandlingTargets | string\n\n/**\n * Action to display notifications in specified UI targets.\n * Used to notify applications to handle error messages through the indicated display mechanisms.\n *\n * @example\n * ```typescript\n * {\n * action: 'notify',\n * payload: {\n * targets: [HandlingTargets.TOAST, 'custom-sidebar'],\n * title: 'Error occurred',\n * duration: 5000\n * }\n * }\n * ```\n *\n * @public\n */\nexport type NotifyAction = {\n action: 'notify'\n payload: {\n targets: HandlingTarget[]\n [key: string]: any\n }\n}\n\n/**\n * Action to log out the current user when an error occurs.\n * Useful for authentication errors or session expiration.\n *\n * @example\n * ```typescript\n * {\n * action: 'logout',\n * payload: {\n * clearStorage: true,\n * redirectURL: '/login'\n * }\n * }\n * ```\n *\n * @public\n */\nexport type LogoutAction = {\n action: 'logout'\n payload?: {\n [key: string]: any\n }\n}\n\n/**\n * Action to redirect the user to a different URL when an error occurs.\n * Commonly used for navigation after authentication errors or access denied scenarios.\n *\n * @example\n * ```typescript\n * {\n * action: 'redirect',\n * payload: {\n * redirectURL: '/login',\n * delay: 2000,\n * replace: true,\n * }\n * }\n * ```\n *\n * @public\n */\nexport type RedirectAction = {\n action: 'redirect'\n payload: {\n redirectURL: string\n [key: string]: any\n }\n}\n\n/**\n * Custom action type for application-specific actions.\n * This type is essential for proper TypeScript discrimination in the ErrorAction union.\n * Without this, TypeScript cannot properly distinguish between predefined and custom actions.\n *\n * @example\n * ```typescript\n * {\n * action: 'custom',\n * payload: {\n * type: 'analytics',\n * event: 'error_occurred',\n * category: 'authentication',\n * severity: 'high'\n * }\n * }\n *\n * {\n * action: 'custom',\n * payload: {\n * type: 'show-modal',\n * modalId: 'error-modal',\n * title: 'Error',\n * message: 'Something went wrong'\n * }\n * }\n * ```\n *\n * @public\n */\nexport type CustomAction = {\n action: 'custom'\n payload?: Record<string, any>\n}\n\n/**\n * Union type of all possible error actions.\n * Includes predefined actions (NotifyAction, LogoutAction, RedirectAction)\n * and CustomAction for application-specific actions.\n *\n * @public\n */\nexport type ErrorAction = NotifyAction | LogoutAction | RedirectAction | CustomAction\n\n/**\n * Array of valid ErrorXOptions field names.\n * This serves as the single source of truth for both runtime validation and type checking.\n *\n * @internal\n */\nexport const ERROR_X_OPTION_FIELDS = [\n 'message',\n 'name',\n 'code',\n 'uiMessage',\n 'cause',\n 'metadata',\n 'actions',\n] as const\n\n/**\n * Union type of all valid ErrorXOptions field names.\n *\n * @public\n */\nexport type ErrorXOptionField = (typeof ERROR_X_OPTION_FIELDS)[number]\n\n/**\n * Configuration options for creating an ErrorX instance.\n * All properties are optional with sensible defaults.\n *\n * @remarks\n * **Note on design:** ErrorXOptions is a `type` instead of a `class` to provide maximum flexibility.\n * This allows you to pass plain objects without instantiation:\n *\n * ```typescript\n * // ✅ Works - plain object\n * new ErrorX({ message: 'Error', code: 'ERR' })\n *\n * // ✅ Works - object literal\n * const opts = { message: 'Error' }\n * new ErrorX(opts)\n * ```\n *\n * If ErrorXOptions were a class, you would need to instantiate it:\n *\n * ```typescript\n * // ❌ Would be required with class\n * new ErrorX(new ErrorXOptions({ message: 'Error' }))\n * ```\n *\n * The current `type` approach provides better ergonomics while still maintaining type safety.\n * The `isErrorXOptions()` validation method ensures only valid option objects are accepted.\n *\n * @public\n */\nexport type ErrorXOptions = {\n /** Technical error message (default: 'An error occurred') */\n message?: string\n /** Error type/name (default: 'Error') */\n name?: string\n /** Error identifier code (auto-generated from name if not provided) */\n code?: string | number\n /** User-friendly message for UI display (default: undefined) */\n uiMessage?: string | undefined\n /** Original error that caused this error (preserves error chain) */\n cause?: Error | unknown\n /** Additional context and debugging information (default: undefined) */\n metadata?: ErrorMetadata\n /** Actions to perform when this error occurs (default: undefined) */\n actions?: ErrorAction[]\n}\n\n/**\n * JSON-serializable representation of an ErrorX instance.\n * Used for transmitting errors over network or storing in databases.\n *\n * @example\n * ```typescript\n * const serialized: SerializableError = {\n * name: 'AuthError',\n * message: 'Authentication failed.',\n * code: 'AUTH_FAILED',\n * uiMessage: 'Please check your credentials',\n * stack: 'Error: Authentication failed.\\n at login (auth.ts:42:15)',\n * metadata: { userId: 123, loginAttempt: 3 },\n * timestamp: '2024-01-15T10:30:45.123Z',\n * actions: [\n * { action: 'logout', payload: { clearStorage: true } }\n * ],\n * cause: {\n * name: 'NetworkError',\n * message: 'Request timeout.',\n * code: 'NETWORK_TIMEOUT',\n * // ... other error properties\n * }\n * }\n * ```\n *\n * @public\n */\nexport type SerializableError = {\n /** Error type/name */\n name: string\n /** Technical error message */\n message: string\n /** Error identifier code */\n code: string\n /** User-friendly message for UI display */\n uiMessage: string | undefined\n /** Stack trace (optional) */\n stack?: string\n /** Additional context and debugging information */\n metadata: ErrorMetadata | undefined\n /** ISO timestamp when error was created */\n timestamp: string\n /** Actions to perform when this error occurs */\n actions?: ErrorAction[]\n /** Serialized cause error (for error chaining) */\n cause?: SerializableError\n}\n","import safeStringify from 'safe-stringify'\nimport type {\n ErrorAction,\n ErrorMetadata,\n ErrorXOptionField,\n ErrorXOptions,\n SerializableError,\n} from './types.js'\nimport { ERROR_X_OPTION_FIELDS } from './types.js'\n\n// Use the single source of truth for accepted fields\nconst acceptedFields = new Set(ERROR_X_OPTION_FIELDS)\n\n/**\n * Enhanced Error class with rich metadata, type-safe error handling, and intelligent error conversion.\n *\n * @example\n * ```typescript\n * // Basic usage\n * const error = new ErrorX({ message: 'Database connection failed' })\n *\n * // With full options\n * const error = new ErrorX({\n * message: 'User authentication failed',\n * name: 'AuthError',\n * code: 'AUTH_FAILED',\n * uiMessage: 'Please check your credentials',\n * metadata: { userId: 123, loginAttempt: 3 }\n * })\n * ```\n *\n * @public\n */\nexport class ErrorX extends Error {\n /** Error identifier code, auto-generated from name if not provided */\n public readonly code: string\n /** User-friendly message suitable for display in UI */\n public readonly uiMessage: string | undefined\n /** Additional context and metadata associated with the error */\n public readonly metadata: ErrorMetadata | undefined\n /** Timestamp when the error was created */\n public readonly timestamp: Date\n /** Error actions for UI behavior and handling */\n public readonly actions: ErrorAction[] | undefined\n\n /**\n * Creates a new ErrorX instance with enhanced error handling capabilities.\n *\n * @param messageOrOptions - Error message string, ErrorXOptions object, or any value to convert to ErrorX\n * @param additionalOptions - Additional options when first parameter is a string (optional)\n *\n * @example\n * ```typescript\n * // Create with string message only\n * const error1 = new ErrorX('Database query failed')\n *\n * // Create with string message and additional options\n * const error2 = new ErrorX('Database query failed', {\n * name: 'DatabaseError',\n * code: 'DB_QUERY_FAILED',\n * uiMessage: 'Unable to load data. Please try again.',\n * metadata: { query: 'SELECT * FROM users', timeout: 5000 }\n * })\n *\n * // Create with options object (backward compatible)\n * const error3 = new ErrorX({\n * message: 'Database query failed',\n * name: 'DatabaseError',\n * code: 'DB_QUERY_FAILED',\n * actions: [\n * { action: 'notify', payload: { targets: [HandlingTargets.TOAST] } }\n * ]\n * })\n *\n * // Create with unknown input (smart conversion)\n * const apiError = { message: 'User not found', code: 404 }\n * const error4 = new ErrorX(apiError)\n *\n * // Create with no options (uses defaults)\n * const error5 = new ErrorX()\n * ```\n */\n constructor(\n messageOrOptions?: string | ErrorXOptions | unknown,\n additionalOptions?: Partial<ErrorXOptions>\n ) {\n let options: ErrorXOptions = {}\n\n // Handle different input types\n if (typeof messageOrOptions === 'string') {\n // String message provided - merge with additional options\n options = {\n message: messageOrOptions,\n ...additionalOptions,\n }\n } else if (ErrorX.isErrorXOptions(messageOrOptions)) {\n // Valid ErrorXOptions object - use directly\n options = messageOrOptions\n } else if (messageOrOptions != null) {\n // Unknown input - convert using smart conversion\n options = ErrorX.convertUnknownToOptions(messageOrOptions)\n }\n // else: undefined/null - use empty options object\n\n const formattedMessage = ErrorX.formatMessage(options.message)\n super(formattedMessage, { cause: options.cause })\n\n this.name = options.name ?? ErrorX.getDefaultName()\n this.code =\n options.code != null ? String(options.code) : ErrorX.generateDefaultCode(options.name)\n this.uiMessage = options.uiMessage\n this.metadata = options.metadata\n this.actions = options.actions\n this.timestamp = new Date()\n\n // Handle stack trace preservation\n if (options.cause instanceof Error) {\n this.stack = ErrorX.preserveOriginalStack(options.cause, this)\n } else {\n // Node.js specific stack trace capture for clean stack\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n // Clean the stack to remove ErrorX constructor noise\n this.stack = ErrorX.cleanStack(this.stack)\n }\n }\n\n /**\n * Returns the default error name.\n * @returns Default error name 'Error'\n */\n private static getDefaultName(): string {\n return 'Error'\n }\n\n /**\n * Validates if an object is a valid ErrorXOptions object.\n * Checks that the object only contains accepted ErrorXOptions fields.\n *\n * @param value - Value to check\n * @returns True if value is a valid ErrorXOptions object\n */\n public static isErrorXOptions(value: unknown): value is ErrorXOptions {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return false\n }\n\n // If it's an Error instance, it's not ErrorXOptions\n if (value instanceof Error) {\n return false\n }\n\n const obj = value as Record<string, unknown>\n const keys = Object.keys(obj)\n\n // Empty object is valid ErrorXOptions\n if (keys.length === 0) {\n return true\n }\n\n // Check if all keys are in the accepted fields\n // If there's any key that's not accepted, it's not ErrorXOptions\n return keys.every(key => acceptedFields.has(key as ErrorXOptionField))\n }\n\n /**\n * Generates a default error code from the error name.\n * Converts camelCase/PascalCase names to UPPER_SNAKE_CASE format.\n *\n * @param name - Error name to convert\n * @returns Generated error code in UPPER_SNAKE_CASE format\n *\n * @example\n * ```typescript\n * generateDefaultCode('DatabaseError') // 'DATABASE_ERROR'\n * generateDefaultCode('userAuthError') // 'USER_AUTH_ERROR'\n * generateDefaultCode('API Timeout') // 'API_TIMEOUT'\n * ```\n */\n private static generateDefaultCode(name?: string): string {\n if (!name) return 'ERROR'\n\n // Convert camelCase/PascalCase to UPPER_SNAKE_CASE\n return name\n .replace(/([a-z])([A-Z])/g, '$1_$2') // Add underscore between camelCase\n .replace(/\\s+/g, '_') // Replace spaces with underscores\n .replace(/[^a-zA-Z0-9_]/g, '') // Remove special characters\n .toUpperCase()\n }\n\n /**\n * Preserves the original error's stack trace while updating the error message.\n * Combines the new error's message with the original error's stack trace.\n *\n * @param originalError - The original error whose stack to preserve\n * @param newError - The new error whose message to use\n * @returns Combined stack trace with new error message and original stack\n */\n private static preserveOriginalStack(originalError: Error, newError: Error): string {\n if (!originalError.stack) return newError.stack || ''\n\n // Get the new error's first line (error name + message)\n const newErrorFirstLine = `${newError.name}: ${newError.message}`\n\n // Get original stack lines (skip the first line which is the original error message)\n const originalStackLines = originalError.stack.split('\\n')\n const originalStackTrace = originalStackLines.slice(1)\n\n // Combine new error message with original stack trace\n return [newErrorFirstLine, ...originalStackTrace].join('\\n')\n }\n\n /**\n * Cleans the stack trace by removing ErrorX internal method calls.\n * This provides cleaner stack traces that focus on user code.\n *\n * @param stack - Raw stack trace to clean\n * @returns Cleaned stack trace without ErrorX internal calls\n */\n private static cleanStack(stack?: string): string {\n if (!stack) return ''\n\n const stackLines = stack.split('\\n')\n const cleanedLines: string[] = []\n\n for (const line of stackLines) {\n // Skip lines that contain ErrorX constructor or internal methods\n if (\n line.includes('new ErrorX') ||\n line.includes('ErrorX.constructor') ||\n line.includes('ErrorX.toErrorX') ||\n line.includes('error-x/dist/') ||\n line.includes('error-x/src/error.ts')\n ) {\n continue\n }\n cleanedLines.push(line)\n }\n\n return cleanedLines.join('\\n')\n }\n\n /**\n * Processes an error's stack trace to trim it after a specified delimiter.\n * Useful for removing irrelevant stack frames before a specific function.\n *\n * @param error - Error whose stack to process\n * @param delimiter - String to search for in stack lines\n * @returns Processed stack trace starting after the delimiter\n *\n * @example\n * ```typescript\n * const processed = ErrorX.processErrorStack(error, 'my-app-entry')\n * // Returns stack trace starting after the line containing 'my-app-entry'\n * ```\n */\n private static processErrorStack(error: Error, delimiter: string): string {\n let stack = error.stack ?? ''\n const stackLines = stack.split('\\n')\n\n // Find the index of the first line containing the delimiter\n const delimiterIndex = stackLines.findIndex(line => line.includes(delimiter))\n\n // If the delimiter is found, return all lines after it\n if (delimiterIndex !== -1) {\n stack = stackLines.slice(delimiterIndex + 1).join('\\n')\n }\n return stack\n }\n\n /**\n * Formats error messages with proper capitalization and punctuation.\n * Ensures consistent message formatting across all ErrorX instances.\n *\n * @param message - Raw error message to format (optional)\n * @returns Formatted message with proper capitalization and punctuation\n *\n * @example\n * ```typescript\n * formatMessage('database connection failed') // 'Database connection failed.'\n * formatMessage('user not found. please check credentials') // 'User not found. Please check credentials.'\n * formatMessage() // 'An error occurred'\n * ```\n */\n private static formatMessage(message?: string): string {\n if (!message || typeof message !== 'string' || !message.trim()) {\n return 'An error occurred'\n }\n\n // Split by sentences and capitalize each\n let formatted = message\n .split('. ')\n .map(sentence => {\n const trimmed = sentence.trim()\n if (!trimmed) return trimmed\n return trimmed.charAt(0).toUpperCase() + trimmed.slice(1)\n })\n .join('. ')\n\n // Add period at the end if it doesn't have proper punctuation\n const endsWithPunctuation = /[.!?)\\]]$/.test(formatted)\n if (!endsWithPunctuation) {\n formatted = `${formatted}.`\n }\n\n return formatted\n }\n\n /**\n * Creates a new ErrorX instance with additional metadata merged with existing metadata.\n * The original error properties are preserved while extending the metadata.\n *\n * @param additionalMetadata - Additional metadata to merge with existing metadata\n * @returns New ErrorX instance with merged metadata\n *\n * @example\n * ```typescript\n * const error = new ErrorX({\n * message: 'API request failed',\n * metadata: { endpoint: '/users' }\n * })\n *\n * const enrichedError = error.withMetadata({\n * retryCount: 3,\n * userId: 123\n * })\n * // Result: metadata = { endpoint: '/users', retryCount: 3, userId: 123 }\n * ```\n */\n public withMetadata(additionalMetadata: ErrorMetadata): ErrorX {\n const options: ErrorXOptions = {\n message: this.message,\n name: this.name,\n code: this.code,\n uiMessage: this.uiMessage,\n cause: this.cause,\n metadata: { ...(this.metadata ?? {}), ...additionalMetadata },\n }\n if (this.actions) {\n options.actions = this.actions\n }\n const newError = new ErrorX(options)\n\n // Preserve the original stack trace\n if (this.stack) {\n newError.stack = this.stack\n }\n return newError\n }\n\n /**\n * Type guard that checks if a value is an ErrorX instance.\n *\n * @param value - Value to check\n * @returns True if value is an ErrorX instance, false otherwise\n *\n * @example\n * ```typescript\n * try {\n * // some operation\n * } catch (error) {\n * if (ErrorX.isErrorX(error)) {\n * // TypeScript knows error is ErrorX\n * console.log(error.code, error.metadata)\n * }\n * }\n * ```\n */\n public static isErrorX(value: unknown): value is ErrorX {\n return value instanceof ErrorX\n }\n\n /**\n * Converts unknown input into ErrorXOptions with intelligent property extraction.\n * Handles strings, regular Error objects, API response objects, and unknown values.\n * This is a private helper method used by both the constructor and toErrorX.\n *\n * @param error - Value to convert to ErrorXOptions\n * @returns ErrorXOptions object with extracted properties\n * @internal\n */\n private static convertUnknownToOptions(error: unknown): ErrorXOptions {\n let name = ''\n let message = ''\n let code = ''\n let uiMessage = ''\n let cause: unknown\n let metadata: ErrorMetadata = {}\n let actions: ErrorAction[] | undefined\n\n if (error) {\n if (typeof error === 'string') {\n message = error\n metadata = { originalError: error }\n } else if (error instanceof Error) {\n name = error.name\n message = error.message\n cause = error.cause\n } else if (typeof error === 'object') {\n // Extract name from various properties\n if ('name' in error && error.name) name = String(error.name)\n else if ('title' in error && error.title) name = String(error.title)\n\n // Extract message from various properties\n if ('message' in error && error.message) message = String(error.message)\n else if ('details' in error && error.details) message = String(error.details)\n else if ('text' in error && error.text) message = String(error.text)\n else if ('info' in error && error.info) message = String(error.info)\n else if ('statusText' in error && error.statusText) message = String(error.statusText)\n else if ('error' in error && error.error) message = String(error.error)\n else if ('errorMessage' in error && error.errorMessage) message = String(error.errorMessage)\n\n // Extract code\n if ('code' in error && error.code) code = String(error.code)\n\n // Extract UI message\n if ('uiMessage' in error && error.uiMessage) uiMessage = String(error.uiMessage)\n else if ('userMessage' in error && error.userMessage) uiMessage = String(error.userMessage)\n\n // Extract actions\n if ('actions' in error && Array.isArray(error.actions)) {\n actions = error.actions as ErrorAction[]\n }\n\n // Store original object as metadata if it has additional properties\n metadata = { originalError: error }\n }\n }\n\n const options: ErrorXOptions = {\n message: message || 'Unknown error occurred',\n }\n\n if (name) options.name = name\n if (code) options.code = code\n if (uiMessage) options.uiMessage = uiMessage\n if (cause) options.cause = cause\n if (Object.keys(metadata).length > 0) options.metadata = metadata\n if (actions && actions.length > 0) options.actions = actions\n\n return options\n }\n\n /**\n * Converts unknown input into an ErrorX instance with intelligent property extraction.\n * Handles strings, regular Error objects, API response objects, and unknown values.\n *\n * @param error - Value to convert to ErrorX\n * @returns ErrorX instance with extracted properties\n *\n * @example\n * ```typescript\n * // Convert string error\n * const error1 = ErrorX.toErrorX('Something went wrong')\n *\n * // Convert regular Error\n * const error2 = ErrorX.toErrorX(new Error('Database failed'))\n *\n * // Convert API response object\n * const apiError = {\n * message: 'User not found',\n * code: 'USER_404',\n * statusText: 'Not Found'\n * }\n * const error3 = ErrorX.toErrorX(apiError)\n * ```\n */\n public static toErrorX(error: unknown): ErrorX {\n if (error instanceof ErrorX) return error\n\n const options = ErrorX.convertUnknownToOptions(error)\n return new ErrorX(options)\n }\n\n /**\n * Public wrapper for processing error stack traces with delimiter.\n * Delegates to the private processErrorStack method for implementation.\n *\n * @param error - Error whose stack to process\n * @param delimiter - String to search for in stack lines\n * @returns Processed stack trace starting after the delimiter\n *\n * @example\n * ```typescript\n * const error = new Error('Something failed')\n * const cleanStack = ErrorX.processStack(error, 'my-app-entry')\n * // Returns stack trace starting after the line containing 'my-app-entry'\n * ```\n */\n public static processStack(error: Error, delimiter: string): string {\n return ErrorX.processErrorStack(error, delimiter)\n }\n\n /**\n * Creates a new ErrorX instance with cleaned stack trace using the specified delimiter.\n * Returns the same instance if no delimiter is provided or no stack is available.\n *\n * @param delimiter - Optional string to search for in stack lines\n * @returns New ErrorX instance with cleaned stack trace, or the same instance if no cleaning needed\n *\n * @example\n * ```typescript\n * const error = new ErrorX({ message: 'Database error' })\n * const cleanedError = error.cleanStackTrace('database-layer')\n * // Returns new ErrorX with stack trace starting after 'database-layer'\n * ```\n */\n public cleanStackTrace(delimiter?: string): ErrorX {\n if (delimiter && this.stack) {\n const options: ErrorXOptions = {\n message: this.message,\n name: this.name,\n code: this.code,\n uiMessage: this.uiMessage,\n cause: this.cause,\n }\n if (this.metadata !== undefined) {\n options.metadata = this.metadata\n }\n if (this.actions) {\n options.actions = this.actions\n }\n const newError = new ErrorX(options)\n newError.stack = ErrorX.processErrorStack(this, delimiter)\n return newError\n }\n return this\n }\n\n /**\n * Converts the ErrorX instance to a detailed string representation.\n * Includes error name, message, code, timestamp, metadata, and stack trace.\n *\n * @returns Formatted string representation of the error\n *\n * @example\n * ```typescript\n * const error = new ErrorX({\n * message: 'Database connection failed',\n * name: 'DatabaseError',\n * code: 'DB_CONN_FAILED',\n * metadata: { host: 'localhost', port: 5432 }\n * })\n *\n * console.log(error.toString())\n * // Output: \"DatabaseError: Database connection failed. [DB_CONN_FAILED] (2024-01-15T10:30:45.123Z) metadata: {...}\"\n * ```\n */\n public toString(): string {\n const parts = []\n\n // Add name and message\n parts.push(`${this.name}: ${this.message}`)\n\n // Add code if different from default\n if (this.code && this.code !== 'ERROR') {\n parts.push(`[${this.code}]`)\n }\n\n // Add timestamp\n parts.push(`(${this.timestamp.toISOString()})`)\n\n // Add metadata if present\n if (this.metadata && Object.keys(this.metadata).length > 0) {\n const metadataStr = safeStringify(this.metadata)\n parts.push(`metadata: ${metadataStr}`)\n }\n\n let result = parts.join(' ')\n\n // Add stack trace if available\n if (this.stack) {\n result += `\\n${this.stack}`\n }\n\n return result\n }\n\n /**\n * Serializes the ErrorX instance to a JSON-compatible object.\n * Recursively serializes the error chain and handles ErrorX or regular Error causes.\n *\n * @returns Serializable object representation of the error\n *\n * @example\n * ```typescript\n * const error = new ErrorX({\n * message: 'API request failed',\n * code: 'API_ERROR',\n * metadata: { endpoint: '/users', status: 500 }\n * })\n *\n * const serialized = error.toJSON()\n * // Can be safely passed to JSON.stringify() or sent over network\n * ```\n */\n public toJSON(): SerializableError {\n // Handle metadata serialization with circular reference protection\n\n // Use safe stringify to parse the metadata and remove circular references\n const safeMetadata: ErrorMetadata | undefined = this.metadata\n ? JSON.parse(safeStringify(this.metadata))\n : undefined\n\n const serialized: SerializableError = {\n name: this.name,\n message: this.message,\n code: this.code,\n uiMessage: this.uiMessage,\n metadata: safeMetadata,\n timestamp: this.timestamp.toISOString(),\n }\n\n // Include actions if present\n if (this.actions && this.actions.length > 0) {\n // Use safe stringify to parse the actions and remove circular references\n const stringified = safeStringify(this.actions)\n serialized.actions = JSON.parse(stringified)\n }\n\n // Include stack if available\n if (this.stack) {\n serialized.stack = this.stack\n }\n\n // Recursively serialize cause if it's an ErrorX\n if (this.cause) {\n if (this.cause instanceof ErrorX) {\n serialized.cause = this.cause.toJSON()\n } else if (this.cause instanceof Error) {\n const causeData: SerializableError = {\n name: this.cause.name,\n message: this.cause.message,\n code: 'ERROR',\n uiMessage: undefined,\n metadata: {},\n timestamp: new Date().toISOString(),\n }\n if (this.cause.stack) {\n causeData.stack = this.cause.stack\n }\n serialized.cause = causeData\n }\n }\n\n return serialized\n }\n\n /**\n * Deserializes a JSON object back into an ErrorX instance.\n * Recursively reconstructs the error chain and restores all properties.\n *\n * @param serialized - Serialized error object to deserialize\n * @returns Reconstructed ErrorX instance with restored properties\n *\n * @example\n * ```typescript\n * const serializedError = {\n * name: 'DatabaseError',\n * message: 'Connection failed.',\n * code: 'DB_CONN_FAILED',\n * uiMessage: 'Database is temporarily unavailable',\n * metadata: { host: 'localhost' },\n * timestamp: '2024-01-15T10:30:45.123Z'\n * }\n *\n * const error = ErrorX.fromJSON(serializedError)\n * // Fully restored ErrorX instance with all properties\n * ```\n */\n public static fromJSON(serialized: SerializableError): ErrorX {\n const options: ErrorXOptions = {\n message: serialized.message,\n name: serialized.name,\n code: serialized.code,\n uiMessage: serialized.uiMessage,\n }\n if (serialized.metadata !== undefined) {\n options.metadata = serialized.metadata\n }\n\n if (serialized.actions && serialized.actions.length > 0) {\n options.actions = serialized.actions\n }\n\n const error = new ErrorX(options)\n\n // Restore stack and timestamp\n if (serialized.stack) {\n error.stack = serialized.stack\n }\n // Use Object.defineProperty to set readonly properties\n Object.defineProperty(error, 'timestamp', {\n value: new Date(serialized.timestamp),\n writable: false,\n })\n\n // Restore cause chain\n if (serialized.cause) {\n Object.defineProperty(error, 'cause', {\n value: ErrorX.fromJSON(serialized.cause),\n writable: false,\n })\n }\n\n return error\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -167,6 +167,29 @@ type ErrorAction = NotifyAction | LogoutAction | RedirectAction | CustomAction;
|
|
|
167
167
|
* Configuration options for creating an ErrorX instance.
|
|
168
168
|
* All properties are optional with sensible defaults.
|
|
169
169
|
*
|
|
170
|
+
* @remarks
|
|
171
|
+
* **Note on design:** ErrorXOptions is a `type` instead of a `class` to provide maximum flexibility.
|
|
172
|
+
* This allows you to pass plain objects without instantiation:
|
|
173
|
+
*
|
|
174
|
+
* ```typescript
|
|
175
|
+
* // ✅ Works - plain object
|
|
176
|
+
* new ErrorX({ message: 'Error', code: 'ERR' })
|
|
177
|
+
*
|
|
178
|
+
* // ✅ Works - object literal
|
|
179
|
+
* const opts = { message: 'Error' }
|
|
180
|
+
* new ErrorX(opts)
|
|
181
|
+
* ```
|
|
182
|
+
*
|
|
183
|
+
* If ErrorXOptions were a class, you would need to instantiate it:
|
|
184
|
+
*
|
|
185
|
+
* ```typescript
|
|
186
|
+
* // ❌ Would be required with class
|
|
187
|
+
* new ErrorX(new ErrorXOptions({ message: 'Error' }))
|
|
188
|
+
* ```
|
|
189
|
+
*
|
|
190
|
+
* The current `type` approach provides better ergonomics while still maintaining type safety.
|
|
191
|
+
* The `isErrorXOptions()` validation method ensures only valid option objects are accepted.
|
|
192
|
+
*
|
|
170
193
|
* @public
|
|
171
194
|
*/
|
|
172
195
|
type ErrorXOptions = {
|
|
@@ -268,49 +291,54 @@ declare class ErrorX extends Error {
|
|
|
268
291
|
/**
|
|
269
292
|
* Creates a new ErrorX instance with enhanced error handling capabilities.
|
|
270
293
|
*
|
|
271
|
-
* @param
|
|
272
|
-
* @param
|
|
273
|
-
* @param options.name - Error type/name (defaults to 'Error')
|
|
274
|
-
* @param options.code - Error identifier code (auto-generated from name if not provided)
|
|
275
|
-
* @param options.uiMessage - User-friendly message (defaults to undefined)
|
|
276
|
-
* @param options.cause - Original error that caused this error
|
|
277
|
-
* @param options.metadata - Additional context data (defaults to undefined)
|
|
278
|
-
* @param options.actions - Error actions for UI behavior and handling (defaults to undefined)
|
|
294
|
+
* @param messageOrOptions - Error message string, ErrorXOptions object, or any value to convert to ErrorX
|
|
295
|
+
* @param additionalOptions - Additional options when first parameter is a string (optional)
|
|
279
296
|
*
|
|
280
297
|
* @example
|
|
281
298
|
* ```typescript
|
|
282
|
-
* // Create with
|
|
283
|
-
* const
|
|
284
|
-
*
|
|
299
|
+
* // Create with string message only
|
|
300
|
+
* const error1 = new ErrorX('Database query failed')
|
|
301
|
+
*
|
|
302
|
+
* // Create with string message and additional options
|
|
303
|
+
* const error2 = new ErrorX('Database query failed', {
|
|
285
304
|
* name: 'DatabaseError',
|
|
286
305
|
* code: 'DB_QUERY_FAILED',
|
|
287
306
|
* uiMessage: 'Unable to load data. Please try again.',
|
|
288
|
-
* metadata: { query: 'SELECT * FROM users', timeout: 5000 }
|
|
307
|
+
* metadata: { query: 'SELECT * FROM users', timeout: 5000 }
|
|
308
|
+
* })
|
|
309
|
+
*
|
|
310
|
+
* // Create with options object (backward compatible)
|
|
311
|
+
* const error3 = new ErrorX({
|
|
312
|
+
* message: 'Database query failed',
|
|
313
|
+
* name: 'DatabaseError',
|
|
314
|
+
* code: 'DB_QUERY_FAILED',
|
|
289
315
|
* actions: [
|
|
290
|
-
* {
|
|
291
|
-
* action: 'notify',
|
|
292
|
-
* payload: { targets: [HandlingTargets.TOAST] }
|
|
293
|
-
* },
|
|
294
|
-
* {
|
|
295
|
-
* action: 'redirect',
|
|
296
|
-
* payload: { redirectURL: '/dashboard', delay: 1000 }
|
|
297
|
-
* }
|
|
316
|
+
* { action: 'notify', payload: { targets: [HandlingTargets.TOAST] } }
|
|
298
317
|
* ]
|
|
299
318
|
* })
|
|
300
319
|
*
|
|
301
|
-
* // Create with
|
|
302
|
-
* const
|
|
320
|
+
* // Create with unknown input (smart conversion)
|
|
321
|
+
* const apiError = { message: 'User not found', code: 404 }
|
|
322
|
+
* const error4 = new ErrorX(apiError)
|
|
303
323
|
*
|
|
304
324
|
* // Create with no options (uses defaults)
|
|
305
|
-
* const
|
|
325
|
+
* const error5 = new ErrorX()
|
|
306
326
|
* ```
|
|
307
327
|
*/
|
|
308
|
-
constructor(
|
|
328
|
+
constructor(messageOrOptions?: string | ErrorXOptions | unknown, additionalOptions?: Partial<ErrorXOptions>);
|
|
309
329
|
/**
|
|
310
330
|
* Returns the default error name.
|
|
311
331
|
* @returns Default error name 'Error'
|
|
312
332
|
*/
|
|
313
333
|
private static getDefaultName;
|
|
334
|
+
/**
|
|
335
|
+
* Validates if an object is a valid ErrorXOptions object.
|
|
336
|
+
* Checks that the object only contains accepted ErrorXOptions fields.
|
|
337
|
+
*
|
|
338
|
+
* @param value - Value to check
|
|
339
|
+
* @returns True if value is a valid ErrorXOptions object
|
|
340
|
+
*/
|
|
341
|
+
static isErrorXOptions(value: unknown): value is ErrorXOptions;
|
|
314
342
|
/**
|
|
315
343
|
* Generates a default error code from the error name.
|
|
316
344
|
* Converts camelCase/PascalCase names to UPPER_SNAKE_CASE format.
|
|
@@ -414,6 +442,16 @@ declare class ErrorX extends Error {
|
|
|
414
442
|
* ```
|
|
415
443
|
*/
|
|
416
444
|
static isErrorX(value: unknown): value is ErrorX;
|
|
445
|
+
/**
|
|
446
|
+
* Converts unknown input into ErrorXOptions with intelligent property extraction.
|
|
447
|
+
* Handles strings, regular Error objects, API response objects, and unknown values.
|
|
448
|
+
* This is a private helper method used by both the constructor and toErrorX.
|
|
449
|
+
*
|
|
450
|
+
* @param error - Value to convert to ErrorXOptions
|
|
451
|
+
* @returns ErrorXOptions object with extracted properties
|
|
452
|
+
* @internal
|
|
453
|
+
*/
|
|
454
|
+
private static convertUnknownToOptions;
|
|
417
455
|
/**
|
|
418
456
|
* Converts unknown input into an ErrorX instance with intelligent property extraction.
|
|
419
457
|
* Handles strings, regular Error objects, API response objects, and unknown values.
|
package/dist/index.d.ts
CHANGED
|
@@ -167,6 +167,29 @@ type ErrorAction = NotifyAction | LogoutAction | RedirectAction | CustomAction;
|
|
|
167
167
|
* Configuration options for creating an ErrorX instance.
|
|
168
168
|
* All properties are optional with sensible defaults.
|
|
169
169
|
*
|
|
170
|
+
* @remarks
|
|
171
|
+
* **Note on design:** ErrorXOptions is a `type` instead of a `class` to provide maximum flexibility.
|
|
172
|
+
* This allows you to pass plain objects without instantiation:
|
|
173
|
+
*
|
|
174
|
+
* ```typescript
|
|
175
|
+
* // ✅ Works - plain object
|
|
176
|
+
* new ErrorX({ message: 'Error', code: 'ERR' })
|
|
177
|
+
*
|
|
178
|
+
* // ✅ Works - object literal
|
|
179
|
+
* const opts = { message: 'Error' }
|
|
180
|
+
* new ErrorX(opts)
|
|
181
|
+
* ```
|
|
182
|
+
*
|
|
183
|
+
* If ErrorXOptions were a class, you would need to instantiate it:
|
|
184
|
+
*
|
|
185
|
+
* ```typescript
|
|
186
|
+
* // ❌ Would be required with class
|
|
187
|
+
* new ErrorX(new ErrorXOptions({ message: 'Error' }))
|
|
188
|
+
* ```
|
|
189
|
+
*
|
|
190
|
+
* The current `type` approach provides better ergonomics while still maintaining type safety.
|
|
191
|
+
* The `isErrorXOptions()` validation method ensures only valid option objects are accepted.
|
|
192
|
+
*
|
|
170
193
|
* @public
|
|
171
194
|
*/
|
|
172
195
|
type ErrorXOptions = {
|
|
@@ -268,49 +291,54 @@ declare class ErrorX extends Error {
|
|
|
268
291
|
/**
|
|
269
292
|
* Creates a new ErrorX instance with enhanced error handling capabilities.
|
|
270
293
|
*
|
|
271
|
-
* @param
|
|
272
|
-
* @param
|
|
273
|
-
* @param options.name - Error type/name (defaults to 'Error')
|
|
274
|
-
* @param options.code - Error identifier code (auto-generated from name if not provided)
|
|
275
|
-
* @param options.uiMessage - User-friendly message (defaults to undefined)
|
|
276
|
-
* @param options.cause - Original error that caused this error
|
|
277
|
-
* @param options.metadata - Additional context data (defaults to undefined)
|
|
278
|
-
* @param options.actions - Error actions for UI behavior and handling (defaults to undefined)
|
|
294
|
+
* @param messageOrOptions - Error message string, ErrorXOptions object, or any value to convert to ErrorX
|
|
295
|
+
* @param additionalOptions - Additional options when first parameter is a string (optional)
|
|
279
296
|
*
|
|
280
297
|
* @example
|
|
281
298
|
* ```typescript
|
|
282
|
-
* // Create with
|
|
283
|
-
* const
|
|
284
|
-
*
|
|
299
|
+
* // Create with string message only
|
|
300
|
+
* const error1 = new ErrorX('Database query failed')
|
|
301
|
+
*
|
|
302
|
+
* // Create with string message and additional options
|
|
303
|
+
* const error2 = new ErrorX('Database query failed', {
|
|
285
304
|
* name: 'DatabaseError',
|
|
286
305
|
* code: 'DB_QUERY_FAILED',
|
|
287
306
|
* uiMessage: 'Unable to load data. Please try again.',
|
|
288
|
-
* metadata: { query: 'SELECT * FROM users', timeout: 5000 }
|
|
307
|
+
* metadata: { query: 'SELECT * FROM users', timeout: 5000 }
|
|
308
|
+
* })
|
|
309
|
+
*
|
|
310
|
+
* // Create with options object (backward compatible)
|
|
311
|
+
* const error3 = new ErrorX({
|
|
312
|
+
* message: 'Database query failed',
|
|
313
|
+
* name: 'DatabaseError',
|
|
314
|
+
* code: 'DB_QUERY_FAILED',
|
|
289
315
|
* actions: [
|
|
290
|
-
* {
|
|
291
|
-
* action: 'notify',
|
|
292
|
-
* payload: { targets: [HandlingTargets.TOAST] }
|
|
293
|
-
* },
|
|
294
|
-
* {
|
|
295
|
-
* action: 'redirect',
|
|
296
|
-
* payload: { redirectURL: '/dashboard', delay: 1000 }
|
|
297
|
-
* }
|
|
316
|
+
* { action: 'notify', payload: { targets: [HandlingTargets.TOAST] } }
|
|
298
317
|
* ]
|
|
299
318
|
* })
|
|
300
319
|
*
|
|
301
|
-
* // Create with
|
|
302
|
-
* const
|
|
320
|
+
* // Create with unknown input (smart conversion)
|
|
321
|
+
* const apiError = { message: 'User not found', code: 404 }
|
|
322
|
+
* const error4 = new ErrorX(apiError)
|
|
303
323
|
*
|
|
304
324
|
* // Create with no options (uses defaults)
|
|
305
|
-
* const
|
|
325
|
+
* const error5 = new ErrorX()
|
|
306
326
|
* ```
|
|
307
327
|
*/
|
|
308
|
-
constructor(
|
|
328
|
+
constructor(messageOrOptions?: string | ErrorXOptions | unknown, additionalOptions?: Partial<ErrorXOptions>);
|
|
309
329
|
/**
|
|
310
330
|
* Returns the default error name.
|
|
311
331
|
* @returns Default error name 'Error'
|
|
312
332
|
*/
|
|
313
333
|
private static getDefaultName;
|
|
334
|
+
/**
|
|
335
|
+
* Validates if an object is a valid ErrorXOptions object.
|
|
336
|
+
* Checks that the object only contains accepted ErrorXOptions fields.
|
|
337
|
+
*
|
|
338
|
+
* @param value - Value to check
|
|
339
|
+
* @returns True if value is a valid ErrorXOptions object
|
|
340
|
+
*/
|
|
341
|
+
static isErrorXOptions(value: unknown): value is ErrorXOptions;
|
|
314
342
|
/**
|
|
315
343
|
* Generates a default error code from the error name.
|
|
316
344
|
* Converts camelCase/PascalCase names to UPPER_SNAKE_CASE format.
|
|
@@ -414,6 +442,16 @@ declare class ErrorX extends Error {
|
|
|
414
442
|
* ```
|
|
415
443
|
*/
|
|
416
444
|
static isErrorX(value: unknown): value is ErrorX;
|
|
445
|
+
/**
|
|
446
|
+
* Converts unknown input into ErrorXOptions with intelligent property extraction.
|
|
447
|
+
* Handles strings, regular Error objects, API response objects, and unknown values.
|
|
448
|
+
* This is a private helper method used by both the constructor and toErrorX.
|
|
449
|
+
*
|
|
450
|
+
* @param error - Value to convert to ErrorXOptions
|
|
451
|
+
* @returns ErrorXOptions object with extracted properties
|
|
452
|
+
* @internal
|
|
453
|
+
*/
|
|
454
|
+
private static convertUnknownToOptions;
|
|
417
455
|
/**
|
|
418
456
|
* Converts unknown input into an ErrorX instance with intelligent property extraction.
|
|
419
457
|
* Handles strings, regular Error objects, API response objects, and unknown values.
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
import safeStringify from 'safe-stringify';
|
|
2
2
|
|
|
3
3
|
// src/error.ts
|
|
4
|
+
|
|
5
|
+
// src/types.ts
|
|
6
|
+
var HandlingTargets = /* @__PURE__ */ ((HandlingTargets2) => {
|
|
7
|
+
HandlingTargets2["MODAL"] = "modal";
|
|
8
|
+
HandlingTargets2["TOAST"] = "toast";
|
|
9
|
+
HandlingTargets2["INLINE"] = "inline";
|
|
10
|
+
HandlingTargets2["BANNER"] = "banner";
|
|
11
|
+
HandlingTargets2["CONSOLE"] = "console";
|
|
12
|
+
HandlingTargets2["LOGGER"] = "logger";
|
|
13
|
+
HandlingTargets2["NOTIFICATION"] = "notification";
|
|
14
|
+
return HandlingTargets2;
|
|
15
|
+
})(HandlingTargets || {});
|
|
16
|
+
var ERROR_X_OPTION_FIELDS = [
|
|
17
|
+
"message",
|
|
18
|
+
"name",
|
|
19
|
+
"code",
|
|
20
|
+
"uiMessage",
|
|
21
|
+
"cause",
|
|
22
|
+
"metadata",
|
|
23
|
+
"actions"
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
// src/error.ts
|
|
27
|
+
var acceptedFields = new Set(ERROR_X_OPTION_FIELDS);
|
|
4
28
|
var ErrorX = class _ErrorX extends Error {
|
|
5
29
|
/** Error identifier code, auto-generated from name if not provided */
|
|
6
30
|
code;
|
|
@@ -15,44 +39,52 @@ var ErrorX = class _ErrorX extends Error {
|
|
|
15
39
|
/**
|
|
16
40
|
* Creates a new ErrorX instance with enhanced error handling capabilities.
|
|
17
41
|
*
|
|
18
|
-
* @param
|
|
19
|
-
* @param
|
|
20
|
-
* @param options.name - Error type/name (defaults to 'Error')
|
|
21
|
-
* @param options.code - Error identifier code (auto-generated from name if not provided)
|
|
22
|
-
* @param options.uiMessage - User-friendly message (defaults to undefined)
|
|
23
|
-
* @param options.cause - Original error that caused this error
|
|
24
|
-
* @param options.metadata - Additional context data (defaults to undefined)
|
|
25
|
-
* @param options.actions - Error actions for UI behavior and handling (defaults to undefined)
|
|
42
|
+
* @param messageOrOptions - Error message string, ErrorXOptions object, or any value to convert to ErrorX
|
|
43
|
+
* @param additionalOptions - Additional options when first parameter is a string (optional)
|
|
26
44
|
*
|
|
27
45
|
* @example
|
|
28
46
|
* ```typescript
|
|
29
|
-
* // Create with
|
|
30
|
-
* const
|
|
31
|
-
*
|
|
47
|
+
* // Create with string message only
|
|
48
|
+
* const error1 = new ErrorX('Database query failed')
|
|
49
|
+
*
|
|
50
|
+
* // Create with string message and additional options
|
|
51
|
+
* const error2 = new ErrorX('Database query failed', {
|
|
32
52
|
* name: 'DatabaseError',
|
|
33
53
|
* code: 'DB_QUERY_FAILED',
|
|
34
54
|
* uiMessage: 'Unable to load data. Please try again.',
|
|
35
|
-
* metadata: { query: 'SELECT * FROM users', timeout: 5000 }
|
|
55
|
+
* metadata: { query: 'SELECT * FROM users', timeout: 5000 }
|
|
56
|
+
* })
|
|
57
|
+
*
|
|
58
|
+
* // Create with options object (backward compatible)
|
|
59
|
+
* const error3 = new ErrorX({
|
|
60
|
+
* message: 'Database query failed',
|
|
61
|
+
* name: 'DatabaseError',
|
|
62
|
+
* code: 'DB_QUERY_FAILED',
|
|
36
63
|
* actions: [
|
|
37
|
-
* {
|
|
38
|
-
* action: 'notify',
|
|
39
|
-
* payload: { targets: [HandlingTargets.TOAST] }
|
|
40
|
-
* },
|
|
41
|
-
* {
|
|
42
|
-
* action: 'redirect',
|
|
43
|
-
* payload: { redirectURL: '/dashboard', delay: 1000 }
|
|
44
|
-
* }
|
|
64
|
+
* { action: 'notify', payload: { targets: [HandlingTargets.TOAST] } }
|
|
45
65
|
* ]
|
|
46
66
|
* })
|
|
47
67
|
*
|
|
48
|
-
* // Create with
|
|
49
|
-
* const
|
|
68
|
+
* // Create with unknown input (smart conversion)
|
|
69
|
+
* const apiError = { message: 'User not found', code: 404 }
|
|
70
|
+
* const error4 = new ErrorX(apiError)
|
|
50
71
|
*
|
|
51
72
|
* // Create with no options (uses defaults)
|
|
52
|
-
* const
|
|
73
|
+
* const error5 = new ErrorX()
|
|
53
74
|
* ```
|
|
54
75
|
*/
|
|
55
|
-
constructor(
|
|
76
|
+
constructor(messageOrOptions, additionalOptions) {
|
|
77
|
+
let options = {};
|
|
78
|
+
if (typeof messageOrOptions === "string") {
|
|
79
|
+
options = {
|
|
80
|
+
message: messageOrOptions,
|
|
81
|
+
...additionalOptions
|
|
82
|
+
};
|
|
83
|
+
} else if (_ErrorX.isErrorXOptions(messageOrOptions)) {
|
|
84
|
+
options = messageOrOptions;
|
|
85
|
+
} else if (messageOrOptions != null) {
|
|
86
|
+
options = _ErrorX.convertUnknownToOptions(messageOrOptions);
|
|
87
|
+
}
|
|
56
88
|
const formattedMessage = _ErrorX.formatMessage(options.message);
|
|
57
89
|
super(formattedMessage, { cause: options.cause });
|
|
58
90
|
this.name = options.name ?? _ErrorX.getDefaultName();
|
|
@@ -77,6 +109,27 @@ var ErrorX = class _ErrorX extends Error {
|
|
|
77
109
|
static getDefaultName() {
|
|
78
110
|
return "Error";
|
|
79
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* Validates if an object is a valid ErrorXOptions object.
|
|
114
|
+
* Checks that the object only contains accepted ErrorXOptions fields.
|
|
115
|
+
*
|
|
116
|
+
* @param value - Value to check
|
|
117
|
+
* @returns True if value is a valid ErrorXOptions object
|
|
118
|
+
*/
|
|
119
|
+
static isErrorXOptions(value) {
|
|
120
|
+
if (value == null || typeof value !== "object" || Array.isArray(value)) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
if (value instanceof Error) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
const obj = value;
|
|
127
|
+
const keys = Object.keys(obj);
|
|
128
|
+
if (keys.length === 0) {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
return keys.every((key) => acceptedFields.has(key));
|
|
132
|
+
}
|
|
80
133
|
/**
|
|
81
134
|
* Generates a default error code from the error name.
|
|
82
135
|
* Converts camelCase/PascalCase names to UPPER_SNAKE_CASE format.
|
|
@@ -242,31 +295,15 @@ var ErrorX = class _ErrorX extends Error {
|
|
|
242
295
|
return value instanceof _ErrorX;
|
|
243
296
|
}
|
|
244
297
|
/**
|
|
245
|
-
* Converts unknown input into
|
|
298
|
+
* Converts unknown input into ErrorXOptions with intelligent property extraction.
|
|
246
299
|
* Handles strings, regular Error objects, API response objects, and unknown values.
|
|
300
|
+
* This is a private helper method used by both the constructor and toErrorX.
|
|
247
301
|
*
|
|
248
|
-
* @param error - Value to convert to
|
|
249
|
-
* @returns
|
|
250
|
-
*
|
|
251
|
-
* @example
|
|
252
|
-
* ```typescript
|
|
253
|
-
* // Convert string error
|
|
254
|
-
* const error1 = ErrorX.toErrorX('Something went wrong')
|
|
255
|
-
*
|
|
256
|
-
* // Convert regular Error
|
|
257
|
-
* const error2 = ErrorX.toErrorX(new Error('Database failed'))
|
|
258
|
-
*
|
|
259
|
-
* // Convert API response object
|
|
260
|
-
* const apiError = {
|
|
261
|
-
* message: 'User not found',
|
|
262
|
-
* code: 'USER_404',
|
|
263
|
-
* statusText: 'Not Found'
|
|
264
|
-
* }
|
|
265
|
-
* const error3 = ErrorX.toErrorX(apiError)
|
|
266
|
-
* ```
|
|
302
|
+
* @param error - Value to convert to ErrorXOptions
|
|
303
|
+
* @returns ErrorXOptions object with extracted properties
|
|
304
|
+
* @internal
|
|
267
305
|
*/
|
|
268
|
-
static
|
|
269
|
-
if (error instanceof _ErrorX) return error;
|
|
306
|
+
static convertUnknownToOptions(error) {
|
|
270
307
|
let name = "";
|
|
271
308
|
let message = "";
|
|
272
309
|
let code = "";
|
|
@@ -310,6 +347,35 @@ var ErrorX = class _ErrorX extends Error {
|
|
|
310
347
|
if (cause) options.cause = cause;
|
|
311
348
|
if (Object.keys(metadata).length > 0) options.metadata = metadata;
|
|
312
349
|
if (actions && actions.length > 0) options.actions = actions;
|
|
350
|
+
return options;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Converts unknown input into an ErrorX instance with intelligent property extraction.
|
|
354
|
+
* Handles strings, regular Error objects, API response objects, and unknown values.
|
|
355
|
+
*
|
|
356
|
+
* @param error - Value to convert to ErrorX
|
|
357
|
+
* @returns ErrorX instance with extracted properties
|
|
358
|
+
*
|
|
359
|
+
* @example
|
|
360
|
+
* ```typescript
|
|
361
|
+
* // Convert string error
|
|
362
|
+
* const error1 = ErrorX.toErrorX('Something went wrong')
|
|
363
|
+
*
|
|
364
|
+
* // Convert regular Error
|
|
365
|
+
* const error2 = ErrorX.toErrorX(new Error('Database failed'))
|
|
366
|
+
*
|
|
367
|
+
* // Convert API response object
|
|
368
|
+
* const apiError = {
|
|
369
|
+
* message: 'User not found',
|
|
370
|
+
* code: 'USER_404',
|
|
371
|
+
* statusText: 'Not Found'
|
|
372
|
+
* }
|
|
373
|
+
* const error3 = ErrorX.toErrorX(apiError)
|
|
374
|
+
* ```
|
|
375
|
+
*/
|
|
376
|
+
static toErrorX(error) {
|
|
377
|
+
if (error instanceof _ErrorX) return error;
|
|
378
|
+
const options = _ErrorX.convertUnknownToOptions(error);
|
|
313
379
|
return new _ErrorX(options);
|
|
314
380
|
}
|
|
315
381
|
/**
|
|
@@ -510,18 +576,6 @@ ${this.stack}`;
|
|
|
510
576
|
}
|
|
511
577
|
};
|
|
512
578
|
|
|
513
|
-
// src/types.ts
|
|
514
|
-
var HandlingTargets = /* @__PURE__ */ ((HandlingTargets2) => {
|
|
515
|
-
HandlingTargets2["MODAL"] = "modal";
|
|
516
|
-
HandlingTargets2["TOAST"] = "toast";
|
|
517
|
-
HandlingTargets2["INLINE"] = "inline";
|
|
518
|
-
HandlingTargets2["BANNER"] = "banner";
|
|
519
|
-
HandlingTargets2["CONSOLE"] = "console";
|
|
520
|
-
HandlingTargets2["LOGGER"] = "logger";
|
|
521
|
-
HandlingTargets2["NOTIFICATION"] = "notification";
|
|
522
|
-
return HandlingTargets2;
|
|
523
|
-
})(HandlingTargets || {});
|
|
524
|
-
|
|
525
579
|
export { ErrorX, HandlingTargets };
|
|
526
580
|
//# sourceMappingURL=index.js.map
|
|
527
581
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/error.ts","../src/types.ts"],"names":["HandlingTargets"],"mappings":"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","file":"index.js","sourcesContent":["import safeStringify from 'safe-stringify'\nimport type { ErrorAction, ErrorMetadata, ErrorXOptions, SerializableError } from './types.js'\n\n/**\n * Enhanced Error class with rich metadata, type-safe error handling, and intelligent error conversion.\n *\n * @example\n * ```typescript\n * // Basic usage\n * const error = new ErrorX({ message: 'Database connection failed' })\n *\n * // With full options\n * const error = new ErrorX({\n * message: 'User authentication failed',\n * name: 'AuthError',\n * code: 'AUTH_FAILED',\n * uiMessage: 'Please check your credentials',\n * metadata: { userId: 123, loginAttempt: 3 }\n * })\n * ```\n *\n * @public\n */\nexport class ErrorX extends Error {\n /** Error identifier code, auto-generated from name if not provided */\n public readonly code: string\n /** User-friendly message suitable for display in UI */\n public readonly uiMessage: string | undefined\n /** Additional context and metadata associated with the error */\n public readonly metadata: ErrorMetadata | undefined\n /** Timestamp when the error was created */\n public readonly timestamp: Date\n /** Error actions for UI behavior and handling */\n public readonly actions: ErrorAction[] | undefined\n\n /**\n * Creates a new ErrorX instance with enhanced error handling capabilities.\n *\n * @param options - Configuration options for the error (optional)\n * @param options.message - Technical error message (defaults to 'An error occurred')\n * @param options.name - Error type/name (defaults to 'Error')\n * @param options.code - Error identifier code (auto-generated from name if not provided)\n * @param options.uiMessage - User-friendly message (defaults to undefined)\n * @param options.cause - Original error that caused this error\n * @param options.metadata - Additional context data (defaults to undefined)\n * @param options.actions - Error actions for UI behavior and handling (defaults to undefined)\n *\n * @example\n * ```typescript\n * // Create with full options\n * const error = new ErrorX({\n * message: 'Database query failed',\n * name: 'DatabaseError',\n * code: 'DB_QUERY_FAILED',\n * uiMessage: 'Unable to load data. Please try again.',\n * metadata: { query: 'SELECT * FROM users', timeout: 5000 },\n * actions: [\n * {\n * action: 'notify',\n * payload: { targets: [HandlingTargets.TOAST] }\n * },\n * {\n * action: 'redirect',\n * payload: { redirectURL: '/dashboard', delay: 1000 }\n * }\n * ]\n * })\n *\n * // Create with minimal options\n * const simpleError = new ErrorX({ message: 'Something failed' })\n *\n * // Create with no options (uses defaults)\n * const defaultError = new ErrorX()\n * ```\n */\n constructor(options: ErrorXOptions = {}) {\n const formattedMessage = ErrorX.formatMessage(options.message)\n super(formattedMessage, { cause: options.cause })\n\n this.name = options.name ?? ErrorX.getDefaultName()\n this.code =\n options.code != null ? String(options.code) : ErrorX.generateDefaultCode(options.name)\n this.uiMessage = options.uiMessage\n this.metadata = options.metadata\n this.actions = options.actions\n this.timestamp = new Date()\n\n // Handle stack trace preservation\n if (options.cause instanceof Error) {\n this.stack = ErrorX.preserveOriginalStack(options.cause, this)\n } else {\n // Node.js specific stack trace capture for clean stack\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n // Clean the stack to remove ErrorX constructor noise\n this.stack = ErrorX.cleanStack(this.stack)\n }\n }\n\n /**\n * Returns the default error name.\n * @returns Default error name 'Error'\n */\n private static getDefaultName(): string {\n return 'Error'\n }\n\n /**\n * Generates a default error code from the error name.\n * Converts camelCase/PascalCase names to UPPER_SNAKE_CASE format.\n *\n * @param name - Error name to convert\n * @returns Generated error code in UPPER_SNAKE_CASE format\n *\n * @example\n * ```typescript\n * generateDefaultCode('DatabaseError') // 'DATABASE_ERROR'\n * generateDefaultCode('userAuthError') // 'USER_AUTH_ERROR'\n * generateDefaultCode('API Timeout') // 'API_TIMEOUT'\n * ```\n */\n private static generateDefaultCode(name?: string): string {\n if (!name) return 'ERROR'\n\n // Convert camelCase/PascalCase to UPPER_SNAKE_CASE\n return name\n .replace(/([a-z])([A-Z])/g, '$1_$2') // Add underscore between camelCase\n .replace(/\\s+/g, '_') // Replace spaces with underscores\n .replace(/[^a-zA-Z0-9_]/g, '') // Remove special characters\n .toUpperCase()\n }\n\n /**\n * Preserves the original error's stack trace while updating the error message.\n * Combines the new error's message with the original error's stack trace.\n *\n * @param originalError - The original error whose stack to preserve\n * @param newError - The new error whose message to use\n * @returns Combined stack trace with new error message and original stack\n */\n private static preserveOriginalStack(originalError: Error, newError: Error): string {\n if (!originalError.stack) return newError.stack || ''\n\n // Get the new error's first line (error name + message)\n const newErrorFirstLine = `${newError.name}: ${newError.message}`\n\n // Get original stack lines (skip the first line which is the original error message)\n const originalStackLines = originalError.stack.split('\\n')\n const originalStackTrace = originalStackLines.slice(1)\n\n // Combine new error message with original stack trace\n return [newErrorFirstLine, ...originalStackTrace].join('\\n')\n }\n\n /**\n * Cleans the stack trace by removing ErrorX internal method calls.\n * This provides cleaner stack traces that focus on user code.\n *\n * @param stack - Raw stack trace to clean\n * @returns Cleaned stack trace without ErrorX internal calls\n */\n private static cleanStack(stack?: string): string {\n if (!stack) return ''\n\n const stackLines = stack.split('\\n')\n const cleanedLines: string[] = []\n\n for (const line of stackLines) {\n // Skip lines that contain ErrorX constructor or internal methods\n if (\n line.includes('new ErrorX') ||\n line.includes('ErrorX.constructor') ||\n line.includes('ErrorX.toErrorX') ||\n line.includes('error-x/dist/') ||\n line.includes('error-x/src/error.ts')\n ) {\n continue\n }\n cleanedLines.push(line)\n }\n\n return cleanedLines.join('\\n')\n }\n\n /**\n * Processes an error's stack trace to trim it after a specified delimiter.\n * Useful for removing irrelevant stack frames before a specific function.\n *\n * @param error - Error whose stack to process\n * @param delimiter - String to search for in stack lines\n * @returns Processed stack trace starting after the delimiter\n *\n * @example\n * ```typescript\n * const processed = ErrorX.processErrorStack(error, 'my-app-entry')\n * // Returns stack trace starting after the line containing 'my-app-entry'\n * ```\n */\n private static processErrorStack(error: Error, delimiter: string): string {\n let stack = error.stack ?? ''\n const stackLines = stack.split('\\n')\n\n // Find the index of the first line containing the delimiter\n const delimiterIndex = stackLines.findIndex(line => line.includes(delimiter))\n\n // If the delimiter is found, return all lines after it\n if (delimiterIndex !== -1) {\n stack = stackLines.slice(delimiterIndex + 1).join('\\n')\n }\n return stack\n }\n\n /**\n * Formats error messages with proper capitalization and punctuation.\n * Ensures consistent message formatting across all ErrorX instances.\n *\n * @param message - Raw error message to format (optional)\n * @returns Formatted message with proper capitalization and punctuation\n *\n * @example\n * ```typescript\n * formatMessage('database connection failed') // 'Database connection failed.'\n * formatMessage('user not found. please check credentials') // 'User not found. Please check credentials.'\n * formatMessage() // 'An error occurred'\n * ```\n */\n private static formatMessage(message?: string): string {\n if (!message || typeof message !== 'string' || !message.trim()) {\n return 'An error occurred'\n }\n\n // Split by sentences and capitalize each\n let formatted = message\n .split('. ')\n .map(sentence => {\n const trimmed = sentence.trim()\n if (!trimmed) return trimmed\n return trimmed.charAt(0).toUpperCase() + trimmed.slice(1)\n })\n .join('. ')\n\n // Add period at the end if it doesn't have proper punctuation\n const endsWithPunctuation = /[.!?)\\]]$/.test(formatted)\n if (!endsWithPunctuation) {\n formatted = `${formatted}.`\n }\n\n return formatted\n }\n\n /**\n * Creates a new ErrorX instance with additional metadata merged with existing metadata.\n * The original error properties are preserved while extending the metadata.\n *\n * @param additionalMetadata - Additional metadata to merge with existing metadata\n * @returns New ErrorX instance with merged metadata\n *\n * @example\n * ```typescript\n * const error = new ErrorX({\n * message: 'API request failed',\n * metadata: { endpoint: '/users' }\n * })\n *\n * const enrichedError = error.withMetadata({\n * retryCount: 3,\n * userId: 123\n * })\n * // Result: metadata = { endpoint: '/users', retryCount: 3, userId: 123 }\n * ```\n */\n public withMetadata(additionalMetadata: ErrorMetadata): ErrorX {\n const options: ErrorXOptions = {\n message: this.message,\n name: this.name,\n code: this.code,\n uiMessage: this.uiMessage,\n cause: this.cause,\n metadata: { ...(this.metadata ?? {}), ...additionalMetadata },\n }\n if (this.actions) {\n options.actions = this.actions\n }\n const newError = new ErrorX(options)\n\n // Preserve the original stack trace\n if (this.stack) {\n newError.stack = this.stack\n }\n return newError\n }\n\n /**\n * Type guard that checks if a value is an ErrorX instance.\n *\n * @param value - Value to check\n * @returns True if value is an ErrorX instance, false otherwise\n *\n * @example\n * ```typescript\n * try {\n * // some operation\n * } catch (error) {\n * if (ErrorX.isErrorX(error)) {\n * // TypeScript knows error is ErrorX\n * console.log(error.code, error.metadata)\n * }\n * }\n * ```\n */\n public static isErrorX(value: unknown): value is ErrorX {\n return value instanceof ErrorX\n }\n\n /**\n * Converts unknown input into an ErrorX instance with intelligent property extraction.\n * Handles strings, regular Error objects, API response objects, and unknown values.\n *\n * @param error - Value to convert to ErrorX\n * @returns ErrorX instance with extracted properties\n *\n * @example\n * ```typescript\n * // Convert string error\n * const error1 = ErrorX.toErrorX('Something went wrong')\n *\n * // Convert regular Error\n * const error2 = ErrorX.toErrorX(new Error('Database failed'))\n *\n * // Convert API response object\n * const apiError = {\n * message: 'User not found',\n * code: 'USER_404',\n * statusText: 'Not Found'\n * }\n * const error3 = ErrorX.toErrorX(apiError)\n * ```\n */\n public static toErrorX(error: unknown): ErrorX {\n if (error instanceof ErrorX) return error\n\n let name = ''\n let message = ''\n let code = ''\n let uiMessage = ''\n let cause: unknown\n let metadata: ErrorMetadata = {}\n let actions: ErrorAction[] | undefined\n\n if (error) {\n if (typeof error === 'string') {\n message = error\n metadata = { originalError: error }\n } else if (error instanceof Error) {\n name = error.name\n message = error.message\n cause = error.cause\n } else if (typeof error === 'object') {\n // Extract name from various properties\n if ('name' in error && error.name) name = String(error.name)\n else if ('title' in error && error.title) name = String(error.title)\n\n // Extract message from various properties\n if ('message' in error && error.message) message = String(error.message)\n else if ('details' in error && error.details) message = String(error.details)\n else if ('text' in error && error.text) message = String(error.text)\n else if ('info' in error && error.info) message = String(error.info)\n else if ('statusText' in error && error.statusText) message = String(error.statusText)\n else if ('error' in error && error.error) message = String(error.error)\n else if ('errorMessage' in error && error.errorMessage) message = String(error.errorMessage)\n\n // Extract code\n if ('code' in error && error.code) code = String(error.code)\n\n // Extract UI message\n if ('uiMessage' in error && error.uiMessage) uiMessage = String(error.uiMessage)\n else if ('userMessage' in error && error.userMessage) uiMessage = String(error.userMessage)\n\n // Extract actions\n if ('actions' in error && Array.isArray(error.actions)) {\n actions = error.actions as ErrorAction[]\n }\n\n // Store original object as metadata if it has additional properties\n metadata = { originalError: error }\n }\n }\n\n const options: ErrorXOptions = {\n message: message || 'Unknown error occurred',\n }\n\n if (name) options.name = name\n if (code) options.code = code\n if (uiMessage) options.uiMessage = uiMessage\n if (cause) options.cause = cause\n if (Object.keys(metadata).length > 0) options.metadata = metadata\n if (actions && actions.length > 0) options.actions = actions\n\n return new ErrorX(options)\n }\n\n /**\n * Public wrapper for processing error stack traces with delimiter.\n * Delegates to the private processErrorStack method for implementation.\n *\n * @param error - Error whose stack to process\n * @param delimiter - String to search for in stack lines\n * @returns Processed stack trace starting after the delimiter\n *\n * @example\n * ```typescript\n * const error = new Error('Something failed')\n * const cleanStack = ErrorX.processStack(error, 'my-app-entry')\n * // Returns stack trace starting after the line containing 'my-app-entry'\n * ```\n */\n public static processStack(error: Error, delimiter: string): string {\n return ErrorX.processErrorStack(error, delimiter)\n }\n\n /**\n * Creates a new ErrorX instance with cleaned stack trace using the specified delimiter.\n * Returns the same instance if no delimiter is provided or no stack is available.\n *\n * @param delimiter - Optional string to search for in stack lines\n * @returns New ErrorX instance with cleaned stack trace, or the same instance if no cleaning needed\n *\n * @example\n * ```typescript\n * const error = new ErrorX({ message: 'Database error' })\n * const cleanedError = error.cleanStackTrace('database-layer')\n * // Returns new ErrorX with stack trace starting after 'database-layer'\n * ```\n */\n public cleanStackTrace(delimiter?: string): ErrorX {\n if (delimiter && this.stack) {\n const options: ErrorXOptions = {\n message: this.message,\n name: this.name,\n code: this.code,\n uiMessage: this.uiMessage,\n cause: this.cause,\n }\n if (this.metadata !== undefined) {\n options.metadata = this.metadata\n }\n if (this.actions) {\n options.actions = this.actions\n }\n const newError = new ErrorX(options)\n newError.stack = ErrorX.processErrorStack(this, delimiter)\n return newError\n }\n return this\n }\n\n /**\n * Converts the ErrorX instance to a detailed string representation.\n * Includes error name, message, code, timestamp, metadata, and stack trace.\n *\n * @returns Formatted string representation of the error\n *\n * @example\n * ```typescript\n * const error = new ErrorX({\n * message: 'Database connection failed',\n * name: 'DatabaseError',\n * code: 'DB_CONN_FAILED',\n * metadata: { host: 'localhost', port: 5432 }\n * })\n *\n * console.log(error.toString())\n * // Output: \"DatabaseError: Database connection failed. [DB_CONN_FAILED] (2024-01-15T10:30:45.123Z) metadata: {...}\"\n * ```\n */\n public toString(): string {\n const parts = []\n\n // Add name and message\n parts.push(`${this.name}: ${this.message}`)\n\n // Add code if different from default\n if (this.code && this.code !== 'ERROR') {\n parts.push(`[${this.code}]`)\n }\n\n // Add timestamp\n parts.push(`(${this.timestamp.toISOString()})`)\n\n // Add metadata if present\n if (this.metadata && Object.keys(this.metadata).length > 0) {\n const metadataStr = safeStringify(this.metadata)\n parts.push(`metadata: ${metadataStr}`)\n }\n\n let result = parts.join(' ')\n\n // Add stack trace if available\n if (this.stack) {\n result += `\\n${this.stack}`\n }\n\n return result\n }\n\n /**\n * Serializes the ErrorX instance to a JSON-compatible object.\n * Recursively serializes the error chain and handles ErrorX or regular Error causes.\n *\n * @returns Serializable object representation of the error\n *\n * @example\n * ```typescript\n * const error = new ErrorX({\n * message: 'API request failed',\n * code: 'API_ERROR',\n * metadata: { endpoint: '/users', status: 500 }\n * })\n *\n * const serialized = error.toJSON()\n * // Can be safely passed to JSON.stringify() or sent over network\n * ```\n */\n public toJSON(): SerializableError {\n // Handle metadata serialization with circular reference protection\n\n // Use safe stringify to parse the metadata and remove circular references\n const safeMetadata: ErrorMetadata | undefined = this.metadata\n ? JSON.parse(safeStringify(this.metadata))\n : undefined\n\n const serialized: SerializableError = {\n name: this.name,\n message: this.message,\n code: this.code,\n uiMessage: this.uiMessage,\n metadata: safeMetadata,\n timestamp: this.timestamp.toISOString(),\n }\n\n // Include actions if present\n if (this.actions && this.actions.length > 0) {\n // Use safe stringify to parse the actions and remove circular references\n const stringified = safeStringify(this.actions)\n serialized.actions = JSON.parse(stringified)\n }\n\n // Include stack if available\n if (this.stack) {\n serialized.stack = this.stack\n }\n\n // Recursively serialize cause if it's an ErrorX\n if (this.cause) {\n if (this.cause instanceof ErrorX) {\n serialized.cause = this.cause.toJSON()\n } else if (this.cause instanceof Error) {\n const causeData: SerializableError = {\n name: this.cause.name,\n message: this.cause.message,\n code: 'ERROR',\n uiMessage: undefined,\n metadata: {},\n timestamp: new Date().toISOString(),\n }\n if (this.cause.stack) {\n causeData.stack = this.cause.stack\n }\n serialized.cause = causeData\n }\n }\n\n return serialized\n }\n\n /**\n * Deserializes a JSON object back into an ErrorX instance.\n * Recursively reconstructs the error chain and restores all properties.\n *\n * @param serialized - Serialized error object to deserialize\n * @returns Reconstructed ErrorX instance with restored properties\n *\n * @example\n * ```typescript\n * const serializedError = {\n * name: 'DatabaseError',\n * message: 'Connection failed.',\n * code: 'DB_CONN_FAILED',\n * uiMessage: 'Database is temporarily unavailable',\n * metadata: { host: 'localhost' },\n * timestamp: '2024-01-15T10:30:45.123Z'\n * }\n *\n * const error = ErrorX.fromJSON(serializedError)\n * // Fully restored ErrorX instance with all properties\n * ```\n */\n public static fromJSON(serialized: SerializableError): ErrorX {\n const options: ErrorXOptions = {\n message: serialized.message,\n name: serialized.name,\n code: serialized.code,\n uiMessage: serialized.uiMessage,\n }\n if (serialized.metadata !== undefined) {\n options.metadata = serialized.metadata\n }\n\n if (serialized.actions && serialized.actions.length > 0) {\n options.actions = serialized.actions\n }\n\n const error = new ErrorX(options)\n\n // Restore stack and timestamp\n if (serialized.stack) {\n error.stack = serialized.stack\n }\n // Use Object.defineProperty to set readonly properties\n Object.defineProperty(error, 'timestamp', {\n value: new Date(serialized.timestamp),\n writable: false,\n })\n\n // Restore cause chain\n if (serialized.cause) {\n Object.defineProperty(error, 'cause', {\n value: ErrorX.fromJSON(serialized.cause),\n writable: false,\n })\n }\n\n return error\n }\n}\n","/**\n * Metadata object containing additional context information for an error.\n * Can store any key-value pairs to provide extra debugging or business context.\n *\n * @example\n * ```typescript\n * const metadata: ErrorMetadata = {\n * userId: 123,\n * operation: 'fetchUser',\n * retryCount: 3\n * }\n * ```\n *\n * @public\n */\nexport type ErrorMetadata = Record<string, any>\n\n/**\n * Predefined display targets for error notifications and UI feedback.\n * These enum values provide consistent, type-safe options for where errors should be displayed.\n *\n * @public\n */\nexport enum HandlingTargets {\n MODAL = 'modal',\n TOAST = 'toast',\n INLINE = 'inline',\n BANNER = 'banner',\n CONSOLE = 'console',\n LOGGER = 'logger',\n NOTIFICATION = 'notification',\n}\n\n/**\n * Display target type that allows both predefined enum values and custom strings.\n * This enables flexibility for custom UI components while providing standard options.\n *\n * @example\n * ```typescript\n * // Using predefined enum values\n * targets: [HandlingTargets.MODAL, HandlingTargets.TOAST]\n *\n * // Using custom strings\n * targets: ['custom-sidebar', 'my-notification-center']\n *\n * // Mixing both\n * targets: [HandlingTargets.MODAL, 'custom-popup', HandlingTargets.CONSOLE]\n * ```\n *\n * @public\n */\nexport type HandlingTarget = HandlingTargets | string\n\n/**\n * Action to display notifications in specified UI targets.\n * Used to notify applications to handle error messages through the indicated display mechanisms.\n *\n * @example\n * ```typescript\n * {\n * action: 'notify',\n * payload: {\n * targets: [HandlingTargets.TOAST, 'custom-sidebar'],\n * title: 'Error occurred',\n * duration: 5000\n * }\n * }\n * ```\n *\n * @public\n */\nexport type NotifyAction = {\n action: 'notify'\n payload: {\n targets: HandlingTarget[]\n [key: string]: any\n }\n}\n\n/**\n * Action to log out the current user when an error occurs.\n * Useful for authentication errors or session expiration.\n *\n * @example\n * ```typescript\n * {\n * action: 'logout',\n * payload: {\n * clearStorage: true,\n * redirectURL: '/login'\n * }\n * }\n * ```\n *\n * @public\n */\nexport type LogoutAction = {\n action: 'logout'\n payload?: {\n [key: string]: any\n }\n}\n\n/**\n * Action to redirect the user to a different URL when an error occurs.\n * Commonly used for navigation after authentication errors or access denied scenarios.\n *\n * @example\n * ```typescript\n * {\n * action: 'redirect',\n * payload: {\n * redirectURL: '/login',\n * delay: 2000,\n * replace: true,\n * }\n * }\n * ```\n *\n * @public\n */\nexport type RedirectAction = {\n action: 'redirect'\n payload: {\n redirectURL: string\n [key: string]: any\n }\n}\n\n/**\n * Custom action type for application-specific actions.\n * This type is essential for proper TypeScript discrimination in the ErrorAction union.\n * Without this, TypeScript cannot properly distinguish between predefined and custom actions.\n *\n * @example\n * ```typescript\n * {\n * action: 'custom',\n * payload: {\n * type: 'analytics',\n * event: 'error_occurred',\n * category: 'authentication',\n * severity: 'high'\n * }\n * }\n *\n * {\n * action: 'custom',\n * payload: {\n * type: 'show-modal',\n * modalId: 'error-modal',\n * title: 'Error',\n * message: 'Something went wrong'\n * }\n * }\n * ```\n *\n * @public\n */\nexport type CustomAction = {\n action: 'custom'\n payload?: Record<string, any>\n}\n\n/**\n * Union type of all possible error actions.\n * Includes predefined actions (NotifyAction, LogoutAction, RedirectAction)\n * and CustomAction for application-specific actions.\n *\n * @public\n */\nexport type ErrorAction = NotifyAction | LogoutAction | RedirectAction | CustomAction\n\n/**\n * Configuration options for creating an ErrorX instance.\n * All properties are optional with sensible defaults.\n *\n * @public\n */\nexport type ErrorXOptions = {\n /** Technical error message (default: 'An error occurred') */\n message?: string\n /** Error type/name (default: 'Error') */\n name?: string\n /** Error identifier code (auto-generated from name if not provided) */\n code?: string | number\n /** User-friendly message for UI display (default: undefined) */\n uiMessage?: string | undefined\n /** Original error that caused this error (preserves error chain) */\n cause?: Error | unknown\n /** Additional context and debugging information (default: undefined) */\n metadata?: ErrorMetadata\n /** Actions to perform when this error occurs (default: undefined) */\n actions?: ErrorAction[]\n}\n\n/**\n * JSON-serializable representation of an ErrorX instance.\n * Used for transmitting errors over network or storing in databases.\n *\n * @example\n * ```typescript\n * const serialized: SerializableError = {\n * name: 'AuthError',\n * message: 'Authentication failed.',\n * code: 'AUTH_FAILED',\n * uiMessage: 'Please check your credentials',\n * stack: 'Error: Authentication failed.\\n at login (auth.ts:42:15)',\n * metadata: { userId: 123, loginAttempt: 3 },\n * timestamp: '2024-01-15T10:30:45.123Z',\n * actions: [\n * { action: 'logout', payload: { clearStorage: true } }\n * ],\n * cause: {\n * name: 'NetworkError',\n * message: 'Request timeout.',\n * code: 'NETWORK_TIMEOUT',\n * // ... other error properties\n * }\n * }\n * ```\n *\n * @public\n */\nexport type SerializableError = {\n /** Error type/name */\n name: string\n /** Technical error message */\n message: string\n /** Error identifier code */\n code: string\n /** User-friendly message for UI display */\n uiMessage: string | undefined\n /** Stack trace (optional) */\n stack?: string\n /** Additional context and debugging information */\n metadata: ErrorMetadata | undefined\n /** ISO timestamp when error was created */\n timestamp: string\n /** Actions to perform when this error occurs */\n actions?: ErrorAction[]\n /** Serialized cause error (for error chaining) */\n cause?: SerializableError\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/error.ts"],"names":["HandlingTargets"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Metadata object containing additional context information for an error.\n * Can store any key-value pairs to provide extra debugging or business context.\n *\n * @example\n * ```typescript\n * const metadata: ErrorMetadata = {\n * userId: 123,\n * operation: 'fetchUser',\n * retryCount: 3\n * }\n * ```\n *\n * @public\n */\nexport type ErrorMetadata = Record<string, any>\n\n/**\n * Predefined display targets for error notifications and UI feedback.\n * These enum values provide consistent, type-safe options for where errors should be displayed.\n *\n * @public\n */\nexport enum HandlingTargets {\n MODAL = 'modal',\n TOAST = 'toast',\n INLINE = 'inline',\n BANNER = 'banner',\n CONSOLE = 'console',\n LOGGER = 'logger',\n NOTIFICATION = 'notification',\n}\n\n/**\n * Display target type that allows both predefined enum values and custom strings.\n * This enables flexibility for custom UI components while providing standard options.\n *\n * @example\n * ```typescript\n * // Using predefined enum values\n * targets: [HandlingTargets.MODAL, HandlingTargets.TOAST]\n *\n * // Using custom strings\n * targets: ['custom-sidebar', 'my-notification-center']\n *\n * // Mixing both\n * targets: [HandlingTargets.MODAL, 'custom-popup', HandlingTargets.CONSOLE]\n * ```\n *\n * @public\n */\nexport type HandlingTarget = HandlingTargets | string\n\n/**\n * Action to display notifications in specified UI targets.\n * Used to notify applications to handle error messages through the indicated display mechanisms.\n *\n * @example\n * ```typescript\n * {\n * action: 'notify',\n * payload: {\n * targets: [HandlingTargets.TOAST, 'custom-sidebar'],\n * title: 'Error occurred',\n * duration: 5000\n * }\n * }\n * ```\n *\n * @public\n */\nexport type NotifyAction = {\n action: 'notify'\n payload: {\n targets: HandlingTarget[]\n [key: string]: any\n }\n}\n\n/**\n * Action to log out the current user when an error occurs.\n * Useful for authentication errors or session expiration.\n *\n * @example\n * ```typescript\n * {\n * action: 'logout',\n * payload: {\n * clearStorage: true,\n * redirectURL: '/login'\n * }\n * }\n * ```\n *\n * @public\n */\nexport type LogoutAction = {\n action: 'logout'\n payload?: {\n [key: string]: any\n }\n}\n\n/**\n * Action to redirect the user to a different URL when an error occurs.\n * Commonly used for navigation after authentication errors or access denied scenarios.\n *\n * @example\n * ```typescript\n * {\n * action: 'redirect',\n * payload: {\n * redirectURL: '/login',\n * delay: 2000,\n * replace: true,\n * }\n * }\n * ```\n *\n * @public\n */\nexport type RedirectAction = {\n action: 'redirect'\n payload: {\n redirectURL: string\n [key: string]: any\n }\n}\n\n/**\n * Custom action type for application-specific actions.\n * This type is essential for proper TypeScript discrimination in the ErrorAction union.\n * Without this, TypeScript cannot properly distinguish between predefined and custom actions.\n *\n * @example\n * ```typescript\n * {\n * action: 'custom',\n * payload: {\n * type: 'analytics',\n * event: 'error_occurred',\n * category: 'authentication',\n * severity: 'high'\n * }\n * }\n *\n * {\n * action: 'custom',\n * payload: {\n * type: 'show-modal',\n * modalId: 'error-modal',\n * title: 'Error',\n * message: 'Something went wrong'\n * }\n * }\n * ```\n *\n * @public\n */\nexport type CustomAction = {\n action: 'custom'\n payload?: Record<string, any>\n}\n\n/**\n * Union type of all possible error actions.\n * Includes predefined actions (NotifyAction, LogoutAction, RedirectAction)\n * and CustomAction for application-specific actions.\n *\n * @public\n */\nexport type ErrorAction = NotifyAction | LogoutAction | RedirectAction | CustomAction\n\n/**\n * Array of valid ErrorXOptions field names.\n * This serves as the single source of truth for both runtime validation and type checking.\n *\n * @internal\n */\nexport const ERROR_X_OPTION_FIELDS = [\n 'message',\n 'name',\n 'code',\n 'uiMessage',\n 'cause',\n 'metadata',\n 'actions',\n] as const\n\n/**\n * Union type of all valid ErrorXOptions field names.\n *\n * @public\n */\nexport type ErrorXOptionField = (typeof ERROR_X_OPTION_FIELDS)[number]\n\n/**\n * Configuration options for creating an ErrorX instance.\n * All properties are optional with sensible defaults.\n *\n * @remarks\n * **Note on design:** ErrorXOptions is a `type` instead of a `class` to provide maximum flexibility.\n * This allows you to pass plain objects without instantiation:\n *\n * ```typescript\n * // ✅ Works - plain object\n * new ErrorX({ message: 'Error', code: 'ERR' })\n *\n * // ✅ Works - object literal\n * const opts = { message: 'Error' }\n * new ErrorX(opts)\n * ```\n *\n * If ErrorXOptions were a class, you would need to instantiate it:\n *\n * ```typescript\n * // ❌ Would be required with class\n * new ErrorX(new ErrorXOptions({ message: 'Error' }))\n * ```\n *\n * The current `type` approach provides better ergonomics while still maintaining type safety.\n * The `isErrorXOptions()` validation method ensures only valid option objects are accepted.\n *\n * @public\n */\nexport type ErrorXOptions = {\n /** Technical error message (default: 'An error occurred') */\n message?: string\n /** Error type/name (default: 'Error') */\n name?: string\n /** Error identifier code (auto-generated from name if not provided) */\n code?: string | number\n /** User-friendly message for UI display (default: undefined) */\n uiMessage?: string | undefined\n /** Original error that caused this error (preserves error chain) */\n cause?: Error | unknown\n /** Additional context and debugging information (default: undefined) */\n metadata?: ErrorMetadata\n /** Actions to perform when this error occurs (default: undefined) */\n actions?: ErrorAction[]\n}\n\n/**\n * JSON-serializable representation of an ErrorX instance.\n * Used for transmitting errors over network or storing in databases.\n *\n * @example\n * ```typescript\n * const serialized: SerializableError = {\n * name: 'AuthError',\n * message: 'Authentication failed.',\n * code: 'AUTH_FAILED',\n * uiMessage: 'Please check your credentials',\n * stack: 'Error: Authentication failed.\\n at login (auth.ts:42:15)',\n * metadata: { userId: 123, loginAttempt: 3 },\n * timestamp: '2024-01-15T10:30:45.123Z',\n * actions: [\n * { action: 'logout', payload: { clearStorage: true } }\n * ],\n * cause: {\n * name: 'NetworkError',\n * message: 'Request timeout.',\n * code: 'NETWORK_TIMEOUT',\n * // ... other error properties\n * }\n * }\n * ```\n *\n * @public\n */\nexport type SerializableError = {\n /** Error type/name */\n name: string\n /** Technical error message */\n message: string\n /** Error identifier code */\n code: string\n /** User-friendly message for UI display */\n uiMessage: string | undefined\n /** Stack trace (optional) */\n stack?: string\n /** Additional context and debugging information */\n metadata: ErrorMetadata | undefined\n /** ISO timestamp when error was created */\n timestamp: string\n /** Actions to perform when this error occurs */\n actions?: ErrorAction[]\n /** Serialized cause error (for error chaining) */\n cause?: SerializableError\n}\n","import safeStringify from 'safe-stringify'\nimport type {\n ErrorAction,\n ErrorMetadata,\n ErrorXOptionField,\n ErrorXOptions,\n SerializableError,\n} from './types.js'\nimport { ERROR_X_OPTION_FIELDS } from './types.js'\n\n// Use the single source of truth for accepted fields\nconst acceptedFields = new Set(ERROR_X_OPTION_FIELDS)\n\n/**\n * Enhanced Error class with rich metadata, type-safe error handling, and intelligent error conversion.\n *\n * @example\n * ```typescript\n * // Basic usage\n * const error = new ErrorX({ message: 'Database connection failed' })\n *\n * // With full options\n * const error = new ErrorX({\n * message: 'User authentication failed',\n * name: 'AuthError',\n * code: 'AUTH_FAILED',\n * uiMessage: 'Please check your credentials',\n * metadata: { userId: 123, loginAttempt: 3 }\n * })\n * ```\n *\n * @public\n */\nexport class ErrorX extends Error {\n /** Error identifier code, auto-generated from name if not provided */\n public readonly code: string\n /** User-friendly message suitable for display in UI */\n public readonly uiMessage: string | undefined\n /** Additional context and metadata associated with the error */\n public readonly metadata: ErrorMetadata | undefined\n /** Timestamp when the error was created */\n public readonly timestamp: Date\n /** Error actions for UI behavior and handling */\n public readonly actions: ErrorAction[] | undefined\n\n /**\n * Creates a new ErrorX instance with enhanced error handling capabilities.\n *\n * @param messageOrOptions - Error message string, ErrorXOptions object, or any value to convert to ErrorX\n * @param additionalOptions - Additional options when first parameter is a string (optional)\n *\n * @example\n * ```typescript\n * // Create with string message only\n * const error1 = new ErrorX('Database query failed')\n *\n * // Create with string message and additional options\n * const error2 = new ErrorX('Database query failed', {\n * name: 'DatabaseError',\n * code: 'DB_QUERY_FAILED',\n * uiMessage: 'Unable to load data. Please try again.',\n * metadata: { query: 'SELECT * FROM users', timeout: 5000 }\n * })\n *\n * // Create with options object (backward compatible)\n * const error3 = new ErrorX({\n * message: 'Database query failed',\n * name: 'DatabaseError',\n * code: 'DB_QUERY_FAILED',\n * actions: [\n * { action: 'notify', payload: { targets: [HandlingTargets.TOAST] } }\n * ]\n * })\n *\n * // Create with unknown input (smart conversion)\n * const apiError = { message: 'User not found', code: 404 }\n * const error4 = new ErrorX(apiError)\n *\n * // Create with no options (uses defaults)\n * const error5 = new ErrorX()\n * ```\n */\n constructor(\n messageOrOptions?: string | ErrorXOptions | unknown,\n additionalOptions?: Partial<ErrorXOptions>\n ) {\n let options: ErrorXOptions = {}\n\n // Handle different input types\n if (typeof messageOrOptions === 'string') {\n // String message provided - merge with additional options\n options = {\n message: messageOrOptions,\n ...additionalOptions,\n }\n } else if (ErrorX.isErrorXOptions(messageOrOptions)) {\n // Valid ErrorXOptions object - use directly\n options = messageOrOptions\n } else if (messageOrOptions != null) {\n // Unknown input - convert using smart conversion\n options = ErrorX.convertUnknownToOptions(messageOrOptions)\n }\n // else: undefined/null - use empty options object\n\n const formattedMessage = ErrorX.formatMessage(options.message)\n super(formattedMessage, { cause: options.cause })\n\n this.name = options.name ?? ErrorX.getDefaultName()\n this.code =\n options.code != null ? String(options.code) : ErrorX.generateDefaultCode(options.name)\n this.uiMessage = options.uiMessage\n this.metadata = options.metadata\n this.actions = options.actions\n this.timestamp = new Date()\n\n // Handle stack trace preservation\n if (options.cause instanceof Error) {\n this.stack = ErrorX.preserveOriginalStack(options.cause, this)\n } else {\n // Node.js specific stack trace capture for clean stack\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n // Clean the stack to remove ErrorX constructor noise\n this.stack = ErrorX.cleanStack(this.stack)\n }\n }\n\n /**\n * Returns the default error name.\n * @returns Default error name 'Error'\n */\n private static getDefaultName(): string {\n return 'Error'\n }\n\n /**\n * Validates if an object is a valid ErrorXOptions object.\n * Checks that the object only contains accepted ErrorXOptions fields.\n *\n * @param value - Value to check\n * @returns True if value is a valid ErrorXOptions object\n */\n public static isErrorXOptions(value: unknown): value is ErrorXOptions {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return false\n }\n\n // If it's an Error instance, it's not ErrorXOptions\n if (value instanceof Error) {\n return false\n }\n\n const obj = value as Record<string, unknown>\n const keys = Object.keys(obj)\n\n // Empty object is valid ErrorXOptions\n if (keys.length === 0) {\n return true\n }\n\n // Check if all keys are in the accepted fields\n // If there's any key that's not accepted, it's not ErrorXOptions\n return keys.every(key => acceptedFields.has(key as ErrorXOptionField))\n }\n\n /**\n * Generates a default error code from the error name.\n * Converts camelCase/PascalCase names to UPPER_SNAKE_CASE format.\n *\n * @param name - Error name to convert\n * @returns Generated error code in UPPER_SNAKE_CASE format\n *\n * @example\n * ```typescript\n * generateDefaultCode('DatabaseError') // 'DATABASE_ERROR'\n * generateDefaultCode('userAuthError') // 'USER_AUTH_ERROR'\n * generateDefaultCode('API Timeout') // 'API_TIMEOUT'\n * ```\n */\n private static generateDefaultCode(name?: string): string {\n if (!name) return 'ERROR'\n\n // Convert camelCase/PascalCase to UPPER_SNAKE_CASE\n return name\n .replace(/([a-z])([A-Z])/g, '$1_$2') // Add underscore between camelCase\n .replace(/\\s+/g, '_') // Replace spaces with underscores\n .replace(/[^a-zA-Z0-9_]/g, '') // Remove special characters\n .toUpperCase()\n }\n\n /**\n * Preserves the original error's stack trace while updating the error message.\n * Combines the new error's message with the original error's stack trace.\n *\n * @param originalError - The original error whose stack to preserve\n * @param newError - The new error whose message to use\n * @returns Combined stack trace with new error message and original stack\n */\n private static preserveOriginalStack(originalError: Error, newError: Error): string {\n if (!originalError.stack) return newError.stack || ''\n\n // Get the new error's first line (error name + message)\n const newErrorFirstLine = `${newError.name}: ${newError.message}`\n\n // Get original stack lines (skip the first line which is the original error message)\n const originalStackLines = originalError.stack.split('\\n')\n const originalStackTrace = originalStackLines.slice(1)\n\n // Combine new error message with original stack trace\n return [newErrorFirstLine, ...originalStackTrace].join('\\n')\n }\n\n /**\n * Cleans the stack trace by removing ErrorX internal method calls.\n * This provides cleaner stack traces that focus on user code.\n *\n * @param stack - Raw stack trace to clean\n * @returns Cleaned stack trace without ErrorX internal calls\n */\n private static cleanStack(stack?: string): string {\n if (!stack) return ''\n\n const stackLines = stack.split('\\n')\n const cleanedLines: string[] = []\n\n for (const line of stackLines) {\n // Skip lines that contain ErrorX constructor or internal methods\n if (\n line.includes('new ErrorX') ||\n line.includes('ErrorX.constructor') ||\n line.includes('ErrorX.toErrorX') ||\n line.includes('error-x/dist/') ||\n line.includes('error-x/src/error.ts')\n ) {\n continue\n }\n cleanedLines.push(line)\n }\n\n return cleanedLines.join('\\n')\n }\n\n /**\n * Processes an error's stack trace to trim it after a specified delimiter.\n * Useful for removing irrelevant stack frames before a specific function.\n *\n * @param error - Error whose stack to process\n * @param delimiter - String to search for in stack lines\n * @returns Processed stack trace starting after the delimiter\n *\n * @example\n * ```typescript\n * const processed = ErrorX.processErrorStack(error, 'my-app-entry')\n * // Returns stack trace starting after the line containing 'my-app-entry'\n * ```\n */\n private static processErrorStack(error: Error, delimiter: string): string {\n let stack = error.stack ?? ''\n const stackLines = stack.split('\\n')\n\n // Find the index of the first line containing the delimiter\n const delimiterIndex = stackLines.findIndex(line => line.includes(delimiter))\n\n // If the delimiter is found, return all lines after it\n if (delimiterIndex !== -1) {\n stack = stackLines.slice(delimiterIndex + 1).join('\\n')\n }\n return stack\n }\n\n /**\n * Formats error messages with proper capitalization and punctuation.\n * Ensures consistent message formatting across all ErrorX instances.\n *\n * @param message - Raw error message to format (optional)\n * @returns Formatted message with proper capitalization and punctuation\n *\n * @example\n * ```typescript\n * formatMessage('database connection failed') // 'Database connection failed.'\n * formatMessage('user not found. please check credentials') // 'User not found. Please check credentials.'\n * formatMessage() // 'An error occurred'\n * ```\n */\n private static formatMessage(message?: string): string {\n if (!message || typeof message !== 'string' || !message.trim()) {\n return 'An error occurred'\n }\n\n // Split by sentences and capitalize each\n let formatted = message\n .split('. ')\n .map(sentence => {\n const trimmed = sentence.trim()\n if (!trimmed) return trimmed\n return trimmed.charAt(0).toUpperCase() + trimmed.slice(1)\n })\n .join('. ')\n\n // Add period at the end if it doesn't have proper punctuation\n const endsWithPunctuation = /[.!?)\\]]$/.test(formatted)\n if (!endsWithPunctuation) {\n formatted = `${formatted}.`\n }\n\n return formatted\n }\n\n /**\n * Creates a new ErrorX instance with additional metadata merged with existing metadata.\n * The original error properties are preserved while extending the metadata.\n *\n * @param additionalMetadata - Additional metadata to merge with existing metadata\n * @returns New ErrorX instance with merged metadata\n *\n * @example\n * ```typescript\n * const error = new ErrorX({\n * message: 'API request failed',\n * metadata: { endpoint: '/users' }\n * })\n *\n * const enrichedError = error.withMetadata({\n * retryCount: 3,\n * userId: 123\n * })\n * // Result: metadata = { endpoint: '/users', retryCount: 3, userId: 123 }\n * ```\n */\n public withMetadata(additionalMetadata: ErrorMetadata): ErrorX {\n const options: ErrorXOptions = {\n message: this.message,\n name: this.name,\n code: this.code,\n uiMessage: this.uiMessage,\n cause: this.cause,\n metadata: { ...(this.metadata ?? {}), ...additionalMetadata },\n }\n if (this.actions) {\n options.actions = this.actions\n }\n const newError = new ErrorX(options)\n\n // Preserve the original stack trace\n if (this.stack) {\n newError.stack = this.stack\n }\n return newError\n }\n\n /**\n * Type guard that checks if a value is an ErrorX instance.\n *\n * @param value - Value to check\n * @returns True if value is an ErrorX instance, false otherwise\n *\n * @example\n * ```typescript\n * try {\n * // some operation\n * } catch (error) {\n * if (ErrorX.isErrorX(error)) {\n * // TypeScript knows error is ErrorX\n * console.log(error.code, error.metadata)\n * }\n * }\n * ```\n */\n public static isErrorX(value: unknown): value is ErrorX {\n return value instanceof ErrorX\n }\n\n /**\n * Converts unknown input into ErrorXOptions with intelligent property extraction.\n * Handles strings, regular Error objects, API response objects, and unknown values.\n * This is a private helper method used by both the constructor and toErrorX.\n *\n * @param error - Value to convert to ErrorXOptions\n * @returns ErrorXOptions object with extracted properties\n * @internal\n */\n private static convertUnknownToOptions(error: unknown): ErrorXOptions {\n let name = ''\n let message = ''\n let code = ''\n let uiMessage = ''\n let cause: unknown\n let metadata: ErrorMetadata = {}\n let actions: ErrorAction[] | undefined\n\n if (error) {\n if (typeof error === 'string') {\n message = error\n metadata = { originalError: error }\n } else if (error instanceof Error) {\n name = error.name\n message = error.message\n cause = error.cause\n } else if (typeof error === 'object') {\n // Extract name from various properties\n if ('name' in error && error.name) name = String(error.name)\n else if ('title' in error && error.title) name = String(error.title)\n\n // Extract message from various properties\n if ('message' in error && error.message) message = String(error.message)\n else if ('details' in error && error.details) message = String(error.details)\n else if ('text' in error && error.text) message = String(error.text)\n else if ('info' in error && error.info) message = String(error.info)\n else if ('statusText' in error && error.statusText) message = String(error.statusText)\n else if ('error' in error && error.error) message = String(error.error)\n else if ('errorMessage' in error && error.errorMessage) message = String(error.errorMessage)\n\n // Extract code\n if ('code' in error && error.code) code = String(error.code)\n\n // Extract UI message\n if ('uiMessage' in error && error.uiMessage) uiMessage = String(error.uiMessage)\n else if ('userMessage' in error && error.userMessage) uiMessage = String(error.userMessage)\n\n // Extract actions\n if ('actions' in error && Array.isArray(error.actions)) {\n actions = error.actions as ErrorAction[]\n }\n\n // Store original object as metadata if it has additional properties\n metadata = { originalError: error }\n }\n }\n\n const options: ErrorXOptions = {\n message: message || 'Unknown error occurred',\n }\n\n if (name) options.name = name\n if (code) options.code = code\n if (uiMessage) options.uiMessage = uiMessage\n if (cause) options.cause = cause\n if (Object.keys(metadata).length > 0) options.metadata = metadata\n if (actions && actions.length > 0) options.actions = actions\n\n return options\n }\n\n /**\n * Converts unknown input into an ErrorX instance with intelligent property extraction.\n * Handles strings, regular Error objects, API response objects, and unknown values.\n *\n * @param error - Value to convert to ErrorX\n * @returns ErrorX instance with extracted properties\n *\n * @example\n * ```typescript\n * // Convert string error\n * const error1 = ErrorX.toErrorX('Something went wrong')\n *\n * // Convert regular Error\n * const error2 = ErrorX.toErrorX(new Error('Database failed'))\n *\n * // Convert API response object\n * const apiError = {\n * message: 'User not found',\n * code: 'USER_404',\n * statusText: 'Not Found'\n * }\n * const error3 = ErrorX.toErrorX(apiError)\n * ```\n */\n public static toErrorX(error: unknown): ErrorX {\n if (error instanceof ErrorX) return error\n\n const options = ErrorX.convertUnknownToOptions(error)\n return new ErrorX(options)\n }\n\n /**\n * Public wrapper for processing error stack traces with delimiter.\n * Delegates to the private processErrorStack method for implementation.\n *\n * @param error - Error whose stack to process\n * @param delimiter - String to search for in stack lines\n * @returns Processed stack trace starting after the delimiter\n *\n * @example\n * ```typescript\n * const error = new Error('Something failed')\n * const cleanStack = ErrorX.processStack(error, 'my-app-entry')\n * // Returns stack trace starting after the line containing 'my-app-entry'\n * ```\n */\n public static processStack(error: Error, delimiter: string): string {\n return ErrorX.processErrorStack(error, delimiter)\n }\n\n /**\n * Creates a new ErrorX instance with cleaned stack trace using the specified delimiter.\n * Returns the same instance if no delimiter is provided or no stack is available.\n *\n * @param delimiter - Optional string to search for in stack lines\n * @returns New ErrorX instance with cleaned stack trace, or the same instance if no cleaning needed\n *\n * @example\n * ```typescript\n * const error = new ErrorX({ message: 'Database error' })\n * const cleanedError = error.cleanStackTrace('database-layer')\n * // Returns new ErrorX with stack trace starting after 'database-layer'\n * ```\n */\n public cleanStackTrace(delimiter?: string): ErrorX {\n if (delimiter && this.stack) {\n const options: ErrorXOptions = {\n message: this.message,\n name: this.name,\n code: this.code,\n uiMessage: this.uiMessage,\n cause: this.cause,\n }\n if (this.metadata !== undefined) {\n options.metadata = this.metadata\n }\n if (this.actions) {\n options.actions = this.actions\n }\n const newError = new ErrorX(options)\n newError.stack = ErrorX.processErrorStack(this, delimiter)\n return newError\n }\n return this\n }\n\n /**\n * Converts the ErrorX instance to a detailed string representation.\n * Includes error name, message, code, timestamp, metadata, and stack trace.\n *\n * @returns Formatted string representation of the error\n *\n * @example\n * ```typescript\n * const error = new ErrorX({\n * message: 'Database connection failed',\n * name: 'DatabaseError',\n * code: 'DB_CONN_FAILED',\n * metadata: { host: 'localhost', port: 5432 }\n * })\n *\n * console.log(error.toString())\n * // Output: \"DatabaseError: Database connection failed. [DB_CONN_FAILED] (2024-01-15T10:30:45.123Z) metadata: {...}\"\n * ```\n */\n public toString(): string {\n const parts = []\n\n // Add name and message\n parts.push(`${this.name}: ${this.message}`)\n\n // Add code if different from default\n if (this.code && this.code !== 'ERROR') {\n parts.push(`[${this.code}]`)\n }\n\n // Add timestamp\n parts.push(`(${this.timestamp.toISOString()})`)\n\n // Add metadata if present\n if (this.metadata && Object.keys(this.metadata).length > 0) {\n const metadataStr = safeStringify(this.metadata)\n parts.push(`metadata: ${metadataStr}`)\n }\n\n let result = parts.join(' ')\n\n // Add stack trace if available\n if (this.stack) {\n result += `\\n${this.stack}`\n }\n\n return result\n }\n\n /**\n * Serializes the ErrorX instance to a JSON-compatible object.\n * Recursively serializes the error chain and handles ErrorX or regular Error causes.\n *\n * @returns Serializable object representation of the error\n *\n * @example\n * ```typescript\n * const error = new ErrorX({\n * message: 'API request failed',\n * code: 'API_ERROR',\n * metadata: { endpoint: '/users', status: 500 }\n * })\n *\n * const serialized = error.toJSON()\n * // Can be safely passed to JSON.stringify() or sent over network\n * ```\n */\n public toJSON(): SerializableError {\n // Handle metadata serialization with circular reference protection\n\n // Use safe stringify to parse the metadata and remove circular references\n const safeMetadata: ErrorMetadata | undefined = this.metadata\n ? JSON.parse(safeStringify(this.metadata))\n : undefined\n\n const serialized: SerializableError = {\n name: this.name,\n message: this.message,\n code: this.code,\n uiMessage: this.uiMessage,\n metadata: safeMetadata,\n timestamp: this.timestamp.toISOString(),\n }\n\n // Include actions if present\n if (this.actions && this.actions.length > 0) {\n // Use safe stringify to parse the actions and remove circular references\n const stringified = safeStringify(this.actions)\n serialized.actions = JSON.parse(stringified)\n }\n\n // Include stack if available\n if (this.stack) {\n serialized.stack = this.stack\n }\n\n // Recursively serialize cause if it's an ErrorX\n if (this.cause) {\n if (this.cause instanceof ErrorX) {\n serialized.cause = this.cause.toJSON()\n } else if (this.cause instanceof Error) {\n const causeData: SerializableError = {\n name: this.cause.name,\n message: this.cause.message,\n code: 'ERROR',\n uiMessage: undefined,\n metadata: {},\n timestamp: new Date().toISOString(),\n }\n if (this.cause.stack) {\n causeData.stack = this.cause.stack\n }\n serialized.cause = causeData\n }\n }\n\n return serialized\n }\n\n /**\n * Deserializes a JSON object back into an ErrorX instance.\n * Recursively reconstructs the error chain and restores all properties.\n *\n * @param serialized - Serialized error object to deserialize\n * @returns Reconstructed ErrorX instance with restored properties\n *\n * @example\n * ```typescript\n * const serializedError = {\n * name: 'DatabaseError',\n * message: 'Connection failed.',\n * code: 'DB_CONN_FAILED',\n * uiMessage: 'Database is temporarily unavailable',\n * metadata: { host: 'localhost' },\n * timestamp: '2024-01-15T10:30:45.123Z'\n * }\n *\n * const error = ErrorX.fromJSON(serializedError)\n * // Fully restored ErrorX instance with all properties\n * ```\n */\n public static fromJSON(serialized: SerializableError): ErrorX {\n const options: ErrorXOptions = {\n message: serialized.message,\n name: serialized.name,\n code: serialized.code,\n uiMessage: serialized.uiMessage,\n }\n if (serialized.metadata !== undefined) {\n options.metadata = serialized.metadata\n }\n\n if (serialized.actions && serialized.actions.length > 0) {\n options.actions = serialized.actions\n }\n\n const error = new ErrorX(options)\n\n // Restore stack and timestamp\n if (serialized.stack) {\n error.stack = serialized.stack\n }\n // Use Object.defineProperty to set readonly properties\n Object.defineProperty(error, 'timestamp', {\n value: new Date(serialized.timestamp),\n writable: false,\n })\n\n // Restore cause chain\n if (serialized.cause) {\n Object.defineProperty(error, 'cause', {\n value: ErrorX.fromJSON(serialized.cause),\n writable: false,\n })\n }\n\n return error\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bombillazo/error-x",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A simple and consistent error handling library for TypeScript applications. Provides type-safe error handling with great DX, solving common pain points like unknown error types, lost stack traces, async error handling, and error serialization. Isomorphic and framework-agnostic.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,14 +28,14 @@
|
|
|
28
28
|
"author": "",
|
|
29
29
|
"license": "MIT",
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@biomejs/biome": "^2.2.
|
|
31
|
+
"@biomejs/biome": "^2.2.4",
|
|
32
32
|
"@commitlint/cli": "^19.8.1",
|
|
33
33
|
"@commitlint/config-conventional": "^19.8.1",
|
|
34
|
-
"@microsoft/api-extractor": "^7.52.
|
|
35
|
-
"@types/node": "^24.
|
|
34
|
+
"@microsoft/api-extractor": "^7.52.13",
|
|
35
|
+
"@types/node": "^24.6.0",
|
|
36
36
|
"@vitest/coverage-v8": "^3.2.4",
|
|
37
37
|
"commitizen": "^4.3.1",
|
|
38
|
-
"cz-customizable": "^7.5.
|
|
38
|
+
"cz-customizable": "^7.5.1",
|
|
39
39
|
"husky": "^9.1.7",
|
|
40
40
|
"tsup": "^8.5.0",
|
|
41
41
|
"typescript": "^5.9.2",
|
|
@@ -66,7 +66,8 @@
|
|
|
66
66
|
"check": "biome check .",
|
|
67
67
|
"typecheck": "tsc --noEmit",
|
|
68
68
|
"api-docs": "api-extractor run --local",
|
|
69
|
-
"api-docs:
|
|
69
|
+
"api-docs:markdown": "npx @microsoft/api-documenter markdown -i temp -o docs/api",
|
|
70
|
+
"api-docs:build": "pnpm build && mkdir -p ./etc && pnpm api-docs && pnpm api-docs:markdown && rm -rf ./etc ./temp",
|
|
70
71
|
"commit": "cz",
|
|
71
72
|
"commit:lint": "commitlint --edit"
|
|
72
73
|
}
|