@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.
- package/dist/auth/core/jwt/cookie.d.ts +21 -0
- package/dist/auth/core/jwt/cookie.js +9 -0
- package/dist/auth/core/jwt/index.d.ts +2 -0
- package/dist/auth/core/jwt/index.js +8 -2
- package/dist/auth/index.js +18 -17
- package/dist/{chunk-E54MAI4I.js → chunk-2F6KNGOD.js} +2 -2
- package/dist/{chunk-BKJPYZYO.js → chunk-3YUKCYHI.js} +4 -4
- package/dist/{chunk-S54PFAEU.js → chunk-7VTBRP5M.js} +2 -2
- package/dist/chunk-AJLUPYCQ.js +50 -0
- package/dist/{chunk-HCF3C3AQ.js → chunk-AKD4YMJU.js} +0 -61
- package/dist/{chunk-6MI4XLWC.js → chunk-AQJAY5FA.js} +2 -2
- package/dist/{chunk-TQJDNWBL.js → chunk-BJSEYZBH.js} +3 -3
- package/dist/{chunk-KXXROUA5.js → chunk-EOEMOXNT.js} +1 -44
- package/dist/{chunk-A6V6XVPZ.js → chunk-J5AISIJS.js} +18 -12
- package/dist/{chunk-Y2JYA2AR.js → chunk-JNJALNRR.js} +2 -2
- package/dist/{chunk-2KDLKHTO.js → chunk-L6AU74EI.js} +2 -14
- package/dist/{chunk-IYXMGIEP.js → chunk-ON4ENPUS.js} +0 -61
- package/dist/{chunk-SNVGJPPX.js → chunk-SNTLJ646.js} +0 -80
- package/dist/{chunk-7JWIX5BS.js → chunk-WMJ5M45N.js} +1 -1
- package/dist/{chunk-QVWDWROP.js → chunk-WMQE2YK7.js} +58 -0
- package/dist/{chunk-NQS7UT6X.js → chunk-YP5SAHAP.js} +4 -4
- package/dist/constants/error-codes.d.ts +0 -78
- package/dist/constants/error-codes.js +1 -1
- package/dist/constants/index.js +23 -23
- package/dist/error/app-error.d.ts +3 -16
- package/dist/error/app-error.js +2 -2
- package/dist/error/error-display.js +7 -7
- package/dist/error/error-handler.d.ts +0 -24
- package/dist/error/error-handler.js +3 -3
- package/dist/error/friendly-messages-v2.js +5 -5
- package/dist/error/friendly-messages.js +1 -15
- package/dist/error/index.js +8 -8
- package/dist/error/messages/en.js +1 -1
- package/dist/error/messages/index.js +3 -3
- package/dist/error/messages/ko.js +1 -1
- package/dist/middleware/auth.d.ts +5 -2
- package/dist/middleware/auth.js +5 -4
- package/dist/middleware/error-handler.js +7 -7
- package/dist/middleware/index.d.ts +1 -1
- package/dist/middleware/index.js +15 -12
- package/dist/middleware/rate-limit.js +3 -3
- package/dist/middleware/security.d.ts +4 -0
- package/dist/middleware/security.js +3 -1
- package/dist/middleware/wrappers.js +13 -12
- package/dist/storage/r2-storage.js +2 -2
- package/dist/utils/api-helpers.js +2 -2
- package/dist/utils/error-processor.js +3 -3
- package/dist/utils/index.js +4 -4
- package/dist/utils/optimistic-lock.js +2 -2
- package/package.json +1 -1
- /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",
|
|
@@ -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-
|
|
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-
|
|
15
|
+
} from "./chunk-WMQE2YK7.js";
|
|
16
16
|
import {
|
|
17
17
|
adminMiddleware,
|
|
18
18
|
authMiddleware,
|
|
19
19
|
optionalAuthMiddleware
|
|
20
|
-
} from "./chunk-
|
|
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-
|
|
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";
|
package/dist/constants/index.js
CHANGED
|
@@ -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(
|
|
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;
|
package/dist/error/app-error.js
CHANGED
|
@@ -5,16 +5,16 @@ import {
|
|
|
5
5
|
getErrorIcon,
|
|
6
6
|
handleApiResponse,
|
|
7
7
|
showFriendlyError
|
|
8
|
-
} from "../chunk-
|
|
9
|
-
import "../chunk-
|
|
8
|
+
} from "../chunk-BJSEYZBH.js";
|
|
9
|
+
import "../chunk-EOEMOXNT.js";
|
|
10
10
|
import {
|
|
11
11
|
getErrorDisplayInfo,
|
|
12
12
|
getFriendlyMessage
|
|
13
|
-
} from "../chunk-
|
|
14
|
-
import "../chunk-
|
|
15
|
-
import "../chunk-
|
|
16
|
-
import "../chunk-
|
|
17
|
-
import "../chunk-
|
|
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-
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
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-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
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-
|
|
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)
|