@withwiz/toolkit 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/auth/core/jwt/cookie.d.ts +21 -0
  2. package/dist/auth/core/jwt/cookie.js +9 -0
  3. package/dist/auth/core/jwt/index.d.ts +2 -0
  4. package/dist/auth/core/jwt/index.js +8 -2
  5. package/dist/auth/index.js +18 -17
  6. package/dist/{chunk-E54MAI4I.js → chunk-2F6KNGOD.js} +2 -2
  7. package/dist/{chunk-BKJPYZYO.js → chunk-3YUKCYHI.js} +4 -4
  8. package/dist/{chunk-S54PFAEU.js → chunk-7VTBRP5M.js} +2 -2
  9. package/dist/chunk-AJLUPYCQ.js +50 -0
  10. package/dist/{chunk-HCF3C3AQ.js → chunk-AKD4YMJU.js} +0 -61
  11. package/dist/{chunk-6MI4XLWC.js → chunk-AQJAY5FA.js} +2 -2
  12. package/dist/{chunk-TQJDNWBL.js → chunk-BJSEYZBH.js} +3 -3
  13. package/dist/{chunk-KXXROUA5.js → chunk-EOEMOXNT.js} +1 -44
  14. package/dist/{chunk-A6V6XVPZ.js → chunk-J5AISIJS.js} +18 -12
  15. package/dist/{chunk-Y2JYA2AR.js → chunk-JNJALNRR.js} +2 -2
  16. package/dist/{chunk-2KDLKHTO.js → chunk-L6AU74EI.js} +2 -14
  17. package/dist/{chunk-IYXMGIEP.js → chunk-ON4ENPUS.js} +0 -61
  18. package/dist/{chunk-SNVGJPPX.js → chunk-SNTLJ646.js} +0 -80
  19. package/dist/{chunk-7JWIX5BS.js → chunk-WMJ5M45N.js} +1 -1
  20. package/dist/{chunk-QVWDWROP.js → chunk-WMQE2YK7.js} +58 -0
  21. package/dist/{chunk-NQS7UT6X.js → chunk-YP5SAHAP.js} +4 -4
  22. package/dist/constants/error-codes.d.ts +0 -78
  23. package/dist/constants/error-codes.js +1 -1
  24. package/dist/constants/index.js +23 -23
  25. package/dist/error/app-error.d.ts +3 -16
  26. package/dist/error/app-error.js +2 -2
  27. package/dist/error/error-display.js +7 -7
  28. package/dist/error/error-handler.d.ts +0 -24
  29. package/dist/error/error-handler.js +3 -3
  30. package/dist/error/friendly-messages-v2.js +5 -5
  31. package/dist/error/friendly-messages.js +1 -15
  32. package/dist/error/index.js +8 -8
  33. package/dist/error/messages/en.js +1 -1
  34. package/dist/error/messages/index.js +3 -3
  35. package/dist/error/messages/ko.js +1 -1
  36. package/dist/middleware/auth.d.ts +5 -2
  37. package/dist/middleware/auth.js +5 -4
  38. package/dist/middleware/error-handler.js +7 -7
  39. package/dist/middleware/index.d.ts +1 -1
  40. package/dist/middleware/index.js +15 -12
  41. package/dist/middleware/rate-limit.js +3 -3
  42. package/dist/middleware/security.d.ts +4 -0
  43. package/dist/middleware/security.js +3 -1
  44. package/dist/middleware/wrappers.js +13 -12
  45. package/dist/storage/r2-storage.js +2 -2
  46. package/dist/utils/api-helpers.js +2 -2
  47. package/dist/utils/error-processor.js +3 -3
  48. package/dist/utils/index.js +4 -4
  49. package/dist/utils/optimistic-lock.js +2 -2
  50. package/package.json +1 -1
  51. /package/dist/{chunk-R6YVUU6I.js → chunk-3GAY2T2A.js} +0 -0
@@ -59,12 +59,6 @@ var ERROR_CODES = {
59
59
  status: HTTP_STATUS.BAD_REQUEST,
60
60
  message: "Password is too weak."
61
61
  },
