@kurly-growth/growthman 0.1.1 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +12 -0
  3. package/.next/build/chunks/8e02f_b5d23412._.js +6758 -0
  4. package/.next/build/chunks/8e02f_b5d23412._.js.map +47 -0
  5. package/.next/build/chunks/[root-of-the-server]__310ad51a._.js +206 -0
  6. package/.next/build/chunks/[root-of-the-server]__310ad51a._.js.map +8 -0
  7. package/.next/build/chunks/[root-of-the-server]__8e2c0d87._.js +500 -0
  8. package/.next/build/chunks/[root-of-the-server]__8e2c0d87._.js.map +11 -0
  9. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_5040861e._.js +13 -0
  10. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_5040861e._.js.map +5 -0
  11. package/.next/build/chunks/[turbopack]_runtime.js +795 -0
  12. package/.next/build/chunks/[turbopack]_runtime.js.map +10 -0
  13. package/.next/build/package.json +1 -0
  14. package/.next/build/postcss.js +6 -0
  15. package/.next/build/postcss.js.map +5 -0
  16. package/.next/build-manifest.json +19 -0
  17. package/.next/diagnostics/build-diagnostics.json +6 -0
  18. package/.next/diagnostics/framework.json +1 -0
  19. package/.next/export-marker.json +6 -0
  20. package/.next/fallback-build-manifest.json +12 -0
  21. package/.next/images-manifest.json +66 -0
  22. package/.next/next-minimal-server.js.nft.json +1 -0
  23. package/.next/next-server.js.nft.json +1 -0
  24. package/.next/package.json +1 -0
  25. package/.next/prerender-manifest.json +114 -0
  26. package/.next/required-server-files.js +163 -0
  27. package/.next/required-server-files.json +163 -0
  28. package/.next/routes-manifest.json +109 -0
  29. package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  30. package/.next/server/app/_global-error/page/build-manifest.json +16 -0
  31. package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  32. package/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  33. package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  34. package/.next/server/app/_global-error/page.js +11 -0
  35. package/.next/server/app/_global-error/page.js.map +5 -0
  36. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  37. package/.next/server/app/_global-error/page_client-reference-manifest.js +2 -0
  38. package/.next/server/app/_global-error.html +2 -0
  39. package/.next/server/app/_global-error.meta +15 -0
  40. package/.next/server/app/_global-error.rsc +13 -0
  41. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  42. package/.next/server/app/_global-error.segments/_full.segment.rsc +13 -0
  43. package/.next/server/app/_global-error.segments/_head.segment.rsc +6 -0
  44. package/.next/server/app/_global-error.segments/_index.segment.rsc +4 -0
  45. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  46. package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  47. package/.next/server/app/_not-found/page/build-manifest.json +16 -0
  48. package/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
  49. package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  50. package/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  51. package/.next/server/app/_not-found/page.js +14 -0
  52. package/.next/server/app/_not-found/page.js.map +5 -0
  53. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  54. package/.next/server/app/_not-found/page_client-reference-manifest.js +2 -0
  55. package/.next/server/app/_not-found.html +1 -0
  56. package/.next/server/app/_not-found.meta +16 -0
  57. package/.next/server/app/_not-found.rsc +15 -0
  58. package/.next/server/app/_not-found.segments/_full.segment.rsc +15 -0
  59. package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  60. package/.next/server/app/_not-found.segments/_index.segment.rsc +6 -0
  61. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  62. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +4 -0
  63. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
  64. package/.next/server/app/api/endpoints/[id]/route/app-paths-manifest.json +3 -0
  65. package/.next/server/app/api/endpoints/[id]/route/build-manifest.json +11 -0
  66. package/.next/server/app/api/endpoints/[id]/route/server-reference-manifest.json +4 -0
  67. package/.next/server/app/api/endpoints/[id]/route.js +7 -0
  68. package/.next/server/app/api/endpoints/[id]/route.js.map +5 -0
  69. package/.next/server/app/api/endpoints/[id]/route.js.nft.json +1 -0
  70. package/.next/server/app/api/endpoints/[id]/route_client-reference-manifest.js +2 -0
  71. package/.next/server/app/api/endpoints/bulk/route/app-paths-manifest.json +3 -0
  72. package/.next/server/app/api/endpoints/bulk/route/build-manifest.json +11 -0
  73. package/.next/server/app/api/endpoints/bulk/route/server-reference-manifest.json +4 -0
  74. package/.next/server/app/api/endpoints/bulk/route.js +7 -0
  75. package/.next/server/app/api/endpoints/bulk/route.js.map +5 -0
  76. package/.next/server/app/api/endpoints/bulk/route.js.nft.json +1 -0
  77. package/.next/server/app/api/endpoints/bulk/route_client-reference-manifest.js +2 -0
  78. package/.next/server/app/api/endpoints/import/route/app-paths-manifest.json +3 -0
  79. package/.next/server/app/api/endpoints/import/route/build-manifest.json +11 -0
  80. package/.next/server/app/api/endpoints/import/route/server-reference-manifest.json +4 -0
  81. package/.next/server/app/api/endpoints/import/route.js +7 -0
  82. package/.next/server/app/api/endpoints/import/route.js.map +5 -0
  83. package/.next/server/app/api/endpoints/import/route.js.nft.json +1 -0
  84. package/.next/server/app/api/endpoints/import/route_client-reference-manifest.js +2 -0
  85. package/.next/server/app/api/endpoints/route/app-paths-manifest.json +3 -0
  86. package/.next/server/app/api/endpoints/route/build-manifest.json +11 -0
  87. package/.next/server/app/api/endpoints/route/server-reference-manifest.json +4 -0
  88. package/.next/server/app/api/endpoints/route.js +7 -0
  89. package/.next/server/app/api/endpoints/route.js.map +5 -0
  90. package/.next/server/app/api/endpoints/route.js.nft.json +1 -0
  91. package/.next/server/app/api/endpoints/route_client-reference-manifest.js +2 -0
  92. package/.next/server/app/api/endpoints/sync/route/app-paths-manifest.json +3 -0
  93. package/.next/server/app/api/endpoints/sync/route/build-manifest.json +11 -0
  94. package/.next/server/app/api/endpoints/sync/route/server-reference-manifest.json +4 -0
  95. package/.next/server/app/api/endpoints/sync/route.js +7 -0
  96. package/.next/server/app/api/endpoints/sync/route.js.map +5 -0
  97. package/.next/server/app/api/endpoints/sync/route.js.nft.json +1 -0
  98. package/.next/server/app/api/endpoints/sync/route_client-reference-manifest.js +2 -0
  99. package/.next/server/app/api/mock/[...slug]/route/app-paths-manifest.json +3 -0
  100. package/.next/server/app/api/mock/[...slug]/route/build-manifest.json +11 -0
  101. package/.next/server/app/api/mock/[...slug]/route/server-reference-manifest.json +4 -0
  102. package/.next/server/app/api/mock/[...slug]/route.js +8 -0
  103. package/.next/server/app/api/mock/[...slug]/route.js.map +5 -0
  104. package/.next/server/app/api/mock/[...slug]/route.js.nft.json +1 -0
  105. package/.next/server/app/api/mock/[...slug]/route_client-reference-manifest.js +2 -0
  106. package/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
  107. package/.next/server/app/favicon.ico/route/build-manifest.json +11 -0
  108. package/.next/server/app/favicon.ico/route.js +7 -0
  109. package/.next/server/app/favicon.ico/route.js.map +5 -0
  110. package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  111. package/.next/server/app/favicon.ico.meta +1 -0
  112. package/.next/server/app/index.html +1 -0
  113. package/.next/server/app/index.meta +14 -0
  114. package/.next/server/app/index.rsc +21 -0
  115. package/.next/server/app/index.segments/__PAGE__.segment.rsc +9 -0
  116. package/.next/server/app/index.segments/_full.segment.rsc +21 -0
  117. package/.next/server/app/index.segments/_head.segment.rsc +6 -0
  118. package/.next/server/app/index.segments/_index.segment.rsc +6 -0
  119. package/.next/server/app/index.segments/_tree.segment.rsc +4 -0
  120. package/.next/server/app/page/app-paths-manifest.json +3 -0
  121. package/.next/server/app/page/build-manifest.json +16 -0
  122. package/.next/server/app/page/next-font-manifest.json +11 -0
  123. package/.next/server/app/page/react-loadable-manifest.json +8 -0
  124. package/.next/server/app/page/server-reference-manifest.json +4 -0
  125. package/.next/server/app/page.js +16 -0
  126. package/.next/server/app/page.js.map +5 -0
  127. package/.next/server/app/page.js.nft.json +1 -0
  128. package/.next/server/app/page_client-reference-manifest.js +2 -0
  129. package/.next/server/app-paths-manifest.json +12 -0
  130. package/.next/server/chunks/4c6d9__next-internal_server_app_api_endpoints_[id]_route_actions_9be426d4.js +3 -0
  131. package/.next/server/chunks/4c6d9__next-internal_server_app_api_endpoints_[id]_route_actions_9be426d4.js.map +1 -0
  132. package/.next/server/chunks/4c6d9__next-internal_server_app_api_endpoints_bulk_route_actions_e28c0cd3.js +3 -0
  133. package/.next/server/chunks/4c6d9__next-internal_server_app_api_endpoints_bulk_route_actions_e28c0cd3.js.map +1 -0
  134. package/.next/server/chunks/4c6d9__next-internal_server_app_api_endpoints_import_route_actions_89a982f4.js +3 -0
  135. package/.next/server/chunks/4c6d9__next-internal_server_app_api_endpoints_import_route_actions_89a982f4.js.map +1 -0
  136. package/.next/server/chunks/4c6d9__next-internal_server_app_api_endpoints_route_actions_0c151162.js +3 -0
  137. package/.next/server/chunks/4c6d9__next-internal_server_app_api_endpoints_route_actions_0c151162.js.map +1 -0
  138. package/.next/server/chunks/4c6d9__next-internal_server_app_api_endpoints_sync_route_actions_3051349a.js +3 -0
  139. package/.next/server/chunks/4c6d9__next-internal_server_app_api_endpoints_sync_route_actions_3051349a.js.map +1 -0
  140. package/.next/server/chunks/4c6d9__next-internal_server_app_api_mock_[___slug]_route_actions_521def8c.js +3 -0
  141. package/.next/server/chunks/4c6d9__next-internal_server_app_api_mock_[___slug]_route_actions_521def8c.js.map +1 -0
  142. package/.next/server/chunks/8e02f_529f6098._.js +3 -0
  143. package/.next/server/chunks/8e02f_529f6098._.js.map +1 -0
  144. package/.next/server/chunks/8e02f_next_dist_esm_build_templates_app-route_2d5d7dcf.js +3 -0
  145. package/.next/server/chunks/8e02f_next_dist_esm_build_templates_app-route_2d5d7dcf.js.map +1 -0
  146. package/.next/server/chunks/[externals]__cf2ccb51._.js +3 -0
  147. package/.next/server/chunks/[externals]__cf2ccb51._.js.map +1 -0
  148. package/.next/server/chunks/[externals]_next_dist_8dbe5856._.js +3 -0
  149. package/.next/server/chunks/[externals]_next_dist_8dbe5856._.js.map +1 -0
  150. package/.next/server/chunks/[root-of-the-server]__05641340._.js +3 -0
  151. package/.next/server/chunks/[root-of-the-server]__05641340._.js.map +1 -0
  152. package/.next/server/chunks/[root-of-the-server]__40089159._.js +3 -0
  153. package/.next/server/chunks/[root-of-the-server]__40089159._.js.map +1 -0
  154. package/.next/server/chunks/[root-of-the-server]__84981507._.js +3 -0
  155. package/.next/server/chunks/[root-of-the-server]__84981507._.js.map +1 -0
  156. package/.next/server/chunks/[root-of-the-server]__88f1e82c._.js +21 -0
  157. package/.next/server/chunks/[root-of-the-server]__88f1e82c._.js.map +1 -0
  158. package/.next/server/chunks/[root-of-the-server]__9f34b8fa._.js +129 -0
  159. package/.next/server/chunks/[root-of-the-server]__9f34b8fa._.js.map +1 -0
  160. package/.next/server/chunks/[root-of-the-server]__a0785728._.js +3 -0
  161. package/.next/server/chunks/[root-of-the-server]__a0785728._.js.map +1 -0
  162. package/.next/server/chunks/[root-of-the-server]__c49c53b0._.js +3 -0
  163. package/.next/server/chunks/[root-of-the-server]__c49c53b0._.js.map +1 -0
  164. package/.next/server/chunks/[turbopack]_runtime.js +795 -0
  165. package/.next/server/chunks/[turbopack]_runtime.js.map +10 -0
  166. package/.next/server/chunks/ced06_growth-mock-server__next-internal_server_app_favicon_ico_route_actions_b931e89c.js +3 -0
  167. package/.next/server/chunks/ced06_growth-mock-server__next-internal_server_app_favicon_ico_route_actions_b931e89c.js.map +1 -0
  168. package/.next/server/chunks/ssr/3d860_Project_Web_growth-mock-server__next-internal_server_app_page_actions_a455ccb7.js +3 -0
  169. package/.next/server/chunks/ssr/3d860_Project_Web_growth-mock-server__next-internal_server_app_page_actions_a455ccb7.js.map +1 -0
  170. package/.next/server/chunks/ssr/4c6d9__next-internal_server_app__global-error_page_actions_386af4fb.js +3 -0
  171. package/.next/server/chunks/ssr/4c6d9__next-internal_server_app__global-error_page_actions_386af4fb.js.map +1 -0
  172. package/.next/server/chunks/ssr/8e02f_lucide-react_dist_esm_createLucideIcon_92babc87.js +3 -0
  173. package/.next/server/chunks/ssr/8e02f_lucide-react_dist_esm_createLucideIcon_92babc87.js.map +1 -0
  174. package/.next/server/chunks/ssr/8e02f_next_dist_5f7af8e7._.js +3 -0
  175. package/.next/server/chunks/ssr/8e02f_next_dist_5f7af8e7._.js.map +1 -0
  176. package/.next/server/chunks/ssr/8e02f_next_dist_8b7d79d3._.js +6 -0
  177. package/.next/server/chunks/ssr/8e02f_next_dist_8b7d79d3._.js.map +1 -0
  178. package/.next/server/chunks/ssr/8e02f_next_dist_a79dfbb1._.js +4 -0
  179. package/.next/server/chunks/ssr/8e02f_next_dist_a79dfbb1._.js.map +1 -0
  180. package/.next/server/chunks/ssr/8e02f_next_dist_client_components_b780ac2a._.js +3 -0
  181. package/.next/server/chunks/ssr/8e02f_next_dist_client_components_b780ac2a._.js.map +1 -0
  182. package/.next/server/chunks/ssr/8e02f_next_dist_client_components_builtin_forbidden_8e6242aa.js +3 -0
  183. package/.next/server/chunks/ssr/8e02f_next_dist_client_components_builtin_forbidden_8e6242aa.js.map +1 -0
  184. package/.next/server/chunks/ssr/8e02f_next_dist_client_components_builtin_global-error_fef7daa4.js +3 -0
  185. package/.next/server/chunks/ssr/8e02f_next_dist_client_components_builtin_global-error_fef7daa4.js.map +1 -0
  186. package/.next/server/chunks/ssr/8e02f_next_dist_client_components_builtin_unauthorized_d6f465ad.js +3 -0
  187. package/.next/server/chunks/ssr/8e02f_next_dist_client_components_builtin_unauthorized_d6f465ad.js.map +1 -0
  188. package/.next/server/chunks/ssr/8e02f_next_dist_esm_build_templates_app-page_aefc7b05.js +4 -0
  189. package/.next/server/chunks/ssr/8e02f_next_dist_esm_build_templates_app-page_aefc7b05.js.map +1 -0
  190. package/.next/server/chunks/ssr/Desktop_Project_Web_growth-mock-server_192f26a7._.js +3 -0
  191. package/.next/server/chunks/ssr/Desktop_Project_Web_growth-mock-server_192f26a7._.js.map +1 -0
  192. package/.next/server/chunks/ssr/Desktop_Project_Web_growth-mock-server_4d3bfee7._.js +4 -0
  193. package/.next/server/chunks/ssr/Desktop_Project_Web_growth-mock-server_4d3bfee7._.js.map +1 -0
  194. package/.next/server/chunks/ssr/Desktop_Project_Web_growth-mock-server_app_734cd624._.js +3 -0
  195. package/.next/server/chunks/ssr/Desktop_Project_Web_growth-mock-server_app_734cd624._.js.map +1 -0
  196. package/.next/server/chunks/ssr/Desktop_Project_Web_growth-mock-server_e3bf5efe._.js +7 -0
  197. package/.next/server/chunks/ssr/Desktop_Project_Web_growth-mock-server_e3bf5efe._.js.map +1 -0
  198. package/.next/server/chunks/ssr/[externals]_next_dist_server_app-render_work-async-storage_external_1f8eeae7.js +3 -0
  199. package/.next/server/chunks/ssr/[externals]_next_dist_server_app-render_work-async-storage_external_1f8eeae7.js.map +1 -0
  200. package/.next/server/chunks/ssr/[root-of-the-server]__04e2ab43._.js +10 -0
  201. package/.next/server/chunks/ssr/[root-of-the-server]__04e2ab43._.js.map +1 -0
  202. package/.next/server/chunks/ssr/[root-of-the-server]__0715ef20._.js +3 -0
  203. package/.next/server/chunks/ssr/[root-of-the-server]__0715ef20._.js.map +1 -0
  204. package/.next/server/chunks/ssr/[root-of-the-server]__0c263e23._.js +3 -0
  205. package/.next/server/chunks/ssr/[root-of-the-server]__0c263e23._.js.map +1 -0
  206. package/.next/server/chunks/ssr/[root-of-the-server]__5d3307e0._.js +3 -0
  207. package/.next/server/chunks/ssr/[root-of-the-server]__5d3307e0._.js.map +1 -0
  208. package/.next/server/chunks/ssr/[root-of-the-server]__6f5c427b._.js +4 -0
  209. package/.next/server/chunks/ssr/[root-of-the-server]__6f5c427b._.js.map +1 -0
  210. package/.next/server/chunks/ssr/[root-of-the-server]__a41353a2._.js +3 -0
  211. package/.next/server/chunks/ssr/[root-of-the-server]__a41353a2._.js.map +1 -0
  212. package/.next/server/chunks/ssr/[root-of-the-server]__c6e8de01._.js +3 -0
  213. package/.next/server/chunks/ssr/[root-of-the-server]__c6e8de01._.js.map +1 -0
  214. package/.next/server/chunks/ssr/[root-of-the-server]__c9e25af2._.js +3 -0
  215. package/.next/server/chunks/ssr/[root-of-the-server]__c9e25af2._.js.map +1 -0
  216. package/.next/server/chunks/ssr/[root-of-the-server]__caa92361._.js +3 -0
  217. package/.next/server/chunks/ssr/[root-of-the-server]__caa92361._.js.map +1 -0
  218. package/.next/server/chunks/ssr/[root-of-the-server]__d0f18aa0._.js +3 -0
  219. package/.next/server/chunks/ssr/[root-of-the-server]__d0f18aa0._.js.map +1 -0
  220. package/.next/server/chunks/ssr/[root-of-the-server]__e5032d8c._.js +3 -0
  221. package/.next/server/chunks/ssr/[root-of-the-server]__e5032d8c._.js.map +1 -0
  222. package/.next/server/chunks/ssr/[turbopack]_runtime.js +795 -0
  223. package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +10 -0
  224. package/.next/server/chunks/ssr/ced06_growth-mock-server__next-internal_server_app__not-found_page_actions_41a9defd.js +3 -0
  225. package/.next/server/chunks/ssr/ced06_growth-mock-server__next-internal_server_app__not-found_page_actions_41a9defd.js.map +1 -0
  226. package/.next/server/functions-config-manifest.json +4 -0
  227. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  228. package/.next/server/middleware-build-manifest.js +20 -0
  229. package/.next/server/middleware-manifest.json +6 -0
  230. package/.next/server/next-font-manifest.js +1 -0
  231. package/.next/server/next-font-manifest.json +15 -0
  232. package/.next/server/pages/404.html +1 -0
  233. package/.next/server/pages/500.html +2 -0
  234. package/.next/server/pages-manifest.json +4 -0
  235. package/.next/server/server-reference-manifest.js +1 -0
  236. package/.next/server/server-reference-manifest.json +5 -0
  237. package/.next/static/17-ALhiWger7Ahids28qF/_buildManifest.js +11 -0
  238. package/.next/static/17-ALhiWger7Ahids28qF/_clientMiddlewareManifest.json +1 -0
  239. package/.next/static/17-ALhiWger7Ahids28qF/_ssgManifest.js +1 -0
  240. package/.next/static/chunks/31523f3a41fdf0b5.js +1 -0
  241. package/.next/static/chunks/3a3338ff069e0977.js +5 -0
  242. package/.next/static/chunks/68c20af4dfeb36d0.js +1 -0
  243. package/.next/static/chunks/77942ffae83b12ce.js +1 -0
  244. package/.next/static/chunks/81faf4667437d774.js +1 -0
  245. package/.next/static/chunks/8c554104dfee37e0.js +5 -0
  246. package/.next/static/chunks/a6dad97d9634a72d.js +1 -0
  247. package/.next/static/chunks/a6dad97d9634a72d.js.map +1 -0
  248. package/.next/static/chunks/ab3bc4985a0e98d2.css +3 -0
  249. package/.next/static/chunks/d71bf6d63636cd19.js +1 -0
  250. package/.next/static/chunks/f32c6649a0ca2698.js +1 -0
  251. package/.next/static/chunks/turbopack-7ea3b444f61e390f.js +4 -0
  252. package/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  253. package/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  254. package/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  255. package/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  256. package/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  257. package/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  258. package/.next/static/media/favicon.de6b30f1.ico +0 -0
  259. package/.next/trace +1 -0
  260. package/.next/trace-build +1 -0
  261. package/.next/turbopack +0 -0
  262. package/.next/types/routes.d.ts +78 -0
  263. package/.next/types/validator.ts +124 -0
  264. package/README.md +24 -1
  265. package/package.json +20 -13
  266. package/prisma/schema.prisma +1 -0
  267. package/.claude/settings.local.json +0 -10
  268. package/CLAUDE.md +0 -58
  269. package/app/api/endpoints/[id]/route.ts +0 -63
  270. package/app/api/endpoints/bulk/route.ts +0 -23
  271. package/app/api/endpoints/import/route.ts +0 -52
  272. package/app/api/endpoints/route.ts +0 -39
  273. package/app/api/endpoints/sync/route.ts +0 -80
  274. package/app/api/mock/[...slug]/route.ts +0 -82
  275. package/app/globals.css +0 -125
  276. package/app/layout.tsx +0 -36
  277. package/app/page.tsx +0 -184
  278. package/components/endpoint-edit-dialog.tsx +0 -181
  279. package/components/endpoint-table.tsx +0 -133
  280. package/components/openapi-upload-dialog.tsx +0 -196
  281. package/components/ui/button.tsx +0 -62
  282. package/components/ui/checkbox.tsx +0 -32
  283. package/components/ui/dialog.tsx +0 -143
  284. package/components/ui/input.tsx +0 -21
  285. package/components/ui/label.tsx +0 -24
  286. package/components/ui/sonner.tsx +0 -37
  287. package/components/ui/table.tsx +0 -116
  288. package/components/ui/textarea.tsx +0 -18
  289. package/components.json +0 -22
  290. package/eslint.config.mjs +0 -18
  291. package/lib/openapi-parser.ts +0 -270
  292. package/lib/prisma.ts +0 -9
  293. package/lib/utils.ts +0 -6
  294. package/lib/validation.ts +0 -19
  295. package/next.config.ts +0 -7
  296. package/pnpm-workspace.yaml +0 -4
  297. package/postcss.config.mjs +0 -7
  298. package/prisma/seed.ts +0 -29
  299. package/tsconfig.json +0 -34
  300. package/types/endpoint.ts +0 -10
  301. /package/{app/favicon.ico → .next/server/app/favicon.ico.body} +0 -0
