@withwiz/toolkit 0.1.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 (380) hide show
  1. package/README.md +162 -0
  2. package/dist/auth/adapters/prisma/index.d.ts +43 -0
  3. package/dist/auth/adapters/prisma/index.js +284 -0
  4. package/dist/auth/core/email/token-generator.d.ts +43 -0
  5. package/dist/auth/core/email/token-generator.js +7 -0
  6. package/dist/auth/core/jwt/client.d.ts +87 -0
  7. package/dist/auth/core/jwt/client.js +36 -0
  8. package/dist/auth/core/jwt/index.d.ts +110 -0
  9. package/dist/auth/core/jwt/index.js +10 -0
  10. package/dist/auth/core/jwt/types.d.ts +6 -0
  11. package/dist/auth/core/jwt/types.js +13 -0
  12. package/dist/auth/core/oauth/index.d.ts +51 -0
  13. package/dist/auth/core/oauth/index.js +12 -0
  14. package/dist/auth/core/password/client-helper.d.ts +44 -0
  15. package/dist/auth/core/password/client-helper.js +28 -0
  16. package/dist/auth/core/password/index.d.ts +71 -0
  17. package/dist/auth/core/password/index.js +14 -0
  18. package/dist/auth/errors/index.d.ts +49 -0
  19. package/dist/auth/errors/index.js +17 -0
  20. package/dist/auth/index.d.ts +21 -0
  21. package/dist/auth/index.js +97 -0
  22. package/dist/auth/types/index.d.ts +213 -0
  23. package/dist/auth/types/index.js +13 -0
  24. package/dist/cache/cache-config.d.ts +73 -0
  25. package/dist/cache/cache-config.js +12 -0
  26. package/dist/cache/cache-defaults.d.ts +141 -0
  27. package/dist/cache/cache-defaults.js +33 -0
  28. package/dist/cache/cache-env.d.ts +75 -0
  29. package/dist/cache/cache-env.js +25 -0
  30. package/dist/cache/cache-factory.d.ts +34 -0
  31. package/dist/cache/cache-factory.js +28 -0
  32. package/dist/cache/cache-invalidation.d.ts +90 -0
  33. package/dist/cache/cache-invalidation.js +24 -0
  34. package/dist/cache/cache-keys-legacy.d.ts +35 -0
  35. package/dist/cache/cache-keys-legacy.js +7 -0
  36. package/dist/cache/cache-redis.d.ts +74 -0
  37. package/dist/cache/cache-redis.js +24 -0
  38. package/dist/cache/cache-types.d.ts +151 -0
  39. package/dist/cache/cache-types.js +9 -0
  40. package/dist/cache/cache-wrapper.d.ts +27 -0
  41. package/dist/cache/cache-wrapper.js +22 -0
  42. package/dist/cache/cache.d.ts +14 -0
  43. package/dist/cache/cache.js +112 -0
  44. package/dist/cache/hybrid-cache-manager.d.ts +148 -0
  45. package/dist/cache/hybrid-cache-manager.js +13 -0
  46. package/dist/cache/index.d.ts +21 -0
  47. package/dist/cache/index.js +112 -0
  48. package/dist/cache/inmemory-cache-manager.d.ts +163 -0
  49. package/dist/cache/inmemory-cache-manager.js +9 -0
  50. package/dist/cache/noop-cache-manager.d.ts +36 -0
  51. package/dist/cache/noop-cache-manager.js +11 -0
  52. package/dist/cache/redis-cache-manager.d.ts +34 -0
  53. package/dist/cache/redis-cache-manager.js +11 -0
  54. package/dist/chunk-26Y7VEYG.js +93 -0
  55. package/dist/chunk-2DVWSDST.js +119 -0
  56. package/dist/chunk-2KAPUVIS.js +155 -0
  57. package/dist/chunk-2TO7WUKK.js +93 -0
  58. package/dist/chunk-34WAGUT5.js +117 -0
  59. package/dist/chunk-3DZA6AGS.js +120 -0
  60. package/dist/chunk-4DPSCTX4.js +212 -0
  61. package/dist/chunk-4KJXENRM.js +64 -0
  62. package/dist/chunk-4NWJ3WCZ.js +28 -0
  63. package/dist/chunk-4ODT3Q4A.js +86 -0
  64. package/dist/chunk-5ATB5D6S.js +40 -0
  65. package/dist/chunk-62FLBG6B.js +34 -0
  66. package/dist/chunk-62Q7DN5G.js +25 -0
  67. package/dist/chunk-65LHDFU3.js +242 -0
  68. package/dist/chunk-6C7HQIX4.js +13 -0
  69. package/dist/chunk-6D3HHYER.js +32 -0
  70. package/dist/chunk-6LTZCXNC.js +326 -0
  71. package/dist/chunk-7VJNLGAS.js +110 -0
  72. package/dist/chunk-7XFHGAJP.js +0 -0
  73. package/dist/chunk-A6EAAWMK.js +50 -0
  74. package/dist/chunk-AHDPGRXS.js +51 -0
  75. package/dist/chunk-AIH3F7JV.js +76 -0
  76. package/dist/chunk-AIHQBQ3E.js +109 -0
  77. package/dist/chunk-BKGVSC6S.js +152 -0
  78. package/dist/chunk-COK4ZXNG.js +0 -0
  79. package/dist/chunk-DEEJBDJE.js +47 -0
  80. package/dist/chunk-DH2ZHGW2.js +53 -0
  81. package/dist/chunk-EBUEBEJX.js +0 -0
  82. package/dist/chunk-EEUBKZV4.js +54 -0
  83. package/dist/chunk-EQYTE7WD.js +139 -0
  84. package/dist/chunk-EUQATJLI.js +180 -0
  85. package/dist/chunk-EZC6ETFW.js +80 -0
  86. package/dist/chunk-EZR55KV2.js +249 -0
  87. package/dist/chunk-F6LCSFSU.js +31 -0
  88. package/dist/chunk-FOKAATUQ.js +62 -0
  89. package/dist/chunk-FW3IEJ7H.js +71 -0
  90. package/dist/chunk-G26T2PRQ.js +53 -0
  91. package/dist/chunk-G4NI37NN.js +257 -0
  92. package/dist/chunk-GCZOXUDV.js +132 -0
  93. package/dist/chunk-GDWEDUHO.js +55 -0
  94. package/dist/chunk-GL2NANFH.js +434 -0
  95. package/dist/chunk-GPBOMJSZ.js +136 -0
  96. package/dist/chunk-H5I5GWAA.js +94 -0
  97. package/dist/chunk-HGC4CCKB.js +29 -0
  98. package/dist/chunk-HV3DGSSH.js +447 -0
  99. package/dist/chunk-I47QEDTX.js +193 -0
  100. package/dist/chunk-IAJNC34M.js +102 -0
  101. package/dist/chunk-IHXRF3BH.js +215 -0
  102. package/dist/chunk-IJEZ7G7S.js +26 -0
  103. package/dist/chunk-IQQKKUAV.js +151 -0
  104. package/dist/chunk-JBCDEAMW.js +35 -0
  105. package/dist/chunk-JLLMTTQ4.js +75 -0
  106. package/dist/chunk-JS5VI3OW.js +143 -0
  107. package/dist/chunk-KAWVMIRJ.js +44 -0
  108. package/dist/chunk-KMCJIL57.js +214 -0
  109. package/dist/chunk-KWTBD4CM.js +145 -0
  110. package/dist/chunk-KXAWBFJN.js +310 -0
  111. package/dist/chunk-L25BNU3E.js +56 -0
  112. package/dist/chunk-L76O3X3D.js +197 -0
  113. package/dist/chunk-LNV2E4I6.js +63 -0
  114. package/dist/chunk-MLGO3HLS.js +329 -0
  115. package/dist/chunk-MRJE6OX5.js +22 -0
  116. package/dist/chunk-MYLGYX4K.js +57 -0
  117. package/dist/chunk-N4YGR5WH.js +310 -0
  118. package/dist/chunk-OIVXOT2X.js +80 -0
  119. package/dist/chunk-ORMEWXMH.js +37 -0
  120. package/dist/chunk-POKGHK3L.js +57 -0
  121. package/dist/chunk-Q7IP4JMW.js +69 -0
  122. package/dist/chunk-RJUVBBZG.js +27 -0
  123. package/dist/chunk-S73334QY.js +89 -0
  124. package/dist/chunk-SLG26KHZ.js +101 -0
  125. package/dist/chunk-SR65BF6X.js +82 -0
  126. package/dist/chunk-SS56XFLI.js +19 -0
  127. package/dist/chunk-T3LJYAMO.js +277 -0
  128. package/dist/chunk-TDZJ6SAI.js +34 -0
  129. package/dist/chunk-TEIYA7U4.js +72 -0
  130. package/dist/chunk-TMVS4F7E.js +88 -0
  131. package/dist/chunk-TRBKJ7JT.js +137 -0
  132. package/dist/chunk-TXGNSECL.js +84 -0
  133. package/dist/chunk-TZAP5T4N.js +188 -0
  134. package/dist/chunk-UCYQNHST.js +24 -0
  135. package/dist/chunk-ULF5RDDX.js +0 -0
  136. package/dist/chunk-UXQRU3EM.js +167 -0
  137. package/dist/chunk-V5K5FYU7.js +200 -0
  138. package/dist/chunk-VDXB5DCY.js +68 -0
  139. package/dist/chunk-VSGKVZB4.js +47 -0
  140. package/dist/chunk-VWODEQ5C.js +204 -0
  141. package/dist/chunk-WDUFQFDP.js +193 -0
  142. package/dist/chunk-WHR7HPWF.js +126 -0
  143. package/dist/chunk-WSQMXMTL.js +122 -0
  144. package/dist/chunk-XHZ5L4FO.js +103 -0
  145. package/dist/chunk-XPASCCUA.js +404 -0
  146. package/dist/chunk-XRRPEBKB.js +231 -0
  147. package/dist/chunk-Y2TUZFCP.js +0 -0
  148. package/dist/chunk-Y3OTJH2S.js +473 -0
  149. package/dist/chunk-YBSHN67U.js +161 -0
  150. package/dist/chunk-YJ3TLEW3.js +100 -0
  151. package/dist/chunk-YJWLWUFK.js +105 -0
  152. package/dist/chunk-Z4D4CMDA.js +488 -0
  153. package/dist/chunk-ZHVUK5OY.js +314 -0
  154. package/dist/chunk-ZTN4X5FN.js +29 -0
  155. package/dist/chunk-ZZIKRBJU.js +96 -0
  156. package/dist/components/ui/Alert.d.ts +12 -0
  157. package/dist/components/ui/Alert.js +10 -0
  158. package/dist/components/ui/Badge.d.ts +7 -0
  159. package/dist/components/ui/Badge.js +8 -0
  160. package/dist/components/ui/Button.d.ts +7 -0
  161. package/dist/components/ui/Button.js +8 -0
  162. package/dist/components/ui/DataTable.d.ts +103 -0
  163. package/dist/components/ui/DataTable.js +606 -0
  164. package/dist/components/ui/DomainDisplay.d.ts +12 -0
  165. package/dist/components/ui/DomainDisplay.js +31 -0
  166. package/dist/components/ui/Input.d.ts +5 -0
  167. package/dist/components/ui/Input.js +8 -0
  168. package/dist/components/ui/Label.d.ts +5 -0
  169. package/dist/components/ui/Label.js +8 -0
  170. package/dist/components/ui/Pagination.d.ts +42 -0
  171. package/dist/components/ui/Pagination.js +20 -0
  172. package/dist/components/ui/Select.d.ts +15 -0
  173. package/dist/components/ui/Select.js +27 -0
  174. package/dist/components/ui/Skeleton.d.ts +6 -0
  175. package/dist/components/ui/Skeleton.js +8 -0
  176. package/dist/components/ui/TimezoneDisplay.d.ts +22 -0
  177. package/dist/components/ui/TimezoneDisplay.js +83 -0
  178. package/dist/components/ui/Tooltip.d.ts +21 -0
  179. package/dist/components/ui/Tooltip.js +94 -0
  180. package/dist/components/ui/WorldMapChart.d.ts +17 -0
  181. package/dist/components/ui/WorldMapChart.js +250 -0
  182. package/dist/components/ui/loading-bar.d.ts +20 -0
  183. package/dist/components/ui/loading-bar.js +15 -0
  184. package/dist/constants/error-codes.d.ts +389 -0
  185. package/dist/constants/error-codes.js +27 -0
  186. package/dist/constants/index.d.ts +11 -0
  187. package/dist/constants/index.js +85 -0
  188. package/dist/constants/messages.d.ts +83 -0
  189. package/dist/constants/messages.js +13 -0
  190. package/dist/constants/pagination.d.ts +43 -0
  191. package/dist/constants/pagination.js +15 -0
  192. package/dist/constants/security.d.ts +66 -0
  193. package/dist/constants/security.js +23 -0
  194. package/dist/constants/validation.d.ts +60 -0
  195. package/dist/constants/validation.js +19 -0
  196. package/dist/error/ErrorBoundary.d.ts +47 -0
  197. package/dist/error/app-error.d.ts +144 -0
  198. package/dist/error/app-error.js +10 -0
  199. package/dist/error/components/EmptyState.d.ts +50 -0
  200. package/dist/error/components/ErrorAlert.d.ts +50 -0
  201. package/dist/error/components/ErrorPage.d.ts +39 -0
  202. package/dist/error/components/LoadingState.d.ts +37 -0
  203. package/dist/error/components/index.d.ts +13 -0
  204. package/dist/error/components/index.js +18 -0
  205. package/dist/error/core/locale-detector.d.ts +44 -0
  206. package/dist/error/core/locale-detector.js +9 -0
  207. package/dist/error/error-display.d.ts +55 -0
  208. package/dist/error/error-display.js +24 -0
  209. package/dist/error/error-handler.d.ts +118 -0
  210. package/dist/error/error-handler.js +18 -0
  211. package/dist/error/friendly-messages-v2.d.ts +46 -0
  212. package/dist/error/friendly-messages-v2.js +15 -0
  213. package/dist/error/friendly-messages.d.ts +22 -0
  214. package/dist/error/friendly-messages.js +12 -0
  215. package/dist/error/hooks/index.d.ts +7 -0
  216. package/dist/error/hooks/index.js +14 -0
  217. package/dist/error/hooks/useErrorHandler.d.ts +67 -0
  218. package/dist/error/hooks/useErrorHandler.js +14 -0
  219. package/dist/error/index.d.ts +26 -0
  220. package/dist/error/index.js +289 -0
  221. package/dist/error/logging/error-logger.d.ts +77 -0
  222. package/dist/error/logging/error-logger.js +10 -0
  223. package/dist/error/logging/index.d.ts +9 -0
  224. package/dist/error/logging/index.js +35 -0
  225. package/dist/error/logging/transports/base.d.ts +30 -0
  226. package/dist/error/logging/transports/base.js +7 -0
  227. package/dist/error/logging/transports/console.d.ts +40 -0
  228. package/dist/error/logging/transports/console.js +9 -0
  229. package/dist/error/logging/transports/file.d.ts +49 -0
  230. package/dist/error/logging/transports/file.js +8 -0
  231. package/dist/error/logging/transports/index.d.ts +12 -0
  232. package/dist/error/logging/transports/index.js +25 -0
  233. package/dist/error/logging/transports/sentry.d.ts +44 -0
  234. package/dist/error/logging/transports/sentry.js +9 -0
  235. package/dist/error/logging/transports/slack.d.ts +51 -0
  236. package/dist/error/logging/transports/slack.js +9 -0
  237. package/dist/error/logging/types.d.ts +83 -0
  238. package/dist/error/logging/types.js +7 -0
  239. package/dist/error/messages/en.d.ts +5 -0
  240. package/dist/error/messages/en.js +7 -0
  241. package/dist/error/messages/index.d.ts +40 -0
  242. package/dist/error/messages/index.js +17 -0
  243. package/dist/error/messages/ko.d.ts +5 -0
  244. package/dist/error/messages/ko.js +7 -0
  245. package/dist/error/messages/types.d.ts +30 -0
  246. package/dist/error/messages/types.js +0 -0
  247. package/dist/error/recovery/circuit-breaker.d.ts +85 -0
  248. package/dist/error/recovery/circuit-breaker.js +9 -0
  249. package/dist/error/recovery/degradation.d.ts +56 -0
  250. package/dist/error/recovery/degradation.js +7 -0
  251. package/dist/error/recovery/fallback.d.ts +55 -0
  252. package/dist/error/recovery/fallback.js +11 -0
  253. package/dist/error/recovery/index.d.ts +12 -0
  254. package/dist/error/recovery/index.js +26 -0
  255. package/dist/error/recovery/retry.d.ts +44 -0
  256. package/dist/error/recovery/retry.js +7 -0
  257. package/dist/geolocation/batch-processor.d.ts +33 -0
  258. package/dist/geolocation/batch-processor.js +10 -0
  259. package/dist/geolocation/index.d.ts +14 -0
  260. package/dist/geolocation/index.js +36 -0
  261. package/dist/geolocation/providers/base-provider.d.ts +33 -0
  262. package/dist/geolocation/providers/base-provider.js +9 -0
  263. package/dist/geolocation/providers/index.d.ts +54 -0
  264. package/dist/geolocation/providers/index.js +29 -0
  265. package/dist/geolocation/providers/ip-api-provider.d.ts +17 -0
  266. package/dist/geolocation/providers/ip-api-provider.js +8 -0
  267. package/dist/geolocation/providers/ipapi-co-provider.d.ts +17 -0
  268. package/dist/geolocation/providers/ipapi-co-provider.js +8 -0
  269. package/dist/geolocation/providers/ipgeolocation-provider.d.ts +18 -0
  270. package/dist/geolocation/providers/ipgeolocation-provider.js +8 -0
  271. package/dist/geolocation/providers/maxmind-provider.d.ts +18 -0
  272. package/dist/geolocation/providers/maxmind-provider.js +8 -0
  273. package/dist/hooks/useDataTable.d.ts +51 -0
  274. package/dist/hooks/useDataTable.js +149 -0
  275. package/dist/hooks/useDebounce.d.ts +7 -0
  276. package/dist/hooks/useDebounce.js +7 -0
  277. package/dist/hooks/useExitIntent.d.ts +35 -0
  278. package/dist/hooks/useExitIntent.js +72 -0
  279. package/dist/hooks/useTimezone.d.ts +19 -0
  280. package/dist/hooks/useTimezone.js +11 -0
  281. package/dist/logger/logger.d.ts +11 -0
  282. package/dist/logger/logger.js +17 -0
  283. package/dist/middleware/auth.d.ts +87 -0
  284. package/dist/middleware/auth.js +20 -0
  285. package/dist/middleware/cors.d.ts +30 -0
  286. package/dist/middleware/cors.js +10 -0
  287. package/dist/middleware/error-handler.d.ts +23 -0
  288. package/dist/middleware/error-handler.js +13 -0
  289. package/dist/middleware/index.d.ts +16 -0
  290. package/dist/middleware/index.js +72 -0
  291. package/dist/middleware/init-request.d.ts +18 -0
  292. package/dist/middleware/init-request.js +8 -0
  293. package/dist/middleware/middleware-chain.d.ts +53 -0
  294. package/dist/middleware/middleware-chain.js +8 -0
  295. package/dist/middleware/rate-limit.d.ts +82 -0
  296. package/dist/middleware/rate-limit.js +14 -0
  297. package/dist/middleware/response-logger.d.ts +22 -0
  298. package/dist/middleware/response-logger.js +8 -0
  299. package/dist/middleware/security.d.ts +31 -0
  300. package/dist/middleware/security.js +9 -0
  301. package/dist/middleware/types.d.ts +45 -0
  302. package/dist/middleware/types.js +0 -0
  303. package/dist/middleware/wrappers.d.ts +91 -0
  304. package/dist/middleware/wrappers.js +32 -0
  305. package/dist/storage/r2-storage.d.ts +38 -0
  306. package/dist/storage/r2-storage.js +105 -0
  307. package/dist/system/cpu.d.ts +2 -0
  308. package/dist/system/cpu.js +9 -0
  309. package/dist/system/disk.d.ts +2 -0
  310. package/dist/system/disk.js +9 -0
  311. package/dist/system/environment.d.ts +8 -0
  312. package/dist/system/environment.js +9 -0
  313. package/dist/system/health-check.d.ts +26 -0
  314. package/dist/system/health-check.js +10 -0
  315. package/dist/system/index.d.ts +51 -0
  316. package/dist/system/index.js +194 -0
  317. package/dist/system/memory.d.ts +2 -0
  318. package/dist/system/memory.js +9 -0
  319. package/dist/system/network.d.ts +2 -0
  320. package/dist/system/network.js +9 -0
  321. package/dist/system/types.d.ts +93 -0
  322. package/dist/system/types.js +0 -0
  323. package/dist/system/utils.d.ts +12 -0
  324. package/dist/system/utils.js +26 -0
  325. package/dist/types/api.d.ts +80 -0
  326. package/dist/types/api.js +0 -0
  327. package/dist/types/database.d.ts +38 -0
  328. package/dist/types/database.js +0 -0
  329. package/dist/types/env.d.ts +105 -0
  330. package/dist/types/env.js +0 -0
  331. package/dist/types/geoip.d.ts +152 -0
  332. package/dist/types/geoip.js +0 -0
  333. package/dist/types/i18n.d.ts +11 -0
  334. package/dist/types/i18n.js +0 -0
  335. package/dist/types/qr-code.d.ts +139 -0
  336. package/dist/types/qr-code.js +75 -0
  337. package/dist/types/user.d.ts +54 -0
  338. package/dist/types/user.js +0 -0
  339. package/dist/utils/api-helpers.d.ts +147 -0
  340. package/dist/utils/api-helpers.js +30 -0
  341. package/dist/utils/client/client-utils.d.ts +3 -0
  342. package/dist/utils/client/client-utils.js +9 -0
  343. package/dist/utils/client/qr-code.d.ts +16 -0
  344. package/dist/utils/client/qr-code.js +215 -0
  345. package/dist/utils/cors.d.ts +40 -0
  346. package/dist/utils/cors.js +21 -0
  347. package/dist/utils/csv-export.d.ts +97 -0
  348. package/dist/utils/csv-export.js +20 -0
  349. package/dist/utils/error-message-formatter.d.ts +17 -0
  350. package/dist/utils/error-message-formatter.js +11 -0
  351. package/dist/utils/error-processor.d.ts +70 -0
  352. package/dist/utils/error-processor.js +34 -0
  353. package/dist/utils/format-number.d.ts +17 -0
  354. package/dist/utils/format-number.js +9 -0
  355. package/dist/utils/index.d.ts +13 -0
  356. package/dist/utils/index.js +160 -0
  357. package/dist/utils/input-validation.d.ts +88 -0
  358. package/dist/utils/input-validation.js +223 -0
  359. package/dist/utils/ip-utils.d.ts +15 -0
  360. package/dist/utils/ip-utils.js +91 -0
  361. package/dist/utils/optimistic-lock.d.ts +27 -0
  362. package/dist/utils/optimistic-lock.js +16 -0
  363. package/dist/utils/sanitizer.d.ts +72 -0
  364. package/dist/utils/sanitizer.js +19 -0
  365. package/dist/utils/shared-utils.d.ts +25 -0
  366. package/dist/utils/shared-utils.js +43 -0
  367. package/dist/utils/short-code-generator.d.ts +24 -0
  368. package/dist/utils/short-code-generator.js +9 -0
  369. package/dist/utils/timezone.d.ts +56 -0
  370. package/dist/utils/timezone.js +29 -0
  371. package/dist/utils/type-guards.d.ts +164 -0
  372. package/dist/utils/type-guards.js +59 -0
  373. package/dist/utils/url-normalizer.d.ts +53 -0
  374. package/dist/utils/url-normalizer.js +21 -0
  375. package/dist/validators/index.d.ts +7 -0
  376. package/dist/validators/index.js +13 -0
  377. package/dist/validators/password-validator.d.ts +86 -0
  378. package/dist/validators/password-validator.js +13 -0
  379. package/dist/world_countries-C2WUL2CQ.js +279 -0
  380. package/package.json +129 -0