62
- INVALID_ALIAS_FORMAT: {
63
- code: 40008,
64
- key: "INVALID_ALIAS_FORMAT",
65
- status: HTTP_STATUS.BAD_REQUEST,
66
- message: "Alias can only contain English letters, numbers, -, and _."
67
- },
68
62
  // ============================================
69
63
  // Authentication Related (401xx)
70
64
  // ============================================
@@ -92,18 +86,6 @@ var ERROR_CODES = {
92
86
  status: HTTP_STATUS.UNAUTHORIZED,
93
87
  message: "Invalid email or password."
94
88
  },
95
- LINK_PASSWORD_REQUIRED: {
96
- code: 40104,
97
- key: "LINK_PASSWORD_REQUIRED",
98
- status: HTTP_STATUS.UNAUTHORIZED,
99
- message: "Link password is required."
100
- },
101
- LINK_PASSWORD_INCORRECT: {
102
- code: 40105,
103
- key: "LINK_PASSWORD_INCORRECT",
104
- status: HTTP_STATUS.UNAUTHORIZED,
105
- message: "Incorrect link password."
106
- },
107
89
  SESSION_EXPIRED: {
108
90
  code: 40107,
109
91
  key: "SESSION_EXPIRED",
@@ -155,30 +137,6 @@ var ERROR_CODES = {
155
137
  status: HTTP_STATUS.NOT_FOUND,
156
138
  message: "User not found."
157
139
  },
158
- LINK_NOT_FOUND: {
159
- code: 40403,
160
- key: "LINK_NOT_FOUND",
161
- status: HTTP_STATUS.NOT_FOUND,
162
- message: "Link not found."
163
- },
164
- TAG_NOT_FOUND: {
165
- code: 40408,
166
- key: "TAG_NOT_FOUND",
167
- status: HTTP_STATUS.NOT_FOUND,
168
- message: "Tag not found."
169
- },
170
- FAVORITE_NOT_FOUND: {
171
- code: 40409,
172
- key: "FAVORITE_NOT_FOUND",
173
- status: HTTP_STATUS.NOT_FOUND,
174
- message: "Favorite not found."
175
- },
176
- GROUP_NOT_FOUND: {
177
- code: 40410,
178
- key: "GROUP_NOT_FOUND",
179
- status: HTTP_STATUS.NOT_FOUND,
180
- message: "Group not found."
181
- },
182
140
  // ============================================
183
141
  // Conflict (409xx)
184
142
  // Reserved: 40901~40903 (미사용, 향후 확장용)
@@ -201,12 +159,6 @@ var ERROR_CODES = {
201
159
  status: HTTP_STATUS.CONFLICT,
202
160
  message: "Email is already registered."
203
161
  },
204
- ALIAS_ALREADY_EXISTS: {
205
- code: 40907,
206
- key: "ALIAS_ALREADY_EXISTS",
207
- status: HTTP_STATUS.CONFLICT,
208
- message: "Alias is already in use."
209
- },
210
162
  // ============================================
211
163
  // Business Logic (422xx)
212
164
  // ============================================
@@ -228,38 +180,6 @@ var ERROR_CODES = {
228
180
  status: HTTP_STATUS.UNPROCESSABLE_ENTITY,
229
181
  message: "Usage quota exceeded."
230
182
  },
231
- LINK_EXPIRED: {
232
- code: 42204,
233
- key: "LINK_EXPIRED",
234
- status: HTTP_STATUS.UNPROCESSABLE_ENTITY,
235
- message: "Link has expired."
236
- },
237
- LINK_INACTIVE: {
238
- code: 42205,
239
- key: "LINK_INACTIVE",
240
- status: HTTP_STATUS.UNPROCESSABLE_ENTITY,
241
- message: "Link is inactive."
242
- },
243
- // LINK_PASSWORD_REQUIRED: 401xx로 이동 (40104)
244
- // LINK_PASSWORD_INCORRECT: 401xx로 이동 (40105)
245
- RESERVED_WORD_USED: {
246
- code: 42208,
247
- key: "RESERVED_WORD_USED",
248
- status: HTTP_STATUS.UNPROCESSABLE_ENTITY,
249
- message: "Reserved words cannot be used as aliases."
250
- },
251
- ALREADY_FAVORITED: {
252
- code: 42209,
253
- key: "ALREADY_FAVORITED",
254
- status: HTTP_STATUS.UNPROCESSABLE_ENTITY,
255
- message: "Already added to favorites."
256
- },
257
- CANNOT_DELETE_OWN_ACCOUNT: {
258
- code: 42210,
259
- key: "CANNOT_DELETE_OWN_ACCOUNT",
260
- status: HTTP_STATUS.UNPROCESSABLE_ENTITY,
261
- message: "You cannot delete your own account."
262
- },
263
183
  FILE_TOO_LARGE: {
264
184
  code: 42211,
265
185
  key: "FILE_TOO_LARGE",
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ERROR_CODES,
3
3
  formatErrorMessage
4
- } from "./chunk-SNVGJPPX.js";
4
+ } from "./chunk-SNTLJ646.js";
5
5
 
