@withwiz/toolkit 0.2.3 → 0.2.4

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.
Files changed (45) hide show
  1. package/dist/auth/core/jwt/index.js +1 -1
  2. package/dist/auth/index.js +1 -1
  3. package/dist/{chunk-H5I5GWAA.js → chunk-6DD3MUDZ.js} +2 -2
  4. package/dist/{chunk-2KAPUVIS.js → chunk-7JWIX5BS.js} +1 -1
  5. package/dist/{chunk-N4YGR5WH.js → chunk-HCF3C3AQ.js} +11 -10
  6. package/dist/{chunk-3DZA6AGS.js → chunk-IJCVFLEY.js} +11 -4
  7. package/dist/{chunk-KXAWBFJN.js → chunk-IYXMGIEP.js} +11 -10
  8. package/dist/{chunk-MLGO3HLS.js → chunk-KXXROUA5.js} +20 -5
  9. package/dist/{chunk-XPASCCUA.js → chunk-M4VXPTKV.js} +2 -2
  10. package/dist/{chunk-TMVS4F7E.js → chunk-QYIUGQ5Q.js} +32 -7
  11. package/dist/{chunk-POKGHK3L.js → chunk-S54PFAEU.js} +2 -2
  12. package/dist/{chunk-Y3OTJH2S.js → chunk-SNVGJPPX.js} +36 -13
  13. package/dist/{chunk-T3LJYAMO.js → chunk-UT4J7NPS.js} +1 -1
  14. package/dist/{chunk-UXQRU3EM.js → chunk-V4KAPU2S.js} +3 -3
  15. package/dist/{chunk-GPBOMJSZ.js → chunk-WDRDGFHO.js} +74 -16
  16. package/dist/{chunk-SLG26KHZ.js → chunk-WTRBW2UY.js} +3 -3
  17. package/dist/{chunk-EEUBKZV4.js → chunk-Y2JYA2AR.js} +2 -2
  18. package/dist/constants/error-codes.d.ts +19 -12
  19. package/dist/constants/error-codes.js +3 -1
  20. package/dist/constants/index.js +3 -1
  21. package/dist/error/app-error.d.ts +1 -0
  22. package/dist/error/app-error.js +2 -2
  23. package/dist/error/error-display.d.ts +1 -1
  24. package/dist/error/error-display.js +7 -3
  25. package/dist/error/error-handler.d.ts +51 -12
  26. package/dist/error/error-handler.js +6 -3
  27. package/dist/error/friendly-messages-v2.js +5 -5
  28. package/dist/error/friendly-messages.d.ts +3 -0
  29. package/dist/error/friendly-messages.js +113 -5
  30. package/dist/error/index.js +22 -20
  31. package/dist/error/messages/en.js +1 -1
  32. package/dist/error/messages/index.js +3 -3
  33. package/dist/error/messages/ko.js +1 -1
  34. package/dist/middleware/auth.js +4 -4
  35. package/dist/middleware/error-handler.js +8 -6
  36. package/dist/middleware/index.js +11 -10
  37. package/dist/middleware/rate-limit.js +3 -3
  38. package/dist/middleware/wrappers.js +11 -10
  39. package/dist/storage/r2-storage.js +7 -3
  40. package/dist/utils/api-helpers.js +2 -2
  41. package/dist/utils/error-processor.js +3 -3
  42. package/dist/utils/index.js +4 -4
  43. package/dist/utils/optimistic-lock.js +2 -2
  44. package/package.json +2 -1
  45. package/dist/chunk-2DVWSDST.js +0 -119
@@ -105,6 +105,18 @@ export declare const ERROR_CODES: {
105
105
  readonly status: 401;
106
106
  readonly message: "Invalid email or password.";
107
107
  };
