@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 CHANGED
@@ -1,5 +1,9 @@
1
1
  # error-x
2
2
 
3
+ [![npm downloads](https://img.shields.io/npm/dm/@bombillazo/error-x.svg?style=for-the-badge)](https://www.npmjs.com/package/@bombillazo/error-x)
4
+ [![npm](https://img.shields.io/npm/dt/@bombillazo/error-x.svg?style=for-the-badge)](https://www.npmjs.com/package/@bombillazo/error-x)
5
+ [![npm](https://img.shields.io/npm/l/@bombillazo/error-x?style=for-the-badge)](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 usage
42
- const error = new ErrorX({ message: 'Database connection failed' })
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
- // With full options
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.toErrorX(error)
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 options - Configuration options for the error (optional)
25
- * @param options.message - Technical error message (defaults to 'An error occurred')
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 full options
36
- * const error = new ErrorX({
37
- * message: 'Database query failed',
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 minimal options
55
- * const simpleError = new ErrorX({ message: 'Something failed' })
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 defaultError = new ErrorX()
79
+ * const error5 = new ErrorX()
59
80
  * ```
60
81
  */
61
- constructor(options = {}) {
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 an ErrorX instance with intelligent property extraction.
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 ErrorX
255
- * @returns ErrorX instance with extracted properties
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 toErrorX(error) {
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
@@ -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 options - Configuration options for the error (optional)
272
- * @param options.message - Technical error message (defaults to 'An error occurred')
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 full options
283
- * const error = new ErrorX({
284
- * message: 'Database query failed',
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 minimal options
302
- * const simpleError = new ErrorX({ message: 'Something failed' })
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 defaultError = new ErrorX()
325
+ * const error5 = new ErrorX()
306
326
  * ```
307
327
  */
308
- constructor(options?: ErrorXOptions);
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 options - Configuration options for the error (optional)
272
- * @param options.message - Technical error message (defaults to 'An error occurred')
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 full options
283
- * const error = new ErrorX({
284
- * message: 'Database query failed',
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 minimal options
302
- * const simpleError = new ErrorX({ message: 'Something failed' })
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 defaultError = new ErrorX()
325
+ * const error5 = new ErrorX()
306
326
  * ```
307
327
  */
308
- constructor(options?: ErrorXOptions);
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 options - Configuration options for the error (optional)
19
- * @param options.message - Technical error message (defaults to 'An error occurred')
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 full options
30
- * const error = new ErrorX({
31
- * message: 'Database query failed',
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 minimal options
49
- * const simpleError = new ErrorX({ message: 'Something failed' })
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 defaultError = new ErrorX()
73
+ * const error5 = new ErrorX()
53
74
  * ```
54
75
  */
55
- constructor(options = {}) {
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 an ErrorX instance with intelligent property extraction.
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 ErrorX
249
- * @returns ErrorX instance with extracted properties
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 toErrorX(error) {
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":";;;;;AAuBO,IAAK,eAAA,qBAAAA,gBAAAA,KAAL;AACL,EAAAA,iBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,iBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,iBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,iBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,iBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,iBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,iBAAA,cAAA,CAAA,GAAe,cAAA;AAPL,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AA4JL,IAAM,qBAAA,GAAwB;AAAA,EACnC,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;;;AChLA,IAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,qBAAqB,CAAA;AAsB7C,IAAM,MAAA,GAAN,MAAM,OAAA,SAAe,KAAA,CAAM;AAAA;AAAA,EAEhB,IAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuChB,WAAA,CACE,kBACA,iBAAA,EACA;AACA,IAAA,IAAI,UAAyB,EAAC;AAG9B,IAAA,IAAI,OAAO,qBAAqB,QAAA,EAAU;AAExC,MAAA,OAAA,GAAU;AAAA,QACR,OAAA,EAAS,gBAAA;AAAA,QACT,GAAG;AAAA,OACL;AAAA,IACF,CAAA,MAAA,IAAW,OAAA,CAAO,eAAA,CAAgB,gBAAgB,CAAA,EAAG;AAEnD,MAAA,OAAA,GAAU,gBAAA;AAAA,IACZ,CAAA,MAAA,IAAW,oBAAoB,IAAA,EAAM;AAEnC,MAAA,OAAA,GAAU,OAAA,CAAO,wBAAwB,gBAAgB,CAAA;AAAA,IAC3D;AAGA,IAAA,MAAM,gBAAA,GAAmB,OAAA,CAAO,aAAA,CAAc,OAAA,CAAQ,OAAO,CAAA;AAC7D,IAAA,KAAA,CAAM,gBAAA,EAAkB,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AAEhD,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAO,cAAA,EAAe;AAClD,IAAA,IAAA,CAAK,IAAA,GACH,OAAA,CAAQ,IAAA,IAAQ,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAA,CAAO,mBAAA,CAAoB,OAAA,CAAQ,IAAI,CAAA;AACvF,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAG1B,IAAA,IAAI,OAAA,CAAQ,iBAAiB,KAAA,EAAO;AAClC,MAAA,IAAA,CAAK,KAAA,GAAQ,OAAA,CAAO,qBAAA,CAAsB,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,IAC/D,CAAA,MAAO;AAEL,MAAA,IAAI,OAAO,KAAA,CAAM,iBAAA,KAAsB,UAAA,EAAY;AACjD,QAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,MAChD;AAEA,MAAA,IAAA,CAAK,KAAA,GAAQ,OAAA,CAAO,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,cAAA,GAAyB;AACtC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAc,gBAAgB,KAAA,EAAwC;AACpE,IAAA,IAAI,KAAA,IAAS,QAAQ,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtE,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAG5B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAIA,IAAA,OAAO,KAAK,KAAA,CAAM,CAAA,GAAA,KAAO,cAAA,CAAe,GAAA,CAAI,GAAwB,CAAC,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,OAAe,oBAAoB,IAAA,EAAuB;AACxD,IAAA,IAAI,CAAC,MAAM,OAAO,OAAA;AAGlB,IAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,iBAAA,EAAmB,OAAO,CAAA,CAClC,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,gBAAA,EAAkB,EAAE,EAC5B,WAAA,EAAY;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAe,qBAAA,CAAsB,aAAA,EAAsB,QAAA,EAAyB;AAClF,IAAA,IAAI,CAAC,aAAA,CAAc,KAAA,EAAO,OAAO,SAAS,KAAA,IAAS,EAAA;AAGnD,IAAA,MAAM,oBAAoB,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,EAAA,EAAK,SAAS,OAAO,CAAA,CAAA;AAG/D,IAAA,MAAM,kBAAA,GAAqB,aAAA,CAAc,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AACzD,IAAA,MAAM,kBAAA,GAAqB,kBAAA,CAAmB,KAAA,CAAM,CAAC,CAAA;AAGrD,IAAA,OAAO,CAAC,iBAAA,EAAmB,GAAG,kBAAkB,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAe,WAAW,KAAA,EAAwB;AAChD,IAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AACnC,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAE7B,MAAA,IACE,KAAK,QAAA,CAAS,YAAY,KAC1B,IAAA,CAAK,QAAA,CAAS,oBAAoB,CAAA,IAClC,IAAA,CAAK,SAAS,iBAAiB,CAAA,IAC/B,KAAK,QAAA,CAAS,eAAe,KAC7B,IAAA,CAAK,QAAA,CAAS,sBAAsB,CAAA,EACpC;AACA,QAAA;AAAA,MACF;AACA,MAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,OAAe,iBAAA,CAAkB,KAAA,EAAc,SAAA,EAA2B;AACxE,IAAA,IAAI,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAGnC,IAAA,MAAM,iBAAiB,UAAA,CAAW,SAAA,CAAU,UAAQ,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAG5E,IAAA,IAAI,mBAAmB,EAAA,EAAI;AACzB,MAAA,KAAA,GAAQ,WAAW,KAAA,CAAM,cAAA,GAAiB,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IACxD;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,OAAe,cAAc,OAAA,EAA0B;AACrD,IAAA,IAAI,CAAC,WAAW,OAAO,OAAA,KAAY,YAAY,CAAC,OAAA,CAAQ,MAAK,EAAG;AAC9D,MAAA,OAAO,mBAAA;AAAA,IACT;AAGA,IAAA,IAAI,YAAY,OAAA,CACb,KAAA,CAAM,IAAI,CAAA,CACV,IAAI,CAAA,QAAA,KAAY;AACf,MAAA,MAAM,OAAA,GAAU,SAAS,IAAA,EAAK;AAC9B,MAAA,IAAI,CAAC,SAAS,OAAO,OAAA;AACrB,MAAA,OAAO,OAAA,CAAQ,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,IAC1D,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAGZ,IAAA,MAAM,mBAAA,GAAsB,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA;AACtD,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,SAAA,GAAY,GAAG,SAAS,CAAA,CAAA,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBO,aAAa,kBAAA,EAA2C;AAC7D,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU,EAAE,GAAI,IAAA,CAAK,YAAY,EAAC,EAAI,GAAG,kBAAA;AAAmB,KAC9D;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,OAAA,CAAQ,UAAU,IAAA,CAAK,OAAA;AAAA,IACzB;AACA,IAAA,MAAM,QAAA,GAAW,IAAI,OAAA,CAAO,OAAO,CAAA;AAGnC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,QAAA,CAAS,QAAQ,IAAA,CAAK,KAAA;AAAA,IACxB;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,OAAc,SAAS,KAAA,EAAiC;AACtD,IAAA,OAAO,KAAA,YAAiB,OAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAe,wBAAwB,KAAA,EAA+B;AACpE,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,WAA0B,EAAC;AAC/B,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAA,GAAU,KAAA;AACV,QAAA,QAAA,GAAW,EAAE,eAAe,KAAA,EAAM;AAAA,MACpC,CAAA,MAAA,IAAW,iBAAiB,KAAA,EAAO;AACjC,QAAA,IAAA,GAAO,KAAA,CAAM,IAAA;AACb,QAAA,OAAA,GAAU,KAAA,CAAM,OAAA;AAChB,QAAA,KAAA,GAAQ,KAAA,CAAM,KAAA;AAAA,MAChB,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AAEpC,QAAA,IAAI,UAAU,KAAA,IAAS,KAAA,CAAM,MAAM,IAAA,GAAO,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,aAAA,IAClD,WAAW,KAAA,IAAS,KAAA,CAAM,OAAO,IAAA,GAAO,MAAA,CAAO,MAAM,KAAK,CAAA;AAGnE,QAAA,IAAI,aAAa,KAAA,IAAS,KAAA,CAAM,SAAS,OAAA,GAAU,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,aAAA,IAC9D,aAAa,KAAA,IAAS,KAAA,CAAM,SAAS,OAAA,GAAU,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,aAAA,IACnE,UAAU,KAAA,IAAS,KAAA,CAAM,MAAM,OAAA,GAAU,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,aAAA,IAC1D,UAAU,KAAA,IAAS,KAAA,CAAM,MAAM,OAAA,GAAU,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,aAAA,IAC1D,gBAAgB,KAAA,IAAS,KAAA,CAAM,YAAY,OAAA,GAAU,MAAA,CAAO,MAAM,UAAU,CAAA;AAAA,aAAA,IAC5E,WAAW,KAAA,IAAS,KAAA,CAAM,OAAO,OAAA,GAAU,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,aAAA,IAC7D,kBAAkB,KAAA,IAAS,KAAA,CAAM,cAAc,OAAA,GAAU,MAAA,CAAO,MAAM,YAAY,CAAA;AAG3F,QAAA,IAAI,UAAU,KAAA,IAAS,KAAA,CAAM,MAAM,IAAA,GAAO,MAAA,CAAO,MAAM,IAAI,CAAA;AAG3D,QAAA,IAAI,eAAe,KAAA,IAAS,KAAA,CAAM,WAAW,SAAA,GAAY,MAAA,CAAO,MAAM,SAAS,CAAA;AAAA,aAAA,IACtE,iBAAiB,KAAA,IAAS,KAAA,CAAM,aAAa,SAAA,GAAY,MAAA,CAAO,MAAM,WAAW,CAAA;AAG1F,QAAA,IAAI,aAAa,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACtD,UAAA,OAAA,GAAU,KAAA,CAAM,OAAA;AAAA,QAClB;AAGA,QAAA,QAAA,GAAW,EAAE,eAAe,KAAA,EAAM;AAAA,MACpC;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,SAAS,OAAA,IAAW;AAAA,KACtB;AAEA,IAAA,IAAI,IAAA,UAAc,IAAA,GAAO,IAAA;AACzB,IAAA,IAAI,IAAA,UAAc,IAAA,GAAO,IAAA;AACzB,IAAA,IAAI,SAAA,UAAmB,SAAA,GAAY,SAAA;AACnC,IAAA,IAAI,KAAA,UAAe,KAAA,GAAQ,KAAA;AAC3B,IAAA,IAAI,OAAO,IAAA,CAAK,QAAQ,EAAE,MAAA,GAAS,CAAA,UAAW,QAAA,GAAW,QAAA;AACzD,IAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,UAAW,OAAA,GAAU,OAAA;AAErD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,OAAc,SAAS,KAAA,EAAwB;AAC7C,IAAA,IAAI,KAAA,YAAiB,SAAQ,OAAO,KAAA;AAEpC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAO,uBAAA,CAAwB,KAAK,CAAA;AACpD,IAAA,OAAO,IAAI,QAAO,OAAO,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAc,YAAA,CAAa,KAAA,EAAc,SAAA,EAA2B;AAClE,IAAA,OAAO,OAAA,CAAO,iBAAA,CAAkB,KAAA,EAAO,SAAS,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBO,gBAAgB,SAAA,EAA4B;AACjD,IAAA,IAAI,SAAA,IAAa,KAAK,KAAA,EAAO;AAC3B,MAAA,MAAM,OAAA,GAAyB;AAAA,QAC7B,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,OAAO,IAAA,CAAK;AAAA,OACd;AACA,MAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,QAAA,OAAA,CAAQ,WAAW,IAAA,CAAK,QAAA;AAAA,MAC1B;AACA,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,OAAA,CAAQ,UAAU,IAAA,CAAK,OAAA;AAAA,MACzB;AACA,MAAA,MAAM,QAAA,GAAW,IAAI,OAAA,CAAO,OAAO,CAAA;AACnC,MAAA,QAAA,CAAS,KAAA,GAAQ,OAAA,CAAO,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AACzD,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBO,QAAA,GAAmB;AACxB,IAAA,MAAM,QAAQ,EAAC;AAGf,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAG1C,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7B;AAGA,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,CAAA,CAAA,CAAG,CAAA;AAG9C,IAAA,IAAI,IAAA,CAAK,YAAY,MAAA,CAAO,IAAA,CAAK,KAAK,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1D,MAAA,MAAM,WAAA,GAAc,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAA;AAC/C,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,WAAW,CAAA,CAAE,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAG3B,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAA,IAAU;AAAA,EAAK,KAAK,KAAK,CAAA,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBO,MAAA,GAA4B;AAIjC,IAAA,MAAM,YAAA,GAA0C,KAAK,QAAA,GACjD,IAAA,CAAK,MAAM,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAC,CAAA,GACvC,MAAA;AAEJ,IAAA,MAAM,UAAA,GAAgC;AAAA,MACpC,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,WAAA;AAAY,KACxC;AAGA,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAE3C,MAAA,MAAM,WAAA,GAAc,aAAA,CAAc,IAAA,CAAK,OAAO,CAAA;AAC9C,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAAA,IAC7C;AAGA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAI,IAAA,CAAK,iBAAiB,OAAA,EAAQ;AAChC,QAAA,UAAA,CAAW,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AAAA,MACvC,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,YAAiB,KAAA,EAAO;AACtC,QAAA,MAAM,SAAA,GAA+B;AAAA,UACnC,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA;AAAA,UACjB,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,UACpB,IAAA,EAAM,OAAA;AAAA,UACN,SAAA,EAAW,MAAA;AAAA,UACX,UAAU,EAAC;AAAA,UACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,SACpC;AACA,QAAA,IAAI,IAAA,CAAK,MAAM,KAAA,EAAO;AACpB,UAAA,SAAA,CAAU,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAA;AAAA,QAC/B;AACA,QAAA,UAAA,CAAW,KAAA,GAAQ,SAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,OAAc,SAAS,UAAA,EAAuC;AAC5D,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,WAAW,UAAA,CAAW;AAAA,KACxB;AACA,IAAA,IAAI,UAAA,CAAW,aAAa,MAAA,EAAW;AACrC,MAAA,OAAA,CAAQ,WAAW,UAAA,CAAW,QAAA;AAAA,IAChC;AAEA,IAAA,IAAI,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,EAAG;AACvD,MAAA,OAAA,CAAQ,UAAU,UAAA,CAAW,OAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAO,OAAO,CAAA;AAGhC,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,KAAA,CAAM,QAAQ,UAAA,CAAW,KAAA;AAAA,IAC3B;AAEA,IAAA,MAAA,CAAO,cAAA,CAAe,OAAO,WAAA,EAAa;AAAA,MACxC,KAAA,EAAO,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAAA,MACpC,QAAA,EAAU;AAAA,KACX,CAAA;AAGD,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,MAAA,CAAO,cAAA,CAAe,OAAO,OAAA,EAAS;AAAA,QACpC,KAAA,EAAO,OAAA,CAAO,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAAA,QACvC,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF","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.1.1",
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.0",
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.10",
35
- "@types/node": "^24.3.0",
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.0",
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:build": "pnpm build && mkdir -p ./etc && pnpm api-docs && rm -rf ./etc ./temp",
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
  }