@withwiz/cms-kit 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 (327) hide show
  1. package/README.ko.md +146 -0
  2. package/README.md +146 -0
  3. package/dist/chunk-2REYWBQ6.js +32 -0
  4. package/dist/chunk-2REYWBQ6.js.map +1 -0
  5. package/dist/chunk-2SYUEQ6J.mjs +17 -0
  6. package/dist/chunk-2SYUEQ6J.mjs.map +1 -0
  7. package/dist/chunk-3ILEMZAL.mjs +32 -0
  8. package/dist/chunk-3ILEMZAL.mjs.map +1 -0
  9. package/dist/chunk-3Y2TQCHU.mjs +33 -0
  10. package/dist/chunk-3Y2TQCHU.mjs.map +1 -0
  11. package/dist/chunk-4LSFAAZW.js +1 -0
  12. package/dist/chunk-4LSFAAZW.js.map +1 -0
  13. package/dist/chunk-4W3X7OKF.js +100 -0
  14. package/dist/chunk-4W3X7OKF.js.map +1 -0
  15. package/dist/chunk-5JUIMXNF.js +108 -0
  16. package/dist/chunk-5JUIMXNF.js.map +1 -0
  17. package/dist/chunk-5RDMODGV.mjs +34 -0
  18. package/dist/chunk-5RDMODGV.mjs.map +1 -0
  19. package/dist/chunk-6ES4W2DL.mjs +1 -0
  20. package/dist/chunk-6ES4W2DL.mjs.map +1 -0
  21. package/dist/chunk-6EZ3QE5N.js +71 -0
  22. package/dist/chunk-6EZ3QE5N.js.map +1 -0
  23. package/dist/chunk-6JFERXNE.mjs +16 -0
  24. package/dist/chunk-6JFERXNE.mjs.map +1 -0
  25. package/dist/chunk-7SWW3ZIN.js +17 -0
  26. package/dist/chunk-7SWW3ZIN.js.map +1 -0
  27. package/dist/chunk-AXR56AUD.mjs +1 -0
  28. package/dist/chunk-AXR56AUD.mjs.map +1 -0
  29. package/dist/chunk-BE7JDL64.js +154 -0
  30. package/dist/chunk-BE7JDL64.js.map +1 -0
  31. package/dist/chunk-BHN2SRZC.js +51 -0
  32. package/dist/chunk-BHN2SRZC.js.map +1 -0
  33. package/dist/chunk-BJTO5JO5.mjs +11 -0
  34. package/dist/chunk-BJTO5JO5.mjs.map +1 -0
  35. package/dist/chunk-BWKKHCDG.mjs +164 -0
  36. package/dist/chunk-BWKKHCDG.mjs.map +1 -0
  37. package/dist/chunk-C5WFZJM4.js +218 -0
  38. package/dist/chunk-C5WFZJM4.js.map +1 -0
  39. package/dist/chunk-CGVFB23E.mjs +123 -0
  40. package/dist/chunk-CGVFB23E.mjs.map +1 -0
  41. package/dist/chunk-D2VDTRXO.js +1 -0
  42. package/dist/chunk-D2VDTRXO.js.map +1 -0
  43. package/dist/chunk-D75ADHVM.mjs +181 -0
  44. package/dist/chunk-D75ADHVM.mjs.map +1 -0
  45. package/dist/chunk-DCIF4XJL.js +309 -0
  46. package/dist/chunk-DCIF4XJL.js.map +1 -0
  47. package/dist/chunk-DGUM43GV.js +11 -0
  48. package/dist/chunk-DGUM43GV.js.map +1 -0
  49. package/dist/chunk-DSORCGJK.js +44 -0
  50. package/dist/chunk-DSORCGJK.js.map +1 -0
  51. package/dist/chunk-E5YUAOJI.js +27 -0
  52. package/dist/chunk-E5YUAOJI.js.map +1 -0
  53. package/dist/chunk-EG6NVPP2.js +164 -0
  54. package/dist/chunk-EG6NVPP2.js.map +1 -0
  55. package/dist/chunk-EL7YGOTY.js +1 -0
  56. package/dist/chunk-EL7YGOTY.js.map +1 -0
  57. package/dist/chunk-EM4MQEWV.mjs +100 -0
  58. package/dist/chunk-EM4MQEWV.mjs.map +1 -0
  59. package/dist/chunk-FCCCG5Z7.mjs +108 -0
  60. package/dist/chunk-FCCCG5Z7.mjs.map +1 -0
  61. package/dist/chunk-FEPGJ7WN.mjs +218 -0
  62. package/dist/chunk-FEPGJ7WN.mjs.map +1 -0
  63. package/dist/chunk-HXVWBFCN.js +16 -0
  64. package/dist/chunk-HXVWBFCN.js.map +1 -0
  65. package/dist/chunk-I5YMTJV6.mjs +51 -0
  66. package/dist/chunk-I5YMTJV6.mjs.map +1 -0
  67. package/dist/chunk-IMNWW7Q5.mjs +13 -0
  68. package/dist/chunk-IMNWW7Q5.mjs.map +1 -0
  69. package/dist/chunk-J5N76ASB.mjs +114 -0
  70. package/dist/chunk-J5N76ASB.mjs.map +1 -0
  71. package/dist/chunk-JBV26CUG.mjs +51 -0
  72. package/dist/chunk-JBV26CUG.mjs.map +1 -0
  73. package/dist/chunk-JMWXVXK5.js +53 -0
  74. package/dist/chunk-JMWXVXK5.js.map +1 -0
  75. package/dist/chunk-KWKV2GAH.js +60 -0
  76. package/dist/chunk-KWKV2GAH.js.map +1 -0
  77. package/dist/chunk-LDFE33ML.mjs +53 -0
  78. package/dist/chunk-LDFE33ML.mjs.map +1 -0
  79. package/dist/chunk-LF5LOI7K.mjs +174 -0
  80. package/dist/chunk-LF5LOI7K.mjs.map +1 -0
  81. package/dist/chunk-MMKAMH4U.mjs +16 -0
  82. package/dist/chunk-MMKAMH4U.mjs.map +1 -0
  83. package/dist/chunk-MUHFEEYW.js +33 -0
  84. package/dist/chunk-MUHFEEYW.js.map +1 -0
  85. package/dist/chunk-MUQYK5EO.js +1 -0
  86. package/dist/chunk-MUQYK5EO.js.map +1 -0
  87. package/dist/chunk-OBNALAMG.mjs +71 -0
  88. package/dist/chunk-OBNALAMG.mjs.map +1 -0
  89. package/dist/chunk-OLEYNPW6.js +25 -0
  90. package/dist/chunk-OLEYNPW6.js.map +1 -0
  91. package/dist/chunk-OYJRR3G2.js +123 -0
  92. package/dist/chunk-OYJRR3G2.js.map +1 -0
  93. package/dist/chunk-PLVG7AW3.js +16 -0
  94. package/dist/chunk-PLVG7AW3.js.map +1 -0
  95. package/dist/chunk-PYD4CES4.js +1 -0
  96. package/dist/chunk-PYD4CES4.js.map +1 -0
  97. package/dist/chunk-QACD2U6P.mjs +1 -0
  98. package/dist/chunk-QACD2U6P.mjs.map +1 -0
  99. package/dist/chunk-R5GGIVD4.js +10 -0
  100. package/dist/chunk-R5GGIVD4.js.map +1 -0
  101. package/dist/chunk-RCK5WCU5.mjs +25 -0
  102. package/dist/chunk-RCK5WCU5.mjs.map +1 -0
  103. package/dist/chunk-S6UUSM7S.js +13 -0
  104. package/dist/chunk-S6UUSM7S.js.map +1 -0
  105. package/dist/chunk-S7GOXCRM.js +114 -0
  106. package/dist/chunk-S7GOXCRM.js.map +1 -0
  107. package/dist/chunk-SMV5D5LO.mjs +28 -0
  108. package/dist/chunk-SMV5D5LO.mjs.map +1 -0
  109. package/dist/chunk-T7EVFD4G.mjs +60 -0
  110. package/dist/chunk-T7EVFD4G.mjs.map +1 -0
  111. package/dist/chunk-TLH3V4SY.mjs +1 -0
  112. package/dist/chunk-TLH3V4SY.mjs.map +1 -0
  113. package/dist/chunk-TUQ2CVAK.mjs +10 -0
  114. package/dist/chunk-TUQ2CVAK.mjs.map +1 -0
  115. package/dist/chunk-U6PVJKTB.js +51 -0
  116. package/dist/chunk-U6PVJKTB.js.map +1 -0
  117. package/dist/chunk-UXMMEEX4.mjs +27 -0
  118. package/dist/chunk-UXMMEEX4.mjs.map +1 -0
  119. package/dist/chunk-VVXNFFKI.mjs +44 -0
  120. package/dist/chunk-VVXNFFKI.mjs.map +1 -0
  121. package/dist/chunk-VZZ3RU3Q.js +28 -0
  122. package/dist/chunk-VZZ3RU3Q.js.map +1 -0
  123. package/dist/chunk-W4FWIZ2Y.js +34 -0
  124. package/dist/chunk-W4FWIZ2Y.js.map +1 -0
  125. package/dist/chunk-YEQFKOWD.mjs +154 -0
  126. package/dist/chunk-YEQFKOWD.mjs.map +1 -0
  127. package/dist/chunk-YPBKY4KY.mjs +1 -0
  128. package/dist/chunk-YPBKY4KY.mjs.map +1 -0
  129. package/dist/chunk-YY7K5CXX.js +174 -0
  130. package/dist/chunk-YY7K5CXX.js.map +1 -0
  131. package/dist/chunk-ZFORODOX.js +181 -0
  132. package/dist/chunk-ZFORODOX.js.map +1 -0
  133. package/dist/chunk-ZULSFSDG.mjs +309 -0
  134. package/dist/chunk-ZULSFSDG.mjs.map +1 -0
  135. package/dist/components/AdminManagerBase.d.mts +26 -0
  136. package/dist/components/AdminManagerBase.d.ts +26 -0
  137. package/dist/components/AdminManagerBase.js +13 -0
  138. package/dist/components/AdminManagerBase.js.map +1 -0
  139. package/dist/components/AdminManagerBase.mjs +12 -0
  140. package/dist/components/AdminManagerBase.mjs.map +1 -0
  141. package/dist/components/AdminManagerConfig.d.mts +83 -0
  142. package/dist/components/AdminManagerConfig.d.ts +83 -0
  143. package/dist/components/AdminManagerConfig.js +2 -0
  144. package/dist/components/AdminManagerConfig.js.map +1 -0
  145. package/dist/components/AdminManagerConfig.mjs +2 -0
  146. package/dist/components/AdminManagerConfig.mjs.map +1 -0
  147. package/dist/components/AdminShell.d.mts +30 -0
  148. package/dist/components/AdminShell.d.ts +30 -0
  149. package/dist/components/AdminShell.js +12 -0
  150. package/dist/components/AdminShell.js.map +1 -0
  151. package/dist/components/AdminShell.mjs +11 -0
  152. package/dist/components/AdminShell.mjs.map +1 -0
  153. package/dist/components/JsonLd.d.mts +32 -0
  154. package/dist/components/JsonLd.d.ts +32 -0
  155. package/dist/components/JsonLd.js +11 -0
  156. package/dist/components/JsonLd.js.map +1 -0
  157. package/dist/components/JsonLd.mjs +11 -0
  158. package/dist/components/JsonLd.mjs.map +1 -0
  159. package/dist/components/ResizableImage.d.mts +18 -0
  160. package/dist/components/ResizableImage.d.ts +18 -0
  161. package/dist/components/ResizableImage.js +10 -0
  162. package/dist/components/ResizableImage.js.map +1 -0
  163. package/dist/components/ResizableImage.mjs +9 -0
  164. package/dist/components/ResizableImage.mjs.map +1 -0
  165. package/dist/components/ToggleSwitch.d.mts +11 -0
  166. package/dist/components/ToggleSwitch.d.ts +11 -0
  167. package/dist/components/ToggleSwitch.js +10 -0
  168. package/dist/components/ToggleSwitch.js.map +1 -0
  169. package/dist/components/ToggleSwitch.mjs +9 -0
  170. package/dist/components/ToggleSwitch.mjs.map +1 -0
  171. package/dist/components/image-drop-zone.css +115 -0
  172. package/dist/components/index.d.mts +26 -0
  173. package/dist/components/index.d.ts +26 -0
  174. package/dist/components/index.js +35 -0
  175. package/dist/components/index.js.map +1 -0
  176. package/dist/components/index.mjs +35 -0
  177. package/dist/components/index.mjs.map +1 -0
  178. package/dist/components/toggle-switch.css +55 -0
  179. package/dist/hooks/index.d.mts +45 -0
  180. package/dist/hooks/index.d.ts +45 -0
  181. package/dist/hooks/index.js +25 -0
  182. package/dist/hooks/index.js.map +1 -0
  183. package/dist/hooks/index.mjs +25 -0
  184. package/dist/hooks/index.mjs.map +1 -0
  185. package/dist/hooks/useImageDropZone.d.mts +37 -0
  186. package/dist/hooks/useImageDropZone.d.ts +37 -0
  187. package/dist/hooks/useImageDropZone.js +13 -0
  188. package/dist/hooks/useImageDropZone.js.map +1 -0
  189. package/dist/hooks/useImageDropZone.mjs +12 -0
  190. package/dist/hooks/useImageDropZone.mjs.map +1 -0
  191. package/dist/hooks/useScrollReveal.d.mts +6 -0
  192. package/dist/hooks/useScrollReveal.d.ts +6 -0
  193. package/dist/hooks/useScrollReveal.js +12 -0
  194. package/dist/hooks/useScrollReveal.js.map +1 -0
  195. package/dist/hooks/useScrollReveal.mjs +11 -0
  196. package/dist/hooks/useScrollReveal.mjs.map +1 -0
  197. package/dist/image-drop-zone.css +115 -0
  198. package/dist/index-00a40-FQ.d.mts +136 -0
  199. package/dist/index-00a40-FQ.d.ts +136 -0
  200. package/dist/index.d.mts +35 -0
  201. package/dist/index.d.ts +35 -0
  202. package/dist/index.js +169 -0
  203. package/dist/index.js.map +1 -0
  204. package/dist/index.mjs +169 -0
  205. package/dist/index.mjs.map +1 -0
  206. package/dist/infrastructure/index.d.mts +4 -0
  207. package/dist/infrastructure/index.d.ts +4 -0
  208. package/dist/infrastructure/index.js +20 -0
  209. package/dist/infrastructure/index.js.map +1 -0
  210. package/dist/infrastructure/index.mjs +20 -0
  211. package/dist/infrastructure/index.mjs.map +1 -0
  212. package/dist/infrastructure/middleware/index.d.mts +3 -0
  213. package/dist/infrastructure/middleware/index.d.ts +3 -0
  214. package/dist/infrastructure/middleware/index.js +15 -0
  215. package/dist/infrastructure/middleware/index.js.map +1 -0
  216. package/dist/infrastructure/middleware/index.mjs +15 -0
  217. package/dist/infrastructure/middleware/index.mjs.map +1 -0
  218. package/dist/infrastructure/middleware/wrappers.d.mts +10 -0
  219. package/dist/infrastructure/middleware/wrappers.d.ts +10 -0
  220. package/dist/infrastructure/middleware/wrappers.js +15 -0
  221. package/dist/infrastructure/middleware/wrappers.js.map +1 -0
  222. package/dist/infrastructure/middleware/wrappers.mjs +15 -0
  223. package/dist/infrastructure/middleware/wrappers.mjs.map +1 -0
  224. package/dist/infrastructure/prisma.d.mts +5 -0
  225. package/dist/infrastructure/prisma.d.ts +5 -0
  226. package/dist/infrastructure/prisma.js +12 -0
  227. package/dist/infrastructure/prisma.js.map +1 -0
  228. package/dist/infrastructure/prisma.mjs +12 -0
  229. package/dist/infrastructure/prisma.mjs.map +1 -0
  230. package/dist/services/index.d.mts +22 -0
  231. package/dist/services/index.d.ts +22 -0
  232. package/dist/services/index.js +36 -0
  233. package/dist/services/index.js.map +1 -0
  234. package/dist/services/index.mjs +36 -0
  235. package/dist/services/index.mjs.map +1 -0
  236. package/dist/toggle-switch.css +55 -0
  237. package/dist/types/common.d.mts +14 -0
  238. package/dist/types/common.d.ts +14 -0
  239. package/dist/types/common.js +8 -0
  240. package/dist/types/common.js.map +1 -0
  241. package/dist/types/common.mjs +8 -0
  242. package/dist/types/common.mjs.map +1 -0
  243. package/dist/types/index.d.mts +1 -0
  244. package/dist/types/index.d.ts +1 -0
  245. package/dist/types/index.js +9 -0
  246. package/dist/types/index.js.map +1 -0
  247. package/dist/types/index.mjs +9 -0
  248. package/dist/types/index.mjs.map +1 -0
  249. package/dist/utils/admin-fetch.d.mts +11 -0
  250. package/dist/utils/admin-fetch.d.ts +11 -0
  251. package/dist/utils/admin-fetch.js +13 -0
  252. package/dist/utils/admin-fetch.js.map +1 -0
  253. package/dist/utils/admin-fetch.mjs +13 -0
  254. package/dist/utils/admin-fetch.mjs.map +1 -0
  255. package/dist/utils/api-helpers.d.mts +20 -0
  256. package/dist/utils/api-helpers.d.ts +20 -0
  257. package/dist/utils/api-helpers.js +12 -0
  258. package/dist/utils/api-helpers.js.map +1 -0
  259. package/dist/utils/api-helpers.mjs +12 -0
  260. package/dist/utils/api-helpers.mjs.map +1 -0
  261. package/dist/utils/date.d.mts +5 -0
  262. package/dist/utils/date.d.ts +5 -0
  263. package/dist/utils/date.js +12 -0
  264. package/dist/utils/date.js.map +1 -0
  265. package/dist/utils/date.mjs +12 -0
  266. package/dist/utils/date.mjs.map +1 -0
  267. package/dist/utils/html-sanitizer.d.mts +56 -0
  268. package/dist/utils/html-sanitizer.d.ts +56 -0
  269. package/dist/utils/html-sanitizer.js +11 -0
  270. package/dist/utils/html-sanitizer.js.map +1 -0
  271. package/dist/utils/html-sanitizer.mjs +11 -0
  272. package/dist/utils/html-sanitizer.mjs.map +1 -0
  273. package/dist/utils/image-variant-utils.d.mts +14 -0
  274. package/dist/utils/image-variant-utils.d.ts +14 -0
  275. package/dist/utils/image-variant-utils.js +10 -0
  276. package/dist/utils/image-variant-utils.js.map +1 -0
  277. package/dist/utils/image-variant-utils.mjs +10 -0
  278. package/dist/utils/image-variant-utils.mjs.map +1 -0
  279. package/dist/utils/image-variants.d.mts +13 -0
  280. package/dist/utils/image-variants.d.ts +13 -0
  281. package/dist/utils/image-variants.js +12 -0
  282. package/dist/utils/image-variants.js.map +1 -0
  283. package/dist/utils/image-variants.mjs +12 -0
  284. package/dist/utils/image-variants.mjs.map +1 -0
  285. package/dist/utils/index.d.mts +88 -0
  286. package/dist/utils/index.d.ts +88 -0
  287. package/dist/utils/index.js +92 -0
  288. package/dist/utils/index.js.map +1 -0
  289. package/dist/utils/index.mjs +92 -0
  290. package/dist/utils/index.mjs.map +1 -0
  291. package/dist/utils/jwt.d.mts +19 -0
  292. package/dist/utils/jwt.d.ts +19 -0
  293. package/dist/utils/jwt.js +9 -0
  294. package/dist/utils/jwt.js.map +1 -0
  295. package/dist/utils/jwt.mjs +9 -0
  296. package/dist/utils/jwt.mjs.map +1 -0
  297. package/dist/utils/r2-helpers.d.mts +9 -0
  298. package/dist/utils/r2-helpers.d.ts +9 -0
  299. package/dist/utils/r2-helpers.js +20 -0
  300. package/dist/utils/r2-helpers.js.map +1 -0
  301. package/dist/utils/r2-helpers.mjs +20 -0
  302. package/dist/utils/r2-helpers.mjs.map +1 -0
  303. package/dist/utils/r2-storage.d.mts +38 -0
  304. package/dist/utils/r2-storage.d.ts +38 -0
  305. package/dist/utils/r2-storage.js +17 -0
  306. package/dist/utils/r2-storage.js.map +1 -0
  307. package/dist/utils/r2-storage.mjs +17 -0
  308. package/dist/utils/r2-storage.mjs.map +1 -0
  309. package/dist/utils/route-params.d.mts +3 -0
  310. package/dist/utils/route-params.d.ts +3 -0
  311. package/dist/utils/route-params.js +8 -0
  312. package/dist/utils/route-params.js.map +1 -0
  313. package/dist/utils/route-params.mjs +8 -0
  314. package/dist/utils/route-params.mjs.map +1 -0
  315. package/dist/validators/index.d.mts +2 -0
  316. package/dist/validators/index.d.ts +2 -0
  317. package/dist/validators/index.js +11 -0
  318. package/dist/validators/index.js.map +1 -0
  319. package/dist/validators/index.mjs +11 -0
  320. package/dist/validators/index.mjs.map +1 -0
  321. package/dist/validators/shared.d.mts +6 -0
  322. package/dist/validators/shared.d.ts +6 -0
  323. package/dist/validators/shared.js +10 -0
  324. package/dist/validators/shared.js.map +1 -0
  325. package/dist/validators/shared.mjs +10 -0
  326. package/dist/validators/shared.mjs.map +1 -0
  327. package/package.json +257 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-OYJRR3G2.js","../src/utils/html-sanitizer.ts"],"names":[],"mappings":"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","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-OYJRR3G2.js","sourcesContent":[null,"/**\n * 서버사이드 HTML 새니타이저 (spec.md §4.6 / Sprint 1 S1).\n *\n * 위험한 요소(script, iframe, object 등)와 이벤트 핸들러 속성을 제거하면서\n * 블록 에디터가 사용하는 안전한 HTML 구조를 보존한다.\n *\n * - 1차(기본): `isomorphic-dompurify` (실제 jsdom+DOMPurify DOM/parser\n * allowlist 새니타이저 — 손수 만든 regex 가 아님). 동적으로 로드한다.\n * - fallback: regex 기반 새니타이저는 *방어 심층(defense-in-depth)* 으로만\n * 남겨둔다 (optional dep 미설치 시). 더 이상 1차 경로가 아니다.\n * - `createSanitizer(config)` 로 신뢰 iframe origin 을 주입할 수 있다.\n *\n * `sanitizeHtmlContent` 는 하위 호환을 위해 기본 안전 설정으로 동작한다\n * (I1 — 동일 이름, 동일 `string|null|undefined → string|null` 시그니처).\n * 기본 신뢰 iframe origin 은 §5 config boundary 를 통해 consumer 가\n * override 할 수 있고, 미설정 시 현재 YouTube/Vimeo 집합이 그대로 쓰인다\n * (unconfigured 동작 불변 — I3 보호).\n *\n * `../../withwiz-blog-core/src/utils/html-sanitizer.ts` 와 *메커니즘 동일*\n * (`createSanitizer` factory + `tryLoadDomPurify()` 동적 require +\n * `uponSanitizeElement` iframe-origin hook + regex defense-in-depth fallback).\n */\n\nimport { resolveTrustedIframeOrigins } from '../config';\n\n// ── 정규식 패턴 (defense-in-depth fallback 전용) ──\n\n/** 항상 제거할 태그 (내용 포함) */\nconst STRIP_TAGS_WITH_CONTENT =\n /(<\\s*\\/?\\s*(script|object|embed|applet|form|input|textarea|select|button)\\b[^>]*>)/gi;\n\n/** 신뢰되지 않는 iframe 매칭 */\nconst UNTRUSTED_IFRAME = /<\\s*iframe\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*iframe\\s*>/gi;\n\n/** script/style 태그 사이 콘텐츠 */\nconst STRIP_TAG_CONTENT = /<\\s*(script|style)\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*\\1\\s*>/gi;\n\n/** 이벤트 핸들러 속성 (onclick, onerror, onload 등) */\nconst EVENT_HANDLER_ATTRS = /\\s+on\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]*)/gi;\n\n/** 위험한 URL 프로토콜 (href/src 속성 내) */\nconst DANGEROUS_PROTOCOL =\n /(href|src|action)\\s*=\\s*[\"']\\s*(javascript|vbscript|data\\s*:(?!image\\/))[^\"']*[\"']/gi;\n\n// ── 설정 인터페이스 ──\n\n/** 새니타이저 설정 */\nexport interface SanitizerConfig {\n /**\n * 신뢰할 수 있는 iframe origin 목록 (prefix 매칭).\n * 미지정 시 §5 config boundary 의 기본값(YouTube/Vimeo) 사용.\n */\n trustedIframeOrigins?: readonly string[];\n /** DOMPurify 사용 시 허용할 태그 화이트리스트. */\n allowedTags?: string[];\n /** DOMPurify 사용 시 허용할 속성 화이트리스트. */\n allowedAttributes?: Record<string, string[]>;\n}\n\n// ── DOMPurify 동적 로딩 (선택적 / 실제 사용되는 1차 경로) ──\n\ntype DOMPurifyLike = {\n sanitize: (dirty: string, options?: Record<string, unknown>) => string;\n};\n\nlet cachedDomPurify: DOMPurifyLike | null | undefined;\n\n/**\n * 선택적 의존성 `isomorphic-dompurify` (실제 DOM allowlist 새니타이저) 를\n * 동기적으로 로드한다. 설치되지 않았거나 로드 실패 시에만 null 을 반환하고,\n * 호출자는 regex defense-in-depth fallback 을 쓴다.\n */\nfunction tryLoadDomPurify(): DOMPurifyLike | null {\n if (cachedDomPurify !== undefined) return cachedDomPurify;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require('isomorphic-dompurify') as unknown;\n const candidate =\n (mod as { default?: DOMPurifyLike }).default ?? (mod as DOMPurifyLike);\n if (candidate && typeof candidate.sanitize === 'function') {\n cachedDomPurify = candidate;\n return candidate;\n }\n } catch {\n // 모듈 미설치 — regex fallback 사용\n }\n cachedDomPurify = null;\n return null;\n}\n\n// ── 정규식 기반 새니타이저 (defense-in-depth fallback) ──\n\nfunction regexSanitize(html: string, trustedOrigins: readonly string[]): string {\n let result = html;\n\n // 1. script/style 태그 사이 콘텐츠 제거\n result = result.replace(STRIP_TAG_CONTENT, '');\n\n // 2. 위험한 태그 제거\n result = result.replace(STRIP_TAGS_WITH_CONTENT, '');\n\n // 2b. 신뢰되지 않는 iframe 제거 (신뢰 origin 유지)\n result = result.replace(UNTRUSTED_IFRAME, (match) => {\n const srcMatch = match.match(/\\bsrc\\s*=\\s*[\"']([^\"']+)[\"']/i);\n if (srcMatch) {\n const src = srcMatch[1].trim();\n if (trustedOrigins.some((origin) => src.startsWith(origin))) {\n return match;\n }\n }\n return '';\n });\n\n // 3. 이벤트 핸들러 속성 제거\n result = result.replace(EVENT_HANDLER_ATTRS, '');\n\n // 4. 위험한 URL 프로토콜 무력화\n result = result.replace(DANGEROUS_PROTOCOL, '$1=\"\"');\n\n return result;\n}\n\n// ── DOMPurify 기반 새니타이저 (1차 경로) ──\n\nfunction dompurifySanitize(\n html: string,\n purify: DOMPurifyLike,\n trustedOrigins: readonly string[],\n config: SanitizerConfig,\n): string {\n const options: Record<string, unknown> = {\n // iframe 은 hook 에서 origin 검증 후 허용\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['allowfullscreen', 'frameborder', 'allow'],\n FORBID_TAGS: [\n 'script',\n 'object',\n 'embed',\n 'applet',\n 'form',\n 'input',\n 'textarea',\n 'select',\n 'button',\n 'style',\n ],\n FORBID_ATTR: [\n 'onerror',\n 'onload',\n 'onclick',\n 'onmouseover',\n 'onfocus',\n 'onblur',\n ],\n };\n\n if (config.allowedTags) options.ALLOWED_TAGS = config.allowedTags;\n if (config.allowedAttributes) {\n const flat = new Set<string>();\n for (const attrs of Object.values(config.allowedAttributes)) {\n for (const a of attrs) flat.add(a);\n }\n options.ALLOWED_ATTR = Array.from(flat);\n }\n\n const purifyWithHook = purify as DOMPurifyLike & {\n addHook?: (hook: string, cb: (node: Element) => void) => void;\n removeHook?: (hook: string) => void;\n };\n if (typeof purifyWithHook.addHook === 'function') {\n purifyWithHook.addHook('uponSanitizeElement', (node) => {\n if (node.nodeName && node.nodeName.toLowerCase() === 'iframe') {\n const src = (node as Element).getAttribute?.('src') ?? '';\n const trusted = trustedOrigins.some((origin) =>\n src.startsWith(origin),\n );\n if (!trusted) {\n (node as Element).remove?.();\n }\n }\n });\n }\n try {\n return purify.sanitize(html, options);\n } finally {\n if (typeof purifyWithHook.removeHook === 'function') {\n purifyWithHook.removeHook('uponSanitizeElement');\n }\n }\n}\n\n// ── Public API ──\n\n/**\n * 새니타이저 팩토리.\n *\n * DOMPurify(isomorphic-dompurify) 가 설치되어 있으면 그것을 *1차* 로 사용하고,\n * 없을 때만 regex defense-in-depth fallback 으로 동작한다.\n *\n * @example\n * const sanitize = createSanitizer({\n * trustedIframeOrigins: ['https://www.youtube.com/', 'https://www.loom.com/'],\n * });\n * const safe = sanitize(userHtml);\n */\nexport function createSanitizer(\n config: SanitizerConfig = {},\n): (html: string | null | undefined) => string | null {\n return function sanitize(html: string | null | undefined): string | null {\n if (!html) return html as string | null;\n // 신뢰 origin 은 point-of-use 에서 §5 boundary 를 통해 해석한다\n // (lazy — import 시점에 config 가 없어도 throw 하지 않음).\n const trustedOrigins =\n config.trustedIframeOrigins ?? resolveTrustedIframeOrigins();\n const purify = tryLoadDomPurify();\n if (purify) {\n return dompurifySanitize(html, purify, trustedOrigins, config);\n }\n return regexSanitize(html, trustedOrigins);\n };\n}\n\n/**\n * 리치 HTML 콘텐츠에서 위험한 요소와 속성을 제거한다.\n * 기본 안전 설정으로 동작한다 (하위 호환, I1). 호스트별 신뢰 origin 확장은\n * `createSanitizer({ trustedIframeOrigins: [...] })` 또는 §5\n * `setCmsConfig({ sanitizer: { trustedIframeOrigins } })` 로 한다.\n */\nexport function sanitizeHtmlContent(\n html: string | null | undefined,\n): string | null {\n return defaultSanitize(html);\n}\n\n/** 모듈 로드 시점에 1회 만들어지는 기본 새니타이저 (실행은 lazy). */\nconst defaultSanitize = createSanitizer();\n"]}