6
6
  // src/utils/api-helpers.ts
7
7
  import { NextResponse } from "next/server";
@@ -4,6 +4,35 @@ import {
4
4
 
5
5
  // src/middleware/security.ts
6
6
  import { NextResponse } from "next/server";
7
+ function setAllowedOrigins(origins) {
8
+ globalThis.__withwiz_allowed_origins = origins;
9
+ logger.info(`[Security Middleware] Allowed origins configured: ${origins.join(", ")}`);
10
+ }
11
+ var STATE_CHANGING_METHODS = ["POST", "PUT", "PATCH", "DELETE"];
12
+ function verifyOrigin(request) {
13
+ const allowedOrigins = globalThis.__withwiz_allowed_origins;
14
+ if (!allowedOrigins || allowedOrigins.length === 0) {
15
+ return true;
16
+ }
17
+ const method = request.method.toUpperCase();
18
+ if (!STATE_CHANGING_METHODS.includes(method)) {
19
+ return true;
20
+ }
21
+ const origin = request.headers.get("origin");
22
+ if (origin) {
23
+ return allowedOrigins.some((allowed) => origin === allowed);
24
+ }
25
+ const referer = request.headers.get("referer");
26
+ if (referer) {
27
+ try {
28
+ const refererOrigin = new URL(referer).origin;
29
+ return allowedOrigins.some((allowed) => refererOrigin === allowed);
30
+ } catch (e) {
31
+ return false;
32
+ }
33
+ }
34
+ return false;
35
+ }
7
36
  var BLOCKED_METHODS = ["TRACE", "TRACK"];
8
37
  var ALLOWED_CONTENT_TYPES = [
9
38
  "application/json",
@@ -97,6 +126,32 @@ var securityMiddleware = async (context, next) => {
97
126
  }
98
127
  }
99
128
  }
129
+ if (!verifyOrigin(request)) {
130
+ logger.warn("[Security] Origin verification failed", {
131
+ method,
132
+ origin: request.headers.get("origin"),
133
+ referer: request.headers.get("referer"),
134
+ url: request.url
135
+ });
136
+ return new NextResponse(
137
+ JSON.stringify({
138
+ success: false,
139
+ error: {
140
+ code: 40300,
141
+ message: "Origin verification failed",
142
+ userMessage: {
143
+ title: "\uC694\uCCAD \uAC70\uBD80",
144
+ description: "\uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC740 \uCD9C\uCC98\uC5D0\uC11C\uC758 \uC694\uCCAD\uC785\uB2C8\uB2E4.",
145
+ action: "\uC62C\uBC14\uB978 \uD398\uC774\uC9C0\uC5D0\uC11C \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694."
146
+ }
147
+ }
148
+ }),
149
+ {
150
+ status: 403,
151
+ headers: { "Content-Type": "application/json" }
152
+ }
153
+ );
154
+ }
100
155
  const response = await next();
