@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.
- package/.next/BUILD_ID +1 -0
- package/.next/app-path-routes-manifest.json +17 -0
- package/.next/build/chunks/[root-of-the-server]__05i36w1._.js +500 -0
- package/.next/build/chunks/[root-of-the-server]__05i36w1._.js.map +11 -0
- package/.next/build/chunks/[root-of-the-server]__1kki86f._.js +206 -0
- package/.next/build/chunks/[root-of-the-server]__1kki86f._.js.map +8 -0
- package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_1gfkiq9._.js +13 -0
- package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_1gfkiq9._.js.map +5 -0
- package/.next/build/chunks/[turbopack]_runtime.js +926 -0
- package/.next/build/chunks/[turbopack]_runtime.js.map +11 -0
- package/.next/build/chunks/node_modules_20v-8wl._.js +7183 -0
- package/.next/build/chunks/node_modules_20v-8wl._.js.map +47 -0
- package/.next/build/chunks/pool_entry-[turbopack-node]_transforms_postcss_ts_0tp-k2v._.js +6 -0
- package/.next/build/chunks/pool_entry-[turbopack-node]_transforms_postcss_ts_0tp-k2v._.js.map +5 -0
- package/.next/build/package.json +1 -0
- package/.next/build-manifest.json +23 -0
- package/.next/export-marker.json +6 -0
- package/.next/fallback-build-manifest.json +15 -0
- package/.next/images-manifest.json +68 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +241 -0
- package/.next/required-server-files.js +351 -0
- package/.next/required-server-files.json +351 -0
- package/.next/routes-manifest.json +138 -0
- package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
- package/.next/server/app/_global-error/page/build-manifest.json +19 -0
- package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
- package/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
- package/.next/server/app/_global-error/page.js +9 -0
- package/.next/server/app/_global-error/page.js.map +5 -0
- package/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
- package/.next/server/app/_global-error.html +1 -0
- package/.next/server/app/_global-error.meta +30 -0
- package/.next/server/app/_global-error.rsc +15 -0
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +20 -0
- package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
- package/.next/server/app/_not-found/page/build-manifest.json +19 -0
- package/.next/server/app/_not-found/page/next-font-manifest.json +6 -0
- package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
- package/.next/server/app/_not-found/page.js +15 -0
- package/.next/server/app/_not-found/page.js.map +5 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
- package/.next/server/app/_not-found.html +2 -0
- package/.next/server/app/_not-found.meta +36 -0
- package/.next/server/app/_not-found.rsc +43 -0
- package/.next/server/app/_not-found.segments/_full.segment.rsc +43 -0
- package/.next/server/app/_not-found.segments/_index.segment.rsc +34 -0
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +20 -0
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/api/analyze/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/analyze/route/build-manifest.json +12 -0
- package/.next/server/app/api/analyze/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/analyze/route.js +7 -0
- package/.next/server/app/api/analyze/route.js.map +5 -0
- package/.next/server/app/api/analyze/route.js.nft.json +1 -0
- package/.next/server/app/api/analyze/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/connect/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/connect/route/build-manifest.json +12 -0
- package/.next/server/app/api/connect/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/connect/route.js +8 -0
- package/.next/server/app/api/connect/route.js.map +5 -0
- package/.next/server/app/api/connect/route.js.nft.json +1 -0
- package/.next/server/app/api/connect/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/health/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/health/route/build-manifest.json +12 -0
- package/.next/server/app/api/health/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/health/route.js +6 -0
- package/.next/server/app/api/health/route.js.map +5 -0
- package/.next/server/app/api/health/route.js.nft.json +1 -0
- package/.next/server/app/api/health/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/metrics/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/metrics/route/build-manifest.json +12 -0
- package/.next/server/app/api/metrics/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/metrics/route.js +8 -0
- package/.next/server/app/api/metrics/route.js.map +5 -0
- package/.next/server/app/api/metrics/route.js.nft.json +1 -0
- package/.next/server/app/api/metrics/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/setup/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/setup/route/build-manifest.json +12 -0
- package/.next/server/app/api/setup/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/setup/route.js +8 -0
- package/.next/server/app/api/setup/route.js.map +5 -0
- package/.next/server/app/api/setup/route.js.nft.json +1 -0
- package/.next/server/app/api/setup/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/timings/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/timings/route/build-manifest.json +12 -0
- package/.next/server/app/api/timings/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/timings/route.js +6 -0
- package/.next/server/app/api/timings/route.js.map +5 -0
- package/.next/server/app/api/timings/route.js.nft.json +1 -0
- package/.next/server/app/api/timings/route_client-reference-manifest.js +3 -0
- package/.next/server/app/connect/page/app-paths-manifest.json +3 -0
- package/.next/server/app/connect/page/build-manifest.json +19 -0
- package/.next/server/app/connect/page/next-font-manifest.json +6 -0
- package/.next/server/app/connect/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/connect/page/server-reference-manifest.json +4 -0
- package/.next/server/app/connect/page.js +16 -0
- package/.next/server/app/connect/page.js.map +5 -0
- package/.next/server/app/connect/page.js.nft.json +1 -0
- package/.next/server/app/connect/page_client-reference-manifest.js +3 -0
- package/.next/server/app/connect.html +24 -0
- package/.next/server/app/connect.meta +35 -0
- package/.next/server/app/connect.rsc +44 -0
- package/.next/server/app/connect.segments/_full.segment.rsc +44 -0
- package/.next/server/app/connect.segments/_index.segment.rsc +34 -0
- package/.next/server/app/connect.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/connect.segments/connect/__PAGE__.segment.rsc +25 -0
- package/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
- package/.next/server/app/favicon.ico/route/build-manifest.json +12 -0
- package/.next/server/app/favicon.ico/route.js +7 -0
- package/.next/server/app/favicon.ico/route.js.map +5 -0
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
- package/.next/server/app/favicon.ico.body +0 -0
- package/.next/server/app/favicon.ico.meta +1 -0
- package/.next/server/app/index.html +2 -0
- package/.next/server/app/index.meta +30 -0
- package/.next/server/app/index.rsc +44 -0
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +19 -0
- package/.next/server/app/index.segments/_full.segment.rsc +44 -0
- package/.next/server/app/index.segments/_index.segment.rsc +34 -0
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/page/app-paths-manifest.json +3 -0
- package/.next/server/app/page/build-manifest.json +19 -0
- package/.next/server/app/page/next-font-manifest.json +6 -0
- package/.next/server/app/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/page/server-reference-manifest.json +4 -0
- package/.next/server/app/page.js +16 -0
- package/.next/server/app/page.js.map +5 -0
- package/.next/server/app/page.js.nft.json +1 -0
- package/.next/server/app/page_client-reference-manifest.js +3 -0
- package/.next/server/app/performance/[slug]/page/app-paths-manifest.json +3 -0
- package/.next/server/app/performance/[slug]/page/build-manifest.json +19 -0
- package/.next/server/app/performance/[slug]/page/next-font-manifest.json +6 -0
- package/.next/server/app/performance/[slug]/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/performance/[slug]/page/server-reference-manifest.json +4 -0
- package/.next/server/app/performance/[slug]/page.js +19 -0
- package/.next/server/app/performance/[slug]/page.js.map +5 -0
- package/.next/server/app/performance/[slug]/page.js.nft.json +1 -0
- package/.next/server/app/performance/[slug]/page_client-reference-manifest.js +3 -0
- package/.next/server/app/performance/page/app-paths-manifest.json +3 -0
- package/.next/server/app/performance/page/build-manifest.json +19 -0
- package/.next/server/app/performance/page/next-font-manifest.json +6 -0
- package/.next/server/app/performance/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/performance/page/server-reference-manifest.json +4 -0
- package/.next/server/app/performance/page.js +17 -0
- package/.next/server/app/performance/page.js.map +5 -0
- package/.next/server/app/performance/page.js.nft.json +1 -0
- package/.next/server/app/performance/page_client-reference-manifest.js +3 -0
- package/.next/server/app/performance.html +2 -0
- package/.next/server/app/performance.meta +35 -0
- package/.next/server/app/performance.rsc +56 -0
- package/.next/server/app/performance.segments/_full.segment.rsc +56 -0
- package/.next/server/app/performance.segments/_index.segment.rsc +34 -0
- package/.next/server/app/performance.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/performance.segments/performance/__PAGE__.segment.rsc +39 -0
- package/.next/server/app/settings/page/app-paths-manifest.json +3 -0
- package/.next/server/app/settings/page/build-manifest.json +19 -0
- package/.next/server/app/settings/page/next-font-manifest.json +6 -0
- package/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/settings/page/server-reference-manifest.json +4 -0
- package/.next/server/app/settings/page.js +18 -0
- package/.next/server/app/settings/page.js.map +5 -0
- package/.next/server/app/settings/page.js.nft.json +1 -0
- package/.next/server/app/settings/page_client-reference-manifest.js +3 -0
- package/.next/server/app/settings.html +2 -0
- package/.next/server/app/settings.meta +35 -0
- package/.next/server/app/settings.rsc +60 -0
- package/.next/server/app/settings.segments/_full.segment.rsc +60 -0
- package/.next/server/app/settings.segments/_index.segment.rsc +34 -0
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +44 -0
- package/.next/server/app/setup/page/app-paths-manifest.json +3 -0
- package/.next/server/app/setup/page/build-manifest.json +19 -0
- package/.next/server/app/setup/page/next-font-manifest.json +6 -0
- package/.next/server/app/setup/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/setup/page/server-reference-manifest.json +4 -0
- package/.next/server/app/setup/page.js +16 -0
- package/.next/server/app/setup/page.js.map +5 -0
- package/.next/server/app/setup/page.js.nft.json +1 -0
- package/.next/server/app/setup/page_client-reference-manifest.js +3 -0
- package/.next/server/app/setup.html +2 -0
- package/.next/server/app/setup.meta +35 -0
- package/.next/server/app/setup.rsc +44 -0
- package/.next/server/app/setup.segments/_full.segment.rsc +44 -0
- package/.next/server/app/setup.segments/_index.segment.rsc +34 -0
- package/.next/server/app/setup.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +25 -0
- package/.next/server/app-paths-manifest.json +17 -0
- package/.next/server/chunks/[externals]__1o8qm3w._.js +3 -0
- package/.next/server/chunks/[externals]__1o8qm3w._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0chxb6o._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0chxb6o._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__14tfjrn._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__14tfjrn._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1fj5wte._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1fj5wte._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1i_tsds._.js +22 -0
- package/.next/server/chunks/[root-of-the-server]__1i_tsds._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1l249st._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1l249st._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1uv-wzy._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1uv-wzy._.js.map +1 -0
- package/.next/server/chunks/[turbopack]_runtime.js +807 -0
- package/.next/server/chunks/[turbopack]_runtime.js.map +10 -0
- package/.next/server/chunks/_1494cut._.js +3 -0
- package/.next/server/chunks/_1494cut._.js.map +1 -0
- package/.next/server/chunks/_1gvvd7n._.js +158 -0
- package/.next/server/chunks/_1gvvd7n._.js.map +1 -0
- package/.next/server/chunks/_1pe45_3._.js +17 -0
- package/.next/server/chunks/_1pe45_3._.js.map +1 -0
- package/.next/server/chunks/_1qtlv__._.js +3 -0
- package/.next/server/chunks/_1qtlv__._.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_analyze_route_actions_0lx-23h.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_analyze_route_actions_0lx-23h.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_connect_route_actions_1r5w03m.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_connect_route_actions_1r5w03m.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_health_route_actions_1ryftkb.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_health_route_actions_1ryftkb.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_metrics_route_actions_0qn5q3s.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_metrics_route_actions_0qn5q3s.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_setup_route_actions_0txsuev.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_setup_route_actions_0txsuev.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_timings_route_actions_1tsq7j6.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_timings_route_actions_1tsq7j6.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_0g2jjls.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_0g2jjls.js.map +1 -0
- package/.next/server/chunks/node_modules_0jatszq._.js +8 -0
- package/.next/server/chunks/node_modules_0jatszq._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__036j_vr._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__036j_vr._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0ev464o._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0ev464o._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0f5axvr._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0f5axvr._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0hg5gib._.js +33 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0hg5gib._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0tmkhxy._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0tmkhxy._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0ydfg18._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0ydfg18._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__18hr860._.js +33 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__18hr860._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__18w2nrx._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__18w2nrx._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1c8dejo._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1c8dejo._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1mwg_vi._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1mwg_vi._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1p_6ezv._.js +14 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1p_6ezv._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1vxra_4._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1vxra_4._.js.map +1 -0
- package/.next/server/chunks/ssr/[turbopack]_runtime.js +807 -0
- package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +10 -0
- package/.next/server/chunks/ssr/_042xeoh._.js +3 -0
- package/.next/server/chunks/ssr/_042xeoh._.js.map +1 -0
- package/.next/server/chunks/ssr/_0c7qo1d._.js +3 -0
- package/.next/server/chunks/ssr/_0c7qo1d._.js.map +1 -0
- package/.next/server/chunks/ssr/_0dbmzjx._.js +166 -0
- package/.next/server/chunks/ssr/_0dbmzjx._.js.map +1 -0
- package/.next/server/chunks/ssr/_178o6nh._.js +3 -0
- package/.next/server/chunks/ssr/_178o6nh._.js.map +1 -0
- package/.next/server/chunks/ssr/_1bbiu24._.js +3 -0
- package/.next/server/chunks/ssr/_1bbiu24._.js.map +1 -0
- package/.next/server/chunks/ssr/_1d1ipgp._.js +6 -0
- package/.next/server/chunks/ssr/_1d1ipgp._.js.map +1 -0
- package/.next/server/chunks/ssr/_1n9m819._.js +3 -0
- package/.next/server/chunks/ssr/_1n9m819._.js.map +1 -0
- package/.next/server/chunks/ssr/_1p5i72g._.js +151 -0
- package/.next/server/chunks/ssr/_1p5i72g._.js.map +1 -0
- package/.next/server/chunks/ssr/_1r2qog2._.js +7 -0
- package/.next/server/chunks/ssr/_1r2qog2._.js.map +1 -0
- package/.next/server/chunks/ssr/_1rkc3oc._.js +25 -0
- package/.next/server/chunks/ssr/_1rkc3oc._.js.map +1 -0
- package/.next/server/chunks/ssr/_20txlee._.js +3 -0
- package/.next/server/chunks/ssr/_20txlee._.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_connect_page_actions_1g-s_3i.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_connect_page_actions_1g-s_3i.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_0hhsz1j.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_0hhsz1j.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_performance_[slug]_page_actions_1pzv3w1.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_performance_[slug]_page_actions_1pzv3w1.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_performance_page_actions_0vi13cc.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_performance_page_actions_0vi13cc.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_11x4dq5.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_11x4dq5.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_setup_page_actions_0u1sm0s.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_setup_page_actions_0u1sm0s.js.map +1 -0
- package/.next/server/chunks/ssr/app_layout_tsx_2144vk_._.js +3 -0
- package/.next/server/chunks/ssr/app_layout_tsx_2144vk_._.js.map +1 -0
- package/.next/server/chunks/ssr/app_loading_tsx_0a1flg9._.js +3 -0
- package/.next/server/chunks/ssr/app_loading_tsx_0a1flg9._.js.map +1 -0
- package/.next/server/chunks/ssr/app_performance_[slug]_loading_tsx_0d5z78a._.js +3 -0
- package/.next/server/chunks/ssr/app_performance_[slug]_loading_tsx_0d5z78a._.js.map +1 -0
- package/.next/server/chunks/ssr/app_performance_loading_tsx_1bq2nq9._.js +3 -0
- package/.next/server/chunks/ssr/app_performance_loading_tsx_1bq2nq9._.js.map +1 -0
- package/.next/server/chunks/ssr/app_settings_loading_tsx_0nv_78v._.js +3 -0
- package/.next/server/chunks/ssr/app_settings_loading_tsx_0nv_78v._.js.map +1 -0
- package/.next/server/chunks/ssr/components_0j32dj5._.js +3 -0
- package/.next/server/chunks/ssr/components_0j32dj5._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_1wax83z._.js +33 -0
- package/.next/server/chunks/ssr/node_modules_1wax83z._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_cn_dist_index_166wuka.js +3 -0
- package/.next/server/chunks/ssr/node_modules_cn_dist_index_166wuka.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_0nkkbfv._.js +6 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_0nkkbfv._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_1v8aef8._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_1v8aef8._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0q-w892.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0q-w892.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_server-async-storage_0t1dato.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_server-async-storage_0t1dato.js.map +1 -0
- package/.next/server/functions-config-manifest.json +4 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +23 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +6 -0
- package/.next/server/pages/404.html +2 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages-manifest.json +4 -0
- package/.next/server/prefetch-hints.json +90 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +5 -0
- package/.next/static/chunks/0cz1d0mv5g_q7.js +1 -0
- package/.next/static/chunks/0wyq7u3z0lfca.js +1 -0
- package/.next/static/chunks/13ihwqjtq_hlo.js +1 -0
- package/.next/static/chunks/14pp7x-su_dnv.js +5 -0
- package/.next/static/chunks/1clwpy-vw07cb.js +1 -0
- package/.next/static/chunks/1rj7ns8rte9vc.js +1 -0
- package/.next/static/chunks/1u5zan5bs9a7v.js +31 -0
- package/.next/static/chunks/2-llbg7gt2gi5.js +4 -0
- package/.next/static/chunks/212boumyeyva9.js +23 -0
- package/.next/static/chunks/28w-hz8hg8t4v.css +1 -0
- package/.next/static/chunks/2xy80eg_ueu_u.js +1 -0
- package/.next/static/chunks/3-kx-5mj07qy0.js +22 -0
- package/.next/static/chunks/3fntmmi971322.js +1 -0
- package/.next/static/chunks/3lqd2emjcxbd-.js +1 -0
- package/.next/static/chunks/3rfi1wruz0m51.js +1 -0
- package/.next/static/chunks/turbopack-2-rd7l6sk4a9l.js +1 -0
- package/.next/static/media/favicon.2vob68tjqpejf.ico +0 -0
- package/.next/static/vTYnNx5fUtumjGBK2LQwR/_buildManifest.js +11 -0
- package/.next/static/vTYnNx5fUtumjGBK2LQwR/_clientMiddlewareManifest.js +1 -0
- package/.next/static/vTYnNx5fUtumjGBK2LQwR/_ssgManifest.js +1 -0
- package/.next/trace +1 -0
- package/.next/trace-build +1 -0
- package/.next/turbopack +0 -0
- package/README.md +147 -0
- package/bin/cli.mjs +81 -0
- package/bin/output.mjs +86 -0
- package/package.json +62 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/next.svg +1 -0
- package/public/vercel.svg +1 -0
- 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)})();
|
|
Binary file
|
|
@@ -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"}]
|
package/.next/turbopack
ADDED
|
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
|
+

|
|
21
|
+
|
|
22
|
+
### Performance hub
|
|
23
|
+
|
|
24
|
+

|
|
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
|
+
}
|
package/public/file.svg
ADDED
|
@@ -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>
|
package/public/globe.svg
ADDED
|
@@ -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>
|
package/public/next.svg
ADDED
|
@@ -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>
|