@@ -0,0 +1,102 @@
1
+ import {
2
+ getErrorDisplayInfo
3
+ } from "./chunk-POKGHK3L.js";
4
+ import {
5
+ AppError
6
+ } from "./chunk-MLGO3HLS.js";
7
+ import {
8
+ ERROR_CODES
9
+ } from "./chunk-Y3OTJH2S.js";
10
+
11
+ // src/error/hooks/useErrorHandler.ts
12
+ import { useState, useCallback } from "react";
13
+ function useErrorHandler(locale = "ko") {
14
+ const [errorState, setErrorState] = useState({
15
+ hasError: false
16
+ });
17
+ const handleError = useCallback(
18
+ (error) => {
19
+ console.error("[useErrorHandler] Error occurred:", error);
20
+ if (error instanceof AppError) {
21
+ const displayInfo2 = getErrorDisplayInfo(error.code, locale);
22
+ setErrorState({
23
+ hasError: true,
24
+ code: error.code,
25
+ message: error.message,
26
+ displayInfo: displayInfo2,
27
+ timestamp: Date.now()
28
+ });
29
+ return;
30
+ }
31
+ if (error && typeof error === "object" && "error" in error && typeof error.error === "object") {
32
+ const apiError = error.error;
33
+ const code = apiError.code || ERROR_CODES.INTERNAL_SERVER_ERROR.code;
34
+ const displayInfo2 = getErrorDisplayInfo(code, locale);
35
+ setErrorState({
36
+ hasError: true,
37
+ code,
38
+ message: apiError.message || "Unknown error",
39
+ displayInfo: displayInfo2,
40
+ timestamp: Date.now()
41
+ });
42
+ return;
43
+ }
44
+ if (error instanceof Error) {
45
+ const displayInfo2 = getErrorDisplayInfo(
46
+ ERROR_CODES.INTERNAL_SERVER_ERROR.code,
47
+ locale
48
+ );
49
+ setErrorState({
50
+ hasError: true,
51
+ code: ERROR_CODES.INTERNAL_SERVER_ERROR.code,
52
+ message: error.message,
53
+ displayInfo: displayInfo2,
54
+ timestamp: Date.now()
55
+ });
56
+ return;
57
+ }
58
+ const displayInfo = getErrorDisplayInfo(
59
+ ERROR_CODES.INTERNAL_SERVER_ERROR.code,
60
+ locale
61
+ );
62
+ setErrorState({
63
+ hasError: true,
64
+ code: ERROR_CODES.INTERNAL_SERVER_ERROR.code,
65
+ message: String(error),
66
+ displayInfo,
67
+ timestamp: Date.now()
68
+ });
69
+ },
70
+ [locale]
71
+ );
72
+ const clearError = useCallback(() => {
73
+ setErrorState({
74
+ hasError: false
75
+ });
76
+ }, []);
77
+ const handleAuthError = useCallback(
78
+ (error, redirectUrl = "/login") => {
79
+ handleError(error);
80
+ if (error instanceof AppError) {
81
+ const httpStatus = Math.floor(error.code / 100);
82
+ if (httpStatus === 401 || httpStatus === 403) {
83
+ setTimeout(() => {
84
+ window.location.href = redirectUrl;
85
+ }, 1e3);
86
+ }
87
+ }
88
+ },
89
+ [handleError]
90
+ );
91
+ return {
92
+ errorState,
93
+ handleError,
94
+ clearError,
95
+ handleAuthError,
96
+ hasError: errorState.hasError
97
+ };
98
+ }
99
+
100
+ export {
101
+ useErrorHandler
102
+ };
@@ -0,0 +1,215 @@
1
+ // src/auth/core/password/index.ts
2
+ import { z } from "zod";
3
+ import bcrypt from "bcryptjs";
4
+ var _PasswordValidator = class _PasswordValidator {
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ /**
9
+ * 비밀번호 유효성 검사
10
+ */
11
+ validate(password) {
12
+ const errors = [];
13
+ if (password.length < this.config.minLength) {
14
+ errors.push(
15
+ `Password must be at least ${this.config.minLength} characters long`
16
+ );
17
+ }
18
+ if (password.length > this.config.maxLength) {
19
+ errors.push(
20
+ `Password cannot exceed ${this.config.maxLength} characters`
21
+ );
22
+ }
23
+ if (this.config.requireNumber && !/\d/.test(password)) {
24
+ errors.push("Password must contain at least one number");
25
+ }
26
+ if (this.config.requireUppercase && !/[A-Z]/.test(password)) {
27
+ errors.push("Password must contain at least one uppercase letter");
28
+ }
29
+ if (this.config.requireLowercase && !/[a-z]/.test(password)) {
30
+ errors.push("Password must contain at least one lowercase letter");
31
+ }
32
+ if (this.config.requireSpecialChar && !_PasswordValidator.SPECIAL_CHARS.test(password)) {
33
+ errors.push("Password must contain at least one special character");
34
+ }
35
+ const strength = this.calculateStrength(password);
36
+ const score = this.calculateScore(password);
37
+ return {
38
+ isValid: errors.length === 0,
39
+ errors,
40
+ strength,
41
+ score
42
+ };
43
+ }
44
+ /**
45
+ * 비밀번호 확인 검증
46
+ */
47
+ validateConfirmation(password, confirmPassword) {
48
+ const errors = [];
49
+ if (password !== confirmPassword) {
50
+ errors.push("Passwords do not match");
51
+ }
52
+ return {
53
+ isValid: errors.length === 0,
54
+ errors,
55
+ strength: "WEAK" /* WEAK */,
56
+ score: 0
57
+ };
58
+ }
59
+ /**
60
+ * 비밀번호 강도 계산
61
+ */
62
+ calculateStrength(password) {
63
+ const score = this.calculateScore(password);
64
+ if (score < 20) return "VERY_WEAK" /* VERY_WEAK */;
65
+ if (score < 40) return "WEAK" /* WEAK */;
66
+ if (score < 60) return "MEDIUM" /* MEDIUM */;
67
+ if (score < 80) return "STRONG" /* STRONG */;
68
+ return "VERY_STRONG" /* VERY_STRONG */;
69
+ }
70
+ /**
71
+ * 비밀번호 점수 계산 (0-100)
72
+ */
73
+ calculateScore(password) {
74
+ let score = 0;
75
+ if (password.length >= 8) score += 10;
76
+ if (password.length >= 12) score += 10;
77
+ if (password.length >= 16) score += 5;
78
+ if (/[a-z]/.test(password)) score += 10;
79
+ if (/[A-Z]/.test(password)) score += 10;
80
+ if (/\d/.test(password)) score += 10;
81
+ if (_PasswordValidator.SPECIAL_CHARS.test(password)) score += 10;
82
+ const uniqueChars = new Set(password).size;
83
+ if (uniqueChars >= password.length * 0.7) score += 20;
84
+ if (password.length >= 12 && uniqueChars >= 8) score += 15;
85
+ return Math.min(score, 100);
86
+ }
87
+ /**
88
+ * Zod 스키마 생성
89
+ */
90
+ createZodSchema() {
91
+ let schema = z.string().min(
92
+ this.config.minLength,
93
+ `Password must be at least ${this.config.minLength} characters long`
94
+ ).max(
95
+ this.config.maxLength,
96
+ `Password cannot exceed ${this.config.maxLength} characters`
97
+ );
98
+ if (this.config.requireNumber) {
99
+ schema = schema.regex(
100
+ /\d/,
101
+ "Password must contain at least one number"
102
+ );
103
+ }
104
+ if (this.config.requireUppercase) {
105
+ schema = schema.regex(
106
+ /[A-Z]/,
107
+ "Password must contain at least one uppercase letter"
108
+ );
109
+ }
110
+ if (this.config.requireLowercase) {
111
+ schema = schema.regex(
112
+ /[a-z]/,
113
+ "Password must contain at least one lowercase letter"
114
+ );
115
+ }
116
+ if (this.config.requireSpecialChar) {
117
+ schema = schema.regex(
118
+ _PasswordValidator.SPECIAL_CHARS,
119
+ "Password must contain at least one special character"
120
+ );
121
+ }
122
+ return schema;
123
+ }
124
+ /**
125
+ * 비밀번호 힌트 생성
126
+ */
127
+ generateHint(password) {
128
+ const hints = [];
129
+ if (password.length < this.config.minLength) {
130
+ hints.push(`Enter at least ${this.config.minLength} characters`);
131
+ }
132
+ if (this.config.requireNumber && !/\d/.test(password)) {
133
+ hints.push("Include numbers");
134
+ }
135
+ if (this.config.requireUppercase && !/[A-Z]/.test(password)) {
136
+ hints.push("Include uppercase letters");
137
+ }
138
+ if (this.config.requireLowercase && !/[a-z]/.test(password)) {
139
+ hints.push("Include lowercase letters");
140
+ }
141
+ if (this.config.requireSpecialChar && !_PasswordValidator.SPECIAL_CHARS.test(password)) {
142
+ hints.push("Include special characters");
143
+ }
144
+ return hints;
145
+ }
146
+ /**
147
+ * 비밀번호 강도 메시지 반환
148
+ */
149
+ static getStrengthMessage(strength) {
150
+ switch (strength) {
151
+ case "VERY_WEAK" /* VERY_WEAK */:
152
+ return "Very Weak";
153
+ case "WEAK" /* WEAK */:
154
+ return "Weak";
155
+ case "MEDIUM" /* MEDIUM */:
156
+ return "Medium";
157
+ case "STRONG" /* STRONG */:
158
+ return "Strong";
159
+ case "VERY_STRONG" /* VERY_STRONG */:
160
+ return "Very Strong";
161
+ default:
162
+ return "Unknown";
163
+ }
164
+ }
165
+ /**
166
+ * 비밀번호 강도 색상 반환 (Tailwind CSS)
167
+ */
168
+ static getStrengthColor(strength) {
169
+ switch (strength) {
170
+ case "VERY_WEAK" /* VERY_WEAK */:
171
+ return "text-red-600";
172
+ case "WEAK" /* WEAK */:
173
+ return "text-orange-600";
174
+ case "MEDIUM" /* MEDIUM */:
175
+ return "text-yellow-600";
176
+ case "STRONG" /* STRONG */:
177
+ return "text-blue-600";
178
+ case "VERY_STRONG" /* VERY_STRONG */:
179
+ return "text-green-600";
180
+ default:
181
+ return "text-gray-600";
182
+ }
183
+ }
184
+ };
185
+ _PasswordValidator.SPECIAL_CHARS = /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?~`]/;
186
+ var PasswordValidator = _PasswordValidator;
187
+ var PasswordHasher = class {
188
+ constructor(rounds = 12) {
189
+ this.rounds = rounds;
190
+ }
191
+ /**
192
+ * 비밀번호 해싱
193
+ */
194
+ async hash(password) {
195
+ return bcrypt.hash(password, this.rounds);
196
+ }
197
+ /**
198
+ * 비밀번호 검증
199
+ */
200
+ async verify(password, hash) {
201
+ return bcrypt.compare(password, hash);
202
+ }
203
+ };
204
+ var defaultPasswordSchema = z.string().min(8, "Password must be at least 8 characters long").max(128, "Password cannot exceed 128 characters").regex(/\d/, "Password must contain at least one number");
205
+ var strongPasswordSchema = z.string().min(12, "Password must be at least 12 characters long").max(128, "Password cannot exceed 128 characters").regex(/[a-z]/, "Password must contain at least one lowercase letter").regex(/[A-Z]/, "Password must contain at least one uppercase letter").regex(/\d/, "Password must contain at least one number").regex(
206
+ /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?~`]/,
207
+ "Password must contain at least one special character"
208
+ );
209
+
210
+ export {
211
+ PasswordValidator,
212
+ PasswordHasher,
213
+ defaultPasswordSchema,
214
+ strongPasswordSchema
215
+ };
@@ -0,0 +1,26 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-62FLBG6B.js";
4
+ import {
5
+ __objRest,
6
+ __spreadValues
7
+ } from "./chunk-ORMEWXMH.js";
8
+
9
+ // src/components/ui/Label.tsx
10
+ import { jsx } from "react/jsx-runtime";
11
+ function Label(_a) {
12
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
13
+ return /* @__PURE__ */ jsx(
14
+ "label",
15
+ __spreadValues({
16
+ className: cn(
17
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
18
+ className
19
+ )
20
+ }, props)
21
+ );
22
+ }
23
+
24
+ export {
25
+ Label
26
+ };
@@ -0,0 +1,151 @@
1
+ // src/cache/cache-defaults.ts
2
+ var ONE_MINUTE = 60;
3
+ var FIVE_MINUTES = 300;
4
+ var TEN_MINUTES = 600;
5
+ var FIFTEEN_MINUTES = 900;
6
+ var THIRTY_MINUTES = 1800;
7
+ var ONE_HOUR = 3600;
8
+ var ONE_DAY = 86400;
9
+ var THIRTY_DAYS = 2592e3;
10
+ var INMEMORY_CACHE_DEFAULTS = {
11
+ /** 최대 캐시 항목 수 */
12
+ MAX_SIZE: 1e5,
13
+ /** 최대 메모리 사용량 (MB) */
14
+ MAX_MB: 200,
15
+ /** 제거 정책: 'lru' | 'fifo' | 'ttl' */
16
+ EVICTION: "lru",
17
+ /** 정리 간격 (밀리초) */
18
+ CLEANUP_INTERVAL: 6e4
19
+ };
20
+ var CACHE_TTL_DEFAULTS = {
21
+ /** 기본 TTL (1시간) */
22
+ DEFAULT: ONE_HOUR,
23
+ /** 짧은 TTL (5분) - 자주 변경되는 데이터 */
24
+ SHORT: FIVE_MINUTES,
25
+ /** 긴 TTL (24시간) - 거의 변경되지 않는 데이터 */
26
+ LONG: ONE_DAY,
27
+ /** GeoIP TTL (30일) - IP 위치 정보는 거의 변경되지 않음 */
28
+ GEOIP: THIRTY_DAYS,
29
+ /** 설정 TTL (1시간) */
30
+ SETTINGS: ONE_HOUR,
31
+ /** 분석 데이터 TTL (30분) */
32
+ ANALYTICS: THIRTY_MINUTES,
33
+ /** 사용자 데이터 TTL (30분) */
34
+ USER: THIRTY_MINUTES,
35
+ /** 링크 데이터 TTL (30분) */
36
+ LINK: THIRTY_MINUTES,
37
+ /** 별칭 TTL (5분) - 자주 확인되는 데이터 */
38
+ ALIAS: FIVE_MINUTES,
39
+ /** 커뮤니티 TTL (15분) */
40
+ COMMUNITY: FIFTEEN_MINUTES,
41
+ /** 예약어 TTL (30분) */
42
+ RESERVED_WORDS: THIRTY_MINUTES
43
+ };
44
+ var CACHE_DURATION_DEFAULTS = {
45
+ /** 분석 데이터 (30분) */
46
+ ANALYTICS: THIRTY_MINUTES,
47
+ /** 사용자 데이터 (10분) */
48
+ USER: TEN_MINUTES,
49
+ /** GeoIP 데이터 (30일) */
50
+ GEOIP: THIRTY_DAYS,
51
+ /** 설정 데이터 (30분) */
52
+ SETTINGS: THIRTY_MINUTES,
53
+ /** 예약어 데이터 (30분) */
54
+ RESERVED_WORDS: THIRTY_MINUTES,
55
+ /** 별칭 데이터 (5분) */
56
+ ALIAS: FIVE_MINUTES,
57
+ /** 커뮤니티 데이터 (15분) */
58
+ COMMUNITY: FIFTEEN_MINUTES,
59
+ /** 링크 데이터 (30분) */
60
+ LINK: THIRTY_MINUTES,
61
+ /** Rate Limit (1분) */
62
+ RATE_LIMIT: ONE_MINUTE,
63
+ /** URL 토큰 (5분) */
64
+ URL_TOKEN: FIVE_MINUTES,
65
+ /** API 키 (5분) */
66
+ API_KEY: FIVE_MINUTES,
67
+ /** API 설정 (10분) */
68
+ API_CONFIG: TEN_MINUTES
69
+ };
70
+ var CACHE_FALLBACK_DEFAULTS = {
71
+ /** 전역 Redis 에러 임계값 (이 값 이상이면 즉시 전역 비활성화) */
72
+ REDIS_ERROR_THRESHOLD_GLOBAL: 1,
73
+ /** 인스턴스별 Redis 에러 임계값 (이 값 이상이면 해당 인스턴스만 일시 비활성화) */
74
+ REDIS_ERROR_THRESHOLD_LOCAL: 5,
75
+ /** Redis 재연결 시도 간격 (밀리초) */
76
+ REDIS_RECONNECT_INTERVAL: 3e4,
77
+ /** Redis 에러 시 인메모리 폴백 허용 여부 */
78
+ FALLBACK_ON_REDIS_ERROR: true,
79
+ /** hybrid 모드에서 인메모리에도 저장 여부 */
80
+ WRITE_TO_MEMORY: true
81
+ };
82
+ var CACHE_HEALTH_DEFAULTS = {
83
+ /** 건강상태 판단: 에러율 임계값 (%) - 이 값 이상이면 unhealthy */
84
+ ERROR_RATE_THRESHOLD: 10,
85
+ /** 건강상태 판단: 히트율 임계값 (%) - 이 값 미만이면 unhealthy */
86
+ HIT_RATE_THRESHOLD: 50,
87
+ /** 성능 리포트: 권장 히트율 (%) - 이 값 미만이면 TTL 조정 권장 */
88
+ REPORT_HIT_RATE_THRESHOLD: 70,
89
+ /** 성능 리포트: 응답시간 임계값 (ms) - 이 값 초과 시 성능 확인 권장 */
90
+ REPORT_RESPONSE_TIME_THRESHOLD: 500,
91
+ /** 성능 리포트: 무효화 빈도 임계값 (/분) - 이 값 초과 시 최적화 권장 */
92
+ REPORT_INVALIDATION_THRESHOLD: 100,
93
+ /** 성능 리포트: 최소 요청 수 - 이 값 미만이면 리포트 판단 생략 */
94
+ REPORT_MIN_REQUESTS: 100
95
+ };
96
+ var CACHE_ENV_VARS = {
97
+ // 전역 설정
98
+ CACHE_ENABLED: "CACHE_ENABLED",
99
+ CACHE_REDIS_ENABLED: "CACHE_REDIS_ENABLED",
100
+ CACHE_INMEMORY_ENABLED: "CACHE_INMEMORY_ENABLED",
101
+ // 인메모리 설정
102
+ CACHE_INMEMORY_MAX_SIZE: "CACHE_INMEMORY_MAX_SIZE",
103
+ CACHE_INMEMORY_MAX_MB: "CACHE_INMEMORY_MAX_MB",
104
+ CACHE_INMEMORY_EVICTION: "CACHE_INMEMORY_EVICTION",
105
+ CACHE_INMEMORY_CLEANUP_INTERVAL: "CACHE_INMEMORY_CLEANUP_INTERVAL",
106
+ // Redis 설정
107
+ UPSTASH_REDIS_REST_URL: "UPSTASH_REDIS_REST_URL",
108
+ UPSTASH_REDIS_REST_TOKEN: "UPSTASH_REDIS_REST_TOKEN",
109
+ // TTL 설정
110
+ CACHE_TTL_DEFAULT: "CACHE_TTL_DEFAULT",
111
+ CACHE_TTL_SHORT: "CACHE_TTL_SHORT",
112
+ CACHE_TTL_LONG: "CACHE_TTL_LONG",
113
+ CACHE_TTL_GEOIP: "CACHE_TTL_GEOIP",
114
+ CACHE_TTL_SETTINGS: "CACHE_TTL_SETTINGS",
115
+ CACHE_TTL_ANALYTICS: "CACHE_TTL_ANALYTICS",
116
+ CACHE_TTL_USER: "CACHE_TTL_USER",
117
+ CACHE_TTL_LINK: "CACHE_TTL_LINK",
118
+ CACHE_TTL_ALIAS: "CACHE_TTL_ALIAS",
119
+ CACHE_TTL_COMMUNITY: "CACHE_TTL_COMMUNITY",
120
+ CACHE_TTL_RESERVED_WORDS: "CACHE_TTL_RESERVED_WORDS",
121
+ // 폴백 설정
122
+ CACHE_REDIS_ERROR_THRESHOLD_GLOBAL: "CACHE_REDIS_ERROR_THRESHOLD_GLOBAL",
123
+ CACHE_REDIS_ERROR_THRESHOLD_LOCAL: "CACHE_REDIS_ERROR_THRESHOLD_LOCAL",
124
+ CACHE_REDIS_RECONNECT_INTERVAL: "CACHE_REDIS_RECONNECT_INTERVAL",
125
+ CACHE_FALLBACK_ON_REDIS_ERROR: "CACHE_FALLBACK_ON_REDIS_ERROR",
126
+ CACHE_WRITE_TO_MEMORY: "CACHE_WRITE_TO_MEMORY",
127
+ // 건강상태 평가 설정
128
+ CACHE_HEALTH_ERROR_RATE_THRESHOLD: "CACHE_HEALTH_ERROR_RATE_THRESHOLD",
129
+ CACHE_HEALTH_HIT_RATE_THRESHOLD: "CACHE_HEALTH_HIT_RATE_THRESHOLD",
130
+ CACHE_REPORT_HIT_RATE_THRESHOLD: "CACHE_REPORT_HIT_RATE_THRESHOLD",
131
+ CACHE_REPORT_RESPONSE_TIME_THRESHOLD: "CACHE_REPORT_RESPONSE_TIME_THRESHOLD",
132
+ CACHE_REPORT_INVALIDATION_THRESHOLD: "CACHE_REPORT_INVALIDATION_THRESHOLD",
133
+ CACHE_REPORT_MIN_REQUESTS: "CACHE_REPORT_MIN_REQUESTS"
134
+ };
135
+
136
+ export {
137
+ ONE_MINUTE,
138
+ FIVE_MINUTES,
139
+ TEN_MINUTES,
140
+ FIFTEEN_MINUTES,
141
+ THIRTY_MINUTES,
142
+ ONE_HOUR,
143
+ ONE_DAY,
144
+ THIRTY_DAYS,
145
+ INMEMORY_CACHE_DEFAULTS,
146
+ CACHE_TTL_DEFAULTS,
147
+ CACHE_DURATION_DEFAULTS,
148
+ CACHE_FALLBACK_DEFAULTS,
149
+ CACHE_HEALTH_DEFAULTS,
150
+ CACHE_ENV_VARS
151
+ };
@@ -0,0 +1,35 @@
1
+ // src/cache/cache-keys-legacy.ts
2
+ var cacheKeys = {
3
+ // 분석 데이터 캐시 키
4
+ geographyStats: (linkId) => `geography:${linkId}`,
5
+ timelineStats: (linkId) => `timeline:${linkId}`,
6
+ deviceStats: (linkId) => `devices:${linkId}`,
7
+ browserStats: (linkId) => `browsers:${linkId}`,
8
+ osStats: (linkId) => `os:${linkId}`,
9
+ // 관리자 통계 캐시 키
10
+ adminCountryStats: () => "admin:stats:country",
11
+ adminCityStats: () => "admin:stats:city",
12
+ adminDailyStats: () => "admin:stats:daily",
13
+ adminDeviceStats: () => "admin:stats:device",
14
+ adminBrowserStats: () => "admin:stats:browser",
15
+ // 사용자 데이터 캐시 키
16
+ userLinks: (userId) => `user:links:${userId}`,
17
+ userStats: (userId) => `user:stats:${userId}`,
18
+ // 링크 데이터 캐시 키
19
+ linkInfo: (linkId) => `link:info:${linkId}`,
20
+ linkClicks: (linkId) => `link:clicks:${linkId}`,
21
+ // GeoLocation 캐시 키
22
+ geoLocation: (ipAddress) => `geo:${ipAddress}`,
23
+ // 커뮤니티 캐시 키
24
+ community: {
25
+ popularTags: (period, limit) => `popular-tags:${period}:${limit}`,
26
+ tagLinks: (tagId, page, pageSize, sortBy, period) => `tag-links:${tagId}:${page}:${pageSize}:${sortBy}:${period}`,
27
+ recentLinks: (page, pageSize) => `recent-links:${page}:${pageSize}`,
28
+ trendingLinks: (period, algorithm, limit) => `trending-links:${period}:${algorithm}:${limit}`,
29
+ searchLinks: (query, tagIds, sortBy, page, pageSize) => `search:${query}:${tagIds}:${sortBy}:${page}:${pageSize}`
30
+ }
31
+ };
32
+
33
+ export {
34
+ cacheKeys
35
+ };
@@ -0,0 +1,75 @@
1
+ // src/constants/security.ts
2
+ var JWT_DEFAULTS = {
3
+ /** 알고리즘 */
4
+ ALGORITHM: "HS256",
5
+ /** 기본 액세스 토큰 만료 기간 */
6
+ DEFAULT_ACCESS_TOKEN_EXPIRES: "7d",
7
+ /** 기본 리프레시 토큰 만료 기간 */
8
+ DEFAULT_REFRESH_TOKEN_EXPIRES: "30d",
9
+ /** 토큰 타입 */
10
+ TOKEN_TYPE: "Bearer"
11
+ };
12
+ var EMAIL_VERIFICATION = {
13
+ /** 토큰 만료 시간 (시간 단위) */
14
+ TOKEN_EXPIRES_HOURS: 24,
15
+ /** 토큰 길이 (바이트) */
16
+ TOKEN_LENGTH: 32
17
+ };
18
+ var PASSWORD_RESET = {
19
+ /** 토큰 만료 시간 (시간 단위) */
20
+ TOKEN_EXPIRES_HOURS: 1,
21
+ /** 토큰 길이 (바이트) */
22
+ TOKEN_LENGTH: 32
23
+ };
24
+ var MAGIC_LINK = {
25
+ /** 토큰 만료 시간 (분 단위) */
26
+ TOKEN_EXPIRES_MINUTES: 15,
27
+ /** 토큰 길이 (바이트) */
28
+ TOKEN_LENGTH: 32
29
+ };
30
+ var API_KEY = {
31
+ /** 키 길이 (문자) */
32
+ LENGTH: 32,
33
+ /** 키 접두사 */
34
+ PREFIX: "tlog_"
35
+ };
36
+ var SESSION = {
37
+ /** 세션 쿠키 이름 */
38
+ COOKIE_NAME: "session",
39
+ /** 세션 만료 시간 (일 단위) */
40
+ EXPIRES_DAYS: 30
41
+ };
42
+ var OAUTH = {
43
+ /** 상태 토큰 길이 */
44
+ STATE_LENGTH: 32,
45
+ /** 상태 토큰 만료 시간 (분) */
46
+ STATE_EXPIRES_MINUTES: 10
47
+ };
48
+ var CSRF = {
49
+ /** 토큰 길이 */
50
+ TOKEN_LENGTH: 32,
51
+ /** 헤더 이름 */
52
+ HEADER_NAME: "X-CSRF-Token"
53
+ };
54
+ var SECURITY_HEADERS = {
55
+ /** Content Security Policy */
56
+ CSP: "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';",
57
+ /** X-Frame-Options */
58
+ X_FRAME_OPTIONS: "DENY",
59
+ /** X-Content-Type-Options */
60
+ X_CONTENT_TYPE_OPTIONS: "nosniff",
61
+ /** Referrer-Policy */
62
+ REFERRER_POLICY: "strict-origin-when-cross-origin"
63
+ };
64
+
65
+ export {
66
+ JWT_DEFAULTS,
67
+ EMAIL_VERIFICATION,
68
+ PASSWORD_RESET,
69
+ MAGIC_LINK,
70
+ API_KEY,
71
+ SESSION,
72
+ OAUTH,
73
+ CSRF,
74
+ SECURITY_HEADERS
75
+ };