101
156
  if (!response.headers.has("X-Content-Type-Options")) {
102
157
  response.headers.set("X-Content-Type-Options", "nosniff");
@@ -118,9 +173,12 @@ var securityMiddleware = async (context, next) => {
118
173
  function validateSecurityConfiguration() {
119
174
  logger.info("[Security Middleware] Blocked methods: " + BLOCKED_METHODS.join(", "));
120
175
  logger.info("[Security Middleware] Allowed Content-Types: " + ALLOWED_CONTENT_TYPES.join(", "));
176
+ const origins = globalThis.__withwiz_allowed_origins;
177
+ logger.info("[Security Middleware] Allowed Origins: " + ((origins == null ? void 0 : origins.join(", ")) || "NOT CONFIGURED (origin check disabled)"));
121
178
  }
122
179
 
123
180
  export {
181
+ setAllowedOrigins,
124
182
  securityMiddleware,
125
183
  validateSecurityConfiguration
126
184
  };
@@ -6,24 +6,24 @@ import {
6
6
  } from "./chunk-FPESPW6P.js";
7
7
  import {
8
8
  rateLimitMiddleware
9
- } from "./chunk-6MI4XLWC.js";
9
+ } from "./chunk-AQJAY5FA.js";
10
10
  import {
11
11
  responseLoggerMiddleware
12
12
  } from "./chunk-OIRAH57Y.js";
13
13
  import {
14
14
  securityMiddleware
15
- } from "./chunk-QVWDWROP.js";
15
+ } from "./chunk-WMQE2YK7.js";
16
16
  import {
17
17
  adminMiddleware,
18
18
  authMiddleware,
19
19
  optionalAuthMiddleware
20
- } from "./chunk-A6V6XVPZ.js";
20
+ } from "./chunk-J5AISIJS.js";
21
21
  import {
22
22
  corsMiddleware
23
23
  } from "./chunk-KGHWGLED.js";
24
24
  import {
25
25
  errorHandlerMiddleware
26
- } from "./chunk-BKJPYZYO.js";
26
+ } from "./chunk-3YUKCYHI.js";
27
27
 
28
28
  // src/middleware/wrappers.ts
