@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,181 +0,0 @@
1
- 'use client'
2
-
3
- import { useState, useEffect } from 'react'
4
- import dynamic from 'next/dynamic'
5
- import { MockEndpoint } from '@/types/endpoint'
6
- import {
7
- Dialog,
8
- DialogContent,
9
- DialogHeader,
10
- DialogTitle,
11
- DialogFooter,
12
- } from '@/components/ui/dialog'
13
- import { Button } from '@/components/ui/button'
14
- import { Input } from '@/components/ui/input'
15
- import { Label } from '@/components/ui/label'
16
-
17
- const MonacoEditor = dynamic(() => import('@monaco-editor/react'), {
18
- ssr: false,
19
- loading: () => <div className="h-[400px] bg-gray-100 animate-pulse rounded" />,
20
- })
21
-
22
- interface EndpointEditDialogProps {
23
- endpoint: MockEndpoint | null
24
- open: boolean
25
- onOpenChange: (open: boolean) => void
26
- onSave: (endpoint: Partial<MockEndpoint> & { id?: string }) => void
27
- }
28
-
29
- const HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']
30
-
31
- export function EndpointEditDialog({
32
- endpoint,
33
- open,
34
- onOpenChange,
35
- onSave,
36
- }: EndpointEditDialogProps) {
37
- const [path, setPath] = useState('')
38
- const [method, setMethod] = useState('GET')
39
- const [description, setDescription] = useState('')
40
- const [statusCode, setStatusCode] = useState(200)
41
- const [responseBody, setResponseBody] = useState('{}')
42
- const [jsonError, setJsonError] = useState<string | null>(null)
43
-
44
- useEffect(() => {
45
- if (endpoint) {
46
- setPath(endpoint.path)
47
- setMethod(endpoint.method)
48
- setDescription(endpoint.description || '')
49
- setStatusCode(endpoint.statusCode)
50
- setResponseBody(JSON.stringify(endpoint.responseBody, null, 2))
51
- } else {
52
- setPath('')
53
- setMethod('GET')
54
- setDescription('')
55
- setStatusCode(200)
56
- setResponseBody('{}')
57
- }
58
- setJsonError(null)
59
- }, [endpoint, open])
60
-
61
- const handleSave = () => {
62
- try {
63
- const parsedBody = JSON.parse(responseBody)
64
- setJsonError(null)
65
- onSave({
66
- id: endpoint?.id,
67
- path,
68
- method,
69
- description: description || null,
70
- statusCode,
71
- responseBody: parsedBody,
72
- })
73
- onOpenChange(false)
74
- } catch {
75
- setJsonError('Invalid JSON format')
76
- }
77
- }
78
-
79
- return (
80
- <Dialog open={open} onOpenChange={onOpenChange}>
81
- <DialogContent className="sm:max-w-[70vw] h-[90vh] flex flex-col">
82
- <DialogHeader>
83
- <DialogTitle>
84
- {endpoint ? 'Edit Endpoint' : 'Create New Endpoint'}
85
- </DialogTitle>
86
- </DialogHeader>
87
-
88
- <div className="grid gap-4 py-4 flex-1 overflow-hidden">
89
- <div className="flex items-center gap-4">
90
- <Label htmlFor="method" className="w-28 text-right shrink-0">
91
- Method
92
- </Label>
93
- <select
94
- id="method"
95
- value={method}
96
- onChange={(e) => setMethod(e.target.value)}
97
- className="flex-1 h-10 rounded-md border border-input bg-background px-3 py-2"
98
- >
99
- {HTTP_METHODS.map((m) => (
100
- <option key={m} value={m}>
101
- {m}
102
- </option>
103
- ))}
104
- </select>
105
- </div>
106
-
107
- <div className="flex items-center gap-4">
108
- <Label htmlFor="path" className="w-28 text-right shrink-0">
109
- Path
110
- </Label>
111
- <Input
112
- id="path"
113
- value={path}
114
- onChange={(e) => setPath(e.target.value)}
115
- placeholder="/v1/users/:userId"
116
- className="flex-1"
117
- />
118
- </div>
119
-
120
- <div className="flex items-center gap-4">
121
- <Label htmlFor="description" className="w-28 text-right shrink-0">
122
- Description
123
- </Label>
124
- <Input
125
- id="description"
126
- value={description}
127
- onChange={(e) => setDescription(e.target.value)}
128
- placeholder="API description"
129
- className="flex-1"
130
- />
131
- </div>
132
-
133
- <div className="flex items-center gap-4">
134
- <Label htmlFor="statusCode" className="w-28 text-right shrink-0">
135
- Status Code
136
- </Label>
137
- <Input
138
- id="statusCode"
139
- type="number"
140
- value={statusCode}
141
- onChange={(e) => setStatusCode(Number(e.target.value))}
142
- className="flex-1"
143
- />
144
- </div>
145
-
146
- <div className="flex items-start gap-4">
147
- <Label className="w-28 text-right shrink-0 pt-2">Response Body</Label>
148
- <div className="flex-1">
149
- <div className="border rounded-md overflow-hidden">
150
- <MonacoEditor
151
- height="calc(85vh - 320px)"
152
- language="json"
153
- theme="vs-dark"
154
- value={responseBody}
155
- onChange={(value) => setResponseBody(value || '{}')}
156
- options={{
157
- minimap: { enabled: false },
158
- fontSize: 14,
159
- formatOnPaste: true,
160
- automaticLayout: true,
161
- scrollBeyondLastLine: false,
162
- }}
163
- />
164
- </div>
165
- {jsonError && (
166
- <p className="text-red-500 text-sm mt-2">{jsonError}</p>
167
- )}
168
- </div>
169
- </div>
170
- </div>
171
-
172
- <DialogFooter className="shrink-0">
173
- <Button variant="outline" onClick={() => onOpenChange(false)}>
174
- Cancel
175
- </Button>
176
- <Button onClick={handleSave}>Save</Button>
177
- </DialogFooter>
178
- </DialogContent>
179
- </Dialog>
180
- )
181
- }
@@ -1,133 +0,0 @@
1
- 'use client'
2
-
3
- import { MockEndpoint } from '@/types/endpoint'
4
- import {
5
- Table,
6
- TableBody,
7
- TableCell,
8
- TableHead,
9
- TableHeader,
10
- TableRow,
11
- } from '@/components/ui/table'
12
- import { Button } from '@/components/ui/button'
13
- import { Checkbox } from '@/components/ui/checkbox'
14
-
15
- interface EndpointTableProps {
16
- endpoints: MockEndpoint[]
17
- onEdit: (endpoint: MockEndpoint) => void
18
- onDelete: (id: string) => void
19
- selectedIds: Set<string>
20
- onSelectionChange: (ids: Set<string>) => void
21
- }
22
-
23
- const methodColors: Record<string, string> = {
24
- GET: 'bg-green-100 text-green-800',
25
- POST: 'bg-blue-100 text-blue-800',
26
- PUT: 'bg-yellow-100 text-yellow-800',
27
- PATCH: 'bg-orange-100 text-orange-800',
28
- DELETE: 'bg-red-100 text-red-800',
29
- }
30
-
31
- export function EndpointTable({
32
- endpoints,
33
- onEdit,
34
- onDelete,
35
- selectedIds,
36
- onSelectionChange,
37
- }: EndpointTableProps) {
38
- const allSelected = endpoints.length > 0 && endpoints.every((e) => selectedIds.has(e.id))
39
- const someSelected = endpoints.some((e) => selectedIds.has(e.id)) && !allSelected
40
-
41
- const handleSelectAll = (checked: boolean) => {
42
- if (checked) {
43
- onSelectionChange(new Set(endpoints.map((e) => e.id)))
44
- } else {
45
- onSelectionChange(new Set())
46
- }
47
- }
48
-
49
- const handleSelectOne = (id: string, checked: boolean) => {
50
- const newSet = new Set(selectedIds)
51
- if (checked) {
52
- newSet.add(id)
53
- } else {
54
- newSet.delete(id)
55
- }
56
- onSelectionChange(newSet)
57
- }
58
-
59
- return (
60
- <Table>
61
- <TableHeader>
62
- <TableRow>
63
- <TableHead className="w-[50px]">
64
- <Checkbox
65
- checked={allSelected}
66
- ref={(el) => {
67
- if (el) {
68
- (el as unknown as HTMLInputElement).indeterminate = someSelected
69
- }
70
- }}
71
- onCheckedChange={(checked) => handleSelectAll(checked === true)}
72
- aria-label="Select all"
73
- />
74
- </TableHead>
75
- <TableHead className="w-[100px]">Method</TableHead>
76
- <TableHead>Path</TableHead>
77
- <TableHead>Description</TableHead>
78
- <TableHead className="w-[150px]">Actions</TableHead>
79
- </TableRow>
80
- </TableHeader>
81
- <TableBody>
82
- {endpoints.length === 0 ? (
83
- <TableRow>
84
- <TableCell colSpan={5} className="text-center text-gray-500">
85
- No endpoints registered yet
86
- </TableCell>
87
- </TableRow>
88
- ) : (
89
- endpoints.map((endpoint) => (
90
- <TableRow key={endpoint.id}>
91
- <TableCell>
92
- <Checkbox
93
- checked={selectedIds.has(endpoint.id)}
94
- onCheckedChange={(checked) => handleSelectOne(endpoint.id, checked === true)}
95
- aria-label={`Select ${endpoint.path}`}
96
- />
97
- </TableCell>
98
- <TableCell>
99
- <span
100
- className={`px-2 py-1 rounded text-xs font-medium ${methodColors[endpoint.method] || 'bg-gray-100'}`}
101
- >
102
- {endpoint.method}
103
- </span>
104
- </TableCell>
105
- <TableCell className="font-mono text-sm">{endpoint.path}</TableCell>
106
- <TableCell className="text-gray-600">
107
- {endpoint.description || '-'}
108
- </TableCell>
109
- <TableCell>
110
- <div className="flex gap-2">
111
- <Button
112
- variant="outline"
113
- size="sm"
114
- onClick={() => onEdit(endpoint)}
115
- >
116
- Edit
117
- </Button>
118
- <Button
119
- variant="destructive"
120
- size="sm"
121
- onClick={() => onDelete(endpoint.id)}
122
- >
123
- Delete
124
- </Button>
125
- </div>
126
- </TableCell>
127
- </TableRow>
128
- ))
129
- )}
130
- </TableBody>
131
- </Table>
132
- )
133
- }
@@ -1,196 +0,0 @@
1
- 'use client'
2
-
3
- import { useState, useRef } from 'react'
4
- import {
5
- Dialog,
6
- DialogContent,
7
- DialogHeader,
8
- DialogTitle,
9
- DialogFooter,
10
- } from '@/components/ui/dialog'
11
- import { Button } from '@/components/ui/button'
12
- import { Input } from '@/components/ui/input'
13
- import { Label } from '@/components/ui/label'
14
- import { toast } from 'sonner'
15
-
16
- interface OpenAPIUploadDialogProps {
17
- open: boolean
18
- onOpenChange: (open: boolean) => void
19
- onImportComplete: () => void
20
- }
21
-
22
- type ImportMode = 'url' | 'file'
23
-
24
- export function OpenAPIUploadDialog({
25
- open,
26
- onOpenChange,
27
- onImportComplete,
28
- }: OpenAPIUploadDialogProps) {
29
- const [mode, setMode] = useState<ImportMode>('url')
30
- const [url, setUrl] = useState('')
31
- const [file, setFile] = useState<File | null>(null)
32
- const [loading, setLoading] = useState(false)
33
- const [error, setError] = useState<string | null>(null)
34
- const fileInputRef = useRef<HTMLInputElement>(null)
35
-
36
- const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
37
- const selectedFile = e.target.files?.[0]
38
- if (selectedFile) {
39
- setFile(selectedFile)
40
- setError(null)
41
- }
42
- }
43
-
44
- const handleImport = async () => {
45
- setLoading(true)
46
- setError(null)
47
-
48
- try {
49
- let response: Response
50
-
51
- if (mode === 'url') {
52
- if (!url.trim()) {
53
- throw new Error('Please enter a URL')
54
- }
55
- response = await fetch('/api/endpoints/sync', {
56
- method: 'POST',
57
- headers: { 'Content-Type': 'application/json' },
58
- body: JSON.stringify({ url: url.trim() }),
59
- })
60
- } else {
61
- if (!file) {
62
- throw new Error('Please select a file')
63
- }
64
- const text = await file.text()
65
- const spec = JSON.parse(text)
66
- response = await fetch('/api/endpoints/import', {
67
- method: 'POST',
68
- headers: { 'Content-Type': 'application/json' },
69
- body: JSON.stringify(spec),
70
- })
71
- }
72
-
73
- const data = await response.json()
74
-
75
- if (!response.ok) {
76
- throw new Error(data.error || 'Import failed')
77
- }
78
-
79
- const succeeded = data.succeeded ?? data.created
80
- const failed = data.failed ?? 0
81
- if (failed > 0) {
82
- toast.warning(`Imported ${succeeded} endpoints (${failed} failed)`)
83
- } else {
84
- toast.success(`Successfully imported ${succeeded} endpoints`)
85
- }
86
- onImportComplete()
87
- handleClose()
88
- } catch (err) {
89
- const message = err instanceof Error ? err.message : 'Import failed'
90
- setError(message)
91
- toast.error(message)
92
- } finally {
93
- setLoading(false)
94
- }
95
- }
96
-
97
- const handleClose = () => {
98
- setUrl('')
99
- setFile(null)
100
- setError(null)
101
- onOpenChange(false)
102
- }
103
-
104
- const canImport = mode === 'url' ? url.trim().length > 0 : file !== null
105
-
106
- return (
107
- <Dialog open={open} onOpenChange={handleClose}>
108
- <DialogContent className="sm:max-w-lg">
109
- <DialogHeader>
110
- <DialogTitle>Import OpenAPI Specification</DialogTitle>
111
- </DialogHeader>
112
-
113
- <div className="py-4 space-y-4">
114
- {/* Mode Toggle */}
115
- <div className="flex gap-2">
116
- <Button
117
- type="button"
118
- variant={mode === 'url' ? 'default' : 'outline'}
119
- size="sm"
120
- onClick={() => setMode('url')}
121
- >
122
- From URL
123
- </Button>
124
- <Button
125
- type="button"
126
- variant={mode === 'file' ? 'default' : 'outline'}
127
- size="sm"
128
- onClick={() => setMode('file')}
129
- >
130
- From File
131
- </Button>
132
- </div>
133
-
134
- {/* URL Input */}
135
- {mode === 'url' && (
136
- <div className="space-y-2">
137
- <Label htmlFor="url">OpenAPI JSON URL</Label>
138
- <Input
139
- id="url"
140
- type="url"
141
- placeholder="https://api.example.com/api-docs-json"
142
- value={url}
143
- onChange={(e) => {
144
- setUrl(e.target.value)
145
- setError(null)
146
- }}
147
- />
148
- <p className="text-xs text-gray-500">
149
- Enter the URL to your OpenAPI/Swagger JSON specification
150
- </p>
151
- </div>
152
- )}
153
-
154
- {/* File Upload */}
155
- {mode === 'file' && (
156
- <div
157
- className="border-2 border-dashed rounded-lg p-8 text-center cursor-pointer hover:border-gray-400 transition-colors"
158
- onClick={() => fileInputRef.current?.click()}
159
- >
160
- <input
161
- ref={fileInputRef}
162
- type="file"
163
- accept=".json"
164
- onChange={handleFileChange}
165
- className="hidden"
166
- />
167
- {file ? (
168
- <p className="text-sm">
169
- Selected: <span className="font-medium">{file.name}</span>
170
- </p>
171
- ) : (
172
- <p className="text-gray-500">
173
- Click to select an OpenAPI JSON file
174
- </p>
175
- )}
176
- </div>
177
- )}
178
-
179
- {/* Error */}
180
- {error && (
181
- <p className="text-red-500 text-sm">{error}</p>
182
- )}
183
- </div>
184
-
185
- <DialogFooter>
186
- <Button variant="outline" onClick={handleClose}>
187
- Cancel
188
- </Button>
189
- <Button onClick={handleImport} disabled={!canImport || loading}>
190
- {loading ? 'Importing...' : 'Import'}
191
- </Button>
192
- </DialogFooter>
193
- </DialogContent>
194
- </Dialog>
195
- )
196
- }
@@ -1,62 +0,0 @@
1
- import * as React from "react"
2
- import { Slot } from "@radix-ui/react-slot"
3
- import { cva, type VariantProps } from "class-variance-authority"
4
-
5
- import { cn } from "@/lib/utils"
6
-
7
- const buttonVariants = cva(
8
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
9
- {
10
- variants: {
11
- variant: {
12
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
13
- destructive:
14
- "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
15
- outline:
16
- "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
17
- secondary:
18
- "bg-secondary text-secondary-foreground hover:bg-secondary/80",
19
- ghost:
20
- "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
21
- link: "text-primary underline-offset-4 hover:underline",
22
- },
23
- size: {
24
- default: "h-9 px-4 py-2 has-[>svg]:px-3",
25
- sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
26
- lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
27
- icon: "size-9",
28
- "icon-sm": "size-8",
29
- "icon-lg": "size-10",
30
- },
31
- },
32
- defaultVariants: {
33
- variant: "default",
34
- size: "default",
35
- },
36
- }
37
- )
38
-
39
- function Button({
40
- className,
41
- variant = "default",
42
- size = "default",
43
- asChild = false,
44
- ...props
45
- }: React.ComponentProps<"button"> &
46
- VariantProps<typeof buttonVariants> & {
47
- asChild?: boolean
48
- }) {
49
- const Comp = asChild ? Slot : "button"
50
-
51
- return (
52
- <Comp
53
- data-slot="button"
54
- data-variant={variant}
55
- data-size={size}
56
- className={cn(buttonVariants({ variant, size, className }))}
57
- {...props}
58
- />
59
- )
60
- }
61
-
62
- export { Button, buttonVariants }
@@ -1,32 +0,0 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import * as CheckboxPrimitive from "@radix-ui/react-checkbox"
5
- import { CheckIcon } from "lucide-react"
6
-
7
- import { cn } from "@/lib/utils"
8
-
9
- function Checkbox({
10
- className,
11
- ...props
12
- }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {
13
- return (
14
- <CheckboxPrimitive.Root
15
- data-slot="checkbox"
16
- className={cn(
17
- "peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
18
- className
19
- )}
20
- {...props}
21
- >
22
- <CheckboxPrimitive.Indicator
23
- data-slot="checkbox-indicator"
24
- className="grid place-content-center text-current transition-none"
25
- >
26
- <CheckIcon className="size-3.5" />
27
- </CheckboxPrimitive.Indicator>
28
- </CheckboxPrimitive.Root>
29
- )
30
- }
31
-
32
- export { Checkbox }