@karan171996/metricflow 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 (374) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +17 -0
  3. package/.next/build/chunks/[root-of-the-server]__05i36w1._.js +500 -0
  4. package/.next/build/chunks/[root-of-the-server]__05i36w1._.js.map +11 -0
  5. package/.next/build/chunks/[root-of-the-server]__1kki86f._.js +206 -0
  6. package/.next/build/chunks/[root-of-the-server]__1kki86f._.js.map +8 -0
  7. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_1gfkiq9._.js +13 -0
  8. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_1gfkiq9._.js.map +5 -0
  9. package/.next/build/chunks/[turbopack]_runtime.js +926 -0
  10. package/.next/build/chunks/[turbopack]_runtime.js.map +11 -0
  11. package/.next/build/chunks/node_modules_20v-8wl._.js +7183 -0
  12. package/.next/build/chunks/node_modules_20v-8wl._.js.map +47 -0
  13. package/.next/build/chunks/pool_entry-[turbopack-node]_transforms_postcss_ts_0tp-k2v._.js +6 -0
  14. package/.next/build/chunks/pool_entry-[turbopack-node]_transforms_postcss_ts_0tp-k2v._.js.map +5 -0
  15. package/.next/build/package.json +1 -0
  16. package/.next/build-manifest.json +23 -0
  17. package/.next/export-marker.json +6 -0
  18. package/.next/fallback-build-manifest.json +15 -0
  19. package/.next/images-manifest.json +68 -0
  20. package/.next/next-minimal-server.js.nft.json +1 -0
  21. package/.next/next-server.js.nft.json +1 -0
  22. package/.next/package.json +1 -0
  23. package/.next/prerender-manifest.json +241 -0
  24. package/.next/required-server-files.js +351 -0
  25. package/.next/required-server-files.json +351 -0
  26. package/.next/routes-manifest.json +138 -0
  27. package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  28. package/.next/server/app/_global-error/page/build-manifest.json +19 -0
  29. package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  30. package/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  31. package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  32. package/.next/server/app/_global-error/page.js +9 -0
  33. package/.next/server/app/_global-error/page.js.map +5 -0
  34. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  35. package/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
  36. package/.next/server/app/_global-error.html +1 -0
  37. package/.next/server/app/_global-error.meta +30 -0
  38. package/.next/server/app/_global-error.rsc +15 -0
  39. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +20 -0
  40. package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  41. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  42. package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  43. package/.next/server/app/_not-found/page/build-manifest.json +19 -0
  44. package/.next/server/app/_not-found/page/next-font-manifest.json +6 -0
  45. package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  46. package/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  47. package/.next/server/app/_not-found/page.js +15 -0
  48. package/.next/server/app/_not-found/page.js.map +5 -0
  49. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  50. package/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
  51. package/.next/server/app/_not-found.html +2 -0
  52. package/.next/server/app/_not-found.meta +36 -0
  53. package/.next/server/app/_not-found.rsc +43 -0
  54. package/.next/server/app/_not-found.segments/_full.segment.rsc +43 -0
  55. package/.next/server/app/_not-found.segments/_index.segment.rsc +34 -0
  56. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +20 -0
  57. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
  58. package/.next/server/app/api/analyze/route/app-paths-manifest.json +3 -0
  59. package/.next/server/app/api/analyze/route/build-manifest.json +12 -0
  60. package/.next/server/app/api/analyze/route/server-reference-manifest.json +4 -0
  61. package/.next/server/app/api/analyze/route.js +7 -0
  62. package/.next/server/app/api/analyze/route.js.map +5 -0
  63. package/.next/server/app/api/analyze/route.js.nft.json +1 -0
  64. package/.next/server/app/api/analyze/route_client-reference-manifest.js +3 -0
  65. package/.next/server/app/api/connect/route/app-paths-manifest.json +3 -0
  66. package/.next/server/app/api/connect/route/build-manifest.json +12 -0
  67. package/.next/server/app/api/connect/route/server-reference-manifest.json +4 -0
  68. package/.next/server/app/api/connect/route.js +8 -0
  69. package/.next/server/app/api/connect/route.js.map +5 -0
  70. package/.next/server/app/api/connect/route.js.nft.json +1 -0
  71. package/.next/server/app/api/connect/route_client-reference-manifest.js +3 -0
  72. package/.next/server/app/api/health/route/app-paths-manifest.json +3 -0
  73. package/.next/server/app/api/health/route/build-manifest.json +12 -0
  74. package/.next/server/app/api/health/route/server-reference-manifest.json +4 -0
  75. package/.next/server/app/api/health/route.js +6 -0
  76. package/.next/server/app/api/health/route.js.map +5 -0
  77. package/.next/server/app/api/health/route.js.nft.json +1 -0
  78. package/.next/server/app/api/health/route_client-reference-manifest.js +3 -0
  79. package/.next/server/app/api/metrics/route/app-paths-manifest.json +3 -0
  80. package/.next/server/app/api/metrics/route/build-manifest.json +12 -0
  81. package/.next/server/app/api/metrics/route/server-reference-manifest.json +4 -0
  82. package/.next/server/app/api/metrics/route.js +8 -0
  83. package/.next/server/app/api/metrics/route.js.map +5 -0
  84. package/.next/server/app/api/metrics/route.js.nft.json +1 -0
  85. package/.next/server/app/api/metrics/route_client-reference-manifest.js +3 -0
  86. package/.next/server/app/api/setup/route/app-paths-manifest.json +3 -0
  87. package/.next/server/app/api/setup/route/build-manifest.json +12 -0
  88. package/.next/server/app/api/setup/route/server-reference-manifest.json +4 -0
  89. package/.next/server/app/api/setup/route.js +8 -0
  90. package/.next/server/app/api/setup/route.js.map +5 -0
  91. package/.next/server/app/api/setup/route.js.nft.json +1 -0
  92. package/.next/server/app/api/setup/route_client-reference-manifest.js +3 -0
  93. package/.next/server/app/api/timings/route/app-paths-manifest.json +3 -0
  94. package/.next/server/app/api/timings/route/build-manifest.json +12 -0
  95. package/.next/server/app/api/timings/route/server-reference-manifest.json +4 -0
  96. package/.next/server/app/api/timings/route.js +6 -0
  97. package/.next/server/app/api/timings/route.js.map +5 -0
  98. package/.next/server/app/api/timings/route.js.nft.json +1 -0
  99. package/.next/server/app/api/timings/route_client-reference-manifest.js +3 -0
  100. package/.next/server/app/connect/page/app-paths-manifest.json +3 -0
  101. package/.next/server/app/connect/page/build-manifest.json +19 -0
  102. package/.next/server/app/connect/page/next-font-manifest.json +6 -0
  103. package/.next/server/app/connect/page/react-loadable-manifest.json +1 -0
  104. package/.next/server/app/connect/page/server-reference-manifest.json +4 -0
  105. package/.next/server/app/connect/page.js +16 -0
  106. package/.next/server/app/connect/page.js.map +5 -0
  107. package/.next/server/app/connect/page.js.nft.json +1 -0
  108. package/.next/server/app/connect/page_client-reference-manifest.js +3 -0
  109. package/.next/server/app/connect.html +24 -0
  110. package/.next/server/app/connect.meta +35 -0
  111. package/.next/server/app/connect.rsc +44 -0
  112. package/.next/server/app/connect.segments/_full.segment.rsc +44 -0
  113. package/.next/server/app/connect.segments/_index.segment.rsc +34 -0
  114. package/.next/server/app/connect.segments/_tree.segment.rsc +2 -0
  115. package/.next/server/app/connect.segments/connect/__PAGE__.segment.rsc +25 -0
  116. package/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
  117. package/.next/server/app/favicon.ico/route/build-manifest.json +12 -0
  118. package/.next/server/app/favicon.ico/route.js +7 -0
  119. package/.next/server/app/favicon.ico/route.js.map +5 -0
  120. package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  121. package/.next/server/app/favicon.ico.body +0 -0
  122. package/.next/server/app/favicon.ico.meta +1 -0
  123. package/.next/server/app/index.html +2 -0
  124. package/.next/server/app/index.meta +30 -0
  125. package/.next/server/app/index.rsc +44 -0
  126. package/.next/server/app/index.segments/__PAGE__.segment.rsc +19 -0
  127. package/.next/server/app/index.segments/_full.segment.rsc +44 -0
  128. package/.next/server/app/index.segments/_index.segment.rsc +34 -0
  129. package/.next/server/app/index.segments/_tree.segment.rsc +2 -0
  130. package/.next/server/app/page/app-paths-manifest.json +3 -0
  131. package/.next/server/app/page/build-manifest.json +19 -0
  132. package/.next/server/app/page/next-font-manifest.json +6 -0
  133. package/.next/server/app/page/react-loadable-manifest.json +1 -0
  134. package/.next/server/app/page/server-reference-manifest.json +4 -0
  135. package/.next/server/app/page.js +16 -0
  136. package/.next/server/app/page.js.map +5 -0
  137. package/.next/server/app/page.js.nft.json +1 -0
  138. package/.next/server/app/page_client-reference-manifest.js +3 -0
  139. package/.next/server/app/performance/[slug]/page/app-paths-manifest.json +3 -0
  140. package/.next/server/app/performance/[slug]/page/build-manifest.json +19 -0
  141. package/.next/server/app/performance/[slug]/page/next-font-manifest.json +6 -0
  142. package/.next/server/app/performance/[slug]/page/react-loadable-manifest.json +1 -0
  143. package/.next/server/app/performance/[slug]/page/server-reference-manifest.json +4 -0
  144. package/.next/server/app/performance/[slug]/page.js +19 -0
  145. package/.next/server/app/performance/[slug]/page.js.map +5 -0
  146. package/.next/server/app/performance/[slug]/page.js.nft.json +1 -0
  147. package/.next/server/app/performance/[slug]/page_client-reference-manifest.js +3 -0
  148. package/.next/server/app/performance/page/app-paths-manifest.json +3 -0
  149. package/.next/server/app/performance/page/build-manifest.json +19 -0
  150. package/.next/server/app/performance/page/next-font-manifest.json +6 -0
  151. package/.next/server/app/performance/page/react-loadable-manifest.json +1 -0
  152. package/.next/server/app/performance/page/server-reference-manifest.json +4 -0
  153. package/.next/server/app/performance/page.js +17 -0
  154. package/.next/server/app/performance/page.js.map +5 -0
  155. package/.next/server/app/performance/page.js.nft.json +1 -0
  156. package/.next/server/app/performance/page_client-reference-manifest.js +3 -0
  157. package/.next/server/app/performance.html +2 -0
  158. package/.next/server/app/performance.meta +35 -0
  159. package/.next/server/app/performance.rsc +56 -0
  160. package/.next/server/app/performance.segments/_full.segment.rsc +56 -0
  161. package/.next/server/app/performance.segments/_index.segment.rsc +34 -0
  162. package/.next/server/app/performance.segments/_tree.segment.rsc +2 -0
  163. package/.next/server/app/performance.segments/performance/__PAGE__.segment.rsc +39 -0
  164. package/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  165. package/.next/server/app/settings/page/build-manifest.json +19 -0
  166. package/.next/server/app/settings/page/next-font-manifest.json +6 -0
  167. package/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  168. package/.next/server/app/settings/page/server-reference-manifest.json +4 -0
  169. package/.next/server/app/settings/page.js +18 -0
  170. package/.next/server/app/settings/page.js.map +5 -0
  171. package/.next/server/app/settings/page.js.nft.json +1 -0
  172. package/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  173. package/.next/server/app/settings.html +2 -0
  174. package/.next/server/app/settings.meta +35 -0
  175. package/.next/server/app/settings.rsc +60 -0
  176. package/.next/server/app/settings.segments/_full.segment.rsc +60 -0
  177. package/.next/server/app/settings.segments/_index.segment.rsc +34 -0
  178. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -0
  179. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +44 -0
  180. package/.next/server/app/setup/page/app-paths-manifest.json +3 -0
  181. package/.next/server/app/setup/page/build-manifest.json +19 -0
  182. package/.next/server/app/setup/page/next-font-manifest.json +6 -0
  183. package/.next/server/app/setup/page/react-loadable-manifest.json +1 -0
  184. package/.next/server/app/setup/page/server-reference-manifest.json +4 -0
  185. package/.next/server/app/setup/page.js +16 -0
  186. package/.next/server/app/setup/page.js.map +5 -0
  187. package/.next/server/app/setup/page.js.nft.json +1 -0
  188. package/.next/server/app/setup/page_client-reference-manifest.js +3 -0
  189. package/.next/server/app/setup.html +2 -0
  190. package/.next/server/app/setup.meta +35 -0
  191. package/.next/server/app/setup.rsc +44 -0
  192. package/.next/server/app/setup.segments/_full.segment.rsc +44 -0
  193. package/.next/server/app/setup.segments/_index.segment.rsc +34 -0
  194. package/.next/server/app/setup.segments/_tree.segment.rsc +2 -0
  195. package/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +25 -0
  196. package/.next/server/app-paths-manifest.json +17 -0
  197. package/.next/server/chunks/[externals]__1o8qm3w._.js +3 -0
  198. package/.next/server/chunks/[externals]__1o8qm3w._.js.map +1 -0
  199. package/.next/server/chunks/[root-of-the-server]__0chxb6o._.js +3 -0
  200. package/.next/server/chunks/[root-of-the-server]__0chxb6o._.js.map +1 -0
  201. package/.next/server/chunks/[root-of-the-server]__14tfjrn._.js +3 -0
  202. package/.next/server/chunks/[root-of-the-server]__14tfjrn._.js.map +1 -0
  203. package/.next/server/chunks/[root-of-the-server]__1fj5wte._.js +3 -0
  204. package/.next/server/chunks/[root-of-the-server]__1fj5wte._.js.map +1 -0
  205. package/.next/server/chunks/[root-of-the-server]__1i_tsds._.js +22 -0
  206. package/.next/server/chunks/[root-of-the-server]__1i_tsds._.js.map +1 -0
  207. package/.next/server/chunks/[root-of-the-server]__1l249st._.js +3 -0
  208. package/.next/server/chunks/[root-of-the-server]__1l249st._.js.map +1 -0
  209. package/.next/server/chunks/[root-of-the-server]__1uv-wzy._.js +5 -0
  210. package/.next/server/chunks/[root-of-the-server]__1uv-wzy._.js.map +1 -0
  211. package/.next/server/chunks/[turbopack]_runtime.js +807 -0
  212. package/.next/server/chunks/[turbopack]_runtime.js.map +10 -0
  213. package/.next/server/chunks/_1494cut._.js +3 -0
  214. package/.next/server/chunks/_1494cut._.js.map +1 -0
  215. package/.next/server/chunks/_1gvvd7n._.js +158 -0
  216. package/.next/server/chunks/_1gvvd7n._.js.map +1 -0
  217. package/.next/server/chunks/_1pe45_3._.js +17 -0
  218. package/.next/server/chunks/_1pe45_3._.js.map +1 -0
  219. package/.next/server/chunks/_1qtlv__._.js +3 -0
  220. package/.next/server/chunks/_1qtlv__._.js.map +1 -0
  221. package/.next/server/chunks/_next-internal_server_app_api_analyze_route_actions_0lx-23h.js +3 -0
  222. package/.next/server/chunks/_next-internal_server_app_api_analyze_route_actions_0lx-23h.js.map +1 -0
  223. package/.next/server/chunks/_next-internal_server_app_api_connect_route_actions_1r5w03m.js +3 -0
  224. package/.next/server/chunks/_next-internal_server_app_api_connect_route_actions_1r5w03m.js.map +1 -0
  225. package/.next/server/chunks/_next-internal_server_app_api_health_route_actions_1ryftkb.js +3 -0
  226. package/.next/server/chunks/_next-internal_server_app_api_health_route_actions_1ryftkb.js.map +1 -0
  227. package/.next/server/chunks/_next-internal_server_app_api_metrics_route_actions_0qn5q3s.js +3 -0
  228. package/.next/server/chunks/_next-internal_server_app_api_metrics_route_actions_0qn5q3s.js.map +1 -0
  229. package/.next/server/chunks/_next-internal_server_app_api_setup_route_actions_0txsuev.js +3 -0
  230. package/.next/server/chunks/_next-internal_server_app_api_setup_route_actions_0txsuev.js.map +1 -0
  231. package/.next/server/chunks/_next-internal_server_app_api_timings_route_actions_1tsq7j6.js +3 -0
  232. package/.next/server/chunks/_next-internal_server_app_api_timings_route_actions_1tsq7j6.js.map +1 -0
  233. package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_0g2jjls.js +3 -0
  234. package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_0g2jjls.js.map +1 -0
  235. package/.next/server/chunks/node_modules_0jatszq._.js +8 -0
  236. package/.next/server/chunks/node_modules_0jatszq._.js.map +1 -0
  237. package/.next/server/chunks/ssr/[root-of-the-server]__036j_vr._.js +3 -0
  238. package/.next/server/chunks/ssr/[root-of-the-server]__036j_vr._.js.map +1 -0
  239. package/.next/server/chunks/ssr/[root-of-the-server]__0ev464o._.js +3 -0
  240. package/.next/server/chunks/ssr/[root-of-the-server]__0ev464o._.js.map +1 -0
  241. package/.next/server/chunks/ssr/[root-of-the-server]__0f5axvr._.js +3 -0
  242. package/.next/server/chunks/ssr/[root-of-the-server]__0f5axvr._.js.map +1 -0
  243. package/.next/server/chunks/ssr/[root-of-the-server]__0hg5gib._.js +33 -0
  244. package/.next/server/chunks/ssr/[root-of-the-server]__0hg5gib._.js.map +1 -0
  245. package/.next/server/chunks/ssr/[root-of-the-server]__0tmkhxy._.js +3 -0
  246. package/.next/server/chunks/ssr/[root-of-the-server]__0tmkhxy._.js.map +1 -0
  247. package/.next/server/chunks/ssr/[root-of-the-server]__0ydfg18._.js +3 -0
  248. package/.next/server/chunks/ssr/[root-of-the-server]__0ydfg18._.js.map +1 -0
  249. package/.next/server/chunks/ssr/[root-of-the-server]__18hr860._.js +33 -0
  250. package/.next/server/chunks/ssr/[root-of-the-server]__18hr860._.js.map +1 -0
  251. package/.next/server/chunks/ssr/[root-of-the-server]__18w2nrx._.js +3 -0
  252. package/.next/server/chunks/ssr/[root-of-the-server]__18w2nrx._.js.map +1 -0
  253. package/.next/server/chunks/ssr/[root-of-the-server]__1c8dejo._.js +3 -0
  254. package/.next/server/chunks/ssr/[root-of-the-server]__1c8dejo._.js.map +1 -0
  255. package/.next/server/chunks/ssr/[root-of-the-server]__1mwg_vi._.js +3 -0
  256. package/.next/server/chunks/ssr/[root-of-the-server]__1mwg_vi._.js.map +1 -0
  257. package/.next/server/chunks/ssr/[root-of-the-server]__1p_6ezv._.js +14 -0
  258. package/.next/server/chunks/ssr/[root-of-the-server]__1p_6ezv._.js.map +1 -0
  259. package/.next/server/chunks/ssr/[root-of-the-server]__1vxra_4._.js +3 -0
  260. package/.next/server/chunks/ssr/[root-of-the-server]__1vxra_4._.js.map +1 -0
  261. package/.next/server/chunks/ssr/[turbopack]_runtime.js +807 -0
  262. package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +10 -0
  263. package/.next/server/chunks/ssr/_042xeoh._.js +3 -0
  264. package/.next/server/chunks/ssr/_042xeoh._.js.map +1 -0
  265. package/.next/server/chunks/ssr/_0c7qo1d._.js +3 -0
  266. package/.next/server/chunks/ssr/_0c7qo1d._.js.map +1 -0
  267. package/.next/server/chunks/ssr/_0dbmzjx._.js +166 -0
  268. package/.next/server/chunks/ssr/_0dbmzjx._.js.map +1 -0
  269. package/.next/server/chunks/ssr/_178o6nh._.js +3 -0
  270. package/.next/server/chunks/ssr/_178o6nh._.js.map +1 -0
  271. package/.next/server/chunks/ssr/_1bbiu24._.js +3 -0
  272. package/.next/server/chunks/ssr/_1bbiu24._.js.map +1 -0
  273. package/.next/server/chunks/ssr/_1d1ipgp._.js +6 -0
  274. package/.next/server/chunks/ssr/_1d1ipgp._.js.map +1 -0
  275. package/.next/server/chunks/ssr/_1n9m819._.js +3 -0
  276. package/.next/server/chunks/ssr/_1n9m819._.js.map +1 -0
  277. package/.next/server/chunks/ssr/_1p5i72g._.js +151 -0
  278. package/.next/server/chunks/ssr/_1p5i72g._.js.map +1 -0
  279. package/.next/server/chunks/ssr/_1r2qog2._.js +7 -0
  280. package/.next/server/chunks/ssr/_1r2qog2._.js.map +1 -0
  281. package/.next/server/chunks/ssr/_1rkc3oc._.js +25 -0
  282. package/.next/server/chunks/ssr/_1rkc3oc._.js.map +1 -0
  283. package/.next/server/chunks/ssr/_20txlee._.js +3 -0
  284. package/.next/server/chunks/ssr/_20txlee._.js.map +1 -0
  285. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js +3 -0
  286. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js.map +1 -0
  287. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js +3 -0
  288. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js.map +1 -0
  289. package/.next/server/chunks/ssr/_next-internal_server_app_connect_page_actions_1g-s_3i.js +3 -0
  290. package/.next/server/chunks/ssr/_next-internal_server_app_connect_page_actions_1g-s_3i.js.map +1 -0
  291. package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_0hhsz1j.js +3 -0
  292. package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_0hhsz1j.js.map +1 -0
  293. package/.next/server/chunks/ssr/_next-internal_server_app_performance_[slug]_page_actions_1pzv3w1.js +3 -0
  294. package/.next/server/chunks/ssr/_next-internal_server_app_performance_[slug]_page_actions_1pzv3w1.js.map +1 -0
  295. package/.next/server/chunks/ssr/_next-internal_server_app_performance_page_actions_0vi13cc.js +3 -0
  296. package/.next/server/chunks/ssr/_next-internal_server_app_performance_page_actions_0vi13cc.js.map +1 -0
  297. package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_11x4dq5.js +3 -0
  298. package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_11x4dq5.js.map +1 -0
  299. package/.next/server/chunks/ssr/_next-internal_server_app_setup_page_actions_0u1sm0s.js +3 -0
  300. package/.next/server/chunks/ssr/_next-internal_server_app_setup_page_actions_0u1sm0s.js.map +1 -0
  301. package/.next/server/chunks/ssr/app_layout_tsx_2144vk_._.js +3 -0
  302. package/.next/server/chunks/ssr/app_layout_tsx_2144vk_._.js.map +1 -0
  303. package/.next/server/chunks/ssr/app_loading_tsx_0a1flg9._.js +3 -0
  304. package/.next/server/chunks/ssr/app_loading_tsx_0a1flg9._.js.map +1 -0
  305. package/.next/server/chunks/ssr/app_performance_[slug]_loading_tsx_0d5z78a._.js +3 -0
  306. package/.next/server/chunks/ssr/app_performance_[slug]_loading_tsx_0d5z78a._.js.map +1 -0
  307. package/.next/server/chunks/ssr/app_performance_loading_tsx_1bq2nq9._.js +3 -0
  308. package/.next/server/chunks/ssr/app_performance_loading_tsx_1bq2nq9._.js.map +1 -0
  309. package/.next/server/chunks/ssr/app_settings_loading_tsx_0nv_78v._.js +3 -0
  310. package/.next/server/chunks/ssr/app_settings_loading_tsx_0nv_78v._.js.map +1 -0
  311. package/.next/server/chunks/ssr/components_0j32dj5._.js +3 -0
  312. package/.next/server/chunks/ssr/components_0j32dj5._.js.map +1 -0
  313. package/.next/server/chunks/ssr/node_modules_1wax83z._.js +33 -0
  314. package/.next/server/chunks/ssr/node_modules_1wax83z._.js.map +1 -0
  315. package/.next/server/chunks/ssr/node_modules_cn_dist_index_166wuka.js +3 -0
  316. package/.next/server/chunks/ssr/node_modules_cn_dist_index_166wuka.js.map +1 -0
  317. package/.next/server/chunks/ssr/node_modules_next_dist_0nkkbfv._.js +6 -0
  318. package/.next/server/chunks/ssr/node_modules_next_dist_0nkkbfv._.js.map +1 -0
  319. package/.next/server/chunks/ssr/node_modules_next_dist_1v8aef8._.js +3 -0
  320. package/.next/server/chunks/ssr/node_modules_next_dist_1v8aef8._.js.map +1 -0
  321. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js +3 -0
  322. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js.map +1 -0
  323. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js +3 -0
  324. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js.map +1 -0
  325. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0q-w892.js +3 -0
  326. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0q-w892.js.map +1 -0
  327. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js +3 -0
  328. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js.map +1 -0
  329. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_server-async-storage_0t1dato.js +3 -0
  330. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_server-async-storage_0t1dato.js.map +1 -0
  331. package/.next/server/functions-config-manifest.json +4 -0
  332. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  333. package/.next/server/middleware-build-manifest.js +23 -0
  334. package/.next/server/middleware-manifest.json +6 -0
  335. package/.next/server/next-font-manifest.js +1 -0
  336. package/.next/server/next-font-manifest.json +6 -0
  337. package/.next/server/pages/404.html +2 -0
  338. package/.next/server/pages/500.html +1 -0
  339. package/.next/server/pages-manifest.json +4 -0
  340. package/.next/server/prefetch-hints.json +90 -0
  341. package/.next/server/server-reference-manifest.js +1 -0
  342. package/.next/server/server-reference-manifest.json +5 -0
  343. package/.next/static/chunks/0cz1d0mv5g_q7.js +1 -0
  344. package/.next/static/chunks/0wyq7u3z0lfca.js +1 -0
  345. package/.next/static/chunks/13ihwqjtq_hlo.js +1 -0
  346. package/.next/static/chunks/14pp7x-su_dnv.js +5 -0
  347. package/.next/static/chunks/1clwpy-vw07cb.js +1 -0
  348. package/.next/static/chunks/1rj7ns8rte9vc.js +1 -0
  349. package/.next/static/chunks/1u5zan5bs9a7v.js +31 -0
  350. package/.next/static/chunks/2-llbg7gt2gi5.js +4 -0
  351. package/.next/static/chunks/212boumyeyva9.js +23 -0
  352. package/.next/static/chunks/28w-hz8hg8t4v.css +1 -0
  353. package/.next/static/chunks/2xy80eg_ueu_u.js +1 -0
  354. package/.next/static/chunks/3-kx-5mj07qy0.js +22 -0
  355. package/.next/static/chunks/3fntmmi971322.js +1 -0
  356. package/.next/static/chunks/3lqd2emjcxbd-.js +1 -0
  357. package/.next/static/chunks/3rfi1wruz0m51.js +1 -0
  358. package/.next/static/chunks/turbopack-2-rd7l6sk4a9l.js +1 -0
  359. package/.next/static/media/favicon.2vob68tjqpejf.ico +0 -0
  360. package/.next/static/vTYnNx5fUtumjGBK2LQwR/_buildManifest.js +11 -0
  361. package/.next/static/vTYnNx5fUtumjGBK2LQwR/_clientMiddlewareManifest.js +1 -0
  362. package/.next/static/vTYnNx5fUtumjGBK2LQwR/_ssgManifest.js +1 -0
  363. package/.next/trace +1 -0
  364. package/.next/trace-build +1 -0
  365. package/.next/turbopack +0 -0
  366. package/README.md +147 -0
  367. package/bin/cli.mjs +81 -0
  368. package/bin/output.mjs +86 -0
  369. package/package.json +62 -0
  370. package/public/file.svg +1 -0
  371. package/public/globe.svg +1 -0
  372. package/public/next.svg +1 -0
  373. package/public/vercel.svg +1 -0
  374. package/public/window.svg +1 -0
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,24851,e=>{"use strict";var t=e.i(43476),r=e.i(22016),a=e.i(70065),s=e.i(67881);e.s(["EmptyState",0,function({title:e="No data yet",reason:i="Keys work, but no page events have arrived.",href:n="/connect",cta:d="Send your first events",onRetry:o}){return(0,t.jsx)(a.Card,{className:"border-[#2d3748] bg-[#1a202c] shadow-md",children:(0,t.jsxs)(a.CardContent,{className:"flex flex-col items-center gap-3 p-10 text-center",children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-white",children:e}),(0,t.jsx)("p",{className:"max-w-md text-sm text-gray-400",children:i}),(0,t.jsxs)("div",{className:"flex gap-3",children:[(0,t.jsx)(r.default,{href:n,className:(0,s.buttonVariants)(),children:d}),o&&(0,t.jsx)(s.Button,{variant:"outline",onClick:o,children:"Retry"})]})]})})}])},94179,e=>{"use strict";var t=e.i(76782),r=e.i(11825),a=e.i(25913),s=e.i(79862);let i=(0,a.cva)("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",secondary:"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",destructive:"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",outline:"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",ghost:"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",link:"text-primary underline-offset-4 hover:underline"}},defaultVariants:{variant:"default"}});e.s(["Badge",0,function({className:e,variant:a="default",render:n,...d}){return(0,r.useRender)({defaultTagName:"span",props:(0,t.mergeProps)({className:(0,s.cn)(i({variant:a}),e)},d),render:n,state:{slot:"badge",variant:a}})}])},70065,e=>{"use strict";var t=e.i(43476),r=e.i(79862);e.s(["Card",0,function({className:e,size:a="default",...s}){return(0,t.jsx)("div",{"data-slot":"card","data-size":a,className:(0,r.cn)("group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",e),...s})},"CardContent",0,function({className:e,...a}){return(0,t.jsx)("div",{"data-slot":"card-content",className:(0,r.cn)("px-(--card-spacing)",e),...a})},"CardDescription",0,function({className:e,...a}){return(0,t.jsx)("div",{"data-slot":"card-description",className:(0,r.cn)("text-sm text-muted-foreground",e),...a})},"CardHeader",0,function({className:e,...a}){return(0,t.jsx)("div",{"data-slot":"card-header",className:(0,r.cn)("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",e),...a})},"CardTitle",0,function({className:e,...a}){return(0,t.jsx)("div",{"data-slot":"card-title",className:(0,r.cn)("font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm",e),...a})}])},78320,e=>{"use strict";var t=e.i(71645);e.s(["hasData",0,function(e){return e.newRelic.throughput>0||e.newRelic.loadTime>0||e.sentry.errorCount>0},"useMetrics",0,function(){let[e,r]=(0,t.useState)({status:"loading"}),[a,s]=(0,t.useState)(0);return(0,t.useEffect)(()=>{let e=!1;return fetch("/api/metrics").then(async t=>{let a=await t.json();if(!t.ok)throw Error(a.error??`HTTP ${t.status}`);e||r({status:"ready",configured:a.configured,pages:a.pages})}).catch(t=>{e||r({status:"error",message:t instanceof Error?t.message:"Request failed"})}),()=>{e=!0}},[a]),{state:e,retry:()=>{r({status:"loading"}),s(e=>e+1)}}}])},60972,e=>{"use strict";var t=e.i(56420);let r={name:"ellipsis",size:24,node:[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]],aliases:["more-horizontal"]};r.node;let a=(0,t.default)(r);e.s(["default",0,a])},53138,e=>{"use strict";var t=e.i(56420);let r={name:"triangle-alert",size:24,node:[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],aliases:["alert-triangle"]};r.node;let a=(0,t.default)(r);e.s(["AlertTriangle",0,a],53138)},64569,e=>{"use strict";var t=e.i(56420);let r={name:"zap",size:24,node:[["path",{d:"M15.914 4a1.5 1.5 0 00-2.474-1.561l-9 9A1.5 1.5 0 005.5 14h4.002a.5.5 0 01.471.666L8.086 20a1.5 1.5 0 002.475 1.56l9-9A1.5 1.5 0 0018.5 10h-3.997a.5.5 0 01-.472-.667z",key:"1v7up4"}]]};r.node;let a=(0,t.default)(r);e.s(["Zap",0,a],64569)}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/1u5zan5bs9a7v.js","static/chunks/3-kx-5mj07qy0.js","static/chunks/1rj7ns8rte9vc.js"],runtimeModuleIds:[94553]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;var t,r=function(){if(null!=self.TURBOPACK_ASSET_SUFFIX)return self.TURBOPACK_ASSET_SUFFIX;let e=document?.currentScript?.getAttribute?.("src")??"",t=e.indexOf("?");return t>=0?e.slice(t):""}(),n=((t=n||{})[t.Runtime=0]="Runtime",t[t.Parent=1]="Parent",t[t.Update=2]="Update",t);let o=new WeakMap;function l(e,t){this.m=e,this.e=t}let i=l.prototype,u=Object.prototype.hasOwnProperty,s="u">typeof Symbol&&Symbol.toStringTag;function c(e,t,r){u.call(e,t)||Object.defineProperty(e,t,r)}function a(e,t){let r=e[t];return r||(r=f(t),e[t]=r),r}function f(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}function p(e,t,r){c(e,"__esModule",{value:!0}),s&&c(e,s,{value:"Module"});let n=0;for(;n<t.length;){let r=t[n++],o=t[n++];if("number"==typeof o)if(0===o)c(e,r,{value:t[n++],enumerable:!0,writable:!1});else throw Error(`unexpected tag: ${o}`);else"function"==typeof t[n]?c(e,r,{get:o,set:t[n++],enumerable:!0}):c(e,r,{get:o,enumerable:!0})}r||Object.seal(e)}function h(e,t){(null!=t?a(this.c,t):this.m).exports=e}i.s=function(e,t,r){let n,o;null!=t?o=(n=a(this.c,t)).exports:(n=this.m,o=this.e),n.namespaceObject=o,p(o,e,r)},i.j=function(e,t){let r,n;null!=t?n=(r=a(this.c,t)).exports:(r=this.m,n=this.e);let l=function(e,t){let r=o.get(e);if(!r){o.set(e,r=[]);let n=e=>{if("default"!==e){for(let t of r)if(u.call(t,e))return t}};e.exports=e.namespaceObject=new Proxy(t,{get(e,t){if(u.call(e,t)||"default"===t||"__esModule"===t)return Reflect.get(e,t);let r=n(t);return r&&Reflect.get(r,t)},set:()=>!1,defineProperty:()=>!1,deleteProperty:()=>!1,has:(e,t)=>!!Reflect.has(e,t)||"default"!==t&&"__esModule"!==t&&void 0!==n(t),ownKeys(e){let t=Reflect.ownKeys(e);for(let e of r)for(let r of Reflect.ownKeys(e))"default"===r||t.includes(r)||t.push(r);return t},getOwnPropertyDescriptor(e,t){let r=Reflect.getOwnPropertyDescriptor(e,t);if(r||"default"===t||"__esModule"===t)return r;let o=n(t);if(o)return{enumerable:!0,configurable:!0,get:()=>Reflect.get(o,t)}}})}return r}(r,n);"object"==typeof e&&null!==e&&l.push(e)},i.v=h,i.n=function(e,t){let r;(r=null!=t?a(this.c,t):this.m).exports=r.namespaceObject=e};let d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,m=[null,d({}),d([]),d(d)];function y(e,t,r){let n=[],o=-1;for(let t=e;("object"==typeof t||"function"==typeof t)&&!m.includes(t);t=d(t))for(let r of Object.getOwnPropertyNames(t))n.push(r,function(e,t){return()=>e[t]}(e,r)),-1===o&&"default"===r&&(o=n.length-1);return r&&o>=0||(o>=0?n.splice(o,1,0,e):n.push("default",0,e)),p(t,n),t}function g(e){let t=K(e,this.m);if(t.namespaceObject)return t.namespaceObject;let r=t.exports;return t.namespaceObject=y(r,"function"==typeof r?function(...e){return r.apply(this,e)}:Object.create(null),r&&r.__esModule)}function b(e){let t=e.indexOf("#");-1!==t&&(e=e.substring(0,t));let r=e.indexOf("?");return -1!==r&&(e=e.substring(0,r)),e}i.i=g,i.A=function(e){return this.r(e)(g.bind(this))},i.t="function"==typeof require?require:function(){throw Error("Unexpected use of runtime require")},i.r=function(e){return K(e,this.m).exports},i.f=function(e){function t(t){if(t=b(t),u.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(t=b(t),u.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r},t.import=async e=>await t(e),t};let O=function(e){let t=new URL(e,"x:/"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,""),r.origin=r.protocol="",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function w(e,t){throw Error(`Invariant: ${t(e)}`)}O.prototype=URL.prototype,i.U=O,i.z=function(e){throw Error("dynamic usage of require is not supported")},i.g=globalThis;let R=l.prototype,k="string"==typeof TURBOPACK_CHUNK_BASE_PATH?TURBOPACK_CHUNK_BASE_PATH:"/_next/",U=new Map;i.M=U;let v=new Map,_=new Map,P=new Map;async function C(e,t,r){let n;if("string"==typeof r)return function(e,t,r){return A(e,t,r)}(e,t,E(r));let o=r.included||[],l=o.map(e=>!!U.has(e)||v.get(e));if(l.length>0&&l.every(e=>e))return void await Promise.all(l);for(let l of(n=A(e,t,E(r.path)),o))v.has(l)||v.set(l,n);await n}R.l=function(e){return C(n.Parent,this.m.id,e)};let j=Promise.resolve(void 0),$=new WeakMap;function A(t,r,o){let l=e.loadChunkCached(t,o),i=$.get(l);if(void 0===i){let e=$.set.bind($,l,j);i=l.then(e).catch(e=>{let l;switch(t){case n.Runtime:l=`as a runtime dependency of chunk ${r}`;break;case n.Parent:l=`from module ${r}`;break;case n.Update:l="from an HMR update";break;default:w(t,e=>`Unknown source type: ${e}`)}let i=Error(`Failed to load chunk ${o} ${l}${e?`: ${e}`:""}`,e?{cause:e}:void 0);throw i.name="ChunkLoadError",i}),$.set(l,i)}return i}R.L=function(e){var t,r;return t=n.Parent,r=this.m.id,A(t,r,e)};R.R=function(e){let t=this.r(e);return t?.default??t},R.P=function(e){return`/ROOT/${e??""}`},R.F=function(e){return e?`file:///ROOT/${e.split("/").map(encodeURIComponent).join("/")}`:"file:///ROOT/"},R.q=function(e,t){h.call(this,`${e}${r}`,t)};let T=/[^A-Za-z0-9\-_.!~*'()/]/;function E(e,t=k){let n=T.test(e)?e.split("/").map(encodeURIComponent).join("/"):e;return`${t}${n}${r}`}function S(e,t){let r,n=e.indexOf("?");if(-1!==n)r=n;else{let t=e.indexOf("#");r=-1!==t?t:e.length}return r>=t.length&&e.startsWith(t,r-t.length)}R.b=k,R.X=r,R.h=E;function M(e){return S(e,".css")}let x={};i.c=x;let K=(e,t)=>{let r=x[e];if(r){if(r.error)throw r.error;return r}return N(e,n.Parent,t.id)};function N(e,t,r){let n=U.get(e);if("function"!=typeof n)throw Error(function(e,t,r){let n;switch(t){case 0:n=`as a runtime entry of chunk ${r}`;break;case 1:n=`because it was required from module ${r}`;break;case 2:n="because of an HMR update";break;default:w(t,e=>`Unknown source type: ${e}`)}return`Module ${e} was instantiated ${n}, but the module factory is not available.`}(e,t,r));let o=f(e),i=o.exports;x[e]=o;let u=new l(o,i);try{n(u,o,i)}catch(e){throw o.error=e,e}return o.namespaceObject&&o.exports!==o.namespaceObject&&y(o.exports,o.namespaceObject),o}function B(t){let r;if(!Array.isArray(t))return e.registerChunk(void 0,t);let n=function(e){if("string"==typeof e)return e;if(e)return{src:e.getAttribute("src")};if("u">typeof TURBOPACK_NEXT_CHUNK_URLS)return{src:TURBOPACK_NEXT_CHUNK_URLS.pop()};throw Error("chunk path empty but not in a worker")}(t[0]);return 2===t.length?r=t[1]:(r=void 0,!function(e,t){let r=1;for(;r<e.length;){let n,o=r+1;for(;o<e.length&&"function"!=typeof e[o];)o++;if(o===e.length)throw Error("malformed chunk format, expected a factory function");let l=e[o];for(let l=r;l<o;l++){let r=e[l],o=t.get(r);if(o){n=o;break}}let i=n??l,u=!1;for(let n=r;n<o;n++){let r=e[n];t.has(r)||(u||(i===l&&Object.defineProperty(l,"name",{value:"module evaluation"}),u=!0),t.set(r,i))}r=o+1}}(t,U)),e.registerChunk(n,r)}let L=new Map;function I(e){let t=L.get(e);if(!t){let r,n;t={resolved:!1,loadingStarted:!1,retryAttempts:0,promise:new Promise((e,t)=>{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},L.set(e,t)}return t}function q(e,t,r,n,o){!(null==n||n instanceof DOMException&&"NetworkError"===n.name)||r.retryAttempts>=1||L.get(t)!==r?(L.get(t)===r&&L.delete(t),r.reject(n)):(r.retryAttempts++,setTimeout(()=>{r.resolved||L.get(t)!==r||(o?o():(r.loadingStarted=!1,H(e,t)))},200+Math.floor(401*Math.random())))}function H(e,t){let r=I(t);if(r.loadingStarted)return r.promise;if(e===n.Runtime)return r.loadingStarted=!0,M(t)&&r.resolve(),r.promise;if("function"==typeof importScripts)if(M(t));else if(S(t,".js")){self.TURBOPACK_NEXT_CHUNK_URLS.push(t);try{importScripts(t)}catch(n){q(e,t,r,n)}}else throw Error(`can't infer type of chunk from URL ${t} in worker`);else{let n=decodeURI(t);if(M(t))if(document.querySelectorAll(`link[rel=stylesheet][href="${t}"],link[rel=stylesheet][href^="${t}?"],link[rel=stylesheet][href="${n}"],link[rel=stylesheet][href^="${n}?"]`).length>0)r.resolve();else{let n=()=>{let o=document.createElement("link");return o.rel="stylesheet",o.crossOrigin=null,o.href=t,o.onerror=()=>{let l=document.createComment("");o.replaceWith(l),q(e,t,r,void 0,()=>l.replaceWith(n()))},o.onload=()=>{r.resolve()},o};document.head.appendChild(n())}else if(S(t,".js")){let o=document.querySelectorAll(`script[src="${t}"],script[src^="${t}?"],script[src="${n}"],script[src^="${n}?"]`);if(o.length>0)for(let n of Array.from(o))n.addEventListener("error",()=>{n.remove(),q(e,t,r)},{once:!0});else{let n=document.createElement("script");n.crossOrigin=null,n.src=t,n.onerror=()=>{n.remove(),q(e,t,r)},document.head.appendChild(n)}}else throw Error(`can't infer type of chunk from URL ${t}`)}return r.loadingStarted=!0,r.promise}e={async registerChunk(e,t){let r;if(null!=e&&(r=function(e){if("string"==typeof e)return e;let t=decodeURIComponent(e.src.replace(/[?#].*$/,""));return t.startsWith(k)?t.slice(k.length):t}(e),I("string"==typeof e?E(e):e.src).resolve()),null!=t){for(let e of t.otherChunks)I(E("string"==typeof e?e:e.path));if(await Promise.all(t.otherChunks.map(e=>{var t;return t=r,C(n.Runtime,t,e)})),t.runtimeModuleIds.length>0)for(let e of t.runtimeModuleIds)!function(e,t){let r=x[t];if(r){if(r.error)throw r.error;return}N(t,n.Runtime,e)}(r,e)}},loadChunkCached:(e,t)=>H(e,t)};var F=globalThis.TURBOPACK;globalThis.TURBOPACK={push:B},F.forEach(B)})();
@@ -0,0 +1,11 @@
1
+ self.__BUILD_MANIFEST = {
2
+ "__rewrites": {
3
+ "afterFiles": [],
4
+ "beforeFiles": [],
5
+ "fallback": []
6
+ },
7
+ "sortedPages": [
8
+ "/_app",
9
+ "/_error"
10
+ ]
11
+ };self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB()
@@ -0,0 +1 @@
1
+ self.__MIDDLEWARE_MATCHERS = [];self.__MIDDLEWARE_MATCHERS_CB && self.__MIDDLEWARE_MATCHERS_CB()
@@ -0,0 +1 @@
1
+ self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
package/.next/trace ADDED
@@ -0,0 +1 @@
1
+ [{"name":"generate-buildid","duration":1000,"timestamp":34517810358,"id":4,"parentId":1,"tags":{},"startTime":1790896092059,"traceId":"cb86be7b860fd9f5"},{"name":"load-custom-routes","duration":3902,"timestamp":34517814437,"id":5,"parentId":1,"tags":{},"startTime":1790896092063,"traceId":"cb86be7b860fd9f5"},{"name":"create-dist-dir","duration":1036,"timestamp":34517818453,"id":6,"parentId":1,"tags":{},"startTime":1790896092067,"traceId":"cb86be7b860fd9f5"},{"name":"clean","duration":438703,"timestamp":34517824663,"id":7,"parentId":1,"tags":{},"startTime":1790896092073,"traceId":"cb86be7b860fd9f5"},{"name":"discover-routes","duration":153627,"timestamp":34518317886,"id":8,"parentId":1,"tags":{},"startTime":1790896092566,"traceId":"cb86be7b860fd9f5"},{"name":"create-root-mapping","duration":25671,"timestamp":34518472369,"id":9,"parentId":1,"tags":{},"startTime":1790896092723,"traceId":"cb86be7b860fd9f5"},{"name":"generate-route-types","duration":302514,"timestamp":34518580134,"id":10,"parentId":1,"tags":{},"startTime":1790896092829,"traceId":"cb86be7b860fd9f5"},{"name":"public-dir-conflict-check","duration":374,"timestamp":34518882940,"id":11,"parentId":1,"tags":{},"startTime":1790896093131,"traceId":"cb86be7b860fd9f5"},{"name":"generate-routes-manifest","duration":22872,"timestamp":34518883848,"id":12,"parentId":1,"tags":{},"startTime":1790896093132,"traceId":"cb86be7b860fd9f5"},{"name":"run-turbopack","duration":11012047,"timestamp":34518932696,"id":14,"parentId":1,"tags":{},"startTime":1790896093181,"traceId":"cb86be7b860fd9f5"},{"name":"turbopack-build-events","duration":322,"timestamp":34520973833,"id":15,"parentId":1,"tags":{},"startTime":1790896095222,"traceId":"cb86be7b860fd9f5"},{"name":"turbopack-persistence","duration":395000,"timestamp":34529062170,"id":16,"parentId":15,"tags":{"reason":"stop","snapshot_duration_ms":15.491709,"persist_duration_ms":379.872251,"task_count":4032,"bytes_written":2600520,"bytes_deleted":0},"startTime":1790896103724,"traceId":"cb86be7b860fd9f5"},{"name":"run-typescript","duration":11162433,"timestamp":34530021768,"id":18,"parentId":1,"tags":{},"startTime":1790896104271,"traceId":"cb86be7b860fd9f5"},{"name":"generate-required-server-files","duration":2664,"timestamp":34541190983,"id":20,"parentId":1,"tags":{},"startTime":1790896115440,"traceId":"cb86be7b860fd9f5"},{"name":"check-static-error-page","duration":37188,"timestamp":34541317413,"id":22,"parentId":21,"tags":{},"startTime":1790896115566,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":3805508,"timestamp":34541359799,"id":39,"parentId":24,"tags":{},"startTime":1790896115609,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":3831071,"timestamp":34541334409,"id":24,"parentId":21,"tags":{"page":"/_global-error"},"startTime":1790896115583,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5315573,"timestamp":34541383284,"id":49,"parentId":35,"tags":{},"startTime":1790896115632,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5346711,"timestamp":34541352245,"id":35,"parentId":21,"tags":{"page":"/performance"},"startTime":1790896115601,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5388925,"timestamp":34541383319,"id":50,"parentId":36,"tags":{},"startTime":1790896115632,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5418557,"timestamp":34541353825,"id":36,"parentId":21,"tags":{"page":"/settings"},"startTime":1790896115603,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5409879,"timestamp":34541383350,"id":51,"parentId":37,"tags":{},"startTime":1790896115632,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5439038,"timestamp":34541354284,"id":37,"parentId":21,"tags":{"page":"/setup"},"startTime":1790896115603,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5597672,"timestamp":34541361470,"id":45,"parentId":30,"tags":{},"startTime":1790896115611,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5622780,"timestamp":34541336475,"id":30,"parentId":21,"tags":{"page":"/api/timings"},"startTime":1790896115586,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5622034,"timestamp":34541360789,"id":42,"parentId":27,"tags":{},"startTime":1790896115610,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5647217,"timestamp":34541335719,"id":27,"parentId":21,"tags":{"page":"/api/health"},"startTime":1790896115585,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5654473,"timestamp":34541358762,"id":38,"parentId":23,"tags":{},"startTime":1790896115608,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5691803,"timestamp":34541321532,"id":23,"parentId":21,"tags":{"page":"/_not-found"},"startTime":1790896115571,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5677987,"timestamp":34541382687,"id":47,"parentId":31,"tags":{},"startTime":1790896115632,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5723758,"timestamp":34541337012,"id":31,"parentId":21,"tags":{"page":"/connect"},"startTime":1790896115586,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5698158,"timestamp":34541383108,"id":48,"parentId":33,"tags":{},"startTime":1790896115632,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5742741,"timestamp":34541338660,"id":33,"parentId":21,"tags":{"page":"/"},"startTime":1790896115588,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5744902,"timestamp":34541361988,"id":46,"parentId":32,"tags":{},"startTime":1790896115611,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5769630,"timestamp":34541337401,"id":32,"parentId":21,"tags":{"page":"/favicon.ico"},"startTime":1790896115586,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5778872,"timestamp":34541360237,"id":40,"parentId":25,"tags":{},"startTime":1790896115609,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5804094,"timestamp":34541335102,"id":25,"parentId":21,"tags":{"page":"/api/analyze"},"startTime":1790896115584,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5769582,"timestamp":34541383376,"id":52,"parentId":34,"tags":{},"startTime":1790896115632,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5813888,"timestamp":34541339159,"id":34,"parentId":21,"tags":{"page":"/performance/[slug]"},"startTime":1790896115588,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5800197,"timestamp":34541360947,"id":43,"parentId":28,"tags":{},"startTime":1790896115610,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5825263,"timestamp":34541335962,"id":28,"parentId":21,"tags":{"page":"/api/metrics"},"startTime":1790896115585,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5821975,"timestamp":34541360597,"id":41,"parentId":26,"tags":{},"startTime":1790896115610,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5847192,"timestamp":34541335444,"id":26,"parentId":21,"tags":{"page":"/api/connect"},"startTime":1790896115585,"traceId":"cb86be7b860fd9f5"},{"name":"is-page-static","duration":5842355,"timestamp":34541361187,"id":44,"parentId":29,"tags":{},"startTime":1790896115610,"traceId":"cb86be7b860fd9f5"},{"name":"check-page","duration":5867386,"timestamp":34541336217,"id":29,"parentId":21,"tags":{"page":"/api/setup"},"startTime":1790896115585,"traceId":"cb86be7b860fd9f5"},{"name":"static-check","duration":5887656,"timestamp":34541316042,"id":21,"parentId":1,"tags":{},"startTime":1790896115565,"traceId":"cb86be7b860fd9f5"},{"name":"write-routes-manifest","duration":1478,"timestamp":34547206361,"id":54,"parentId":1,"tags":{},"startTime":1790896121456,"traceId":"cb86be7b860fd9f5"},{"name":"load-dotenv","duration":167,"timestamp":34547268555,"id":57,"parentId":56,"tags":{},"startTime":1790896121518,"traceId":"cb86be7b860fd9f5"},{"name":"run-export-path-map","duration":2547,"timestamp":34547286443,"id":58,"parentId":56,"tags":{},"startTime":1790896121536,"traceId":"cb86be7b860fd9f5"},{"name":"next-export","duration":2530622,"timestamp":34547257314,"id":56,"parentId":1,"tags":{},"startTime":1790896121507,"traceId":"cb86be7b860fd9f5"},{"name":"move-exported-app-not-found-","duration":16493,"timestamp":34549822540,"id":59,"parentId":55,"tags":{},"startTime":1790896124072,"traceId":"cb86be7b860fd9f5"},{"name":"move-exported-app-global-error-","duration":6694,"timestamp":34549839373,"id":60,"parentId":55,"tags":{},"startTime":1790896124089,"traceId":"cb86be7b860fd9f5"},{"name":"static-generation","duration":2635874,"timestamp":34547214831,"id":55,"parentId":1,"tags":{},"startTime":1790896121464,"traceId":"cb86be7b860fd9f5"},{"name":"write-routes-manifest","duration":13362,"timestamp":34549851699,"id":61,"parentId":1,"tags":{},"startTime":1790896124101,"traceId":"cb86be7b860fd9f5"},{"name":"print-tree-view","duration":11794,"timestamp":34550084016,"id":62,"parentId":1,"tags":{},"startTime":1790896124334,"traceId":"cb86be7b860fd9f5"},{"name":"write-route-bundle-stats","duration":22778,"timestamp":34550095855,"id":63,"parentId":1,"tags":{},"startTime":1790896124345,"traceId":"cb86be7b860fd9f5"},{"name":"telemetry-flush","duration":396749,"timestamp":34550118685,"id":64,"parentId":1,"tags":{},"startTime":1790896124368,"traceId":"cb86be7b860fd9f5"},{"name":"next-build","duration":32966624,"timestamp":34517548858,"id":1,"tags":{"buildMode":"default","version":"16.3.8","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1790896091797,"traceId":"cb86be7b860fd9f5"}]
@@ -0,0 +1 @@
1
+ [{"name":"run-turbopack","duration":11012047,"timestamp":34518932696,"id":14,"parentId":1,"tags":{},"startTime":1790896093181,"traceId":"cb86be7b860fd9f5"},{"name":"turbopack-build-events","duration":322,"timestamp":34520973833,"id":15,"parentId":1,"tags":{},"startTime":1790896095222,"traceId":"cb86be7b860fd9f5"},{"name":"turbopack-persistence","duration":395000,"timestamp":34529062170,"id":16,"parentId":15,"tags":{"reason":"stop","snapshot_duration_ms":15.491709,"persist_duration_ms":379.872251,"task_count":4032,"bytes_written":2600520,"bytes_deleted":0},"startTime":1790896103724,"traceId":"cb86be7b860fd9f5"},{"name":"run-typescript","duration":11162433,"timestamp":34530021768,"id":18,"parentId":1,"tags":{},"startTime":1790896104271,"traceId":"cb86be7b860fd9f5"},{"name":"static-check","duration":5887656,"timestamp":34541316042,"id":21,"parentId":1,"tags":{},"startTime":1790896115565,"traceId":"cb86be7b860fd9f5"},{"name":"static-generation","duration":2635874,"timestamp":34547214831,"id":55,"parentId":1,"tags":{},"startTime":1790896121464,"traceId":"cb86be7b860fd9f5"},{"name":"telemetry-flush","duration":396749,"timestamp":34550118685,"id":64,"parentId":1,"tags":{},"startTime":1790896124368,"traceId":"cb86be7b860fd9f5"},{"name":"next-build","duration":32966624,"timestamp":34517548858,"id":1,"tags":{"buildMode":"default","version":"16.3.8","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1790896091797,"traceId":"cb86be7b860fd9f5"}]
File without changes
package/README.md ADDED
@@ -0,0 +1,147 @@
1
+ # MetricFlow — Performance Dashboard
2
+
3
+ MetricFlow is a local web dashboard that pulls page-performance data from New Relic and errors from Sentry, and uses AI (Gemini) to turn them into insights and alerts. Start it with one command: `npx @karan171996/metricflow`.
4
+
5
+ > Status: early (`v0.1.0`). The npm package is `@karan171996/metricflow` (run it with `npx @karan171996/metricflow`; after a global install the command is `performance-dashboard`). Not yet published to npm, so `npx` works only after publishing.
6
+
7
+ ## Features
8
+
9
+ - **Dashboard** (`/`): KPI cards, line/bar/donut charts, Core Web Vitals cards, visibility breakdown, "what moved" and AI suggestions.
10
+ - **Performance hub** (`/performance`): per-page table and metrics, with a drill-down at `/performance/[slug]` (KPIs, charts, hourly breakdown, related errors).
11
+ - **Settings** (`/settings`): API keys, thresholds, notification preferences, export, team members.
12
+ - **Data sources**: New Relic (load time, LCP, TTFB, FID, error rate, throughput, Apdex) and Sentry (error count, warnings, latest errors).
13
+ - **API routes** (Next.js route handlers): `GET /api/metrics`, `POST /api/analyze`, `GET /api/health`, `/api/timings`.
14
+ - **CLI**: `performance-dashboard` starts the production server and opens your browser. Supports `--json` and `--no-color`.
15
+
16
+ ## Screenshots
17
+
18
+ ### Dashboard
19
+
20
+ ![Dashboard](docs/images/dashboard.png)
21
+
22
+ ### Performance hub
23
+
24
+ ![Performance hub](docs/images/performance.png)
25
+
26
+ _Screenshots use sample data, not real New Relic or Sentry numbers._
27
+
28
+ ### CLI
29
+
30
+ ```
31
+ $ performance-dashboard
32
+ ✔ Dashboard is running
33
+ URL http://localhost:3000
34
+ Stop Ctrl+C
35
+ ```
36
+
37
+ ## Requirements
38
+
39
+ - Node.js `>=20.12`
40
+ - Optional but needed for real data: New Relic, Sentry and Gemini keys
41
+
42
+ ## Quick start
43
+
44
+ ```bash
45
+ git clone https://github.com/karan171996/MetricFlow.git
46
+ cd MetricFlow
47
+ npm install
48
+ cp .env.local.example .env.local # then fill in your keys
49
+ npm run dev # development, http://localhost:3000
50
+ ```
51
+
52
+ Production-style run through the CLI (needs a build first):
53
+
54
+ ```bash
55
+ npm run build
56
+ node bin/cli.mjs # or `performance-dashboard` once installed/linked
57
+ ```
58
+
59
+ ### Installing into an existing app
60
+
61
+ Tested by installing the packed tarball into an older Create React App project (react-scripts 2.1.3). Notes from that test:
62
+
63
+ - **Install size:** MetricFlow pulls in a large dependency tree (Next.js, Recharts, Cypress and others), so expect a heavy `npm install`.
64
+ - **Lockfiles:** if the host project uses yarn, installing with npm adds a `package-lock.json` next to `yarn.lock`. Use one package manager and commit only its lockfile.
65
+ - **Old toolchains:** the New Relic browser agent may not work in projects on webpack 4 (Create React App 2). This is untested; check before relying on it.
66
+
67
+ ### Environment variables
68
+
69
+ Set these in `.env.local` (see `.env.local.example`). The CLI loads `.env.local` and `.env` from the folder you run it in.
70
+
71
+ | Variable | Purpose |
72
+ | --- | --- |
73
+ | `NEXT_PUBLIC_NEWRELIC_ACCOUNT_ID`, `NEWRELIC_API_KEY` | Read metrics from New Relic |
74
+ | `SENTRY_API_KEY`, `SENTRY_ORG_SLUG`, `SENTRY_PROJECT_ID` | Read errors from Sentry |
75
+ | `GEMINI_API_KEY` | AI analysis (`/api/analyze`) |
76
+ | `SENTRY_DSN`, `NEWRELIC_INSERT_KEY` | Only for `npm run send-test-data`, which writes a dummy event to each platform |
77
+
78
+ ## CLI usage
79
+
80
+ ```
81
+ performance-dashboard [port] [options]
82
+ ```
83
+
84
+ | Option | Description |
85
+ | --- | --- |
86
+ | `-h`, `--help` | Show help |
87
+ | `-v`, `--version` | Print the version |
88
+ | `--json` | Machine-readable output: one JSON object per line on stdout (`event` is `ok`, `info`, `warn`, `error` or `summary`) |
89
+ | `--no-color` | Disable colors (also honors `NO_COLOR` and non-TTY output) |
90
+ | `--host <addr>` | Address to listen on. Default `127.0.0.1` (this machine only). `--host 0.0.0.0` exposes the dashboard, and the New Relic/Sentry data behind it, to your network and prints a warning |
91
+ | `[port]` | Port to listen on; default `3000`. The `PORT` environment variable also works |
92
+
93
+ Examples:
94
+
95
+ ```bash
96
+ performance-dashboard
97
+ performance-dashboard 4000 --no-color
98
+ performance-dashboard --json
99
+ ```
100
+
101
+ JSON output:
102
+
103
+ ```
104
+ {"event":"ok","message":"Dashboard is running","url":"http://localhost:3000","port":3000}
105
+ ```
106
+
107
+ Errors print what failed and how to fix it. Exit code `2` is bad usage, `1` is a runtime failure:
108
+
109
+ ```
110
+ $ performance-dashboard abc
111
+ ✖ Invalid port "abc".
112
+ → Use a number from 1 to 65535, e.g. performance-dashboard 4000
113
+
114
+ $ performance-dashboard # before `npm run build`
115
+ ✖ No build found.
116
+ → Run `npm run build` first (published packages include it).
117
+ ```
118
+
119
+ Human text goes to stdout; errors, warnings and spinners go to stderr. Full spec: [CLI_OUTPUT.md](CLI_OUTPUT.md).
120
+
121
+ ## Project structure
122
+
123
+ ```
124
+ app/ Next.js App Router: pages (/, /performance, /settings) and api/ route handlers
125
+ components/ UI: DashboardCharts, Analytics, PerformanceHub, Settings, sidebar, ui (shadcn)
126
+ lib/ hooks/ types/ Data transforms, metric history, shared types
127
+ bin/ CLI (cli.mjs) and output formatter (output.mjs)
128
+ scripts/ send-test-data.mjs
129
+ test/ CLI, hook and package tests (node:test)
130
+ cypress/ End-to-end smoke test
131
+ docs/images/ README screenshots (not shipped in the npm package)
132
+ ```
133
+
134
+ ## Tests
135
+
136
+ ```bash
137
+ npm run test:cli # CLI, hook and package tests (node --test)
138
+ npm run cy:run # Cypress smoke test (needs the app running)
139
+ npm run lint
140
+ ```
141
+
142
+ ## Contributing
143
+
144
+ 1. Branch from `main`.
145
+ 2. Run `npm run lint` and `npm run test:cli` before opening a pull request.
146
+ 3. Keep CLI output going through `bin/output.mjs` (`out.ok/info/warn/error/kv/spinner`), never `console.log`.
147
+ 4. This project uses a recent Next.js with breaking changes; read `node_modules/next/dist/docs/` before changing framework code.
package/bin/cli.mjs ADDED
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { existsSync } from "node:fs";
4
+ import { createRequire } from "node:module";
5
+ import net from "node:net";
6
+ import { dirname, join } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+ import { helpText, out, wantsHelp, wantsJson, wantsVersion } from "./output.mjs";
9
+
10
+ const root = join(dirname(fileURLToPath(import.meta.url)), "..");
11
+ const { version } = createRequire(import.meta.url)("../package.json");
12
+ if (wantsHelp) { process.stdout.write(helpText(version)); process.exit(0); }
13
+ if (wantsVersion) { console.log(version); process.exit(0); }
14
+
15
+ // Bind to loopback unless the user opts in: the dashboard serves their New Relic/Sentry data.
16
+ const args = process.argv.slice(2);
17
+ let host = "127.0.0.1";
18
+ const hi = args.findIndex((a) => a === "--host" || a.startsWith("--host="));
19
+ if (hi >= 0) {
20
+ const eq = args[hi].startsWith("--host=");
21
+ host = eq ? args[hi].slice(7) : args[hi + 1] ?? "";
22
+ args.splice(hi, eq ? 1 : 2);
23
+ if (!host || host.startsWith("-")) {
24
+ out.error("--host needs an address.", { code: "bad_host", hint: "e.g. --host 0.0.0.0 (all interfaces) or --host 127.0.0.1" });
25
+ process.exit(2);
26
+ }
27
+ }
28
+ const port = process.env.PORT || args.find((a) => !a.startsWith("-")) || "3000";
29
+ if (!/^\d+$/.test(port) || +port > 65535) {
30
+ out.error(`Invalid port "${port}".`, { code: "bad_port", hint: "Use a number from 1 to 65535, e.g. performance-dashboard 4000" });
31
+ process.exit(2);
32
+ }
33
+ const loopback = ["127.0.0.1", "localhost", "::1"].includes(host);
34
+ const wildcard = ["0.0.0.0", "::"].includes(host);
35
+ const url = `http://${loopback || wildcard ? "localhost" : host}:${port}`;
36
+ if (!loopback) out.warn(`Listening on ${host}: anyone on your network can open the dashboard and see your New Relic/Sentry data.`, { host });
37
+ if (!loopback) out.warn("/setup and /connect are disabled while the dashboard is exposed.", { host });
38
+
39
+ // Use the user's own keys (New Relic, Sentry, ...) from the folder they run this in.
40
+ for (const f of [".env.local", ".env"]) {
41
+ if (existsSync(f)) process.loadEnvFile(f);
42
+ }
43
+
44
+ if (!existsSync(join(root, ".next"))) {
45
+ out.error("No build found.", { code: "no_build", hint: "Run `npm run build` first (published packages include it)." });
46
+ process.exit(1);
47
+ }
48
+
49
+ const stopSpinner = out.spinner(`Starting dashboard on port ${port}`);
50
+ const nextBin = join(dirname(createRequire(import.meta.url).resolve("next/package.json")), "dist/bin/next");
51
+ const server = spawn(process.execPath, [nextBin, "start", "-p", port, "-H", host], {
52
+ cwd: root,
53
+ stdio: ["inherit", wantsJson ? 2 : "inherit", "inherit"], // keep stdout clean for --json
54
+ // Pass --no-color/--json down so Next's own output matches.
55
+ env: {
56
+ ...process.env,
57
+ ...(loopback ? {} : { METRICFLOW_EXPOSED: "1" }), // app's isLocalRequest honors this
58
+ ...(process.argv.includes("--no-color") || wantsJson ? { FORCE_COLOR: undefined, NO_COLOR: "1" } : {}),
59
+ },
60
+ });
61
+ server.on("exit", (code) => {
62
+ stopSpinner();
63
+ if (code) out.error(`Server exited with code ${code}.`, { code: "server_exit", hint: "Check the output above; the port may be in use (try another port)." });
64
+ process.exit(code ?? 0);
65
+ });
66
+ for (const s of ["SIGINT", "SIGTERM"]) process.on(s, () => server.kill(s));
67
+
68
+ // Open the browser once the port accepts connections.
69
+ const open = () => {
70
+ const [cmd, ...args] =
71
+ process.platform === "darwin" ? ["open"] :
72
+ process.platform === "win32" ? ["cmd", "/c", "start", ""] : ["xdg-open"];
73
+ spawn(cmd, [...args, url], { stdio: "ignore", detached: true }).on("error", () => {}).unref();
74
+ stopSpinner();
75
+ out.ok("Dashboard is running", { url, host, port: +port });
76
+ out.kv([["URL", url], ["Stop", "Ctrl+C"]]);
77
+ };
78
+ const poll = () =>
79
+ net.connect(+port, wildcard ? "127.0.0.1" : host).on("connect", function () { this.end(); open(); })
80
+ .on("error", () => setTimeout(poll, 300));
81
+ poll();
package/bin/output.mjs ADDED
@@ -0,0 +1,86 @@
1
+ // CLI output/formatting. Zero dependencies. Spec: CLI_OUTPUT.md
2
+ // Rules: human text -> stdout, errors/progress -> stderr, --json -> one JSON object per line on stdout.
3
+
4
+ const flags = new Set(process.argv.slice(2));
5
+ export const wantsJson = flags.has("--json");
6
+ export const wantsHelp = flags.has("--help") || flags.has("-h");
7
+ export const wantsVersion = flags.has("--version") || flags.has("-v");
8
+
9
+ const colorOn = (stream) =>
10
+ !wantsJson &&
11
+ !flags.has("--no-color") &&
12
+ !("NO_COLOR" in process.env && process.env.NO_COLOR !== "") &&
13
+ (process.env.FORCE_COLOR ? process.env.FORCE_COLOR !== "0" : stream.isTTY && process.env.TERM !== "dumb");
14
+
15
+ const paint = (code, on) => (s) => (on ? `\x1b[${code}m${s}\x1b[0m` : s);
16
+ const mk = (stream) => {
17
+ const on = colorOn(stream);
18
+ return { bold: paint(1, on), dim: paint(2, on), red: paint(31, on), green: paint(32, on), yellow: paint(33, on), cyan: paint(36, on) };
19
+ };
20
+ const c = mk(process.stdout);
21
+ const ce = mk(process.stderr);
22
+
23
+ // Symbols fall back to ASCII on legacy Windows consoles.
24
+ const unicode = process.platform !== "win32" || !!process.env.WT_SESSION;
25
+ const sym = unicode ? { ok: "✔", warn: "⚠", err: "✖", info: "ℹ" } : { ok: "ok", warn: "!", err: "x", info: "i" };
26
+
27
+ const json = (obj) => process.stdout.write(JSON.stringify(obj) + "\n");
28
+
29
+ export const out = {
30
+ ok: (msg, data = {}) => (wantsJson ? json({ event: "ok", message: msg, ...data }) : console.log(`${c.green(sym.ok)} ${msg}`)),
31
+ info: (msg, data = {}) => (wantsJson ? json({ event: "info", message: msg, ...data }) : console.log(`${c.cyan(sym.info)} ${msg}`)),
32
+ warn: (msg, data = {}) => (wantsJson ? json({ event: "warn", message: msg, ...data }) : console.error(`${ce.yellow(sym.warn)} ${msg}`)),
33
+
34
+ // error: what failed, then an optional "how to fix" line. code feeds --json consumers.
35
+ error(msg, { hint, code = "error" } = {}) {
36
+ if (wantsJson) json({ event: "error", code, message: msg, ...(hint && { hint }) });
37
+ else console.error(`${ce.red(sym.err)} ${ce.bold(msg)}${hint ? `\n ${ce.dim("→")} ${hint}` : ""}`);
38
+ },
39
+
40
+ // Aligned "label value" rows. Rows: [[label, value], ...]. data is the --json payload.
41
+ kv(rows, data = {}) {
42
+ if (wantsJson) return json({ event: "summary", ...data });
43
+ const w = Math.max(...rows.map(([k]) => k.length));
44
+ for (const [k, v] of rows) console.log(` ${c.dim(k.padEnd(w))} ${v}`);
45
+ },
46
+
47
+ // Spinner on a TTY (stderr); one plain line otherwise. Returns stop().
48
+ spinner(msg) {
49
+ if (wantsJson) return () => {};
50
+ if (!process.stderr.isTTY || !colorOn(process.stderr)) {
51
+ console.error(`${msg}...`);
52
+ return () => {};
53
+ }
54
+ const frames = unicode ? "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏" : "-\\|/";
55
+ let i = 0;
56
+ const t = setInterval(() => process.stderr.write(`\r${ce.cyan(frames[i++ % frames.length])} ${msg}`), 80);
57
+ return () => {
58
+ clearInterval(t);
59
+ process.stderr.write("\r\x1b[2K");
60
+ };
61
+ },
62
+ };
63
+
64
+ export const helpText = (version) => `${c.bold("performance-dashboard")} ${c.dim(`v${version}`)}
65
+ Start the performance dashboard and open it in your browser.
66
+
67
+ ${c.bold("Usage")}
68
+ performance-dashboard [port] [options]
69
+
70
+ ${c.bold("Options")}
71
+ -h, --help Show this help
72
+ -v, --version Show version
73
+ --host <addr> Address to listen on (default 127.0.0.1, this machine only).
74
+ --host 0.0.0.0 exposes the dashboard to your network
75
+ --json Machine-readable output: one JSON object per line
76
+ --no-color Disable colors (also honors NO_COLOR and non-TTY)
77
+
78
+ ${c.bold("Environment")}
79
+ PORT Port to listen on (default 3000)
80
+ .env.local, .env in the current folder are loaded (New Relic, Sentry keys)
81
+
82
+ ${c.bold("Examples")}
83
+ performance-dashboard
84
+ performance-dashboard 4000 --no-color
85
+ performance-dashboard --json
86
+ `;
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@karan171996/metricflow",
3
+ "version": "0.1.0",
4
+ "scripts": {
5
+ "dev": "next dev -H 127.0.0.1",
6
+ "build": "next build",
7
+ "start": "next start -H 127.0.0.1",
8
+ "lint": "eslint",
9
+ "send-test-data": "node scripts/send-test-data.mjs",
10
+ "cy:open": "cypress open",
11
+ "cy:run": "cypress run",
12
+ "prepublishOnly": "next build",
13
+ "test:cli": "node --experimental-test-module-mocks --import ./test/register.mjs --test test/*.test.mjs",
14
+ "test:basic": "node scripts/test-env.mjs basic",
15
+ "test:real": "node scripts/test-env.mjs real",
16
+ "test": "npm run test:basic"
17
+ },
18
+ "dependencies": {
19
+ "axios": "^1.20.0",
20
+ "next": "16.3.8",
21
+ "react": "19.2.8",
22
+ "react-dom": "19.2.8"
23
+ },
24
+ "devDependencies": {
25
+ "@base-ui/react": "^1.8.0",
26
+ "@sentry/node": "^10.75.2",
27
+ "@tailwindcss/postcss": "^4",
28
+ "@types/node": "^20",
29
+ "@types/react": "^19",
30
+ "@types/react-dom": "^19",
31
+ "class-variance-authority": "^0.7.1",
32
+ "cn": "^0.3.0",
33
+ "cypress": "^16.1.1",
34
+ "dotenv": "^18.0.1",
35
+ "eslint": "^9",
36
+ "eslint-config-next": "16.3.8",
37
+ "lucide-react": "^1.47.0",
38
+ "recharts": "^3.10.1",
39
+ "shadcn": "^4.21.0",
40
+ "tailwindcss": "^4",
41
+ "tw-animate-css": "^1.4.0",
42
+ "typescript": "^5"
43
+ },
44
+ "bin": {
45
+ "performance-dashboard": "bin/cli.mjs"
46
+ },
47
+ "files": [
48
+ "bin",
49
+ "public",
50
+ ".next",
51
+ "!.next/dev",
52
+ "!.next/cache",
53
+ "!.next/types",
54
+ "!.next/diagnostics"
55
+ ],
56
+ "engines": {
57
+ "node": ">=20.12"
58
+ },
59
+ "publishConfig": {
60
+ "access": "public"
61
+ }
62
+ }
@@ -0,0 +1 @@
1
+ <svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>