29
29
  function withPublicApi(handler) {
@@ -75,12 +75,6 @@ export declare const ERROR_CODES: {
75
75
  readonly status: 400;
76
76
  readonly message: "Password is too weak.";
77
77
  };
78
- readonly INVALID_ALIAS_FORMAT: {
79
- readonly code: 40008;
80
- readonly key: "INVALID_ALIAS_FORMAT";
81
- readonly status: 400;
82
- readonly message: "Alias can only contain English letters, numbers, -, and _.";
83
- };
84
78
  readonly UNAUTHORIZED: {
85
79
  readonly code: 40101;
86
80
  readonly key: "UNAUTHORIZED";
@@ -105,18 +99,6 @@ export declare const ERROR_CODES: {
105
99
  readonly status: 401;
106
100
  readonly message: "Invalid email or password.";
107
101
  };
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
- };
120
102
  readonly SESSION_EXPIRED: {
121
103
  readonly code: 40107;
122
104
  readonly key: "SESSION_EXPIRED";
@@ -159,30 +141,6 @@ export declare const ERROR_CODES: {
159
141
  readonly status: 404;
160
142
  readonly message: "User not found.";
161
143
  };
162
- readonly LINK_NOT_FOUND: {
163
- readonly code: 40403;
164
- readonly key: "LINK_NOT_FOUND";
165
- readonly status: 404;
166
- readonly message: "Link not found.";
167
- };
168
- readonly TAG_NOT_FOUND: {
169
- readonly code: 40408;
170
- readonly key: "TAG_NOT_FOUND";
171
- readonly status: 404;
172
- readonly message: "Tag not found.";
173
- };
174
- readonly FAVORITE_NOT_FOUND: {
175
- readonly code: 40409;
176
- readonly key: "FAVORITE_NOT_FOUND";
177
- readonly status: 404;
178
- readonly message: "Favorite not found.";
179
- };
180
- readonly GROUP_NOT_FOUND: {
181
- readonly code: 40410;
182
- readonly key: "GROUP_NOT_FOUND";
183
- readonly status: 404;
184
- readonly message: "Group not found.";
185
- };
186
144
  readonly CONFLICT: {
187
145
  readonly code: 40904;
188
146
  readonly key: "CONFLICT";
@@ -201,12 +159,6 @@ export declare const ERROR_CODES: {
201
159
  readonly status: 409;
202
160
  readonly message: "Email is already registered.";
203
161
  };
204
- readonly ALIAS_ALREADY_EXISTS: {
205
- readonly code: 40907;
206
- readonly key: "ALIAS_ALREADY_EXISTS";
207
- readonly status: 409;
208
- readonly message: "Alias is already in use.";
209
- };
210
162
  readonly BUSINESS_RULE_VIOLATION: {
211
163
  readonly code: 42201;
212
164
  readonly key: "BUSINESS_RULE_VIOLATION";
@@ -225,36 +177,6 @@ export declare const ERROR_CODES: {
225
177
  readonly status: 422;
226
178
  readonly message: "Usage quota exceeded.";
227
179
  };
228
- readonly LINK_EXPIRED: {
229
- readonly code: 42204;
230
- readonly key: "LINK_EXPIRED";
231
- readonly status: 422;
232
- readonly message: "Link has expired.";
233
- };
234
- readonly LINK_INACTIVE: {
235
- readonly code: 42205;
236
- readonly key: "LINK_INACTIVE";
237
- readonly status: 422;
238
- readonly message: "Link is inactive.";
239
- };
240
- readonly RESERVED_WORD_USED: {
241
- readonly code: 42208;
242
- readonly key: "RESERVED_WORD_USED";
243
- readonly status: 422;
244
- readonly message: "Reserved words cannot be used as aliases.";
245
- };
246
- readonly ALREADY_FAVORITED: {
247
- readonly code: 42209;
248
- readonly key: "ALREADY_FAVORITED";
249
- readonly status: 422;
250
- readonly message: "Already added to favorites.";
251
- };
252
- readonly CANNOT_DELETE_OWN_ACCOUNT: {
253
- readonly code: 42210;
254
- readonly key: "CANNOT_DELETE_OWN_ACCOUNT";
255
- readonly status: 422;
256
- readonly message: "You cannot delete your own account.";
257
- };
258
180
  readonly FILE_TOO_LARGE: {
259
181
  readonly code: 42211;
260
182
  readonly key: "FILE_TOO_LARGE";
@@ -11,7 +11,7 @@ import {
11
11
  getErrorInfo,
12
12
  getHttpStatus,
13
13
  getLogLevel
14
- } from "../chunk-SNVGJPPX.js";
14
+ } from "../chunk-SNTLJ646.js";
15
15
  import "../chunk-ORMEWXMH.js";
16
16
  export {
17
17
  ERROR_CODES,
@@ -1,26 +1,3 @@
1
- import {
2
- DATE,
3
- FILE_UPLOAD,
4
- NUMERIC,
5
- PASSWORD,
6
- TEXT,
7
- URL,
8
- USER_INPUT
9
- } from "../chunk-LNV2E4I6.js";
10
- import {
11
- ERROR_CODES,
12
- HTTP_STATUS,
13
- classifyError,
14
- formatErrorMessage,
15
- getAllErrorCodes,
16
- getDefaultErrorMessage,
17
- getErrorByCode,
18
- getErrorCategory,
19
- getErrorCodesByCategory,
20
- getErrorInfo,
21
- getHttpStatus,
22
- getLogLevel
23
- } from "../chunk-SNVGJPPX.js";
24
1
  import {
25
2
  GENERIC_CONFIRM_MESSAGES,
26
3
  GENERIC_ERROR_MESSAGES,
@@ -45,6 +22,29 @@ import {
45
22
  SECURITY_HEADERS,
46
23
  SESSION
47
24
  } from "../chunk-JLLMTTQ4.js";
25
+ import {
26
+ DATE,
27
+ FILE_UPLOAD,
28
+ NUMERIC,
29
+ PASSWORD,
30
+ TEXT,
31
+ URL,
32
+ USER_INPUT
33
+ } from "../chunk-LNV2E4I6.js";
34
+ import {
35
+ ERROR_CODES,
36
+ HTTP_STATUS,
37
+ classifyError,
38
+ formatErrorMessage,
39
+ getAllErrorCodes,
40
+ getDefaultErrorMessage,
41
+ getErrorByCode,
42
+ getErrorCategory,
43
+ getErrorCodesByCategory,
44
+ getErrorInfo,
45
+ getHttpStatus,
46
+ getLogLevel
47
+ } from "../chunk-SNTLJ646.js";
48
48
  import "../chunk-ORMEWXMH.js";
49
49
  export {
50
50
  API_KEY,
@@ -36,13 +36,13 @@ export interface ISerializedError {
36
36
  *
37
37
  * @example
38
38
  * // 에러 코드 키로 생성
39
- * throw AppError.fromKey('NOT_FOUND', '링크를 찾을 수 없습니다');
39
+ * throw AppError.fromKey('NOT_FOUND', '리소스를 찾을 수 없습니다');
40
40
  *
41
41
  * // 직접 생성
42
- * throw new AppError(40403, '링크를 찾을 수 없습니다');
42
+ * throw new AppError(40401, '리소스를 찾을 수 없습니다');
43
43
  *
44
44
  * // 팩토리 메서드 사용
45
- * throw AppError.notFound('링크를 찾을 수 없습니다');
45
+ * throw AppError.notFound('리소스를 찾을 수 없습니다');
46
46
  */
47
47
  export declare class AppError extends Error {
48
48
  readonly code: number;
@@ -92,7 +92,6 @@ export declare class AppError extends Error {
92
92
  static invalidUrl(url?: string): AppError;
93
93
  static invalidEmail(email?: string): AppError;
94
94
  static weakPassword(): AppError;
95
- static invalidAlias(alias?: string): AppError;
96
95
  static unauthorized(message?: string): AppError;
97
96
  static invalidToken(): AppError;
98
97
  static tokenExpired(): AppError;
@@ -104,24 +103,12 @@ export declare class AppError extends Error {
104
103
  static accountLocked(): AppError;
105
104
  static notFound(message?: string): AppError;
106
105
  static userNotFound(): AppError;
107
- static linkNotFound(): AppError;
108
- static tagNotFound(): AppError;
109
- static favoriteNotFound(): AppError;
110
- static groupNotFound(): AppError;
111
106
  static conflict(message?: string): AppError;
112
107
  static duplicate(resourceName?: string): AppError;
113
108
  static emailExists(email?: string): AppError;
114
- static aliasExists(alias?: string): AppError;
115
109
  static businessRule(message?: string, details?: IErrorDetails): AppError;
116
110
  static invalidOperation(message?: string): AppError;
117
111
  static quotaExceeded(quotaType?: string): AppError;
118
- static linkExpired(): AppError;
119
- static linkInactive(): AppError;
120
- static linkPasswordRequired(): AppError;
121
- static linkPasswordIncorrect(): AppError;
122
- static reservedWord(word?: string): AppError;
123
- static alreadyFavorited(): AppError;
124
- static cannotDeleteOwnAccount(): AppError;
125
112
  static fileTooLarge(maxSize?: string): AppError;
126
113
  static unsupportedFileType(fileType?: string): AppError;
127
114
  static rateLimit(retryAfter?: number): AppError;
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  AppError,
3
3
  app_error_default
4
- } from "../chunk-KXXROUA5.js";
5
- import "../chunk-SNVGJPPX.js";
4
+ } from "../chunk-EOEMOXNT.js";
5
+ import "../chunk-SNTLJ646.js";
6
6
  import "../chunk-ORMEWXMH.js";
7
7
  export {
8
8
  AppError,
@@ -5,16 +5,16 @@ import {
5
5
  getErrorIcon,
6
6
  handleApiResponse,
7
7
  showFriendlyError
8
- } from "../chunk-TQJDNWBL.js";
9
- import "../chunk-KXXROUA5.js";
8
+ } from "../chunk-BJSEYZBH.js";
9
+ import "../chunk-EOEMOXNT.js";
10
10
  import {
11
11
  getErrorDisplayInfo,
12
12
  getFriendlyMessage
13
- } from "../chunk-S54PFAEU.js";
14
- import "../chunk-Y2JYA2AR.js";
15
- import "../chunk-HCF3C3AQ.js";
16
- import "../chunk-IYXMGIEP.js";
17
- import "../chunk-SNVGJPPX.js";
13
+ } from "../chunk-7VTBRP5M.js";
14
+ import "../chunk-JNJALNRR.js";
15
+ import "../chunk-AKD4YMJU.js";
16
+ import "../chunk-ON4ENPUS.js";
17
+ import "../chunk-SNTLJ646.js";
18
18
  import "../chunk-ORMEWXMH.js";
19
19
  export {
20
20
  extractErrorInfo,
@@ -43,12 +43,9 @@ export declare const ErrorResponse: {
43
43
  invalidUrl: () => NextResponse<IErrorResponse>;
44
44
  invalidEmail: () => NextResponse<IErrorResponse>;
45
45
  weakPassword: () => NextResponse<IErrorResponse>;
46
- invalidAlias: () => NextResponse<IErrorResponse>;
47
46
  unauthorized: (message?: string) => NextResponse<IErrorResponse>;
48
47
  invalidToken: () => NextResponse<IErrorResponse>;
49
48
  tokenExpired: () => NextResponse<IErrorResponse>;
50
- linkPasswordRequired: () => NextResponse<IErrorResponse>;
51
- linkPasswordIncorrect: () => NextResponse<IErrorResponse>;
52
49
  invalidCredentials: () => NextResponse<IErrorResponse>;
53
50
  sessionExpired: () => NextResponse<IErrorResponse>;
54
51
  forbidden: (message?: string) => NextResponse<IErrorResponse>;
@@ -57,21 +54,12 @@ export declare const ErrorResponse: {
57
54
  accountLocked: () => NextResponse<IErrorResponse>;
58
55
  notFound: (message?: string) => NextResponse<IErrorResponse>;
59
56
  userNotFound: () => NextResponse<IErrorResponse>;
60
- linkNotFound: () => NextResponse<IErrorResponse>;
61
- tagNotFound: () => NextResponse<IErrorResponse>;
62
- favoriteNotFound: () => NextResponse<IErrorResponse>;
63
- groupNotFound: () => NextResponse<IErrorResponse>;
64
57
  conflict: (message?: string) => NextResponse<IErrorResponse>;
65
58
  duplicate: (resource?: string) => NextResponse<IErrorResponse>;
66
59
  emailExists: () => NextResponse<IErrorResponse>;
67
- aliasExists: () => NextResponse<IErrorResponse>;
68
60
  businessRule: (message?: string) => NextResponse<IErrorResponse>;
69
61
  invalidOperation: (message?: string) => NextResponse<IErrorResponse>;
70
- linkExpired: () => NextResponse<IErrorResponse>;
71
- linkInactive: () => NextResponse<IErrorResponse>;
72
- reservedWord: () => NextResponse<IErrorResponse>;
73
62
  quotaExceeded: () => NextResponse<IErrorResponse>;
74
- alreadyFavorited: () => NextResponse<IErrorResponse>;
75
63
  fileTooLarge: (maxSize?: string) => NextResponse<IErrorResponse>;
76
64
  unsupportedFileType: (fileType?: string) => NextResponse<IErrorResponse>;
77
65
  rateLimit: () => NextResponse<IErrorResponse>;
@@ -104,12 +92,9 @@ declare const _default: {
104
92
  invalidUrl: () => NextResponse<IErrorResponse>;
105
93
  invalidEmail: () => NextResponse<IErrorResponse>;
106
94
  weakPassword: () => NextResponse<IErrorResponse>;
107
- invalidAlias: () => NextResponse<IErrorResponse>;
108
95
  unauthorized: (message?: string) => NextResponse<IErrorResponse>;
109
96
  invalidToken: () => NextResponse<IErrorResponse>;
110
97
  tokenExpired: () => NextResponse<IErrorResponse>;
111
- linkPasswordRequired: () => NextResponse<IErrorResponse>;
112
- linkPasswordIncorrect: () => NextResponse<IErrorResponse>;
113
98
  invalidCredentials: () => NextResponse<IErrorResponse>;
114
99
  sessionExpired: () => NextResponse<IErrorResponse>;
115
100
  forbidden: (message?: string) => NextResponse<IErrorResponse>;
@@ -118,21 +103,12 @@ declare const _default: {
118
103
  accountLocked: () => NextResponse<IErrorResponse>;
119
104
  notFound: (message?: string) => NextResponse<IErrorResponse>;
120
105
  userNotFound: () => NextResponse<IErrorResponse>;
121
- linkNotFound: () => NextResponse<IErrorResponse>;
122
- tagNotFound: () => NextResponse<IErrorResponse>;
123
- favoriteNotFound: () => NextResponse<IErrorResponse>;
124
- groupNotFound: () => NextResponse<IErrorResponse>;
125
106
  conflict: (message?: string) => NextResponse<IErrorResponse>;
126
107
  duplicate: (resource?: string) => NextResponse<IErrorResponse>;
127
108
  emailExists: () => NextResponse<IErrorResponse>;
128
- aliasExists: () => NextResponse<IErrorResponse>;
129
109
  businessRule: (message?: string) => NextResponse<IErrorResponse>;
130
110
  invalidOperation: (message?: string) => NextResponse<IErrorResponse>;
131
- linkExpired: () => NextResponse<IErrorResponse>;
132
- linkInactive: () => NextResponse<IErrorResponse>;
133
- reservedWord: () => NextResponse<IErrorResponse>;
134
111
  quotaExceeded: () => NextResponse<IErrorResponse>;
135
- alreadyFavorited: () => NextResponse<IErrorResponse>;
136
112
  fileTooLarge: (maxSize?: string) => NextResponse<IErrorResponse>;
137
113
  unsupportedFileType: (fileType?: string) => NextResponse<IErrorResponse>;
138
114
  rateLimit: () => NextResponse<IErrorResponse>;
@@ -5,9 +5,9 @@ import {
5
5
  error_handler_default,
6
6
  processError,
7
7
  withErrorHandler
8
- } from "../chunk-2KDLKHTO.js";
9
- import "../chunk-KXXROUA5.js";
10
- import "../chunk-SNVGJPPX.js";
8
+ } from "../chunk-L6AU74EI.js";
9
+ import "../chunk-EOEMOXNT.js";
10
+ import "../chunk-SNTLJ646.js";
11
11
  import "../chunk-AIH3F7JV.js";
12
12
  import "../chunk-GQVBWZLH.js";
13
13
  import "../chunk-OHBAELPZ.js";
@@ -2,11 +2,11 @@ import {
2
2
  formatFriendlyError,
3
3
  getErrorDisplayInfo,
4
4
  getFriendlyMessage
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";
5
+ } from "../chunk-7VTBRP5M.js";
6
+ import "../chunk-JNJALNRR.js";
7
+ import "../chunk-AKD4YMJU.js";
8
+ import "../chunk-ON4ENPUS.js";
9
+ import "../chunk-SNTLJ646.js";
10
10
  import "../chunk-ORMEWXMH.js";
11
11
  export {
12
12
  formatFriendlyError,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getErrorCategory
3
- } from "../chunk-SNVGJPPX.js";
3
+ } from "../chunk-SNTLJ646.js";
4
4
  import "../chunk-ORMEWXMH.js";
5
5
 
6
6
  // src/error/friendly-messages.ts
@@ -13,7 +13,6 @@ var koMessages = {
13
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
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
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
16
  // 인증 (401xx)
18
17
  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
18
  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." },
@@ -28,27 +27,14 @@ var koMessages = {
28
27
  // 리소스 (404xx)
29
28
  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
29
  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
30
  // 충돌 (409xx)
36
31
  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
32
  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
33
  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
34
  // 비즈니스 (422xx)
41
35
  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
36
  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
37
  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
38
  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
39
  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
40
  // Rate Limit (429xx)