108
+ readonly LINK_PASSWORD_REQUIRED: {
109
+ readonly code: 40104;
110
+ readonly key: "LINK_PASSWORD_REQUIRED";
111
+ readonly status: 401;
112
+ readonly message: "Link password is required.";
113
+ };
114
+ readonly LINK_PASSWORD_INCORRECT: {
115
+ readonly code: 40105;
116
+ readonly key: "LINK_PASSWORD_INCORRECT";
117
+ readonly status: 401;
118
+ readonly message: "Incorrect link password.";
119
+ };
108
120
  readonly SESSION_EXPIRED: {
109
121
  readonly code: 40107;
110
122
  readonly key: "SESSION_EXPIRED";
@@ -225,18 +237,6 @@ export declare const ERROR_CODES: {
225
237
  readonly status: 422;
226
238
  readonly message: "Link is inactive.";
227
239
  };
228
- readonly LINK_PASSWORD_REQUIRED: {
229
- readonly code: 42206;
230
- readonly key: "LINK_PASSWORD_REQUIRED";
231
- readonly status: 422;
232
- readonly message: "Link password is required.";
233
- };
234
- readonly LINK_PASSWORD_INCORRECT: {
235
- readonly code: 42207;
236
- readonly key: "LINK_PASSWORD_INCORRECT";
237
- readonly status: 422;
238
- readonly message: "Incorrect link password.";
239
- };
240
240
  readonly RESERVED_WORD_USED: {
241
241
  readonly code: 42208;
242
242
  readonly key: "RESERVED_WORD_USED";
@@ -387,3 +387,10 @@ export declare function getLogLevel(status: number): "debug" | "info" | "warn" |
387
387
  export declare function getAllErrorCodes(): IErrorCodeInfo[];
388
388
  export declare function getErrorCodesByCategory(category: "validation" | "auth" | "permission" | "resource" | "conflict" | "business" | "rateLimit" | "server" | "security"): IErrorCodeInfo[];
389
389
  export declare function formatErrorMessage(code: number, customMessage?: string): string;
390
+ /**
391
+ * 알 수 없는 Error 인스턴스에서 에러 메시지/코드 패턴을 분석하여
392
+ * 가장 적합한 에러코드를 반환하는 공통 함수.
393
+ *
394
+ * AppError.from(), processError(), resolveErrorCode() 등에서 공유.
395
+ */
396
+ export declare function classifyError(error: Error): IErrorCodeInfo;
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  ERROR_CODES,
3
3
  HTTP_STATUS,
4
+ classifyError,
4
5
  formatErrorMessage,
5
6
  getAllErrorCodes,
6
7
  getDefaultErrorMessage,
@@ -10,11 +11,12 @@ import {
10
11
  getErrorInfo,
11
12
  getHttpStatus,
12
13
  getLogLevel
13
- } from "../chunk-Y3OTJH2S.js";
14
+ } from "../chunk-SNVGJPPX.js";
14
15
  import "../chunk-ORMEWXMH.js";
15
16
  export {
16
17
  ERROR_CODES,
17
18
  HTTP_STATUS,
19
+ classifyError,
18
20
  formatErrorMessage,
19
21
  getAllErrorCodes,
20
22
  getDefaultErrorMessage,
@@ -34,6 +34,7 @@ import {
34
34
  import {
35
35
  ERROR_CODES,
36
36
  HTTP_STATUS,
37
+ classifyError,
37
38
  formatErrorMessage,
38
39
  getAllErrorCodes,
39
40
  getDefaultErrorMessage,
@@ -43,7 +44,7 @@ import {
43
44
  getErrorInfo,
44
45
  getHttpStatus,
45
46
  getLogLevel
46
- } from "../chunk-Y3OTJH2S.js";
47
+ } from "../chunk-SNVGJPPX.js";
47
48
  import "../chunk-ORMEWXMH.js";
48
49
  export {
49
50
  API_KEY,
@@ -73,6 +74,7 @@ export {
73
74
  TEXT,
74
75
  URL,
75
76
  USER_INPUT,
77
+ classifyError,
76
78
  formatErrorMessage,
77
79
  getAllErrorCodes,
78
80
  getDefaultErrorMessage,
@@ -140,5 +140,6 @@ export declare class AppError extends Error {
140
140
  static blockedUrl(url?: string): AppError;
141
141
  static suspiciousActivity(): AppError;
142
142
  static ipBlocked(ip?: string): AppError;
143
+ static corsViolation(origin?: string): AppError;
143
144
  }
144
145
  export default AppError;
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  AppError,
3
3
  app_error_default
4
- } from "../chunk-MLGO3HLS.js";
5
- import "../chunk-Y3OTJH2S.js";
4
+ } from "../chunk-KXXROUA5.js";
5
+ import "../chunk-SNVGJPPX.js";
6
6
  import "../chunk-ORMEWXMH.js";
7
7
  export {
8
8
  AppError,
@@ -2,7 +2,7 @@
2
2
  * 프론트엔드 에러 표시 유틸리티
3
3
  * Toast 알림, 에러 UI 표시 등
4
4
  */
5
- export { getFriendlyMessage, getErrorDisplayInfo, type IErrorDisplay } from './friendly-messages';
5
+ export { getFriendlyMessage, getErrorDisplayInfo, type IErrorDisplay } from './friendly-messages-v2';
6
6
  type TLocale = 'ko' | 'en';
7
7
  /**
8
8
  * API 에러 응답 인터페이스
@@ -5,12 +5,16 @@ import {
5
5
  getErrorIcon,
6
6
  handleApiResponse,
7
7
  showFriendlyError
8
- } from "../chunk-3DZA6AGS.js";
8
+ } from "../chunk-IJCVFLEY.js";
9
9
  import {
10
10
  getErrorDisplayInfo,
11
11
  getFriendlyMessage
12
- } from "../chunk-2DVWSDST.js";
13
- import "../chunk-Y3OTJH2S.js";
12
+ } from "../chunk-S54PFAEU.js";
13
+ import "../chunk-Y2JYA2AR.js";
14
+ import "../chunk-HCF3C3AQ.js";
15
+ import "../chunk-IYXMGIEP.js";
16
+ import "../chunk-KXXROUA5.js";
17
+ import "../chunk-SNVGJPPX.js";
14
18
  import "../chunk-ORMEWXMH.js";
15
19
  export {
16
20
  extractErrorInfo,
@@ -3,6 +3,7 @@
3
3
  * API 라우트 및 미들웨어에서 발생하는 모든 에러를 처리
4
4
  */
5
5
  import { NextRequest, NextResponse } from 'next/server';
6
+ export declare const AUTH_ERROR_CODE_MAP: Record<string, number>;
6
7
  /**
7
8
  * 에러 응답 형식
8
9
  */
@@ -37,12 +38,17 @@ export declare function withErrorHandler<T extends unknown[]>(handler: (request:
37
38
  export declare const ErrorResponse: {
38
39
  validation: (message?: string, details?: unknown) => NextResponse<IErrorResponse>;
39
40
  badRequest: (message?: string) => NextResponse<IErrorResponse>;
41
+ invalidInput: (message?: string) => NextResponse<IErrorResponse>;
42
+ missingField: (fieldName: string) => NextResponse<IErrorResponse>;
40
43
  invalidUrl: () => NextResponse<IErrorResponse>;
41
44
  invalidEmail: () => NextResponse<IErrorResponse>;
45
+ weakPassword: () => NextResponse<IErrorResponse>;
42
46
  invalidAlias: () => NextResponse<IErrorResponse>;
43
47
  unauthorized: (message?: string) => NextResponse<IErrorResponse>;
44
48
  invalidToken: () => NextResponse<IErrorResponse>;
45
49
  tokenExpired: () => NextResponse<IErrorResponse>;
50
+ linkPasswordRequired: () => NextResponse<IErrorResponse>;
51
+ linkPasswordIncorrect: () => NextResponse<IErrorResponse>;
46
52
  invalidCredentials: () => NextResponse<IErrorResponse>;
47
53
  sessionExpired: () => NextResponse<IErrorResponse>;
48
54
  forbidden: (message?: string) => NextResponse<IErrorResponse>;
@@ -52,25 +58,39 @@ export declare const ErrorResponse: {
52
58
  notFound: (message?: string) => NextResponse<IErrorResponse>;
53
59
  userNotFound: () => NextResponse<IErrorResponse>;
54
60
  linkNotFound: () => NextResponse<IErrorResponse>;
61
+ tagNotFound: () => NextResponse<IErrorResponse>;
62
+ favoriteNotFound: () => NextResponse<IErrorResponse>;
63
+ groupNotFound: () => NextResponse<IErrorResponse>;
55
64
  conflict: (message?: string) => NextResponse<IErrorResponse>;
56
65
  duplicate: (resource?: string) => NextResponse<IErrorResponse>;
57
66
  emailExists: () => NextResponse<IErrorResponse>;
58
67
  aliasExists: () => NextResponse<IErrorResponse>;
59
68
  businessRule: (message?: string) => NextResponse<IErrorResponse>;
69
+ invalidOperation: (message?: string) => NextResponse<IErrorResponse>;
60
70
  linkExpired: () => NextResponse<IErrorResponse>;
61
71
  linkInactive: () => NextResponse<IErrorResponse>;
62
- linkPasswordRequired: () => NextResponse<IErrorResponse>;
63
- linkPasswordIncorrect: () => NextResponse<IErrorResponse>;
64
72
  reservedWord: () => NextResponse<IErrorResponse>;
65
73
  quotaExceeded: () => NextResponse<IErrorResponse>;
74
+ alreadyFavorited: () => NextResponse<IErrorResponse>;
75
+ fileTooLarge: (maxSize?: string) => NextResponse<IErrorResponse>;
76
+ unsupportedFileType: (fileType?: string) => NextResponse<IErrorResponse>;
66
77
  rateLimit: () => NextResponse<IErrorResponse>;
67
78
  dailyLimit: () => NextResponse<IErrorResponse>;
79
+ apiQuotaExceeded: () => NextResponse<IErrorResponse>;
68
80
  serverError: (message?: string) => NextResponse<IErrorResponse>;
69
- databaseError: () => NextResponse<IErrorResponse>;
70
- serviceUnavailable: () => NextResponse<IErrorResponse>;
81
+ internalError: (message?: string) => NextResponse<IErrorResponse>;
82
+ databaseError: (message?: string) => NextResponse<IErrorResponse>;
83
+ emailSendFailed: () => NextResponse<IErrorResponse>;
84
+ cacheError: () => NextResponse<IErrorResponse>;
85
+ fileUploadFailed: () => NextResponse<IErrorResponse>;
86
+ serviceUnavailable: (message?: string) => NextResponse<IErrorResponse>;
71
87
  externalServiceError: (service?: string) => NextResponse<IErrorResponse>;
72
- accessBlocked: () => NextResponse<IErrorResponse>;
73
- ipBlocked: () => NextResponse<IErrorResponse>;
88
+ accessBlocked: (reason?: string) => NextResponse<IErrorResponse>;
89
+ securityValidationFailed: () => NextResponse<IErrorResponse>;
90
+ blockedUrl: (url?: string) => NextResponse<IErrorResponse>;
91
+ suspiciousActivity: () => NextResponse<IErrorResponse>;
92
+ ipBlocked: (ip?: string) => NextResponse<IErrorResponse>;
93
+ corsViolation: (origin?: string) => NextResponse<IErrorResponse>;
74
94
  };
75
95
  declare const _default: {
76
96
  errorToResponse: typeof errorToResponse;
@@ -79,12 +99,17 @@ declare const _default: {
79
99
  ErrorResponse: {
80
100
  validation: (message?: string, details?: unknown) => NextResponse<IErrorResponse>;
81
101
  badRequest: (message?: string) => NextResponse<IErrorResponse>;
102
+ invalidInput: (message?: string) => NextResponse<IErrorResponse>;
103
+ missingField: (fieldName: string) => NextResponse<IErrorResponse>;
82
104
  invalidUrl: () => NextResponse<IErrorResponse>;
83
105
  invalidEmail: () => NextResponse<IErrorResponse>;
106
+ weakPassword: () => NextResponse<IErrorResponse>;
84
107
  invalidAlias: () => NextResponse<IErrorResponse>;
85
108
  unauthorized: (message?: string) => NextResponse<IErrorResponse>;
86
109
  invalidToken: () => NextResponse<IErrorResponse>;
87
110
  tokenExpired: () => NextResponse<IErrorResponse>;
111
+ linkPasswordRequired: () => NextResponse<IErrorResponse>;
112
+ linkPasswordIncorrect: () => NextResponse<IErrorResponse>;
88
113
  invalidCredentials: () => NextResponse<IErrorResponse>;
89
114
  sessionExpired: () => NextResponse<IErrorResponse>;
90
115
  forbidden: (message?: string) => NextResponse<IErrorResponse>;
@@ -94,25 +119,39 @@ declare const _default: {
94
119
  notFound: (message?: string) => NextResponse<IErrorResponse>;
95
120
  userNotFound: () => NextResponse<IErrorResponse>;
96
121
  linkNotFound: () => NextResponse<IErrorResponse>;
122
+ tagNotFound: () => NextResponse<IErrorResponse>;
123
+ favoriteNotFound: () => NextResponse<IErrorResponse>;
124
+ groupNotFound: () => NextResponse<IErrorResponse>;
97
125
  conflict: (message?: string) => NextResponse<IErrorResponse>;
98
126
  duplicate: (resource?: string) => NextResponse<IErrorResponse>;
99
127
  emailExists: () => NextResponse<IErrorResponse>;
100
128
  aliasExists: () => NextResponse<IErrorResponse>;
101
129
  businessRule: (message?: string) => NextResponse<IErrorResponse>;
130
+ invalidOperation: (message?: string) => NextResponse<IErrorResponse>;
102
131
  linkExpired: () => NextResponse<IErrorResponse>;
103
132
  linkInactive: () => NextResponse<IErrorResponse>;
104
- linkPasswordRequired: () => NextResponse<IErrorResponse>;
105
- linkPasswordIncorrect: () => NextResponse<IErrorResponse>;
106
133
  reservedWord: () => NextResponse<IErrorResponse>;
107
134
  quotaExceeded: () => NextResponse<IErrorResponse>;
135
+ alreadyFavorited: () => NextResponse<IErrorResponse>;
136
+ fileTooLarge: (maxSize?: string) => NextResponse<IErrorResponse>;
137
+ unsupportedFileType: (fileType?: string) => NextResponse<IErrorResponse>;
108
138
  rateLimit: () => NextResponse<IErrorResponse>;
109
139
  dailyLimit: () => NextResponse<IErrorResponse>;
140
+ apiQuotaExceeded: () => NextResponse<IErrorResponse>;
110
141
  serverError: (message?: string) => NextResponse<IErrorResponse>;
111
- databaseError: () => NextResponse<IErrorResponse>;
112
- serviceUnavailable: () => NextResponse<IErrorResponse>;
142
+ internalError: (message?: string) => NextResponse<IErrorResponse>;
143
+ databaseError: (message?: string) => NextResponse<IErrorResponse>;
144
+ emailSendFailed: () => NextResponse<IErrorResponse>;
145
+ cacheError: () => NextResponse<IErrorResponse>;
146
+ fileUploadFailed: () => NextResponse<IErrorResponse>;
147
+ serviceUnavailable: (message?: string) => NextResponse<IErrorResponse>;
113
148
  externalServiceError: (service?: string) => NextResponse<IErrorResponse>;
114
- accessBlocked: () => NextResponse<IErrorResponse>;
115
- ipBlocked: () => NextResponse<IErrorResponse>;
149
+ accessBlocked: (reason?: string) => NextResponse<IErrorResponse>;
150
+ securityValidationFailed: () => NextResponse<IErrorResponse>;
151
+ blockedUrl: (url?: string) => NextResponse<IErrorResponse>;
152
+ suspiciousActivity: () => NextResponse<IErrorResponse>;
153
+ ipBlocked: (ip?: string) => NextResponse<IErrorResponse>;
154
+ corsViolation: (origin?: string) => NextResponse<IErrorResponse>;
116
155
  };
117
156
  };
118
157
  export default _default;
@@ -1,15 +1,18 @@
1
1
  import {
2
+ AUTH_ERROR_CODE_MAP,
2
3
  ErrorResponse,
3
4
  errorToResponse,
4
5
  error_handler_default,
5
6
  processError,
6
7
  withErrorHandler
7
- } from "../chunk-GPBOMJSZ.js";
8
- import "../chunk-MLGO3HLS.js";
9
- import "../chunk-Y3OTJH2S.js";
8
+ } from "../chunk-WDRDGFHO.js";
9
+ import "../chunk-KXXROUA5.js";
10
+ import "../chunk-SNVGJPPX.js";
11
+ import "../chunk-AIH3F7JV.js";
10
12
  import "../chunk-EZR55KV2.js";
11
13
  import "../chunk-ORMEWXMH.js";
12
14
  export {
15
+ AUTH_ERROR_CODE_MAP,
13
16
  ErrorResponse,
14
17
  error_handler_default as default,
15
18
  errorToResponse,
@@ -2,11 +2,11 @@ import {
2
2
  formatFriendlyError,
3
3
  getErrorDisplayInfo,
4
4
  getFriendlyMessage
5
- } from "../chunk-POKGHK3L.js";
6
- import "../chunk-EEUBKZV4.js";
7
- import "../chunk-N4YGR5WH.js";
8
- import "../chunk-KXAWBFJN.js";
9
- import "../chunk-Y3OTJH2S.js";
5
+ } from "../chunk-S54PFAEU.js";
6
+ import "../chunk-Y2JYA2AR.js";
7
+ import "../chunk-HCF3C3AQ.js";
8
+ import "../chunk-IYXMGIEP.js";
9
+ import "../chunk-SNVGJPPX.js";
10
10
  import "../chunk-ORMEWXMH.js";
11
11
  export {
12
12
  formatFriendlyError,
@@ -1,4 +1,7 @@
1
1
  /**
2
+ * @deprecated friendly-messages-v2.ts를 사용하세요.
3
+ * 이 파일은 하위 호환용으로만 유지됩니다. 신규 코드에서 import하지 마세요.
4
+ *
2
5
  * 사용자 친화적 에러 메시지 정의
3
6
  * 5자리 HTTP 확장 에러 코드별 프렌들리 메시지
4
7
  */
@@ -1,10 +1,118 @@
1
1
  import {
2
- formatFriendlyError,
3
- getErrorDisplayInfo,
4
- getFriendlyMessage
5
- } from "../chunk-2DVWSDST.js";
6
- import "../chunk-Y3OTJH2S.js";
2
+ getErrorCategory
3
+ } from "../chunk-SNVGJPPX.js";
7
4
  import "../chunk-ORMEWXMH.js";
5
+
6
+ // src/error/friendly-messages.ts
7
+ var koMessages = {
8
+ // 검증 (400xx)
9
+ 40001: { title: "\uC785\uB825 \uC815\uBCF4\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694", description: "\uC785\uB825\uD558\uC2E0 \uC815\uBCF4 \uC911 \uC77C\uBD80\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", action: "\uC785\uB825 \uB0B4\uC6A9\uC744 \uB2E4\uC2DC \uD655\uC778\uD574 \uC8FC\uC138\uC694." },
10
+ 40002: { title: "\uC694\uCCAD\uC744 \uCC98\uB9AC\uD560 \uC218 \uC5C6\uC5B4\uC694", description: "\uC694\uCCAD \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", action: "\uD398\uC774\uC9C0\uB97C \uC0C8\uB85C\uACE0\uCE68\uD574 \uC8FC\uC138\uC694." },
11
+ 40003: { title: "\uC785\uB825\uAC12\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC544\uC694", description: "\uD5C8\uC6A9\uB418\uC9C0 \uC54A\uB294 \uD615\uC2DD\uC785\uB2C8\uB2E4.", action: "\uC62C\uBC14\uB978 \uD615\uC2DD\uC73C\uB85C \uC785\uB825\uD574 \uC8FC\uC138\uC694." },
12
+ 40004: { title: "\uD544\uC218 \uC815\uBCF4\uAC00 \uBE60\uC84C\uC5B4\uC694", description: "\uD544\uC218 \uD56D\uBAA9\uC774 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.", action: "\uBAA8\uB4E0 \uD544\uC218 \uD56D\uBAA9\uC744 \uC785\uB825\uD574 \uC8FC\uC138\uC694." },
13
+ 40005: { title: "URL \uD615\uC2DD\uC744 \uD655\uC778\uD574 \uC8FC\uC138\uC694", description: "https://\uB85C \uC2DC\uC791\uD558\uB294 URL\uC744 \uC785\uB825\uD574 \uC8FC\uC138\uC694.", action: "\uC608: https://example.com" },
14
+ 40006: { title: "\uC774\uBA54\uC77C \uD615\uC2DD\uC744 \uD655\uC778\uD574 \uC8FC\uC138\uC694", description: "\uC62C\uBC14\uB978 \uC774\uBA54\uC77C \uC8FC\uC18C\uAC00 \uC544\uB2D9\uB2C8\uB2E4.", action: "\uC608: user@example.com" },
15
+ 40007: { title: "\uB354 \uC548\uC804\uD55C \uBE44\uBC00\uBC88\uD638\uAC00 \uD544\uC694\uD574\uC694", description: "8\uC790 \uC774\uC0C1, \uC601\uBB38/\uC22B\uC790/\uD2B9\uC218\uBB38\uC790 \uD3EC\uD568", action: "\uB354 \uBCF5\uC7A1\uD55C \uBE44\uBC00\uBC88\uD638\uB97C \uC124\uC815\uD574 \uC8FC\uC138\uC694." },
16
+ 40008: { title: "\uBCC4\uCE6D \uD615\uC2DD\uC744 \uD655\uC778\uD574 \uC8FC\uC138\uC694", description: "\uC601\uBB38, \uC22B\uC790, \uD558\uC774\uD508(-)\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5", action: "\uC608: my-link-123" },
17
+ // 인증 (401xx)
18
+ 40101: { title: "\uB85C\uADF8\uC778\uC774 \uD544\uC694\uD574\uC694", description: "\uC774 \uAE30\uB2A5\uC740 \uB85C\uADF8\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.", action: "\uB85C\uADF8\uC778 \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
19
+ 40102: { title: "\uC778\uC99D \uC815\uBCF4\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC544\uC694", description: "\uB85C\uADF8\uC778 \uC0C1\uD0DC\uAC00 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", action: "\uB2E4\uC2DC \uB85C\uADF8\uC778\uD574 \uC8FC\uC138\uC694." },
20
+ 40103: { title: "\uB85C\uADF8\uC778\uC774 \uB9CC\uB8CC\uB418\uC5C8\uC5B4\uC694", description: "\uBCF4\uC548\uC744 \uC704\uD574 \uC138\uC158\uC774 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", action: "\uB2E4\uC2DC \uB85C\uADF8\uC778\uD574 \uC8FC\uC138\uC694." },
21
+ 40106: { title: "\uB85C\uADF8\uC778\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694", description: "\uC774\uBA54\uC77C \uB610\uB294 \uBE44\uBC00\uBC88\uD638\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", action: "\uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
22
+ 40107: { title: "\uC138\uC158\uC774 \uC885\uB8CC\uB418\uC5C8\uC5B4\uC694", description: "\uC790\uB3D9 \uB85C\uADF8\uC544\uC6C3\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", action: "\uB2E4\uC2DC \uB85C\uADF8\uC778\uD574 \uC8FC\uC138\uC694." },
23
+ // 권한 (403xx)
24
+ 40304: { title: "\uC811\uADFC \uAD8C\uD55C\uC774 \uC5C6\uC5B4\uC694", description: "\uC774 \uAE30\uB2A5\uC5D0 \uB300\uD55C \uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.", action: "\uAD00\uB9AC\uC790\uC5D0\uAC8C \uBB38\uC758\uD574 \uC8FC\uC138\uC694." },
25
+ 40305: { title: "\uC774\uBA54\uC77C \uC778\uC99D\uC774 \uD544\uC694\uD574\uC694", description: "\uC774\uBA54\uC77C \uC778\uC99D\uC744 \uBA3C\uC800 \uC644\uB8CC\uD574 \uC8FC\uC138\uC694.", action: "\uBA54\uC77C\uD568\uC744 \uD655\uC778\uD574 \uC8FC\uC138\uC694." },
26
+ 40308: { title: "\uACC4\uC815\uC774 \uBE44\uD65C\uC131\uD654\uB418\uC5C8\uC5B4\uC694", description: "\uC11C\uBE44\uC2A4\uB97C \uC774\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.", action: "\uACE0\uAC1D\uC13C\uD130\uB85C \uBB38\uC758\uD574 \uC8FC\uC138\uC694." },
27
+ 40309: { title: "\uACC4\uC815\uC774 \uC7A0\uAE08\uB418\uC5C8\uC5B4\uC694", description: "\uB85C\uADF8\uC778 \uC2E4\uD328\uB85C \uACC4\uC815\uC774 \uC7A0\uACBC\uC2B5\uB2C8\uB2E4.", action: "\uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
28
+ // 리소스 (404xx)
29
+ 40401: { title: "\uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694", description: "\uC694\uCCAD\uD558\uC2E0 \uD56D\uBAA9\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", action: "\uC8FC\uC18C\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694." },
30
+ 40402: { title: "\uC0AC\uC6A9\uC790\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694", description: "\uD574\uB2F9 \uC0AC\uC6A9\uC790\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4." },
31
+ 40403: { title: "\uB9C1\uD06C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694", description: "\uB2E8\uCD95 \uB9C1\uD06C\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", action: "\uB9C1\uD06C \uC8FC\uC18C\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694." },
32
+ 40408: { title: "\uD0DC\uADF8\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694", description: "\uD0DC\uADF8\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4." },
33
+ 40409: { title: "\uC990\uACA8\uCC3E\uAE30\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694", description: "\uD56D\uBAA9\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4." },
34
+ 40410: { title: "\uADF8\uB8F9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694", description: "\uADF8\uB8F9\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4." },
35
+ // 충돌 (409xx)
36
+ 40904: { title: "\uCDA9\uB3CC\uC774 \uBC1C\uC0DD\uD588\uC5B4\uC694", description: "\uAE30\uC874 \uB370\uC774\uD130\uC640 \uCDA9\uB3CC\uD569\uB2C8\uB2E4.", action: "\uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
37
+ 40905: { title: "\uC774\uBBF8 \uC874\uC7AC\uD574\uC694", description: "\uB3D9\uC77C\uD55C \uD56D\uBAA9\uC774 \uC788\uC2B5\uB2C8\uB2E4.", action: "\uB2E4\uB978 \uAC12\uC744 \uC0AC\uC6A9\uD574 \uC8FC\uC138\uC694." },
38
+ 40906: { title: "\uC774\uBBF8 \uB4F1\uB85D\uB41C \uC774\uBA54\uC77C\uC774\uC5D0\uC694", description: "\uB2E4\uB978 \uACC4\uC815\uC5D0\uC11C \uC0AC\uC6A9 \uC911\uC785\uB2C8\uB2E4.", action: "\uB2E4\uB978 \uC774\uBA54\uC77C\uC744 \uC0AC\uC6A9\uD574 \uC8FC\uC138\uC694." },
39
+ 40907: { title: "\uC774\uBBF8 \uC0AC\uC6A9 \uC911\uC778 \uBCC4\uCE6D\uC774\uC5D0\uC694", description: "\uB2E4\uB978 \uB9C1\uD06C\uC5D0\uC11C \uC0AC\uC6A9 \uC911\uC785\uB2C8\uB2E4.", action: "\uB2E4\uB978 \uBCC4\uCE6D\uC744 \uC785\uB825\uD574 \uC8FC\uC138\uC694." },
40
+ // 비즈니스 (422xx)
41
+ 42201: { title: "\uCC98\uB9AC\uD560 \uC218 \uC5C6\uC5B4\uC694", description: "\uD604\uC7AC \uC0C1\uD0DC\uC5D0\uC11C \uCC98\uB9AC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.", action: "\uC870\uAC74\uC744 \uD655\uC778\uD574 \uC8FC\uC138\uC694." },
42
+ 42202: { title: "\uC9C0\uAE08\uC740 \uD560 \uC218 \uC5C6\uB294 \uC791\uC5C5\uC774\uC5D0\uC694", description: "\uD604\uC7AC \uC0C1\uD0DC\uC5D0\uC11C \uBD88\uAC00\uB2A5\uD569\uB2C8\uB2E4." },
43
+ 42203: { title: "\uC0AC\uC6A9\uB7C9\uC744 \uCD08\uACFC\uD588\uC5B4\uC694", description: "\uD55C\uB3C4\uB97C \uCD08\uACFC\uD588\uC2B5\uB2C8\uB2E4.", action: "\uD50C\uB79C \uC5C5\uADF8\uB808\uC774\uB4DC\uB97C \uACE0\uB824\uD574 \uC8FC\uC138\uC694." },
44
+ 42204: { title: "\uB9CC\uB8CC\uB41C \uB9C1\uD06C\uC608\uC694", description: "\uC720\uD6A8 \uAE30\uAC04\uC774 \uC9C0\uB0AC\uC2B5\uB2C8\uB2E4.", action: "\uC0C8 \uB9C1\uD06C\uB97C \uC0DD\uC131\uD574 \uC8FC\uC138\uC694." },
45
+ 42205: { title: "\uBE44\uD65C\uC131\uD654\uB41C \uB9C1\uD06C\uC608\uC694", description: "\uC0AC\uC6A9\uC774 \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", action: "\uC18C\uC720\uC790\uC5D0\uAC8C \uBB38\uC758\uD574 \uC8FC\uC138\uC694." },
46
+ // 42206, 42207: 401xx로 이동 (40104, 40105)
47
+ 40104: { title: "\uBE44\uBC00\uBC88\uD638\uAC00 \uD544\uC694\uD574\uC694", description: "\uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD574\uC57C \uD569\uB2C8\uB2E4.", action: "\uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694." },
48
+ 40105: { title: "\uBE44\uBC00\uBC88\uD638\uAC00 \uD2C0\uB838\uC5B4\uC694", description: "\uBE44\uBC00\uBC88\uD638\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", action: "\uB2E4\uC2DC \uD655\uC778\uD574 \uC8FC\uC138\uC694." },
49
+ 42208: { title: "\uC0AC\uC6A9\uD560 \uC218 \uC5C6\uB294 \uBCC4\uCE6D\uC774\uC5D0\uC694", description: "\uC2DC\uC2A4\uD15C \uC608\uC57D\uC5B4\uC785\uB2C8\uB2E4.", action: "\uB2E4\uB978 \uBCC4\uCE6D\uC744 \uC120\uD0DD\uD574 \uC8FC\uC138\uC694." },
50
+ 42209: { title: "\uC774\uBBF8 \uC990\uACA8\uCC3E\uAE30\uC5D0 \uC788\uC5B4\uC694", description: "\uC774\uBBF8 \uCD94\uAC00\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4." },
51
+ 42210: { title: "\uC0AD\uC81C\uD560 \uC218 \uC5C6\uC5B4\uC694", description: "\uBCF8\uC778 \uAD00\uB9AC\uC790 \uACC4\uC815\uC740 \uC0AD\uC81C \uBD88\uAC00\uD569\uB2C8\uB2E4." },
52
+ 42211: { title: "\uD30C\uC77C\uC774 \uB108\uBB34 \uCEE4\uC694", description: "\uCD5C\uB300 \uD06C\uAE30\uB97C \uCD08\uACFC\uD588\uC2B5\uB2C8\uB2E4.", action: "\uC791\uC740 \uD30C\uC77C\uC744 \uC120\uD0DD\uD574 \uC8FC\uC138\uC694." },
53
+ 42212: { title: "\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uD30C\uC77C \uD615\uC2DD\uC774\uC5D0\uC694", description: "\uC5C5\uB85C\uB4DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.", action: "\uC9C0\uC6D0 \uD615\uC2DD\uC744 \uD655\uC778\uD574 \uC8FC\uC138\uC694." },
54
+ // Rate Limit (429xx)
55
+ 42901: { title: "\uC7A0\uC2DC \uC26C\uC5B4\uAC00\uC138\uC694", description: "\uC694\uCCAD\uC774 \uB108\uBB34 \uB9CE\uC2B5\uB2C8\uB2E4.", action: "\uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
56
+ 42902: { title: "\uC624\uB298 \uC0AC\uC6A9\uB7C9\uC744 \uBAA8\uB450 \uC0AC\uC6A9\uD588\uC5B4\uC694", description: "\uC77C\uC77C \uD55C\uB3C4\uC5D0 \uB3C4\uB2EC\uD588\uC2B5\uB2C8\uB2E4.", action: "\uB0B4\uC77C \uB2E4\uC2DC \uC774\uC6A9\uD574 \uC8FC\uC138\uC694." },
57
+ 42903: { title: "API \uD560\uB2F9\uB7C9\uC744 \uCD08\uACFC\uD588\uC5B4\uC694", description: "API \uD55C\uB3C4\uB97C \uCD08\uACFC\uD588\uC2B5\uB2C8\uB2E4.", action: "\uD50C\uB79C \uC5C5\uADF8\uB808\uC774\uB4DC\uB97C \uACE0\uB824\uD574 \uC8FC\uC138\uC694." },
58
+ // 서버 (500xx)
59
+ 50001: { title: "\uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC5B4\uC694", description: "\uC11C\uBC84 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.", action: "\uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
60
+ 50002: { title: "\uC77C\uC2DC\uC801\uC778 \uC624\uB958\uC608\uC694", description: "\uACE7 \uBCF5\uAD6C\uB429\uB2C8\uB2E4.", action: "\uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
61
+ 50003: { title: "\uB370\uC774\uD130 \uCC98\uB9AC \uC624\uB958\uC608\uC694", description: "\uB370\uC774\uD130 \uCC98\uB9AC \uC911 \uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.", action: "\uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
62
+ 50006: { title: "\uC774\uBA54\uC77C\uC744 \uBCF4\uB0B4\uC9C0 \uBABB\uD588\uC5B4\uC694", description: "\uC774\uBA54\uC77C \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.", action: "\uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
63
+ 50007: { title: "\uC77C\uC2DC\uC801\uC778 \uC624\uB958\uC608\uC694", description: "\uCE90\uC2DC \uCC98\uB9AC \uC911 \uBB38\uC81C\uAC00 \uC788\uC2B5\uB2C8\uB2E4.", action: "\uD398\uC774\uC9C0\uB97C \uC0C8\uB85C\uACE0\uCE68\uD574 \uC8FC\uC138\uC694." },
64
+ 50008: { title: "\uD30C\uC77C \uC5C5\uB85C\uB4DC\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694", description: "\uD30C\uC77C \uC800\uC7A5 \uC911 \uBB38\uC81C\uAC00 \uC788\uC2B5\uB2C8\uB2E4.", action: "\uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
65
+ // 서비스 불가 (503xx)
66
+ 50304: { title: "\uC678\uBD80 \uC11C\uBE44\uC2A4 \uC5F0\uACB0 \uC2E4\uD328", description: "\uC678\uBD80 \uC11C\uBE44\uC2A4\uAC00 \uC751\uB2F5\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", action: "\uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
67
+ 50305: { title: "\uC11C\uBE44\uC2A4 \uC810\uAC80 \uC911\uC774\uC5D0\uC694", description: "\uC810\uAC80 \uC911\uC785\uB2C8\uB2E4.", action: "\uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uBC29\uBB38\uD574 \uC8FC\uC138\uC694." },
68
+ // 보안 (403xx - 71~79)
69
+ 40371: { title: "\uC811\uADFC\uC774 \uCC28\uB2E8\uB418\uC5C8\uC5B4\uC694", description: "\uBCF4\uC548 \uC815\uCC45\uC73C\uB85C \uCC28\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", action: "\uC815\uC0C1\uC801\uC778 \uBC29\uBC95\uC73C\uB85C \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
70
+ 40372: { title: "\uBCF4\uC548 \uAC80\uC99D \uC2E4\uD328", description: "\uBCF4\uC548 \uD1A0\uD070\uC774 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", action: "\uD398\uC774\uC9C0\uB97C \uC0C8\uB85C\uACE0\uCE68\uD574 \uC8FC\uC138\uC694." },
71
+ 40373: { title: "\uC0AC\uC6A9\uD560 \uC218 \uC5C6\uB294 URL\uC774\uC5D0\uC694", description: "\uBCF4\uC548\uC0C1 \uCC28\uB2E8\uB41C URL\uC785\uB2C8\uB2E4.", action: "\uB2E4\uB978 URL\uC744 \uC0AC\uC6A9\uD574 \uC8FC\uC138\uC694." },
72
+ 40374: { title: "\uBE44\uC815\uC0C1 \uD65C\uB3D9 \uAC10\uC9C0", description: "\uC77C\uC2DC\uC801\uC73C\uB85C \uC81C\uD55C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", action: "\uACE0\uAC1D\uC13C\uD130\uB85C \uBB38\uC758\uD574 \uC8FC\uC138\uC694." },
73
+ 40375: { title: "IP\uAC00 \uCC28\uB2E8\uB418\uC5C8\uC5B4\uC694", description: "\uBCF4\uC548 \uC815\uCC45\uC5D0 \uC758\uD574 \uCC28\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", action: "\uACE0\uAC1D\uC13C\uD130\uB85C \uBB38\uC758\uD574 \uC8FC\uC138\uC694." },
74
+ 40376: { title: "CORS \uC815\uCC45 \uC704\uBC18\uC774\uC5D0\uC694", description: "\uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC740 \uCD9C\uCC98\uC5D0\uC11C\uC758 \uC694\uCCAD\uC785\uB2C8\uB2E4.", action: "\uC62C\uBC14\uB978 \uC8FC\uC18C\uB85C \uC811\uC18D\uD574 \uC8FC\uC138\uC694." }
75
+ };
76
+ var defaultMessages = {
77
+ ko: { title: "\uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC5B4\uC694", description: "\uC608\uC0C1\uCE58 \uBABB\uD55C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.", action: "\uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." },
78
+ en: { title: "Something went wrong", description: "An unexpected error occurred.", action: "Please try again later." }
79
+ };
80
+ var categoryIcons = {
81
+ validation: "\u26A0\uFE0F",
82
+ auth: "\u{1F510}",
83
+ permission: "\u{1F6AB}",
84
+ resource: "\u{1F50D}",
85
+ conflict: "\u26A1",
86
+ business: "\u{1F4CB}",
87
+ rateLimit: "\u23F1\uFE0F",
88
+ server: "\u{1F527}",
89
+ security: "\u{1F6E1}\uFE0F",
90
+ unknown: "\u274C"
91
+ };
92
+ var categorySeverity = {
93
+ validation: "warning",
94
+ auth: "warning",
95
+ permission: "warning",
96
+ resource: "info",
97
+ conflict: "warning",
98
+ business: "warning",
99
+ rateLimit: "warning",
100
+ server: "error",
101
+ security: "critical",
102
+ unknown: "error"
103
+ };
104
+ function getFriendlyMessage(code, locale = "ko") {
105
+ return koMessages[code] || defaultMessages[locale];
106
+ }
107
+ function getErrorDisplayInfo(code, locale = "ko") {
108
+ const message = getFriendlyMessage(code, locale);
109
+ const category = getErrorCategory(code);
110
+ return { code, title: message.title, description: message.description, action: message.action, icon: categoryIcons[category], severity: categorySeverity[category] };
111
+ }
112
+ function formatFriendlyError(code, locale = "ko") {
113
+ const { title, description } = getFriendlyMessage(code, locale);
114
+ return `${title} - ${description} [${code}]`;
115
+ }
8
116
  export {
9
117
  formatFriendlyError,
10
118
  getErrorDisplayInfo,
@@ -2,42 +2,41 @@ import {
2
2
  LocaleDetector
3
3
  } from "../chunk-XHZ5L4FO.js";
4
4
  import {
5
+ AUTH_ERROR_CODE_MAP,
5
6
  ErrorResponse,
6
7
  errorToResponse,
7
8
  processError,
8
9
  withErrorHandler
9
- } from "../chunk-GPBOMJSZ.js";
10
+ } from "../chunk-WDRDGFHO.js";
11
+ import {
12
+ extractErrorInfo,
13
+ formatInlineError,
14
+ getDefaultErrorCode,
15
+ getErrorIcon,
16
+ handleApiResponse,
17
+ showFriendlyError
18
+ } from "../chunk-IJCVFLEY.js";
10
19
  import {
11
20
  formatFriendlyError,
12
- getErrorDisplayInfo as getErrorDisplayInfo2,
21
+ getErrorDisplayInfo,
13
22
  getFriendlyMessage
14
- } from "../chunk-POKGHK3L.js";
23
+ } from "../chunk-S54PFAEU.js";
15
24
  import {
16
25
  getAllMessages,
17
26
  getErrorMessage,
18
27
  hasMessage,
19
28
  isLocaleSupported,
20
29
  supportedLocales
21
- } from "../chunk-EEUBKZV4.js";
22
- import "../chunk-N4YGR5WH.js";
23
- import "../chunk-KXAWBFJN.js";
30
+ } from "../chunk-Y2JYA2AR.js";
31
+ import "../chunk-HCF3C3AQ.js";
32
+ import "../chunk-IYXMGIEP.js";
24
33
  import {
25
34
  AppError
26
- } from "../chunk-MLGO3HLS.js";
27
- import {
28
- extractErrorInfo,
29
- formatInlineError,
30
- getDefaultErrorCode,
31
- getErrorIcon,
32
- handleApiResponse,
33
- showFriendlyError
34
- } from "../chunk-3DZA6AGS.js";
35
- import {
36
- getErrorDisplayInfo
37
- } from "../chunk-2DVWSDST.js";
35
+ } from "../chunk-KXXROUA5.js";
38
36
  import {
39
37
  ERROR_CODES,
40
38
  HTTP_STATUS,
39
+ classifyError,
41
40
  formatErrorMessage,
42
41
  getAllErrorCodes,
43
42
  getDefaultErrorMessage,
@@ -47,7 +46,8 @@ import {
47
46
  getErrorInfo,
48
47
  getHttpStatus,
49
48
  getLogLevel
50
- } from "../chunk-Y3OTJH2S.js";
49
+ } from "../chunk-SNVGJPPX.js";
50
+ import "../chunk-AIH3F7JV.js";
51
51
  import "../chunk-EZR55KV2.js";
52
52
  import "../chunk-ORMEWXMH.js";
53
53
 
@@ -184,6 +184,7 @@ function InlineError({
184
184
  ] });
185
185
  }
186
186
  export {
187
+ AUTH_ERROR_CODE_MAP,
187
188
  AppError,
188
189
  ERROR_CODES,
189
190
  ErrorBoundary,
@@ -192,6 +193,7 @@ export {
192
193
  HTTP_STATUS,
193
194
  InlineError,
194
195
  LocaleDetector,
196
+ classifyError,
195
197
  errorToResponse,
196
198
  extractErrorInfo,
197
199
  formatErrorMessage,
@@ -204,7 +206,7 @@ export {
204
206
  getErrorByCode,
205
207
  getErrorCategory,
206
208
  getErrorCodesByCategory,
207
- getErrorDisplayInfo2 as getErrorDisplayInfo,
209
+ getErrorDisplayInfo,
208
210
  getErrorIcon,
209
211
  getErrorInfo,
210
212
  getErrorMessage,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  enMessages
3
- } from "../../chunk-N4YGR5WH.js";
3
+ } from "../../chunk-HCF3C3AQ.js";
4
4
  import "../../chunk-ORMEWXMH.js";
5
5
  export {
6
6
  enMessages
@@ -4,9 +4,9 @@ import {
4
4
  hasMessage,
5
5
  isLocaleSupported,
6
6
  supportedLocales
7
- } from "../../chunk-EEUBKZV4.js";
8
- import "../../chunk-N4YGR5WH.js";
9
- import "../../chunk-KXAWBFJN.js";
7
+ } from "../../chunk-Y2JYA2AR.js";
8
+ import "../../chunk-HCF3C3AQ.js";
9
+ import "../../chunk-IYXMGIEP.js";
10
10
  import "../../chunk-ORMEWXMH.js";
11
11
  export {
12
12
  getAllMessages,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  koMessages
3
- } from "../../chunk-KXAWBFJN.js";
3
+ } from "../../chunk-IYXMGIEP.js";
4
4
  import "../../chunk-ORMEWXMH.js";
5
5
  export {
6
6
  koMessages
@@ -4,10 +4,10 @@ import {
4
4
  initializeAuthMiddleware,
5
5
  optionalAuthMiddleware,
6
6
  setAccessTokenBlacklistChecker
7
- } from "../chunk-UXQRU3EM.js";
8
- import "../chunk-MLGO3HLS.js";
9
- import "../chunk-Y3OTJH2S.js";
10
- import "../chunk-T3LJYAMO.js";
7
+ } from "../chunk-V4KAPU2S.js";
8
+ import "../chunk-KXXROUA5.js";
9
+ import "../chunk-SNVGJPPX.js";
10
+ import "../chunk-UT4J7NPS.js";
11
11
  import "../chunk-AIH3F7JV.js";
12
12
  import "../chunk-EZR55KV2.js";
13
13
  import "../chunk-ORMEWXMH.js";
@@ -1,11 +1,13 @@
1
1
  import {
2
2
  errorHandlerMiddleware
3
- } from "../chunk-TMVS4F7E.js";
4
- import "../chunk-EEUBKZV4.js";
5
- import "../chunk-N4YGR5WH.js";
6
- import "../chunk-KXAWBFJN.js";
7
- import "../chunk-MLGO3HLS.js";
8
- import "../chunk-Y3OTJH2S.js";
3
+ } from "../chunk-QYIUGQ5Q.js";
4
+ import "../chunk-WDRDGFHO.js";
5
+ import "../chunk-Y2JYA2AR.js";
6
+ import "../chunk-HCF3C3AQ.js";
7
+ import "../chunk-IYXMGIEP.js";
8
+ import "../chunk-KXXROUA5.js";
9
+ import "../chunk-SNVGJPPX.js";
10
+ import "../chunk-AIH3F7JV.js";
9
11
  import "../chunk-EZR55KV2.js";
10
12
  import "../chunk-ORMEWXMH.js";
11
13
  export {