@@ -0,0 +1,16 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/services/base-service.ts
2
+ var DEFAULT_PAGE = 1;
3
+ var DEFAULT_LIMIT = 20;
4
+ function parseSortParam(sortBy, allowed, defaultField) {
5
+ const [field, order] = sortBy.split("_");
6
+ const safeField = allowed.includes(field) ? field : defaultField;
7
+ const safeOrder = order === "asc" ? "asc" : "desc";
8
+ return { field: safeField, order: safeOrder };
9
+ }
10
+
11
+
12
+
13
+
14
+
15
+ exports.DEFAULT_PAGE = DEFAULT_PAGE; exports.DEFAULT_LIMIT = DEFAULT_LIMIT; exports.parseSortParam = parseSortParam;
16
+ //# sourceMappingURL=chunk-PLVG7AW3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-PLVG7AW3.js","../src/services/base-service.ts"],"names":[],"mappings":"AAAA;ACiBO,IAAM,aAAA,EAAe,CAAA;AACrB,IAAM,cAAA,EAAgB,EAAA;AAEtB,SAAS,cAAA,CACd,MAAA,EACA,OAAA,EACA,YAAA,EACqC;AACrC,EAAA,MAAM,CAAC,KAAA,EAAO,KAAK,EAAA,EAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACvC,EAAA,MAAM,UAAA,EAAY,OAAA,CAAQ,QAAA,CAAS,KAAK,EAAA,EAAI,MAAA,EAAQ,YAAA;AACpD,EAAA,MAAM,UAAA,EAAuB,MAAA,IAAU,MAAA,EAAQ,MAAA,EAAQ,MAAA;AACvD,EAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAC9C;ADpBA;AACA;AACE;AACA;AACA;AACF,oHAAC","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-PLVG7AW3.js","sourcesContent":[null,"import { prisma } from '../infrastructure/prisma';\nimport { buildPaginatedResult, type PaginatedResult } from '../types/common';\nimport { sanitizeHtmlContent } from '../utils/html-sanitizer';\nimport { isR2Enabled } from '../utils/r2-storage';\nimport { collectR2Keys, deleteR2Keys } from '../utils/r2-helpers';\nimport type { SortOrder } from '../types/common';\n\nexport { prisma, buildPaginatedResult, sanitizeHtmlContent, isR2Enabled, collectR2Keys, deleteR2Keys };\nexport type { PaginatedResult, SortOrder };\n\nexport interface ListParams {\n page?: number;\n limit?: number;\n sortBy?: string;\n sortOrder?: SortOrder;\n}\n\nexport const DEFAULT_PAGE = 1;\nexport const DEFAULT_LIMIT = 20;\n\nexport function parseSortParam(\n sortBy: string,\n allowed: string[],\n defaultField: string,\n): { field: string; order: SortOrder } {\n const [field, order] = sortBy.split('_');\n const safeField = allowed.includes(field) ? field : defaultField;\n const safeOrder: SortOrder = order === 'asc' ? 'asc' : 'desc';\n return { field: safeField, order: safeOrder };\n}\n"]}
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-PYD4CES4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-PYD4CES4.js"],"names":[],"mappings":"AAAA","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-PYD4CES4.js"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-QACD2U6P.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,10 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/utils/route-params.ts
2
+ async function getRouteParam(props, key) {
3
+ const { [key]: value } = await props.params;
4
+ return value;
5
+ }
6
+
7
+
8
+
9
+ exports.getRouteParam = getRouteParam;
10
+ //# sourceMappingURL=chunk-R5GGIVD4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-R5GGIVD4.js","../src/utils/route-params.ts"],"names":[],"mappings":"AAAA;ACAA,MAAA,SAAsB,aAAA,CACpB,KAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,EAAE,CAAC,GAAG,CAAA,EAAG,MAAM,EAAA,EAAI,MAAO,KAAA,CAAiD,MAAA;AACjF,EAAA,OAAO,KAAA;AACT;ADDA;AACA;AACE;AACF,sCAAC","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-R5GGIVD4.js","sourcesContent":[null,"export async function getRouteParam<K extends string>(\n props: unknown,\n key: K,\n): Promise<string> {\n const { [key]: value } = await (props as { params: Promise<Record<K, string>> }).params;\n return value;\n}\n"]}
@@ -0,0 +1,25 @@
1
+ // src/infrastructure/prisma.ts
2
+ var _prisma = null;
3
+ function setPrismaClient(client) {
4
+ _prisma = client;
5
+ }
6
+ function getPrisma() {
7
+ if (!_prisma) {
8
+ throw new Error(
9
+ "@withwiz/cms-kit: Prisma client not initialized. Call setPrismaClient() first."
10
+ );
11
+ }
12
+ return _prisma;
13
+ }
14
+ var prisma = new Proxy({}, {
15
+ get(_target, prop) {
16
+ return getPrisma()[prop];
17
+ }
18
+ });
19
+
20
+ export {
21
+ setPrismaClient,
22
+ getPrisma,
23
+ prisma
24
+ };
25
+ //# sourceMappingURL=chunk-RCK5WCU5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infrastructure/prisma.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nlet _prisma: any = null;\n\nexport function setPrismaClient(client: any) {\n _prisma = client;\n}\n\nexport function getPrisma(): any {\n if (!_prisma) {\n throw new Error(\n '@withwiz/cms-kit: Prisma client not initialized. Call setPrismaClient() first.'\n );\n }\n return _prisma;\n}\n\nexport const prisma: any = new Proxy({}, {\n get(_target, prop) {\n return getPrisma()[prop];\n },\n});\n"],"mappings":";AAEA,IAAI,UAAe;AAEZ,SAAS,gBAAgB,QAAa;AAC3C,YAAU;AACZ;AAEO,SAAS,YAAiB;AAC/B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,SAAc,IAAI,MAAM,CAAC,GAAG;AAAA,EACvC,IAAI,SAAS,MAAM;AACjB,WAAO,UAAU,EAAE,IAAI;AAAA,EACzB;AACF,CAAC;","names":[]}
@@ -0,0 +1,13 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/types/common.ts
2
+ function buildPaginatedResult(items, total, page, limit) {
3
+ const totalPages = Math.ceil(total / limit);
4
+ return {
5
+ items,
6
+ pagination: { page, pageSize: limit, total, totalPages, hasMore: page < totalPages }
7
+ };
8
+ }
9
+
10
+
11
+
12
+ exports.buildPaginatedResult = buildPaginatedResult;
13
+ //# sourceMappingURL=chunk-S6UUSM7S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-S6UUSM7S.js","../src/types/common.ts"],"names":[],"mappings":"AAAA;ACaO,SAAS,oBAAA,CACd,KAAA,EACA,KAAA,EACA,IAAA,EACA,KAAA,EACoB;AACpB,EAAA,MAAM,WAAA,EAAa,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AAC1C,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,KAAA,EAAO,WAAW;AAAA,EACrF,CAAA;AACF;ADhBA;AACA;AACE;AACF,oDAAC","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-S6UUSM7S.js","sourcesContent":[null,"export interface PaginatedResult<T> {\n items: T[];\n pagination: {\n page: number;\n pageSize: number;\n total: number;\n totalPages: number;\n hasMore: boolean;\n };\n}\n\nexport type SortOrder = 'asc' | 'desc';\n\nexport function buildPaginatedResult<T>(\n items: T[],\n total: number,\n page: number,\n limit: number,\n): PaginatedResult<T> {\n const totalPages = Math.ceil(total / limit);\n return {\n items,\n pagination: { page, pageSize: limit, total, totalPages, hasMore: page < totalPages },\n };\n}\n"]}
@@ -0,0 +1,114 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/utils/image-resize.ts
2
+ var MAX_DIMENSION = 1920;
3
+ var TARGET_SIZE = 4 * 1024 * 1024;
4
+ var SKIP_THRESHOLD = 500 * 1024;
5
+ var GIF_MAX_SIZE = 5 * 1024 * 1024;
6
+ var ABSOLUTE_MAX_SIZE = 50 * 1024 * 1024;
7
+ var SKIP_RESIZE_TYPES = ["image/gif"];
8
+ async function resizeImageIfNeeded(file) {
9
+ const originalSize = file.size;
10
+ if (SKIP_RESIZE_TYPES.includes(file.type)) {
11
+ return { file, wasResized: false, originalSize, newSize: originalSize };
12
+ }
13
+ const img = await loadImage(file);
14
+ const { width, height } = img;
15
+ const longestEdge = Math.max(width, height);
16
+ if (file.size <= SKIP_THRESHOLD && longestEdge <= MAX_DIMENSION) {
17
+ return { file, wasResized: false, originalSize, newSize: originalSize };
18
+ }
19
+ const outputMime = detectOutputMime(file.type);
20
+ let targetW = width;
21
+ let targetH = height;
22
+ if (longestEdge > MAX_DIMENSION) {
23
+ const scale = MAX_DIMENSION / longestEdge;
24
+ targetW = Math.round(width * scale);
25
+ targetH = Math.round(height * scale);
26
+ }
27
+ const qualitySteps = [0.85, 0.8, 0.75, 0.65, 0.55, 0.5];
28
+ for (const quality of qualitySteps) {
29
+ const blob = await canvasToBlob(img, targetW, targetH, outputMime, quality);
30
+ if (blob.size <= TARGET_SIZE) {
31
+ return toResult(blob, file.name, outputMime, originalSize);
32
+ }
33
+ }
34
+ const scaleSteps = [0.8, 0.65, 0.5, 0.4];
35
+ for (const scale of scaleSteps) {
36
+ const newW = Math.round(targetW * scale);
37
+ const newH = Math.round(targetH * scale);
38
+ const blob = await canvasToBlob(img, newW, newH, outputMime, 0.75);
39
+ if (blob.size <= TARGET_SIZE) {
40
+ return toResult(blob, file.name, outputMime, originalSize);
41
+ }
42
+ }
43
+ const finalW = Math.round(targetW * 0.3);
44
+ const finalH = Math.round(targetH * 0.3);
45
+ const finalBlob = await canvasToBlob(img, finalW, finalH, outputMime, 0.5);
46
+ return toResult(finalBlob, file.name, outputMime, originalSize);
47
+ }
48
+ function validateImageSize(file) {
49
+ if (file.size > ABSOLUTE_MAX_SIZE) {
50
+ return `\uD30C\uC77C \uD06C\uAE30\uAC00 \uB108\uBB34 \uD07D\uB2C8\uB2E4. (${(file.size / 1024 / 1024).toFixed(0)}MB, \uCD5C\uB300 50MB)`;
51
+ }
52
+ if (SKIP_RESIZE_TYPES.includes(file.type) && file.size > GIF_MAX_SIZE) {
53
+ return `GIF \uD30C\uC77C\uC740 5MB \uC774\uD558\uB9CC \uC5C5\uB85C\uB4DC\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. (${(file.size / 1024 / 1024).toFixed(1)}MB)`;
54
+ }
55
+ return null;
56
+ }
57
+ function detectOutputMime(inputType) {
58
+ if (typeof document === "undefined") return "image/jpeg";
59
+ const supportsWebP = document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp");
60
+ if (supportsWebP) return "image/webp";
61
+ return inputType === "image/png" ? "image/jpeg" : inputType || "image/jpeg";
62
+ }
63
+ function loadImage(file) {
64
+ return new Promise((resolve, reject) => {
65
+ const img = new Image();
66
+ const url = URL.createObjectURL(file);
67
+ img.onload = () => {
68
+ URL.revokeObjectURL(url);
69
+ resolve(img);
70
+ };
71
+ img.onerror = () => {
72
+ URL.revokeObjectURL(url);
73
+ reject(new Error("\uC774\uBBF8\uC9C0 \uB85C\uB4DC\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uD30C\uC77C\uC774 \uC190\uC0C1\uB418\uC5C8\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4."));
74
+ };
75
+ img.src = url;
76
+ });
77
+ }
78
+ function canvasToBlob(img, width, height, mime, quality) {
79
+ return new Promise((resolve, reject) => {
80
+ const canvas = document.createElement("canvas");
81
+ canvas.width = width;
82
+ canvas.height = height;
83
+ const ctx = canvas.getContext("2d");
84
+ if (!ctx) {
85
+ reject(new Error("\uC774\uBBF8\uC9C0 \uCC98\uB9AC\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4."));
86
+ return;
87
+ }
88
+ if (mime !== "image/png") {
89
+ ctx.fillStyle = "#FFFFFF";
90
+ ctx.fillRect(0, 0, width, height);
91
+ }
92
+ ctx.drawImage(img, 0, 0, width, height);
93
+ canvas.toBlob(
94
+ (blob) => {
95
+ if (blob) resolve(blob);
96
+ else reject(new Error("\uC774\uBBF8\uC9C0 \uBCC0\uD658\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4."));
97
+ },
98
+ mime,
99
+ quality
100
+ );
101
+ });
102
+ }
103
+ function toResult(blob, originalName, mime, originalSize) {
104
+ const ext = mime === "image/jpeg" ? ".jpg" : mime === "image/webp" ? ".webp" : ".png";
105
+ const baseName = originalName.replace(/\.[^.]+$/, "");
106
+ const file = new File([blob], `${baseName}${ext}`, { type: mime });
107
+ return { file, wasResized: true, originalSize, newSize: blob.size };
108
+ }
109
+
110
+
111
+
112
+
113
+ exports.resizeImageIfNeeded = resizeImageIfNeeded; exports.validateImageSize = validateImageSize;
114
+ //# sourceMappingURL=chunk-S7GOXCRM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-S7GOXCRM.js","../src/utils/image-resize.ts"],"names":[],"mappings":"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","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-S7GOXCRM.js","sourcesContent":[null,"const MAX_DIMENSION = 1920; // px\nconst TARGET_SIZE = 4 * 1024 * 1024; // 4MB\nconst SKIP_THRESHOLD = 500 * 1024; // 500KB\nconst GIF_MAX_SIZE = 5 * 1024 * 1024; // 5MB\nconst ABSOLUTE_MAX_SIZE = 50 * 1024 * 1024; // 50MB\n\nconst SKIP_RESIZE_TYPES = [\"image/gif\"];\n\nexport interface ResizeResult {\n file: File;\n wasResized: boolean;\n originalSize: number;\n newSize: number;\n}\n\nexport async function resizeImageIfNeeded(\n file: File\n): Promise<ResizeResult> {\n const originalSize = file.size;\n\n if (SKIP_RESIZE_TYPES.includes(file.type)) {\n return { file, wasResized: false, originalSize, newSize: originalSize };\n }\n\n const img = await loadImage(file);\n const { width, height } = img;\n const longestEdge = Math.max(width, height);\n\n if (file.size <= SKIP_THRESHOLD && longestEdge <= MAX_DIMENSION) {\n return { file, wasResized: false, originalSize, newSize: originalSize };\n }\n\n const outputMime = detectOutputMime(file.type);\n\n let targetW = width;\n let targetH = height;\n if (longestEdge > MAX_DIMENSION) {\n const scale = MAX_DIMENSION / longestEdge;\n targetW = Math.round(width * scale);\n targetH = Math.round(height * scale);\n }\n\n const qualitySteps = [0.85, 0.8, 0.75, 0.65, 0.55, 0.5];\n for (const quality of qualitySteps) {\n const blob = await canvasToBlob(img, targetW, targetH, outputMime, quality);\n if (blob.size <= TARGET_SIZE) {\n return toResult(blob, file.name, outputMime, originalSize);\n }\n }\n\n const scaleSteps = [0.8, 0.65, 0.5, 0.4];\n for (const scale of scaleSteps) {\n const newW = Math.round(targetW * scale);\n const newH = Math.round(targetH * scale);\n const blob = await canvasToBlob(img, newW, newH, outputMime, 0.75);\n if (blob.size <= TARGET_SIZE) {\n return toResult(blob, file.name, outputMime, originalSize);\n }\n }\n\n const finalW = Math.round(targetW * 0.3);\n const finalH = Math.round(targetH * 0.3);\n const finalBlob = await canvasToBlob(img, finalW, finalH, outputMime, 0.5);\n return toResult(finalBlob, file.name, outputMime, originalSize);\n}\n\nexport function validateImageSize(file: File): string | null {\n if (file.size > ABSOLUTE_MAX_SIZE) {\n return `파일 크기가 너무 큽니다. (${(file.size / 1024 / 1024).toFixed(0)}MB, 최대 50MB)`;\n }\n if (SKIP_RESIZE_TYPES.includes(file.type) && file.size > GIF_MAX_SIZE) {\n return `GIF 파일은 5MB 이하만 업로드할 수 있습니다. (${(file.size / 1024 / 1024).toFixed(1)}MB)`;\n }\n return null;\n}\n\nfunction detectOutputMime(inputType: string): string {\n if (typeof document === \"undefined\") return \"image/jpeg\";\n const supportsWebP = document\n .createElement(\"canvas\")\n .toDataURL(\"image/webp\")\n .startsWith(\"data:image/webp\");\n if (supportsWebP) return \"image/webp\";\n return inputType === \"image/png\" ? \"image/jpeg\" : inputType || \"image/jpeg\";\n}\n\nfunction loadImage(file: File): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const url = URL.createObjectURL(file);\n img.onload = () => {\n URL.revokeObjectURL(url);\n resolve(img);\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error(\"이미지 로드에 실패했습니다. 파일이 손상되었을 수 있습니다.\"));\n };\n img.src = url;\n });\n}\n\nfunction canvasToBlob(\n img: HTMLImageElement,\n width: number,\n height: number,\n mime: string,\n quality: number\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n reject(new Error(\"이미지 처리에 실패했습니다.\"));\n return;\n }\n if (mime !== \"image/png\") {\n ctx.fillStyle = \"#FFFFFF\";\n ctx.fillRect(0, 0, width, height);\n }\n ctx.drawImage(img, 0, 0, width, height);\n canvas.toBlob(\n (blob) => {\n if (blob) resolve(blob);\n else reject(new Error(\"이미지 변환에 실패했습니다.\"));\n },\n mime,\n quality\n );\n });\n}\n\nfunction toResult(\n blob: Blob,\n originalName: string,\n mime: string,\n originalSize: number\n): ResizeResult {\n const ext =\n mime === \"image/jpeg\" ? \".jpg\" : mime === \"image/webp\" ? \".webp\" : \".png\";\n const baseName = originalName.replace(/\\.[^.]+$/, \"\");\n const file = new File([blob], `${baseName}${ext}`, { type: mime });\n return { file, wasResized: true, originalSize, newSize: blob.size };\n}\n"]}
@@ -0,0 +1,28 @@
1
+ // src/components/ToggleSwitch.tsx
2
+ import "./toggle-switch.css";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ function ToggleSwitch({
5
+ checked,
6
+ onChange,
7
+ label,
8
+ className = ""
9
+ }) {
10
+ return /* @__PURE__ */ jsxs("label", { className: `admin-toggle ${className}`, children: [
11
+ /* @__PURE__ */ jsx("span", { className: `admin-toggle-track ${checked ? "on" : ""}`, children: /* @__PURE__ */ jsx("span", { className: "admin-toggle-thumb" }) }),
12
+ label && /* @__PURE__ */ jsx("span", { className: "admin-toggle-label", children: label }),
13
+ /* @__PURE__ */ jsx(
14
+ "input",
15
+ {
16
+ type: "checkbox",
17
+ checked,
18
+ onChange: (e) => onChange(e.target.checked),
19
+ className: "admin-toggle-input"
20
+ }
21
+ )
22
+ ] });
23
+ }
24
+
25
+ export {
26
+ ToggleSwitch
27
+ };
28
+ //# sourceMappingURL=chunk-SMV5D5LO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ToggleSwitch.tsx"],"sourcesContent":["\"use client\";\n\nimport \"./toggle-switch.css\";\n\ninterface ToggleSwitchProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n label?: string;\n className?: string;\n}\n\nexport default function ToggleSwitch({\n checked,\n onChange,\n label,\n className = \"\",\n}: ToggleSwitchProps) {\n return (\n <label className={`admin-toggle ${className}`}>\n <span className={`admin-toggle-track ${checked ? \"on\" : \"\"}`}>\n <span className=\"admin-toggle-thumb\" />\n </span>\n {label && <span className=\"admin-toggle-label\">{label}</span>}\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n className=\"admin-toggle-input\"\n />\n </label>\n );\n}\n"],"mappings":";AAEA,OAAO;AAgBH,SAEI,KAFJ;AAPW,SAAR,aAA8B;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAAsB;AACpB,SACE,qBAAC,WAAM,WAAW,gBAAgB,SAAS,IACzC;AAAA,wBAAC,UAAK,WAAW,sBAAsB,UAAU,OAAO,EAAE,IACxD,8BAAC,UAAK,WAAU,sBAAqB,GACvC;AAAA,IACC,SAAS,oBAAC,UAAK,WAAU,sBAAsB,iBAAM;AAAA,IACtD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,OAAO;AAAA,QAC1C,WAAU;AAAA;AAAA,IACZ;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,60 @@
1
+ import {
2
+ resolveRouteConfig
3
+ } from "./chunk-BWKKHCDG.mjs";
4
+
5
+ // src/utils/admin-fetch.ts
6
+ var isRefreshing = false;
7
+ var refreshPromise = null;
8
+ function getAuthHeaders() {
9
+ return {};
10
+ }
11
+ async function refreshAccessToken() {
12
+ return tryRefreshCookie();
13
+ }
14
+ async function tryRefreshCookie() {
15
+ try {
16
+ const { refreshEndpoint } = resolveRouteConfig();
17
+ const res = await fetch(refreshEndpoint, {
18
+ method: "POST",
19
+ credentials: "same-origin"
20
+ });
21
+ if (!res.ok) return false;
22
+ const data = await res.json();
23
+ return data.success === true;
24
+ } catch {
25
+ return false;
26
+ }
27
+ }
28
+ async function tryRefresh() {
29
+ if (isRefreshing && refreshPromise) {
30
+ return refreshPromise;
31
+ }
32
+ isRefreshing = true;
33
+ refreshPromise = tryRefreshCookie().finally(() => {
34
+ isRefreshing = false;
35
+ refreshPromise = null;
36
+ });
37
+ return refreshPromise;
38
+ }
39
+ async function adminFetch(url, options = {}) {
40
+ const res = await fetch(url, {
41
+ ...options,
42
+ credentials: "same-origin"
43
+ });
44
+ if (res.status === 401 && typeof window !== "undefined") {
45
+ const refreshed = await tryRefresh();
46
+ if (refreshed) {
47
+ return fetch(url, { ...options, credentials: "same-origin" });
48
+ }
49
+ const { loginPath } = resolveRouteConfig();
50
+ window.location.href = loginPath;
51
+ }
52
+ return res;
53
+ }
54
+
55
+ export {
56
+ getAuthHeaders,
57
+ refreshAccessToken,
58
+ adminFetch
59
+ };
60
+ //# sourceMappingURL=chunk-T7EVFD4G.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/admin-fetch.ts"],"sourcesContent":["import { resolveRouteConfig } from '../config';\n\nlet isRefreshing = false;\nlet refreshPromise: Promise<boolean> | null = null;\n\n/**\n * @deprecated Auth is now handled via httpOnly cookies. Returns empty headers.\n */\nexport function getAuthHeaders(): Record<string, string> {\n return {};\n}\n\n/**\n * @deprecated Auth is now handled via httpOnly cookies.\n */\nexport async function refreshAccessToken(): Promise<boolean> {\n return tryRefreshCookie();\n}\n\nasync function tryRefreshCookie(): Promise<boolean> {\n try {\n // refresh 엔드포인트는 §5 config boundary 에서 해석된다 (consumer\n // override 가능; 미설정 시 레거시 기본 경로 — spec.md §4.1 C2 / B5).\n const { refreshEndpoint } = resolveRouteConfig();\n const res = await fetch(refreshEndpoint, {\n method: 'POST',\n credentials: 'same-origin',\n });\n\n if (!res.ok) return false;\n\n const data = await res.json();\n return data.success === true;\n } catch {\n return false;\n }\n}\n\nasync function tryRefresh(): Promise<boolean> {\n if (isRefreshing && refreshPromise) {\n return refreshPromise;\n }\n\n isRefreshing = true;\n refreshPromise = tryRefreshCookie().finally(() => {\n isRefreshing = false;\n refreshPromise = null;\n });\n\n return refreshPromise;\n}\n\nexport async function adminFetch(\n url: string,\n options: RequestInit = {},\n): Promise<Response> {\n const res = await fetch(url, {\n ...options,\n credentials: 'same-origin',\n });\n\n if (res.status === 401 && typeof window !== 'undefined') {\n const refreshed = await tryRefresh();\n\n if (refreshed) {\n return fetch(url, { ...options, credentials: 'same-origin' });\n }\n\n // login 페이지 경로도 §5 config boundary 에서 해석된다.\n const { loginPath } = resolveRouteConfig();\n window.location.href = loginPath;\n }\n\n return res;\n}\n"],"mappings":";;;;;AAEA,IAAI,eAAe;AACnB,IAAI,iBAA0C;AAKvC,SAAS,iBAAyC;AACvD,SAAO,CAAC;AACV;AAKA,eAAsB,qBAAuC;AAC3D,SAAO,iBAAiB;AAC1B;AAEA,eAAe,mBAAqC;AAClD,MAAI;AAGF,UAAM,EAAE,gBAAgB,IAAI,mBAAmB;AAC/C,UAAM,MAAM,MAAM,MAAM,iBAAiB;AAAA,MACvC,QAAQ;AAAA,MACR,aAAa;AAAA,IACf,CAAC;AAED,QAAI,CAAC,IAAI,GAAI,QAAO;AAEpB,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,WAAO,KAAK,YAAY;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,aAA+B;AAC5C,MAAI,gBAAgB,gBAAgB;AAClC,WAAO;AAAA,EACT;AAEA,iBAAe;AACf,mBAAiB,iBAAiB,EAAE,QAAQ,MAAM;AAChD,mBAAe;AACf,qBAAiB;AAAA,EACnB,CAAC;AAED,SAAO;AACT;AAEA,eAAsB,WACpB,KACA,UAAuB,CAAC,GACL;AACnB,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,GAAG;AAAA,IACH,aAAa;AAAA,EACf,CAAC;AAED,MAAI,IAAI,WAAW,OAAO,OAAO,WAAW,aAAa;AACvD,UAAM,YAAY,MAAM,WAAW;AAEnC,QAAI,WAAW;AACb,aAAO,MAAM,KAAK,EAAE,GAAG,SAAS,aAAa,cAAc,CAAC;AAAA,IAC9D;AAGA,UAAM,EAAE,UAAU,IAAI,mBAAmB;AACzC,WAAO,SAAS,OAAO;AAAA,EACzB;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-TLH3V4SY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,10 @@
1
+ // src/utils/route-params.ts
2
+ async function getRouteParam(props, key) {
3
+ const { [key]: value } = await props.params;
4
+ return value;
5
+ }
6
+
7
+ export {
8
+ getRouteParam
9
+ };
10
+ //# sourceMappingURL=chunk-TUQ2CVAK.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/route-params.ts"],"sourcesContent":["export async function getRouteParam<K extends string>(\n props: unknown,\n key: K,\n): Promise<string> {\n const { [key]: value } = await (props as { params: Promise<Record<K, string>> }).params;\n return value;\n}\n"],"mappings":";AAAA,eAAsB,cACpB,OACA,KACiB;AACjB,QAAM,EAAE,CAAC,GAAG,GAAG,MAAM,IAAI,MAAO,MAAiD;AACjF,SAAO;AACT;","names":[]}
@@ -0,0 +1,51 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/hooks/useScrollReveal.ts
2
+ var _react = require('react');
3
+ function useScrollReveal() {
4
+ const ref = _react.useRef.call(void 0, null);
5
+ _react.useEffect.call(void 0, () => {
6
+ const el = ref.current;
7
+ if (!el) return;
8
+ el.classList.add("scroll-reveal");
9
+ const observer = new IntersectionObserver(
10
+ (entries) => {
11
+ entries.forEach((entry) => {
12
+ if (entry.isIntersecting) {
13
+ entry.target.classList.add("scroll-reveal--visible");
14
+ observer.unobserve(entry.target);
15
+ }
16
+ });
17
+ },
18
+ { threshold: 0.1, rootMargin: "0px 0px -50px 0px" }
19
+ );
20
+ observer.observe(el);
21
+ return () => observer.disconnect();
22
+ }, []);
23
+ return ref;
24
+ }
25
+ function useScrollRevealAll(selector) {
26
+ _react.useEffect.call(void 0, () => {
27
+ const elements = document.querySelectorAll(selector);
28
+ elements.forEach((el) => {
29
+ el.classList.add("scroll-reveal");
30
+ });
31
+ const observer = new IntersectionObserver(
32
+ (entries) => {
33
+ entries.forEach((entry) => {
34
+ if (entry.isIntersecting) {
35
+ entry.target.classList.add("scroll-reveal--visible");
36
+ observer.unobserve(entry.target);
37
+ }
38
+ });
39
+ },
40
+ { threshold: 0.1, rootMargin: "0px 0px -50px 0px" }
41
+ );
42
+ elements.forEach((el) => observer.observe(el));
43
+ return () => observer.disconnect();
44
+ }, [selector]);
45
+ }
46
+
47
+
48
+
49
+
50
+ exports.useScrollReveal = useScrollReveal; exports.useScrollRevealAll = useScrollRevealAll;
51
+ //# sourceMappingURL=chunk-U6PVJKTB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-U6PVJKTB.js","../src/hooks/useScrollReveal.ts"],"names":[],"mappings":"AAAA;ACEA,8BAAkC;AAE3B,SAAS,eAAA,CAAA,EAAyC;AACvD,EAAA,MAAM,IAAA,EAAM,2BAAA,IAAc,CAAA;AAE1B,EAAA,8BAAA,CAAU,EAAA,GAAM;AACd,IAAA,MAAM,GAAA,EAAK,GAAA,CAAI,OAAA;AACf,IAAA,GAAA,CAAI,CAAC,EAAA,EAAI,MAAA;AAET,IAAA,EAAA,CAAG,SAAA,CAAU,GAAA,CAAI,eAAe,CAAA;AAEhC,IAAA,MAAM,SAAA,EAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,OAAA,EAAA,GAAY;AACX,QAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAA,GAAU;AACzB,UAAA,GAAA,CAAI,KAAA,CAAM,cAAA,EAAgB;AACxB,YAAA,KAAA,CAAM,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,wBAAwB,CAAA;AACnD,YAAA,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,MAAM,CAAA;AAAA,UACjC;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAAA,MACA,EAAE,SAAA,EAAW,GAAA,EAAK,UAAA,EAAY,oBAAoB;AAAA,IACpD,CAAA;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,EAAE,CAAA;AACnB,IAAA,OAAO,CAAA,EAAA,GAAM,QAAA,CAAS,UAAA,CAAW,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,CAAC,CAAA;AAEL,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,kBAAA,CAAmB,QAAA,EAAkB;AACnD,EAAA,8BAAA,CAAU,EAAA,GAAM;AACd,IAAA,MAAM,SAAA,EAAW,QAAA,CAAS,gBAAA,CAAiB,QAAQ,CAAA;AAEnD,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,EAAA,EAAA,GAAO;AACvB,MAAA,EAAA,CAAG,SAAA,CAAU,GAAA,CAAI,eAAe,CAAA;AAAA,IAClC,CAAC,CAAA;AAED,IAAA,MAAM,SAAA,EAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,OAAA,EAAA,GAAY;AACX,QAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAA,GAAU;AACzB,UAAA,GAAA,CAAI,KAAA,CAAM,cAAA,EAAgB;AACxB,YAAA,KAAA,CAAM,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,wBAAwB,CAAA;AACnD,YAAA,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,MAAM,CAAA;AAAA,UACjC;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAAA,MACA,EAAE,SAAA,EAAW,GAAA,EAAK,UAAA,EAAY,oBAAoB;AAAA,IACpD,CAAA;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,EAAA,EAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,EAAE,CAAC,CAAA;AAC7C,IAAA,OAAO,CAAA,EAAA,GAAM,QAAA,CAAS,UAAA,CAAW,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACf;ADVA;AACA;AACE;AACA;AACF,2FAAC","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-U6PVJKTB.js","sourcesContent":[null,"'use client';\n\nimport { useEffect, useRef } from 'react';\n\nexport function useScrollReveal<T extends HTMLElement>() {\n const ref = useRef<T>(null);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n el.classList.add('scroll-reveal');\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n entry.target.classList.add('scroll-reveal--visible');\n observer.unobserve(entry.target);\n }\n });\n },\n { threshold: 0.1, rootMargin: '0px 0px -50px 0px' },\n );\n\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n return ref;\n}\n\nexport function useScrollRevealAll(selector: string) {\n useEffect(() => {\n const elements = document.querySelectorAll(selector);\n\n elements.forEach((el) => {\n el.classList.add('scroll-reveal');\n });\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n entry.target.classList.add('scroll-reveal--visible');\n observer.unobserve(entry.target);\n }\n });\n },\n { threshold: 0.1, rootMargin: '0px 0px -50px 0px' },\n );\n\n elements.forEach((el) => observer.observe(el));\n return () => observer.disconnect();\n }, [selector]);\n}\n"]}
@@ -0,0 +1,27 @@
1
+ // src/utils/date.ts
2
+ var pad = (n) => String(n).padStart(2, "0");
3
+ function toLocalDatetime(iso) {
4
+ if (!iso) return "";
5
+ const d = new Date(iso);
6
+ if (isNaN(d.getTime())) return "";
7
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
8
+ }
9
+ function formatDateTime(date) {
10
+ if (!date) return "-";
11
+ const d = new Date(date);
12
+ if (isNaN(d.getTime())) return "-";
13
+ return `${d.getFullYear()}.${pad(d.getMonth() + 1)}.${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;
14
+ }
15
+ function formatDate(date) {
16
+ if (!date) return "-";
17
+ const d = new Date(date);
18
+ if (isNaN(d.getTime())) return "-";
19
+ return `${d.getFullYear()}.${pad(d.getMonth() + 1)}.${pad(d.getDate())}`;
20
+ }
21
+
22
+ export {
23
+ toLocalDatetime,
24
+ formatDateTime,
25
+ formatDate
26
+ };
27
+ //# sourceMappingURL=chunk-UXMMEEX4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/date.ts"],"sourcesContent":["const pad = (n: number) => String(n).padStart(2, '0');\n\nexport function toLocalDatetime(iso: string | null): string {\n if (!iso) return '';\n const d = new Date(iso);\n if (isNaN(d.getTime())) return '';\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;\n}\n\nexport function formatDateTime(date: string | null): string {\n if (!date) return '-';\n const d = new Date(date);\n if (isNaN(d.getTime())) return '-';\n return `${d.getFullYear()}.${pad(d.getMonth() + 1)}.${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;\n}\n\nexport function formatDate(date: string | null): string {\n if (!date) return '-';\n const d = new Date(date);\n if (isNaN(d.getTime())) return '-';\n return `${d.getFullYear()}.${pad(d.getMonth() + 1)}.${pad(d.getDate())}`;\n}\n"],"mappings":";AAAA,IAAM,MAAM,CAAC,MAAc,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAE7C,SAAS,gBAAgB,KAA4B;AAC1D,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,IAAI,KAAK,GAAG;AACtB,MAAI,MAAM,EAAE,QAAQ,CAAC,EAAG,QAAO;AAC/B,SAAO,GAAG,EAAE,YAAY,CAAC,IAAI,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,CAAC;AACpH;AAEO,SAAS,eAAe,MAA6B;AAC1D,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,IAAI,IAAI,KAAK,IAAI;AACvB,MAAI,MAAM,EAAE,QAAQ,CAAC,EAAG,QAAO;AAC/B,SAAO,GAAG,EAAE,YAAY,CAAC,IAAI,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,CAAC;AACpH;AAEO,SAAS,WAAW,MAA6B;AACtD,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,IAAI,IAAI,KAAK,IAAI;AACvB,MAAI,MAAM,EAAE,QAAQ,CAAC,EAAG,QAAO;AAC/B,SAAO,GAAG,EAAE,YAAY,CAAC,IAAI,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,QAAQ,CAAC,CAAC;AACxE;","names":[]}
@@ -0,0 +1,44 @@
1
+ // src/utils/api-helpers.ts
2
+ import { NextResponse } from "next/server";
3
+ function validateIds(ids) {
4
+ if (!Array.isArray(ids) || ids.length === 0) {
5
+ return {
6
+ valid: false,
7
+ response: NextResponse.json(
8
+ { success: false, error: { message: "No ids provided" } },
9
+ { status: 400 }
10
+ )
11
+ };
12
+ }
13
+ return { valid: true, ids };
14
+ }
15
+ function validateAndParse(schema, data) {
16
+ const result = schema.safeParse(data);
17
+ if (!result.success) {
18
+ return {
19
+ success: false,
20
+ response: NextResponse.json(
21
+ {
22
+ success: false,
23
+ error: {
24
+ message: result.error.issues[0]?.message || "Validation error",
25
+ details: { issues: result.error.issues }
26
+ }
27
+ },
28
+ { status: 400 }
29
+ )
30
+ };
31
+ }
32
+ return { success: true, data: result.data };
33
+ }
34
+ function parseSortKey(searchParams, validKeys, defaultKey) {
35
+ const param = searchParams.get("sortBy");
36
+ return validKeys.includes(param ?? "") ? param : defaultKey;
37
+ }
38
+
39
+ export {
40
+ validateIds,
41
+ validateAndParse,
42
+ parseSortKey
43
+ };
44
+ //# sourceMappingURL=chunk-VVXNFFKI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/api-helpers.ts"],"sourcesContent":["import { NextResponse } from 'next/server';\nimport type { ZodSchema } from 'zod';\n\nexport function validateIds(ids: unknown): { valid: true; ids: string[] } | { valid: false; response: NextResponse } {\n if (!Array.isArray(ids) || ids.length === 0) {\n return {\n valid: false,\n response: NextResponse.json(\n { success: false, error: { message: 'No ids provided' } },\n { status: 400 },\n ),\n };\n }\n return { valid: true, ids };\n}\n\nexport function validateAndParse<T>(\n schema: ZodSchema<T>,\n data: unknown,\n): { success: true; data: T } | { success: false; response: NextResponse } {\n const result = schema.safeParse(data);\n if (!result.success) {\n return {\n success: false,\n response: NextResponse.json(\n {\n success: false,\n error: {\n message: result.error.issues[0]?.message || 'Validation error',\n details: { issues: result.error.issues },\n },\n },\n { status: 400 },\n ),\n };\n }\n return { success: true, data: result.data };\n}\n\nexport function parseSortKey<T extends string>(\n searchParams: URLSearchParams,\n validKeys: readonly T[],\n defaultKey: T,\n): T {\n const param = searchParams.get('sortBy');\n return (validKeys as readonly string[]).includes(param ?? '') ? (param as T) : defaultKey;\n}\n"],"mappings":";AAAA,SAAS,oBAAoB;AAGtB,SAAS,YAAY,KAAyF;AACnH,MAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,WAAW,GAAG;AAC3C,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU,aAAa;AAAA,QACrB,EAAE,SAAS,OAAO,OAAO,EAAE,SAAS,kBAAkB,EAAE;AAAA,QACxD,EAAE,QAAQ,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,OAAO,MAAM,IAAI;AAC5B;AAEO,SAAS,iBACd,QACA,MACyE;AACzE,QAAM,SAAS,OAAO,UAAU,IAAI;AACpC,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,aAAa;AAAA,QACrB;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,YACL,SAAS,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW;AAAA,YAC5C,SAAS,EAAE,QAAQ,OAAO,MAAM,OAAO;AAAA,UACzC;AAAA,QACF;AAAA,QACA,EAAE,QAAQ,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,SAAS,MAAM,MAAM,OAAO,KAAK;AAC5C;AAEO,SAAS,aACd,cACA,WACA,YACG;AACH,QAAM,QAAQ,aAAa,IAAI,QAAQ;AACvC,SAAQ,UAAgC,SAAS,SAAS,EAAE,IAAK,QAAc;AACjF;","names":[]}
@@ -0,0 +1,28 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/components/ToggleSwitch.tsx
2
+ require('./toggle-switch.css');
3
+ var _jsxruntime = require('react/jsx-runtime');
4
+ function ToggleSwitch({
5
+ checked,
6
+ onChange,
7
+ label,
8
+ className = ""
9
+ }) {
10
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "label", { className: `admin-toggle ${className}`, children: [
11
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: `admin-toggle-track ${checked ? "on" : ""}`, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "admin-toggle-thumb" }) }),
12
+ label && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "admin-toggle-label", children: label }),
13
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
14
+ "input",
15
+ {
16
+ type: "checkbox",
17
+ checked,
18
+ onChange: (e) => onChange(e.target.checked),
19
+ className: "admin-toggle-input"
20
+ }
21
+ )
22
+ ] });
23
+ }
24
+
25
+
26
+
27
+ exports.ToggleSwitch = ToggleSwitch;
28
+ //# sourceMappingURL=chunk-VZZ3RU3Q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-VZZ3RU3Q.js","../src/components/ToggleSwitch.tsx"],"names":[],"mappings":"AAAA;ACEA,+BAAO;AAgBH,+CAAA;AAPW,SAAR,YAAA,CAA8B;AAAA,EACnC,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAsB;AACpB,EAAA,uBACE,8BAAA,OAAC,EAAA,EAAM,SAAA,EAAW,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA;AACQ,oBAAA;AAGD,IAAA;AAChD,oBAAA;AAAC,MAAA;AAAA,MAAA;AACM,QAAA;AACL,QAAA;AAC0C,QAAA;AAChC,QAAA;AAAA,MAAA;AACZ,IAAA;AACF,EAAA;AAEJ;ADR8E;AACA;AACA;AACA","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-VZZ3RU3Q.js","sourcesContent":[null,"\"use client\";\n\nimport \"./toggle-switch.css\";\n\ninterface ToggleSwitchProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n label?: string;\n className?: string;\n}\n\nexport default function ToggleSwitch({\n checked,\n onChange,\n label,\n className = \"\",\n}: ToggleSwitchProps) {\n return (\n <label className={`admin-toggle ${className}`}>\n <span className={`admin-toggle-track ${checked ? \"on\" : \"\"}`}>\n <span className=\"admin-toggle-thumb\" />\n </span>\n {label && <span className=\"admin-toggle-label\">{label}</span>}\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n className=\"admin-toggle-input\"\n />\n </label>\n );\n}\n"]}
@@ -0,0 +1,34 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkEG6NVPP2js = require('./chunk-EG6NVPP2.js');
4
+
5
+ // src/utils/jwt.ts
6
+ var _jwt = require('@withwiz/toolkit/core/auth/jwt');
7
+ var _logger = require('@withwiz/toolkit/core/logger/logger');
8
+ var _jwtManager = null;
9
+ function getJWTManager() {
10
+ if (!_jwtManager) {
11
+ const { secret, accessTokenExpiry, refreshTokenExpiry, algorithm } = _chunkEG6NVPP2js.resolveJwtConfig.call(void 0, );
12
+ _jwtManager = new (0, _jwt.JWTManager)(
13
+ {
14
+ secret,
15
+ accessTokenExpiry,
16
+ refreshTokenExpiry,
17
+ algorithm
18
+ },
19
+ {
20
+ debug: () => {
21
+ },
22
+ info: (msg, meta) => _logger.logInfo.call(void 0, `[JWT] ${msg}`, meta),
23
+ warn: (msg, meta) => _logger.logInfo.call(void 0, `[JWT] ${msg}`, meta),
24
+ error: (msg, meta) => _logger.logError.call(void 0, `[JWT] ${msg}`, meta)
25
+ }
26
+ );
27
+ }
28
+ return _jwtManager;
29
+ }
30
+
31
+
32
+
33
+ exports.getJWTManager = getJWTManager;
34
+ //# sourceMappingURL=chunk-W4FWIZ2Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-W4FWIZ2Y.js","../src/utils/jwt.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;ACJA,qDAA2B;AAC3B,6DAAkC;AAGlC,IAAI,YAAA,EAAiC,IAAA;AAgB9B,SAAS,aAAA,CAAA,EAA4B;AAC1C,EAAA,GAAA,CAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,EAAE,MAAA,EAAQ,iBAAA,EAAmB,kBAAA,EAAoB,UAAU,EAAA,EAC/D,+CAAA,CAAiB;AACnB,IAAA,YAAA,EAAc,IAAI,oBAAA;AAAA,MAChB;AAAA,QACE,MAAA;AAAA,QACA,iBAAA;AAAA,QACA,kBAAA;AAAA,QACA;AAAA,MACF,CAAA;AAAA,MACA;AAAA,QACE,KAAA,EAAO,CAAA,EAAA,GAAM;AAAA,QAAC,CAAA;AAAA,QACd,IAAA,EAAM,CAAC,GAAA,EAAa,IAAA,EAAA,GAAe,6BAAA,CAAQ,MAAA,EAAS,GAAG,CAAA,CAAA;AACA,QAAA;AACD,QAAA;AACxD,MAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;ADXkD;AACA;AACA;AACA","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-W4FWIZ2Y.js","sourcesContent":[null,"import { JWTManager } from '@withwiz/toolkit/core/auth/jwt';\nimport { logInfo, logError } from '@withwiz/toolkit/core/logger/logger';\nimport { resolveJwtConfig } from '../config';\n\nlet _jwtManager: JWTManager | null = null;\n\n/**\n * JWT 매니저 싱글턴 (spec.md §4.6 / §4.3 / Sprint 1 S3).\n *\n * secret/expiry/algorithm 은 §5 config boundary (`resolveJwtConfig`) 를 통해\n * 해석된다: 명시적 주입 > `process.env.JWT_SECRET` 레거시 fallback > (서명\n * 비밀에는 안전한 기본값이 없음 → point-of-use fail-fast).\n *\n * - 비밀 누락: `@withwiz/cms-kit:` 네임스페이스 에러로 즉시 throw (undefined 로\n * 조용히 JWTManager 를 만들지 않는다).\n * - 비밀 취약(<32자, 문서화 정책): `@withwiz/cms-kit:` 네임스페이스 에러로 거부\n * (forgeable 서명 키는 unsafe-no-safe-default).\n * - import 만으로는 절대 throw 하지 않는다 (lazy / point-of-use).\n * 기존의 JWT_SECRET non-null 단정(bang) 직접 접근은 제거되었다.\n */\nexport function getJWTManager(): JWTManager {\n if (!_jwtManager) {\n const { secret, accessTokenExpiry, refreshTokenExpiry, algorithm } =\n resolveJwtConfig();\n _jwtManager = new JWTManager(\n {\n secret,\n accessTokenExpiry,\n refreshTokenExpiry,\n algorithm,\n },\n {\n debug: () => {},\n info: (msg: string, meta?: any) => logInfo(`[JWT] ${msg}`, meta),\n warn: (msg: string, meta?: any) => logInfo(`[JWT] ${msg}`, meta),\n error: (msg: string, meta?: any) => logError(`[JWT] ${msg}`, meta),\n },\n );\n }\n return _jwtManager;\n}\n"]}