@@ -1,52 +0,0 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import { Prisma } from '@prisma/client'
3
- import { prisma } from '@/lib/prisma'
4
- import { parseOpenAPISpec } from '@/lib/openapi-parser'
5
-
6
- export async function POST(request: NextRequest) {
7
- const spec = await request.json()
8
-
9
- const endpoints = parseOpenAPISpec(spec)
10
-
11
- if (endpoints.length === 0) {
12
- return NextResponse.json(
13
- { error: 'No valid endpoints found in OpenAPI spec' },
14
- { status: 400 }
15
- )
16
- }
17
-
18
- const results = await Promise.allSettled(
19
- endpoints.map((ep) =>
20
- prisma.mockEndpoint.upsert({
21
- where: {
22
- path_method: {
23
- path: ep.path,
24
- method: ep.method,
25
- },
26
- },
27
- update: {
28
- description: ep.description,
29
- statusCode: ep.statusCode,
30
- responseBody: ep.responseBody as Prisma.InputJsonValue,
31
- },
32
- create: {
33
- path: ep.path,
34
- method: ep.method,
35
- description: ep.description,
36
- statusCode: ep.statusCode,
37
- responseBody: ep.responseBody as Prisma.InputJsonValue,
38
- },
39
- })
40
- )
41
- )
42
-
43
- const created = results.filter((r) => r.status === 'fulfilled').length
44
- const failed = results.filter((r) => r.status === 'rejected').length
45
-
46
- return NextResponse.json({
47
- message: `Imported ${created} endpoints`,
48
- created,
49
- failed,
50
- total: endpoints.length,
51
- })
52
- }
@@ -1,39 +0,0 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import { prisma } from '@/lib/prisma'
3
- import { validatePath, validateMethod, validateStatusCode } from '@/lib/validation'
4
-
5
- // GET: 모든 엔드포인트 조회
6
- export async function GET() {
7
- const endpoints = await prisma.mockEndpoint.findMany({
8
- orderBy: { createdAt: 'desc' },
9
- })
10
- return NextResponse.json(endpoints)
11
- }
12
-
13
- // POST: 새 엔드포인트 생성
14
- export async function POST(request: NextRequest) {
15
- const body = await request.json()
16
- const { path, method, description, statusCode, responseBody } = body
17
-
18
- if (!validatePath(path)) {
19
- return NextResponse.json({ error: 'Invalid path' }, { status: 400 })
20
- }
21
- if (!validateMethod(method)) {
22
- return NextResponse.json({ error: 'Invalid method' }, { status: 400 })
23
- }
24
- if (!validateStatusCode(statusCode)) {
25
- return NextResponse.json({ error: 'Invalid status code' }, { status: 400 })
26
- }
27
-
28
- const endpoint = await prisma.mockEndpoint.create({
29
- data: {
30
- path,
31
- method: method.toUpperCase(),
32
- description,
33
- statusCode: statusCode ?? 200,
34
- responseBody,
35
- },
36
- })
37
-
38
- return NextResponse.json(endpoint, { status: 201 })
39
- }
@@ -1,80 +0,0 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import { Prisma } from '@prisma/client'
3
- import { prisma } from '@/lib/prisma'
4
- import { parseOpenAPISpec } from '@/lib/openapi-parser'
5
-
6
- export async function POST(request: NextRequest) {
7
- const { url } = await request.json()
8
-
9
- if (!url) {
10
- return NextResponse.json({ error: 'URL is required' }, { status: 400 })
11
- }
12
-
13
- try {
14
- // OpenAPI JSON 가져오기
15
- const response = await fetch(url, {
16
- headers: {
17
- Accept: 'application/json',
18
- },
19
- })
20
-
21
- if (!response.ok) {
22
- return NextResponse.json(
23
- { error: `Failed to fetch OpenAPI spec: ${response.statusText}` },
24
- { status: 400 }
25
- )
26
- }
27
-
28
- const spec = await response.json()
29
- const endpoints = parseOpenAPISpec(spec)
30
-
31
- if (endpoints.length === 0) {
32
- return NextResponse.json(
33
- { error: 'No valid endpoints found in OpenAPI spec' },
34
- { status: 400 }
35
- )
36
- }
37
-
38
- // Upsert로 새로 추가하거나 업데이트
39
- const results = await Promise.allSettled(
40
- endpoints.map((ep) =>
41
- prisma.mockEndpoint.upsert({
42
- where: {
43
- path_method: {
44
- path: ep.path,
45
- method: ep.method,
46
- },
47
- },
48
- update: {
49
- description: ep.description,
50
- statusCode: ep.statusCode,
51
- responseBody: ep.responseBody as Prisma.InputJsonValue,
52
- },
53
- create: {
54
- path: ep.path,
55
- method: ep.method,
56
- description: ep.description,
57
- statusCode: ep.statusCode,
58
- responseBody: ep.responseBody as Prisma.InputJsonValue,
59
- },
60
- })
61
- )
62
- )
63
-
64
- const succeeded = results.filter((r) => r.status === 'fulfilled').length
65
- const failed = results.filter((r) => r.status === 'rejected').length
66
-
67
- return NextResponse.json({
68
- message: `Synced ${succeeded} endpoints`,
69
- succeeded,
70
- failed,
71
- total: endpoints.length,
72
- })
73
- } catch (error) {
74
- console.error('Sync error:', error)
75
- return NextResponse.json(
76
- { error: error instanceof Error ? error.message : 'Sync failed' },
77
- { status: 500 }
78
- )
79
- }
80
- }
@@ -1,82 +0,0 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import { match } from 'path-to-regexp'
3
- import { prisma } from '@/lib/prisma'
4
-
5
- type RouteParams = {
6
- params: Promise<{ slug: string[] }>
7
- }
8
-
9
- async function findMatchingEndpoint(requestPath: string, method: string) {
10
- // DB에서 해당 method의 모든 엔드포인트 조회
11
- const endpoints = await prisma.mockEndpoint.findMany({
12
- where: { method },
13
- })
14
-
15
- // 정확히 일치하는 경로 먼저 확인
16
- const exactMatch = endpoints.find((ep) => ep.path === requestPath)
17
- if (exactMatch) {
18
- return { endpoint: exactMatch, params: {} }
19
- }
20
-
21
- // path-to-regexp를 사용한 패턴 매칭
22
- for (const endpoint of endpoints) {
23
- try {
24
- const matchFn = match(endpoint.path, { decode: decodeURIComponent })
25
- const result = matchFn(requestPath)
26
-
27
- if (result) {
28
- return { endpoint, params: result.params }
29
- }
30
- } catch {
31
- // 잘못된 패턴은 무시
32
- continue
33
- }
34
- }
35
-
36
- return null
37
- }
38
-
39
- async function handleRequest(request: NextRequest, { params }: RouteParams) {
40
- const { slug } = await params
41
- const requestPath = '/' + slug.join('/')
42
- const method = request.method
43
-
44
- const result = await findMatchingEndpoint(requestPath, method)
45
-
46
- if (!result) {
47
- return NextResponse.json(
48
- { error: 'Endpoint not found', path: requestPath, method },
49
- { status: 404 }
50
- )
51
- }
52
-
53
- const { endpoint, params: pathParams } = result
54
-
55
- // responseBody에 pathParams를 포함하여 반환 (선택적)
56
- const responseData =
57
- Object.keys(pathParams).length > 0
58
- ? { ...endpoint.responseBody as object, _pathParams: pathParams }
59
- : endpoint.responseBody
60
-
61
- return NextResponse.json(responseData, { status: endpoint.statusCode })
62
- }
63
-
64
- export async function GET(request: NextRequest, context: RouteParams) {
65
- return handleRequest(request, context)
66
- }
67
-
68
- export async function POST(request: NextRequest, context: RouteParams) {
69
- return handleRequest(request, context)
70
- }
71
-
72
- export async function PUT(request: NextRequest, context: RouteParams) {
73
- return handleRequest(request, context)
74
- }
75
-
76
- export async function PATCH(request: NextRequest, context: RouteParams) {
77
- return handleRequest(request, context)
78
- }
79
-
80
- export async function DELETE(request: NextRequest, context: RouteParams) {
81
- return handleRequest(request, context)
82
- }
package/app/globals.css DELETED
@@ -1,125 +0,0 @@
1
- @import "tailwindcss";
2
- @import "tw-animate-css";
3
-
4
- @custom-variant dark (&:is(.dark *));
5
-
6
- @theme inline {
7
- --color-background: var(--background);
8
- --color-foreground: var(--foreground);
9
- --font-sans: var(--font-geist-sans);
10
- --font-mono: var(--font-geist-mono);
11
- --color-sidebar-ring: var(--sidebar-ring);
12
- --color-sidebar-border: var(--sidebar-border);
13
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
14
- --color-sidebar-accent: var(--sidebar-accent);
15
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
16
- --color-sidebar-primary: var(--sidebar-primary);
17
- --color-sidebar-foreground: var(--sidebar-foreground);
18
- --color-sidebar: var(--sidebar);
19
- --color-chart-5: var(--chart-5);
20
- --color-chart-4: var(--chart-4);
21
- --color-chart-3: var(--chart-3);
22
- --color-chart-2: var(--chart-2);
23
- --color-chart-1: var(--chart-1);
24
- --color-ring: var(--ring);
25
- --color-input: var(--input);
26
- --color-border: var(--border);
27
- --color-destructive: var(--destructive);
28
- --color-accent-foreground: var(--accent-foreground);
29
- --color-accent: var(--accent);
30
- --color-muted-foreground: var(--muted-foreground);
31
- --color-muted: var(--muted);
32
- --color-secondary-foreground: var(--secondary-foreground);
33
- --color-secondary: var(--secondary);
34
- --color-primary-foreground: var(--primary-foreground);
35
- --color-primary: var(--primary);
36
- --color-popover-foreground: var(--popover-foreground);
37
- --color-popover: var(--popover);
38
- --color-card-foreground: var(--card-foreground);
39
- --color-card: var(--card);
40
- --radius-sm: calc(var(--radius) - 4px);
41
- --radius-md: calc(var(--radius) - 2px);
42
- --radius-lg: var(--radius);
43
- --radius-xl: calc(var(--radius) + 4px);
44
- --radius-2xl: calc(var(--radius) + 8px);
45
- --radius-3xl: calc(var(--radius) + 12px);
46
- --radius-4xl: calc(var(--radius) + 16px);
47
- }
48
-
49
- :root {
50
- --radius: 0.625rem;
51
- --background: oklch(1 0 0);
52
- --foreground: oklch(0.145 0 0);
53
- --card: oklch(1 0 0);
54
- --card-foreground: oklch(0.145 0 0);
55
- --popover: oklch(1 0 0);
56
- --popover-foreground: oklch(0.145 0 0);
57
- --primary: oklch(0.205 0 0);
58
- --primary-foreground: oklch(0.985 0 0);
59
- --secondary: oklch(0.97 0 0);
60
- --secondary-foreground: oklch(0.205 0 0);
61
- --muted: oklch(0.97 0 0);
62
- --muted-foreground: oklch(0.556 0 0);
63
- --accent: oklch(0.97 0 0);
64
- --accent-foreground: oklch(0.205 0 0);
65
- --destructive: oklch(0.577 0.245 27.325);
66
- --border: oklch(0.922 0 0);
67
- --input: oklch(0.922 0 0);
68
- --ring: oklch(0.708 0 0);
69
- --chart-1: oklch(0.646 0.222 41.116);
70
- --chart-2: oklch(0.6 0.118 184.704);
71
- --chart-3: oklch(0.398 0.07 227.392);
72
- --chart-4: oklch(0.828 0.189 84.429);
73
- --chart-5: oklch(0.769 0.188 70.08);
74
- --sidebar: oklch(0.985 0 0);
75
- --sidebar-foreground: oklch(0.145 0 0);
76
- --sidebar-primary: oklch(0.205 0 0);
77
- --sidebar-primary-foreground: oklch(0.985 0 0);
78
- --sidebar-accent: oklch(0.97 0 0);
79
- --sidebar-accent-foreground: oklch(0.205 0 0);
80
- --sidebar-border: oklch(0.922 0 0);
81
- --sidebar-ring: oklch(0.708 0 0);
82
- }
83
-
84
- .dark {
85
- --background: oklch(0.145 0 0);
86
- --foreground: oklch(0.985 0 0);
87
- --card: oklch(0.205 0 0);
88
- --card-foreground: oklch(0.985 0 0);
89
- --popover: oklch(0.205 0 0);
90
- --popover-foreground: oklch(0.985 0 0);
91
- --primary: oklch(0.922 0 0);
92
- --primary-foreground: oklch(0.205 0 0);
93
- --secondary: oklch(0.269 0 0);
94
- --secondary-foreground: oklch(0.985 0 0);
95
- --muted: oklch(0.269 0 0);
96
- --muted-foreground: oklch(0.708 0 0);
97
- --accent: oklch(0.269 0 0);
98
- --accent-foreground: oklch(0.985 0 0);
99
- --destructive: oklch(0.704 0.191 22.216);
100
- --border: oklch(1 0 0 / 10%);
101
- --input: oklch(1 0 0 / 15%);
102
- --ring: oklch(0.556 0 0);
103
- --chart-1: oklch(0.488 0.243 264.376);
104
- --chart-2: oklch(0.696 0.17 162.48);
105
- --chart-3: oklch(0.769 0.188 70.08);
106
- --chart-4: oklch(0.627 0.265 303.9);
107
- --chart-5: oklch(0.645 0.246 16.439);
108
- --sidebar: oklch(0.205 0 0);
109
- --sidebar-foreground: oklch(0.985 0 0);
110
- --sidebar-primary: oklch(0.488 0.243 264.376);
111
- --sidebar-primary-foreground: oklch(0.985 0 0);
112
- --sidebar-accent: oklch(0.269 0 0);
113
- --sidebar-accent-foreground: oklch(0.985 0 0);
114
- --sidebar-border: oklch(1 0 0 / 10%);
115
- --sidebar-ring: oklch(0.556 0 0);
116
- }
117
-
118
- @layer base {
119
- * {
120
- @apply border-border outline-ring/50;
121
- }
122
- body {
123
- @apply bg-background text-foreground;
124
- }
125
- }
package/app/layout.tsx DELETED
@@ -1,36 +0,0 @@
1
- import type { Metadata } from "next";
2
- import { Geist, Geist_Mono } from "next/font/google";
3
- import { Toaster } from "@/components/ui/sonner";
4
- import "./globals.css";
5
-
6
- const geistSans = Geist({
7
- variable: "--font-geist-sans",
8
- subsets: ["latin"],
9
- });
10
-
11
- const geistMono = Geist_Mono({
12
- variable: "--font-geist-mono",
13
- subsets: ["latin"],
14
- });
15
-
16
- export const metadata: Metadata = {
17
- title: "Growthman",
18
- description: "Local mock API server with UI dashboard",
19
- };
20
-
21
- export default function RootLayout({
22
- children,
23
- }: Readonly<{
24
- children: React.ReactNode;
25
- }>) {
26
- return (
27
- <html lang="en">
28
- <body
29
- className={`${geistSans.variable} ${geistMono.variable} antialiased`}
30
- >
31
- {children}
32
- <Toaster />
33
- </body>
34
- </html>
35
- );
36
- }
package/app/page.tsx DELETED
@@ -1,184 +0,0 @@
1
- 'use client'
2
-
3
- import { useState, useEffect, useCallback } from 'react'
4
- import { MockEndpoint } from '@/types/endpoint'
5
- import { EndpointTable } from '@/components/endpoint-table'
6
- import { EndpointEditDialog } from '@/components/endpoint-edit-dialog'
7
- import { OpenAPIUploadDialog } from '@/components/openapi-upload-dialog'
8
- import { Button } from '@/components/ui/button'
9
- import { toast } from 'sonner'
10
-
11
- export default function Home() {
12
- const [endpoints, setEndpoints] = useState<MockEndpoint[]>([])
13
- const [loading, setLoading] = useState(true)
14
- const [editDialogOpen, setEditDialogOpen] = useState(false)
15
- const [uploadDialogOpen, setUploadDialogOpen] = useState(false)
16
- const [selectedEndpoint, setSelectedEndpoint] = useState<MockEndpoint | null>(null)
17
- const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set())
18
-
19
- const fetchEndpoints = useCallback(async () => {
20
- try {
21
- const response = await fetch('/api/endpoints')
22
- const data = await response.json()
23
- setEndpoints(data)
24
- } catch (error) {
25
- console.error('Failed to fetch endpoints:', error)
26
- } finally {
27
- setLoading(false)
28
- }
29
- }, [])
30
-
31
- useEffect(() => {
32
- fetchEndpoints()
33
- }, [fetchEndpoints])
34
-
35
- const handleEdit = (endpoint: MockEndpoint) => {
36
- setSelectedEndpoint(endpoint)
37
- setEditDialogOpen(true)
38
- }
39
-
40
- const handleCreate = () => {
41
- setSelectedEndpoint(null)
42
- setEditDialogOpen(true)
43
- }
44
-
45
- const handleDelete = async (id: string) => {
46
- if (!confirm('Are you sure you want to delete this endpoint?')) return
47
-
48
- try {
49
- const response = await fetch(`/api/endpoints/${id}`, { method: 'DELETE' })
50
- if (!response.ok) throw new Error('Failed to delete')
51
- setSelectedIds((prev) => {
52
- const newSet = new Set(prev)
53
- newSet.delete(id)
54
- return newSet
55
- })
56
- toast.success('Endpoint deleted successfully')
57
- fetchEndpoints()
58
- } catch (error) {
59
- console.error('Failed to delete endpoint:', error)
60
- toast.error('Failed to delete endpoint')
61
- }
62
- }
63
-
64
- const handleBulkDelete = async () => {
65
- if (selectedIds.size === 0) return
66
- if (!confirm(`Are you sure you want to delete ${selectedIds.size} endpoint(s)?`)) return
67
-
68
- try {
69
- const response = await fetch('/api/endpoints/bulk', {
70
- method: 'DELETE',
71
- headers: { 'Content-Type': 'application/json' },
72
- body: JSON.stringify({ ids: Array.from(selectedIds) }),
73
- })
74
- if (!response.ok) throw new Error('Failed to delete')
75
- const count = selectedIds.size
76
- setSelectedIds(new Set())
77
- toast.success(`${count} endpoint(s) deleted successfully`)
78
- fetchEndpoints()
79
- } catch (error) {
80
- console.error('Failed to delete endpoints:', error)
81
- toast.error('Failed to delete endpoints')
82
- }
83
- }
84
-
85
- const handleSave = async (endpoint: Partial<MockEndpoint> & { id?: string }) => {
86
- try {
87
- const isUpdate = !!endpoint.id
88
- const response = isUpdate
89
- ? await fetch(`/api/endpoints/${endpoint.id}`, {
90
- method: 'PUT',
91
- headers: { 'Content-Type': 'application/json' },
92
- body: JSON.stringify(endpoint),
93
- })
94
- : await fetch('/api/endpoints', {
95
- method: 'POST',
96
- headers: { 'Content-Type': 'application/json' },
97
- body: JSON.stringify(endpoint),
98
- })
99
-
100
- if (!response.ok) {
101
- const data = await response.json()
102
- throw new Error(data.error || 'Failed to save')
103
- }
104
-
105
- toast.success(isUpdate ? 'Endpoint updated successfully' : 'Endpoint created successfully')
106
- fetchEndpoints()
107
- } catch (error) {
108
- console.error('Failed to save endpoint:', error)
109
- toast.error(error instanceof Error ? error.message : 'Failed to save endpoint')
110
- }
111
- }
112
-
113
- return (
114
- <div className="min-h-screen bg-gray-50">
115
- <div className="max-w-7xl mx-auto py-8 px-4 sm:px-6 lg:px-8">
116
- <div className="flex justify-between items-center mb-8">
117
- <div>
118
- <h1 className="text-3xl font-bold text-gray-900">Growthman</h1>
119
- <p className="mt-1 text-gray-500">
120
- Manage your mock API endpoints
121
- </p>
122
- </div>
123
- <div className="flex gap-3">
124
- <Button variant="outline" onClick={() => setUploadDialogOpen(true)}>
125
- Import OpenAPI
126
- </Button>
127
- <Button onClick={handleCreate}>
128
- + New Endpoint
129
- </Button>
130
- </div>
131
- </div>
132
-
133
- {selectedIds.size > 0 && (
134
- <div className="mb-4 flex items-center gap-4 p-3 bg-blue-50 border border-blue-200 rounded-lg">
135
- <span className="text-sm text-blue-800">
136
- {selectedIds.size} endpoint(s) selected
137
- </span>
138
- <Button
139
- variant="destructive"
140
- size="sm"
141
- onClick={handleBulkDelete}
142
- >
143
- Delete Selected
144
- </Button>
145
- <Button
146
- variant="ghost"
147
- size="sm"
148
- onClick={() => setSelectedIds(new Set())}
149
- >
150
- Clear Selection
151
- </Button>
152
- </div>
153
- )}
154
-
155
- <div className="bg-white shadow rounded-lg">
156
- {loading ? (
157
- <div className="p-8 text-center text-gray-500">Loading...</div>
158
- ) : (
159
- <EndpointTable
160
- endpoints={endpoints}
161
- onEdit={handleEdit}
162
- onDelete={handleDelete}
163
- selectedIds={selectedIds}
164
- onSelectionChange={setSelectedIds}
165
- />
166
- )}
167
- </div>
168
- </div>
169
-
170
- <EndpointEditDialog
171
- endpoint={selectedEndpoint}
172
- open={editDialogOpen}
173
- onOpenChange={setEditDialogOpen}
174
- onSave={handleSave}
175
- />
176
-
177
- <OpenAPIUploadDialog
178
- open={uploadDialogOpen}
179
- onOpenChange={setUploadDialogOpen}
180
- onImportComplete={fetchEndpoints}
181
- />
182
- </div>
183
- )
184
- }