@karan171996/metricflow 0.1.5 → 0.1.6
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 -1
- package/.next/build/chunks/[root-of-the-server]__1kki86f._.js +2 -2
- package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_1gfkiq9._.js +1 -1
- package/.next/build/chunks/{node_modules_20v-8wl._.js → node_modules__pnpm_0q5gz_g._.js} +181 -230
- package/.next/build-manifest.json +7 -7
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +10 -10
- package/.next/server/app/_global-error/page/build-manifest.json +4 -4
- package/.next/server/app/_global-error/page.js +7 -7
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +7 -7
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
- package/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page/build-manifest.json +4 -4
- package/.next/server/app/_not-found/page.js +10 -10
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +2 -2
- package/.next/server/app/_not-found.rsc +17 -17
- package/.next/server/app/_not-found.segments/_full.segment.rsc +17 -17
- package/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +7 -7
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/analyze/route.js +5 -5
- package/.next/server/app/api/analyze/route.js.nft.json +1 -1
- package/.next/server/app/api/connect/route.js +5 -5
- package/.next/server/app/api/connect/route.js.nft.json +1 -1
- package/.next/server/app/api/health/route.js +4 -4
- package/.next/server/app/api/health/route.js.nft.json +1 -1
- package/.next/server/app/api/metrics/route.js +5 -5
- package/.next/server/app/api/metrics/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/route.js +4 -4
- package/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/server/app/api/setup/ai/route.js +5 -5
- package/.next/server/app/api/setup/ai/route.js.nft.json +1 -1
- package/.next/server/app/api/setup/route.js +5 -5
- package/.next/server/app/api/setup/route.js.nft.json +1 -1
- package/.next/server/app/api/timings/route.js +4 -4
- package/.next/server/app/api/timings/route.js.nft.json +1 -1
- package/.next/server/app/connect/page/build-manifest.json +4 -4
- package/.next/server/app/connect/page.js +11 -11
- package/.next/server/app/connect/page.js.nft.json +1 -1
- package/.next/server/app/connect/page_client-reference-manifest.js +1 -1
- package/.next/server/app/connect.html +2 -2
- package/.next/server/app/connect.rsc +19 -19
- package/.next/server/app/connect.segments/_full.segment.rsc +19 -19
- package/.next/server/app/connect.segments/_index.segment.rsc +11 -11
- package/.next/server/app/connect.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connect.segments/connect/__PAGE__.segment.rsc +12 -12
- package/.next/server/app/icon.svg/route.js +4 -4
- package/.next/server/app/icon.svg/route.js.nft.json +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +20 -20
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +7 -7
- package/.next/server/app/index.segments/_full.segment.rsc +20 -20
- package/.next/server/app/index.segments/_index.segment.rsc +11 -11
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/page/build-manifest.json +4 -4
- package/.next/server/app/page.js +11 -11
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/performance/[slug]/page/build-manifest.json +4 -4
- package/.next/server/app/performance/[slug]/page.js +13 -13
- package/.next/server/app/performance/[slug]/page.js.nft.json +1 -1
- package/.next/server/app/performance/[slug]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/performance/page/build-manifest.json +4 -4
- package/.next/server/app/performance/page.js +11 -11
- package/.next/server/app/performance/page.js.nft.json +1 -1
- package/.next/server/app/performance/page_client-reference-manifest.js +1 -1
- package/.next/server/app/performance.html +2 -2
- package/.next/server/app/performance.rsc +20 -20
- package/.next/server/app/performance.segments/_full.segment.rsc +20 -20
- package/.next/server/app/performance.segments/_index.segment.rsc +11 -11
- package/.next/server/app/performance.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/performance.segments/performance/__PAGE__.segment.rsc +14 -14
- package/.next/server/app/settings/page/build-manifest.json +4 -4
- package/.next/server/app/settings/page.js +12 -12
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +31 -31
- package/.next/server/app/settings.segments/_full.segment.rsc +31 -31
- package/.next/server/app/settings.segments/_index.segment.rsc +11 -11
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +26 -26
- package/.next/server/app/setup/page/build-manifest.json +4 -4
- package/.next/server/app/setup/page.js +11 -11
- package/.next/server/app/setup/page.js.nft.json +1 -1
- package/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/.next/server/app/setup.html +2 -2
- package/.next/server/app/setup.rsc +20 -20
- package/.next/server/app/setup.segments/_full.segment.rsc +20 -20
- package/.next/server/app/setup.segments/_index.segment.rsc +11 -11
- package/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +13 -13
- package/.next/server/app/tools/[tool]/page/build-manifest.json +4 -4
- package/.next/server/app/tools/[tool]/page.js +12 -12
- package/.next/server/app/tools/[tool]/page.js.nft.json +1 -1
- package/.next/server/app/tools/[tool]/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__05mqvyo._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0fkj1-q._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0i0nt_u._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1su9v2-._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1wcikrf._.js +5 -0
- package/.next/server/chunks/_08xo8nu._.js +22 -0
- package/.next/server/chunks/_0w8wvdn._.js +3 -0
- package/.next/server/chunks/_0wct7-r._.js +17 -0
- package/.next/server/chunks/_1f80q3b._.js +158 -0
- package/.next/server/chunks/_1l9d64o._.js +3 -0
- package/.next/server/chunks/_1lktrox._.js +8 -0
- package/.next/server/chunks/_1ze9o4l._.js +8 -0
- package/.next/server/chunks/ssr/{node_modules_cn_dist_index_166wuka.js → 0f2__cn_dist_index_1jh2egc.js} +2 -2
- package/.next/server/chunks/ssr/0x0c_next_dist_03da18h._.js +6 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_1v8aef8._.js → 0x0c_next_dist_0lkq344._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_next_dist_0drixxt._.js → 0x0c_next_dist_1icgwks._.js} +6 -6
- package/.next/server/chunks/ssr/0x0c_next_dist_client_components_1z4ahr3._.js +3 -0
- package/.next/server/chunks/ssr/0x0c_next_dist_client_components_builtin_forbidden_0pm41ij.js +3 -0
- package/.next/server/chunks/ssr/0x0c_next_dist_client_components_builtin_global-error_1-wtk5-.js +3 -0
- package/.next/server/chunks/ssr/0x0c_next_dist_client_components_builtin_unauthorized_0v3_y-3.js +3 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_server-async-storage_0t1dato.js → 0x0c_next_dist_client_components_server-async-storage_1-oepaa.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__02c3m72._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__031i31p._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__1c8dejo._.js → [root-of-the-server]__07myivi._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__0g1dtzd._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0kocjhm._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0l4t71c._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0tikq3c._.js +14 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__1vxra_4._.js → [root-of-the-server]__1-0b897._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__146cm0r._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1cl7b4r._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1mydt_n._.js +33 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1thxzex._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__18hr860._.js → [root-of-the-server]__1wd0g6g._.js} +3 -3
- package/.next/server/chunks/ssr/_02_o-ya._.js +6 -0
- package/.next/server/chunks/ssr/_09540a5._.js +151 -0
- package/.next/server/chunks/ssr/{_1b_fov9._.js → _0defuav._.js} +2 -2
- package/.next/server/chunks/ssr/{_1-6djlo._.js → _0e_s0v0._.js} +2 -2
- package/.next/server/chunks/ssr/_0htqt7_._.js +18 -0
- package/.next/server/chunks/ssr/_0me-cg5._.js +3 -0
- package/.next/server/chunks/ssr/{_20txlee._.js → _13m9nev._.js} +2 -2
- package/.next/server/chunks/ssr/_1idvrlk._.js +7 -0
- package/.next/server/chunks/ssr/_1qy3_r5._.js +3 -0
- package/.next/server/chunks/ssr/_1rd2o5p._.js +3 -0
- package/.next/server/chunks/ssr/{_1zb40ot._.js → _1t7ag6f._.js} +2 -2
- package/.next/server/chunks/ssr/{_1rkc3oc._.js → _1tpe22e._.js} +3 -3
- package/.next/server/chunks/ssr/app_layout_tsx_2144vk_._.js +1 -1
- package/.next/server/chunks/ssr/app_loading_tsx_0a1flg9._.js +1 -1
- package/.next/server/chunks/ssr/app_performance_[slug]_loading_tsx_0d5z78a._.js +1 -1
- package/.next/server/chunks/ssr/app_performance_loading_tsx_1bq2nq9._.js +1 -1
- package/.next/server/chunks/ssr/app_settings_loading_tsx_0nv_78v._.js +1 -1
- package/.next/server/chunks/ssr/components_0j32dj5._.js +1 -1
- package/.next/server/chunks/ssr/{node_modules_1wax83z._.js → node_modules__pnpm_0hf3oiy._.js} +3 -3
- package/.next/server/middleware-build-manifest.js +7 -7
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{19jmme1xtmib0.js → 06qwhmc60u5rw.js} +2 -2
- package/.next/static/chunks/1-4lacz2t2rmw.js +4 -0
- package/.next/static/chunks/11ea1elg0081p.js +1 -0
- package/.next/static/chunks/12nwz8qd2ocwk.css +1 -0
- package/.next/static/chunks/{1otvbjuxr6thq.js → 1ou_bh9mvu5x1.js} +1 -1
- package/.next/static/chunks/1t-tmstauvn0u.js +1 -0
- package/.next/static/chunks/23d4pgenwzdj5.js +1 -0
- package/.next/static/chunks/2dpz7gbtyu5go.js +1 -0
- package/.next/static/chunks/2rz3rt3tdd_p4.js +1 -0
- package/.next/static/chunks/{41tx3tz7-8892.js → 3dfy6smxuju__.js} +1 -1
- package/.next/static/chunks/{2uf-bm2nz17t-.js → 3dwrl3svcft9m.js} +1 -1
- package/.next/static/chunks/3fmhqgzb47j23.js +1 -0
- package/.next/static/chunks/{212boumyeyva9.js → 3y_9ajtx5_9ky.js} +2 -2
- package/.next/static/chunks/42z_0gfabqpr_.js +31 -0
- package/.next/static/chunks/44rowux-iee-x.js +22 -0
- package/.next/static/chunks/{turbopack-2-rd7l6sk4a9l.js → turbopack-00gi3z1duuih6.js} +1 -1
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/README.md +153 -65
- package/package.json +16 -17
- package/.next/server/chunks/[root-of-the-server]__027a1hx._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__14tfjrn._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1fj5wte._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1lxxc0h._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1uv-wzy._.js +0 -5
- package/.next/server/chunks/_0g9k22b._.js +0 -8
- package/.next/server/chunks/_0zwkfj-._.js +0 -8
- package/.next/server/chunks/_10b5gsp._.js +0 -22
- package/.next/server/chunks/_1494cut._.js +0 -3
- package/.next/server/chunks/_1f-783b._.js +0 -158
- package/.next/server/chunks/_1pe45_3._.js +0 -17
- package/.next/server/chunks/_1qtlv__._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__06gb9_u._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0d9igav._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0fufdy-._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__15_sjnx._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__18-cm6x._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__1fxaeqo._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__1io3bae._.js +0 -33
- package/.next/server/chunks/ssr/[root-of-the-server]__1p_6ezv._.js +0 -14
- package/.next/server/chunks/ssr/[root-of-the-server]__1pm7uf6._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__1q99mso._.js +0 -3
- package/.next/server/chunks/ssr/_0-bp5v7._.js +0 -7
- package/.next/server/chunks/ssr/_06r8zrg._.js +0 -3
- package/.next/server/chunks/ssr/_1a5owey._.js +0 -3
- package/.next/server/chunks/ssr/_1d1ipgp._.js +0 -6
- package/.next/server/chunks/ssr/_1d74ud1._.js +0 -3
- package/.next/server/chunks/ssr/_1ovns3l._.js +0 -18
- package/.next/server/chunks/ssr/_1y-b2zm._.js +0 -151
- package/.next/server/chunks/ssr/node_modules_next_dist_0nkkbfv._.js +0 -6
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0q-w892.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js +0 -3
- package/.next/static/chunks/0ubjg1ka_080j.js +0 -1
- package/.next/static/chunks/1jtdb3kujnm2_.css +0 -1
- package/.next/static/chunks/1kpyel_do_nn_.js +0 -1
- package/.next/static/chunks/1rj7ns8rte9vc.js +0 -1
- package/.next/static/chunks/1u5zan5bs9a7v.js +0 -31
- package/.next/static/chunks/1wurvq5krow1k.js +0 -1
- package/.next/static/chunks/2bd8yoc_iosfu.js +0 -1
- package/.next/static/chunks/3-kx-5mj07qy0.js +0 -22
- package/.next/static/chunks/32d1qdgpjfhb0.js +0 -4
- package/.next/static/chunks/3fntmmi971322.js +0 -1
- /package/.next/static/{kitK02ca_n40lM28SxiCO → PgrMGvOetgfaX9yDcTEN_}/_buildManifest.js +0 -0
- /package/.next/static/{kitK02ca_n40lM28SxiCO → PgrMGvOetgfaX9yDcTEN_}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{kitK02ca_n40lM28SxiCO → PgrMGvOetgfaX9yDcTEN_}/_ssgManifest.js +0 -0
package/.next/trace
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"name":"generate-buildid","duration":237,"timestamp":33675951115,"id":4,"parentId":1,"tags":{},"startTime":1790975369414,"traceId":"63f7aed0e09036c7"},{"name":"load-custom-routes","duration":449,"timestamp":33675951478,"id":5,"parentId":1,"tags":{},"startTime":1790975369415,"traceId":"63f7aed0e09036c7"},{"name":"create-dist-dir","duration":220,"timestamp":33675951952,"id":6,"parentId":1,"tags":{},"startTime":1790975369415,"traceId":"63f7aed0e09036c7"},{"name":"clean","duration":59666,"timestamp":33675952835,"id":7,"parentId":1,"tags":{},"startTime":1790975369416,"traceId":"63f7aed0e09036c7"},{"name":"discover-routes","duration":5528,"timestamp":33676021356,"id":8,"parentId":1,"tags":{},"startTime":1790975369485,"traceId":"63f7aed0e09036c7"},{"name":"create-root-mapping","duration":59,"timestamp":33676026919,"id":9,"parentId":1,"tags":{},"startTime":1790975369490,"traceId":"63f7aed0e09036c7"},{"name":"generate-route-types","duration":19132,"timestamp":33676028361,"id":10,"parentId":1,"tags":{},"startTime":1790975369492,"traceId":"63f7aed0e09036c7"},{"name":"public-dir-conflict-check","duration":91,"timestamp":33676047551,"id":11,"parentId":1,"tags":{},"startTime":1790975369511,"traceId":"63f7aed0e09036c7"},{"name":"generate-routes-manifest","duration":2683,"timestamp":33676047752,"id":12,"parentId":1,"tags":{},"startTime":1790975369511,"traceId":"63f7aed0e09036c7"},{"name":"run-turbopack","duration":3265794,"timestamp":33676059363,"id":14,"parentId":1,"tags":{},"startTime":1790975369523,"traceId":"63f7aed0e09036c7"},{"name":"turbopack-build-events","duration":75,"timestamp":33676388068,"id":15,"parentId":1,"tags":{},"startTime":1790975369851,"traceId":"63f7aed0e09036c7"},{"name":"turbopack-persistence","duration":343000,"timestamp":33678754341,"id":16,"parentId":15,"tags":{"reason":"stop","snapshot_duration_ms":4.909997,"persist_duration_ms":337.525688,"task_count":4096,"bytes_written":28697349,"bytes_deleted":0},"startTime":1790975372562,"traceId":"63f7aed0e09036c7"},{"name":"run-typescript","duration":2639906,"timestamp":33679333715,"id":16,"parentId":1,"tags":{},"startTime":1790975372797,"traceId":"63f7aed0e09036c7"},{"name":"generate-required-server-files","duration":908,"timestamp":33681975331,"id":18,"parentId":1,"tags":{},"startTime":1790975375439,"traceId":"63f7aed0e09036c7"},{"name":"check-static-error-page","duration":9998,"timestamp":33682003682,"id":20,"parentId":19,"tags":{},"startTime":1790975375467,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":888859,"timestamp":33682015157,"id":40,"parentId":22,"tags":{},"startTime":1790975375479,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":897522,"timestamp":33682006564,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1790975375470,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1222632,"timestamp":33682020006,"id":50,"parentId":31,"tags":{},"startTime":1790975375484,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1235007,"timestamp":33682007676,"id":31,"parentId":19,"tags":{"page":"/connect"},"startTime":1790975375471,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1232788,"timestamp":33682015437,"id":45,"parentId":27,"tags":{},"startTime":1790975375479,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1241014,"timestamp":33682007258,"id":27,"parentId":19,"tags":{"page":"/api/settings"},"startTime":1790975375471,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1238900,"timestamp":33682015326,"id":43,"parentId":25,"tags":{},"startTime":1790975375479,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1247213,"timestamp":33682007059,"id":25,"parentId":19,"tags":{"page":"/api/health"},"startTime":1790975375471,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1237298,"timestamp":33682020028,"id":51,"parentId":33,"tags":{},"startTime":1790975375484,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1249503,"timestamp":33682007866,"id":33,"parentId":19,"tags":{"page":"/"},"startTime":1790975375471,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1251007,"timestamp":33682014875,"id":39,"parentId":21,"tags":{},"startTime":1790975375478,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1260842,"timestamp":33682005089,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1790975375469,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1252249,"timestamp":33682020056,"id":54,"parentId":37,"tags":{},"startTime":1790975375484,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1258850,"timestamp":33682013499,"id":37,"parentId":19,"tags":{"page":"/setup"},"startTime":1790975375477,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1277077,"timestamp":33682015507,"id":46,"parentId":28,"tags":{},"startTime":1790975375479,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1285270,"timestamp":33682007353,"id":28,"parentId":19,"tags":{"page":"/api/setup/ai"},"startTime":1790975375471,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1286415,"timestamp":33682020061,"id":55,"parentId":38,"tags":{},"startTime":1790975375484,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1292946,"timestamp":33682013583,"id":38,"parentId":19,"tags":{"page":"/tools/[tool]"},"startTime":1790975375477,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1300254,"timestamp":33682015578,"id":47,"parentId":29,"tags":{},"startTime":1790975375479,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1308430,"timestamp":33682007456,"id":29,"parentId":19,"tags":{"page":"/api/setup"},"startTime":1790975375471,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1303537,"timestamp":33682015633,"id":48,"parentId":30,"tags":{},"startTime":1790975375479,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1311630,"timestamp":33682007570,"id":30,"parentId":19,"tags":{"page":"/api/timings"},"startTime":1790975375471,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1307623,"timestamp":33682015693,"id":49,"parentId":32,"tags":{},"startTime":1790975375479,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1315581,"timestamp":33682007765,"id":32,"parentId":19,"tags":{"page":"/icon.svg"},"startTime":1790975375471,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1312389,"timestamp":33682020041,"id":52,"parentId":35,"tags":{},"startTime":1790975375484,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1319212,"timestamp":33682013250,"id":35,"parentId":19,"tags":{"page":"/performance"},"startTime":1790975375477,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1318613,"timestamp":33682015373,"id":44,"parentId":26,"tags":{},"startTime":1790975375479,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1326855,"timestamp":33682007154,"id":26,"parentId":19,"tags":{"page":"/api/metrics"},"startTime":1790975375471,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1321008,"timestamp":33682015221,"id":41,"parentId":23,"tags":{},"startTime":1790975375479,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1329415,"timestamp":33682006834,"id":23,"parentId":19,"tags":{"page":"/api/analyze"},"startTime":1790975375470,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1318666,"timestamp":33682020049,"id":53,"parentId":36,"tags":{},"startTime":1790975375484,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1325332,"timestamp":33682013402,"id":36,"parentId":19,"tags":{"page":"/settings"},"startTime":1790975375477,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1327736,"timestamp":33682015273,"id":42,"parentId":24,"tags":{},"startTime":1790975375479,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1336082,"timestamp":33682006956,"id":24,"parentId":19,"tags":{"page":"/api/connect"},"startTime":1790975375470,"traceId":"63f7aed0e09036c7"},{"name":"is-page-static","duration":1329258,"timestamp":33682020067,"id":56,"parentId":34,"tags":{},"startTime":1790975375484,"traceId":"63f7aed0e09036c7"},{"name":"check-page","duration":1341370,"timestamp":33682007984,"id":34,"parentId":19,"tags":{"page":"/performance/[slug]"},"startTime":1790975375471,"traceId":"63f7aed0e09036c7"},{"name":"static-check","duration":1346600,"timestamp":33682002780,"id":19,"parentId":1,"tags":{},"startTime":1790975375466,"traceId":"63f7aed0e09036c7"},{"name":"write-routes-manifest","duration":436,"timestamp":33683350389,"id":58,"parentId":1,"tags":{},"startTime":1790975376814,"traceId":"63f7aed0e09036c7"},{"name":"load-dotenv","duration":36,"timestamp":33683360545,"id":61,"parentId":60,"tags":{},"startTime":1790975376824,"traceId":"63f7aed0e09036c7"},{"name":"run-export-path-map","duration":489,"timestamp":33683362028,"id":62,"parentId":60,"tags":{},"startTime":1790975376826,"traceId":"63f7aed0e09036c7"},{"name":"next-export","duration":527528,"timestamp":33683359534,"id":60,"parentId":1,"tags":{},"startTime":1790975376823,"traceId":"63f7aed0e09036c7"},{"name":"move-exported-app-not-found-","duration":910,"timestamp":33683889183,"id":63,"parentId":59,"tags":{},"startTime":1790975377353,"traceId":"63f7aed0e09036c7"},{"name":"move-exported-app-global-error-","duration":594,"timestamp":33683890184,"id":64,"parentId":59,"tags":{},"startTime":1790975377354,"traceId":"63f7aed0e09036c7"},{"name":"static-generation","duration":538427,"timestamp":33683352655,"id":59,"parentId":1,"tags":{},"startTime":1790975376816,"traceId":"63f7aed0e09036c7"},{"name":"write-routes-manifest","duration":356,"timestamp":33683891262,"id":65,"parentId":1,"tags":{},"startTime":1790975377355,"traceId":"63f7aed0e09036c7"},{"name":"print-tree-view","duration":2713,"timestamp":33683940857,"id":66,"parentId":1,"tags":{},"startTime":1790975377404,"traceId":"63f7aed0e09036c7"},{"name":"write-route-bundle-stats","duration":8247,"timestamp":33683943592,"id":67,"parentId":1,"tags":{},"startTime":1790975377407,"traceId":"63f7aed0e09036c7"},{"name":"telemetry-flush","duration":442073,"timestamp":33683951855,"id":68,"parentId":1,"tags":{},"startTime":1790975377415,"traceId":"63f7aed0e09036c7"},{"name":"next-build","duration":8485723,"timestamp":33675908251,"id":1,"tags":{"buildMode":"default","version":"16.3.8","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1790975369372,"traceId":"63f7aed0e09036c7"}]
|
|
1
|
+
[{"name":"generate-buildid","duration":238,"timestamp":61148938119,"id":4,"parentId":1,"tags":{},"startTime":1791002842700,"traceId":"1b3a7aabc9e57426"},{"name":"load-custom-routes","duration":425,"timestamp":61148938480,"id":5,"parentId":1,"tags":{},"startTime":1791002842700,"traceId":"1b3a7aabc9e57426"},{"name":"create-dist-dir","duration":256,"timestamp":61148938931,"id":6,"parentId":1,"tags":{},"startTime":1791002842700,"traceId":"1b3a7aabc9e57426"},{"name":"clean","duration":60677,"timestamp":61148939952,"id":7,"parentId":1,"tags":{},"startTime":1791002842701,"traceId":"1b3a7aabc9e57426"},{"name":"discover-routes","duration":6846,"timestamp":61149009861,"id":8,"parentId":1,"tags":{},"startTime":1791002842771,"traceId":"1b3a7aabc9e57426"},{"name":"create-root-mapping","duration":67,"timestamp":61149016744,"id":9,"parentId":1,"tags":{},"startTime":1791002842778,"traceId":"1b3a7aabc9e57426"},{"name":"generate-route-types","duration":18369,"timestamp":61149018304,"id":10,"parentId":1,"tags":{},"startTime":1791002842780,"traceId":"1b3a7aabc9e57426"},{"name":"public-dir-conflict-check","duration":82,"timestamp":61149036727,"id":11,"parentId":1,"tags":{},"startTime":1791002842798,"traceId":"1b3a7aabc9e57426"},{"name":"generate-routes-manifest","duration":2857,"timestamp":61149036902,"id":12,"parentId":1,"tags":{},"startTime":1791002842798,"traceId":"1b3a7aabc9e57426"},{"name":"run-turbopack","duration":1201501,"timestamp":61149049184,"id":14,"parentId":1,"tags":{},"startTime":1791002842811,"traceId":"1b3a7aabc9e57426"},{"name":"turbopack-build-events","duration":88,"timestamp":61149354998,"id":15,"parentId":1,"tags":{},"startTime":1791002843117,"traceId":"1b3a7aabc9e57426"},{"name":"turbopack-persistence","duration":112000,"timestamp":61149709627,"id":16,"parentId":15,"tags":{"reason":"stop","snapshot_duration_ms":1.594754,"persist_duration_ms":110.05646700000001,"task_count":526,"bytes_written":546505,"bytes_deleted":0},"startTime":1791002843583,"traceId":"1b3a7aabc9e57426"},{"name":"run-typescript","duration":2697101,"timestamp":61150254399,"id":18,"parentId":1,"tags":{},"startTime":1791002844016,"traceId":"1b3a7aabc9e57426"},{"name":"generate-required-server-files","duration":837,"timestamp":61152952192,"id":20,"parentId":1,"tags":{},"startTime":1791002846714,"traceId":"1b3a7aabc9e57426"},{"name":"check-static-error-page","duration":9846,"timestamp":61152973436,"id":22,"parentId":21,"tags":{},"startTime":1791002846735,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":986469,"timestamp":61152984756,"id":42,"parentId":24,"tags":{},"startTime":1791002846746,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":995349,"timestamp":61152975938,"id":24,"parentId":21,"tags":{"page":"/_global-error"},"startTime":1791002846738,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1178534,"timestamp":61152984931,"id":45,"parentId":27,"tags":{},"startTime":1791002846747,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1186997,"timestamp":61152976507,"id":27,"parentId":21,"tags":{"page":"/api/health"},"startTime":1791002846738,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1269848,"timestamp":61152984482,"id":41,"parentId":23,"tags":{},"startTime":1791002846746,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1280048,"timestamp":61152974323,"id":23,"parentId":21,"tags":{"page":"/_not-found"},"startTime":1791002846736,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1288044,"timestamp":61152985236,"id":50,"parentId":32,"tags":{},"startTime":1791002846747,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1296239,"timestamp":61152977084,"id":32,"parentId":21,"tags":{"page":"/api/timings"},"startTime":1791002846739,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1285641,"timestamp":61152988845,"id":54,"parentId":37,"tags":{},"startTime":1791002846750,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1291681,"timestamp":61152982841,"id":37,"parentId":21,"tags":{"page":"/performance"},"startTime":1791002846744,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1289545,"timestamp":61152988861,"id":56,"parentId":39,"tags":{},"startTime":1791002846750,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1295359,"timestamp":61152983090,"id":39,"parentId":21,"tags":{"page":"/setup"},"startTime":1791002846745,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1302931,"timestamp":61152988865,"id":57,"parentId":40,"tags":{},"startTime":1791002846750,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1308656,"timestamp":61152983181,"id":40,"parentId":21,"tags":{"page":"/tools/[tool]"},"startTime":1791002846745,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1308627,"timestamp":61152985037,"id":47,"parentId":29,"tags":{},"startTime":1791002846747,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1316952,"timestamp":61152976747,"id":29,"parentId":21,"tags":{"page":"/api/settings"},"startTime":1791002846738,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1312365,"timestamp":61152988811,"id":52,"parentId":33,"tags":{},"startTime":1791002846750,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1323261,"timestamp":61152977977,"id":33,"parentId":21,"tags":{"page":"/connect"},"startTime":1791002846740,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1325763,"timestamp":61152985299,"id":51,"parentId":34,"tags":{},"startTime":1791002846747,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1332969,"timestamp":61152978145,"id":34,"parentId":21,"tags":{"page":"/icon.svg"},"startTime":1791002846740,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1327886,"timestamp":61152984980,"id":46,"parentId":28,"tags":{},"startTime":1791002846747,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1336261,"timestamp":61152976631,"id":28,"parentId":21,"tags":{"page":"/api/metrics"},"startTime":1791002846738,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1327464,"timestamp":61152988830,"id":53,"parentId":35,"tags":{},"startTime":1791002846750,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1338032,"timestamp":61152978283,"id":35,"parentId":21,"tags":{"page":"/"},"startTime":1791002846740,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1332424,"timestamp":61152985107,"id":48,"parentId":30,"tags":{},"startTime":1791002846747,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1340701,"timestamp":61152976852,"id":30,"parentId":21,"tags":{"page":"/api/setup/ai"},"startTime":1791002846738,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1346199,"timestamp":61152985180,"id":49,"parentId":31,"tags":{},"startTime":1791002846747,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1354450,"timestamp":61152976963,"id":31,"parentId":21,"tags":{"page":"/api/setup"},"startTime":1791002846739,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1342385,"timestamp":61152989819,"id":58,"parentId":36,"tags":{},"startTime":1791002846751,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1353720,"timestamp":61152978511,"id":36,"parentId":21,"tags":{"page":"/performance/[slug]"},"startTime":1791002846740,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1349225,"timestamp":61152984877,"id":44,"parentId":26,"tags":{},"startTime":1791002846746,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1357728,"timestamp":61152976391,"id":26,"parentId":21,"tags":{"page":"/api/connect"},"startTime":1791002846738,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1354454,"timestamp":61152988853,"id":55,"parentId":38,"tags":{},"startTime":1791002846750,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1360360,"timestamp":61152982981,"id":38,"parentId":21,"tags":{"page":"/settings"},"startTime":1791002846745,"traceId":"1b3a7aabc9e57426"},{"name":"is-page-static","duration":1366556,"timestamp":61152984822,"id":43,"parentId":25,"tags":{},"startTime":1791002846746,"traceId":"1b3a7aabc9e57426"},{"name":"check-page","duration":1375149,"timestamp":61152976255,"id":25,"parentId":21,"tags":{"page":"/api/analyze"},"startTime":1791002846738,"traceId":"1b3a7aabc9e57426"},{"name":"static-check","duration":1378550,"timestamp":61152972874,"id":21,"parentId":1,"tags":{},"startTime":1791002846734,"traceId":"1b3a7aabc9e57426"},{"name":"write-routes-manifest","duration":402,"timestamp":61154352092,"id":60,"parentId":1,"tags":{},"startTime":1791002848114,"traceId":"1b3a7aabc9e57426"},{"name":"load-dotenv","duration":28,"timestamp":61154361450,"id":63,"parentId":62,"tags":{},"startTime":1791002848123,"traceId":"1b3a7aabc9e57426"},{"name":"run-export-path-map","duration":428,"timestamp":61154362837,"id":64,"parentId":62,"tags":{},"startTime":1791002848124,"traceId":"1b3a7aabc9e57426"},{"name":"next-export","duration":515908,"timestamp":61154360528,"id":62,"parentId":1,"tags":{},"startTime":1791002848122,"traceId":"1b3a7aabc9e57426"},{"name":"move-exported-app-not-found-","duration":1078,"timestamp":61154878644,"id":65,"parentId":61,"tags":{},"startTime":1791002848640,"traceId":"1b3a7aabc9e57426"},{"name":"move-exported-app-global-error-","duration":647,"timestamp":61154879800,"id":66,"parentId":61,"tags":{},"startTime":1791002848641,"traceId":"1b3a7aabc9e57426"},{"name":"static-generation","duration":526600,"timestamp":61154354211,"id":61,"parentId":1,"tags":{},"startTime":1791002848116,"traceId":"1b3a7aabc9e57426"},{"name":"write-routes-manifest","duration":377,"timestamp":61154880976,"id":67,"parentId":1,"tags":{},"startTime":1791002848643,"traceId":"1b3a7aabc9e57426"},{"name":"print-tree-view","duration":2794,"timestamp":61154956976,"id":68,"parentId":1,"tags":{},"startTime":1791002848719,"traceId":"1b3a7aabc9e57426"},{"name":"write-route-bundle-stats","duration":7045,"timestamp":61154959790,"id":69,"parentId":1,"tags":{},"startTime":1791002848721,"traceId":"1b3a7aabc9e57426"},{"name":"telemetry-flush","duration":471046,"timestamp":61154966851,"id":70,"parentId":1,"tags":{},"startTime":1791002848728,"traceId":"1b3a7aabc9e57426"},{"name":"next-build","duration":6542824,"timestamp":61148895098,"id":1,"tags":{"buildMode":"default","version":"16.3.8","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1791002842657,"traceId":"1b3a7aabc9e57426"}]
|
package/.next/trace-build
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"name":"run-turbopack","duration":
|
|
1
|
+
[{"name":"run-turbopack","duration":1201501,"timestamp":61149049184,"id":14,"parentId":1,"tags":{},"startTime":1791002842811,"traceId":"1b3a7aabc9e57426"},{"name":"turbopack-build-events","duration":88,"timestamp":61149354998,"id":15,"parentId":1,"tags":{},"startTime":1791002843117,"traceId":"1b3a7aabc9e57426"},{"name":"turbopack-persistence","duration":112000,"timestamp":61149709627,"id":16,"parentId":15,"tags":{"reason":"stop","snapshot_duration_ms":1.594754,"persist_duration_ms":110.05646700000001,"task_count":526,"bytes_written":546505,"bytes_deleted":0},"startTime":1791002843583,"traceId":"1b3a7aabc9e57426"},{"name":"run-typescript","duration":2697101,"timestamp":61150254399,"id":18,"parentId":1,"tags":{},"startTime":1791002844016,"traceId":"1b3a7aabc9e57426"},{"name":"static-check","duration":1378550,"timestamp":61152972874,"id":21,"parentId":1,"tags":{},"startTime":1791002846734,"traceId":"1b3a7aabc9e57426"},{"name":"static-generation","duration":526600,"timestamp":61154354211,"id":61,"parentId":1,"tags":{},"startTime":1791002848116,"traceId":"1b3a7aabc9e57426"},{"name":"telemetry-flush","duration":471046,"timestamp":61154966851,"id":70,"parentId":1,"tags":{},"startTime":1791002848728,"traceId":"1b3a7aabc9e57426"},{"name":"next-build","duration":6542824,"timestamp":61148895098,"id":1,"tags":{"buildMode":"default","version":"16.3.8","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1791002842657,"traceId":"1b3a7aabc9e57426"}]
|
package/README.md
CHANGED
|
@@ -1,79 +1,134 @@
|
|
|
1
1
|
# MetricFlow — Performance Dashboard
|
|
2
2
|
|
|
3
|
-
MetricFlow is a local
|
|
3
|
+
MetricFlow is a local dashboard for your website. It reads real-user performance metrics from **New Relic** and JavaScript errors from **Sentry**, joins them per page, and can ask an AI model (Gemini, Claude or OpenAI) what to fix first.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
It runs on your own machine with your own keys. There is no MetricFlow server and no account to create.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
```bash
|
|
8
|
+
npx @karan171996/metricflow
|
|
9
|
+
```
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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`.
|
|
11
|
+
> **Status: early, work in progress (v0.1.5).** Things will change. Bug reports and feedback are welcome in [Issues](https://github.com/karan171996/MetricFlow/issues).
|
|
12
|
+
|
|
13
|
+

|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
_Screenshots use sample data, not real New Relic or Sentry numbers._
|
|
17
16
|
|
|
18
|
-
|
|
17
|
+
## What you need
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
| | Required? | Why |
|
|
20
|
+
| --- | --- | --- |
|
|
21
|
+
| Node.js `>=20.12` | Yes | Runs the dashboard |
|
|
22
|
+
| A New Relic account, with the **Browser agent** on your site | Yes | Page views, load time, Core Web Vitals, Apdex |
|
|
23
|
+
| A Sentry project | Yes | Error counts and latest errors per page |
|
|
24
|
+
| A Gemini, Claude or OpenAI API key | No | AI suggestions on the dashboard |
|
|
21
25
|
|
|
22
|
-
|
|
26
|
+
New Relic and Sentry both have free plans, which are enough to try MetricFlow.
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
## Get started in 4 steps
|
|
25
29
|
|
|
26
|
-
|
|
30
|
+
### 1. Start the dashboard
|
|
27
31
|
|
|
28
|
-
|
|
32
|
+
From any folder (usually your website's project folder):
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npx @karan171996/metricflow
|
|
36
|
+
```
|
|
29
37
|
|
|
30
38
|
```
|
|
31
|
-
$ performance-dashboard
|
|
32
39
|
✔ Dashboard is running
|
|
33
40
|
URL http://localhost:3000
|
|
34
41
|
Stop Ctrl+C
|
|
35
42
|
```
|
|
36
43
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
- Node.js `>=20.12`
|
|
40
|
-
- Optional but needed for real data: New Relic, Sentry and Gemini keys
|
|
44
|
+
Your browser opens the dashboard. The first time, it shows **Connect your data**, because no keys are set yet.
|
|
41
45
|
|
|
42
|
-
|
|
46
|
+
To install it in a project instead of using `npx` each time:
|
|
43
47
|
|
|
44
48
|
```bash
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
npm install
|
|
48
|
-
cp .env.local.example .env.local # then fill in your keys
|
|
49
|
-
npm run dev # development, http://localhost:3000
|
|
49
|
+
npm install --save-dev @karan171996/metricflow
|
|
50
|
+
npx performance-dashboard
|
|
50
51
|
```
|
|
51
52
|
|
|
52
|
-
|
|
53
|
+
The dashboard header shows the `name` from that project's `package.json`.
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
```
|
|
55
|
+
### 2. Add your keys
|
|
56
|
+
|
|
57
|
+
You need five values. Where to find each one:
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
| Value | Where to find it |
|
|
60
|
+
| --- | --- |
|
|
61
|
+
| New Relic **User API key** | New Relic → API keys → create key, type **User**. Starts with `NRAK-`. |
|
|
62
|
+
| New Relic **account ID** | A plain number, shown next to your keys in New Relic. |
|
|
63
|
+
| Sentry **auth token** | Sentry → Settings → Auth Tokens. Scopes: `project:read`, `event:read`. |
|
|
64
|
+
| Sentry **organization slug** | The name in your Sentry URL: `sentry.io/organizations/<slug>/`. |
|
|
65
|
+
| Sentry **project slug** | Sentry → Project settings. |
|
|
60
66
|
|
|
61
|
-
|
|
67
|
+
Save them in one of two ways:
|
|
62
68
|
|
|
63
|
-
- **
|
|
64
|
-
- **
|
|
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.
|
|
69
|
+
- **On the Setup page.** Click **Set up keys** on the dashboard (or open `/setup`), paste the values and save. MetricFlow checks each key with New Relic and Sentry before saving it.
|
|
70
|
+
- **In a `.env.local` file** in the folder where you run the command:
|
|
66
71
|
|
|
67
|
-
|
|
72
|
+
```bash
|
|
73
|
+
NEXT_PUBLIC_NEWRELIC_ACCOUNT_ID=1234567
|
|
74
|
+
NEWRELIC_API_KEY=NRAK-...
|
|
75
|
+
SENTRY_API_KEY=sntrys_...
|
|
76
|
+
SENTRY_ORG_SLUG=your-org
|
|
77
|
+
SENTRY_PROJECT_ID=your-project
|
|
78
|
+
```
|
|
68
79
|
|
|
69
|
-
|
|
80
|
+
Restart the dashboard after editing the file.
|
|
70
81
|
|
|
71
|
-
|
|
82
|
+
> **Using `npx`?** Keys saved on the Setup page are stored inside the downloaded package folder, so they can disappear when npm clears its cache or you update MetricFlow. For keys that stay put, use `.env.local` in your project folder. Add `.env.local` to your `.gitignore` so the keys are never committed.
|
|
83
|
+
|
|
84
|
+
**Optional AI suggestions:** on the Setup page, add a Gemini, Claude or OpenAI key, or set one in `.env.local` (`GEMINI_API_KEY`, `CLAUDE_API_KEY` or `OPENAI_API_KEY`). If you set more than one, `AI_PROVIDER=gemini|claude|openai` picks which one is used.
|
|
85
|
+
|
|
86
|
+
### 3. Send data from your site
|
|
87
|
+
|
|
88
|
+
MetricFlow only reads data. Your website has to send it to New Relic and Sentry first. After saving your keys, click **Next: connect your app** (or open `/connect`). That page gives you copy-paste snippets:
|
|
89
|
+
|
|
90
|
+
1. **New Relic Browser agent**: records page views, load timing and Core Web Vitals.
|
|
91
|
+
2. **`emitMetric()` helper** (optional): sends your own numbers through the Browser agent.
|
|
92
|
+
3. **Sentry**: sends JavaScript errors. Use your project's DSN.
|
|
93
|
+
|
|
94
|
+
Add them to your site, deploy or run it, and open a few pages.
|
|
95
|
+
|
|
96
|
+
### 4. Check that metrics arrive
|
|
97
|
+
|
|
98
|
+
On `/connect`, the **Events received** panel shows a row for each source:
|
|
99
|
+
|
|
100
|
+
- **Browser agent (page views)**
|
|
101
|
+
- **Custom events (emitMetric / test event)**
|
|
102
|
+
- **Sentry errors**
|
|
103
|
+
|
|
104
|
+
Reload a few pages of your site and watch the rows turn green. New Relic can take a minute or two to show new data.
|
|
105
|
+
|
|
106
|
+
To test without touching your site, add a New Relic **Ingest - License** key on `/connect` and click **Send test event**. This key is only used for the test button and is different from the User key.
|
|
107
|
+
|
|
108
|
+
Then open the dashboard (`/`). Your top 20 pages (by page views, last 24 hours) appear automatically. The dashboard refreshes every 30 seconds.
|
|
109
|
+
|
|
110
|
+
## What you'll see
|
|
111
|
+
|
|
112
|
+
| Page | What it shows |
|
|
113
|
+
| --- | --- |
|
|
114
|
+
| **Dashboard** (`/`) | Average response time, error rate, throughput and Apdex; TTFB, LCP and CLS cards with trends; pages passing Core Web Vitals; what moved since the last check; AI suggestions |
|
|
115
|
+
| **Performance** (`/performance`) | Every tracked page with its health. Click a row for that page's detail view |
|
|
116
|
+
| **New Relic** (`/tools/new-relic`) | New Relic numbers only, per page |
|
|
117
|
+
| **Sentry** (`/tools/sentry`) | Error count, latest error and when it was last seen, per page |
|
|
118
|
+
| **Settings** (`/settings`) | Warning and critical thresholds used to mark pages Healthy, Warning or Critical |
|
|
119
|
+
|
|
120
|
+

|
|
121
|
+
|
|
122
|
+
## Troubleshooting
|
|
123
|
+
|
|
124
|
+
| You see | What to do |
|
|
72
125
|
| --- | --- |
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
|
|
|
126
|
+
| **Connect your data** after adding keys | If you used `.env.local`, restart the dashboard. Check that all five values are set. |
|
|
127
|
+
| A page says **No data yet** | That page has no page views in New Relic in the last 24 hours. Check the Browser agent is on that page, then reload it. |
|
|
128
|
+
| **Could not load metrics** | New Relic rejected the request. Check the User API key and account ID on `/setup`, then click **Retry**. |
|
|
129
|
+
| Error counts are always 0 | Check the Sentry token scopes (`project:read`, `event:read`) and that the project slug is right. |
|
|
130
|
+
| `http://localhost:3000` shows a different app | Another app is using port 3000 over IPv6. Open `http://127.0.0.1:3000` instead, or pick another port: `npx @karan171996/metricflow 4000`. |
|
|
131
|
+
| Port already in use | Start on another port: `npx @karan171996/metricflow 4000`. |
|
|
77
132
|
|
|
78
133
|
## CLI usage
|
|
79
134
|
|
|
@@ -90,6 +145,8 @@ performance-dashboard [port] [options]
|
|
|
90
145
|
| `--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
146
|
| `[port]` | Port to listen on; default `3000`. The `PORT` environment variable also works |
|
|
92
147
|
|
|
148
|
+
The CLI loads `.env.local` and `.env` from the folder you run it in. Set `METRICFLOW_PROJECT_NAME` to change the name shown in the dashboard header.
|
|
149
|
+
|
|
93
150
|
Examples:
|
|
94
151
|
|
|
95
152
|
```bash
|
|
@@ -110,38 +167,69 @@ Errors print what failed and how to fix it. Exit code `2` is bad usage, `1` is a
|
|
|
110
167
|
$ performance-dashboard abc
|
|
111
168
|
✖ Invalid port "abc".
|
|
112
169
|
→ 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
170
|
```
|
|
118
171
|
|
|
119
172
|
Human text goes to stdout; errors, warnings and spinners go to stderr. Full spec: [CLI_OUTPUT.md](https://github.com/karan171996/MetricFlow/blob/main/CLI_OUTPUT.md).
|
|
120
173
|
|
|
121
|
-
##
|
|
174
|
+
## All environment variables
|
|
122
175
|
|
|
176
|
+
| Variable | Purpose |
|
|
177
|
+
| --- | --- |
|
|
178
|
+
| `NEXT_PUBLIC_NEWRELIC_ACCOUNT_ID`, `NEWRELIC_API_KEY` | Read metrics from New Relic (required) |
|
|
179
|
+
| `SENTRY_API_KEY`, `SENTRY_ORG_SLUG`, `SENTRY_PROJECT_ID` | Read errors from Sentry (required) |
|
|
180
|
+
| `GEMINI_API_KEY`, `CLAUDE_API_KEY`, `OPENAI_API_KEY` | AI suggestions (optional, any one) |
|
|
181
|
+
| `AI_PROVIDER` | `gemini`, `claude` or `openai`; picks the AI key when several are set |
|
|
182
|
+
| `NEWRELIC_INSERT_KEY` | Only for **Send test event** on `/connect` and `pnpm send-test-data` |
|
|
183
|
+
| `SENTRY_DSN` | Only for `pnpm send-test-data` |
|
|
184
|
+
| `METRICFLOW_PROJECT_NAME` | Overrides the project name in the header |
|
|
185
|
+
|
|
186
|
+
## Develop from source
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
git clone https://github.com/karan171996/MetricFlow.git
|
|
190
|
+
cd MetricFlow
|
|
191
|
+
pnpm install
|
|
192
|
+
cp .env.local.example .env.local # then fill in your keys
|
|
193
|
+
pnpm dev # http://127.0.0.1:3000
|
|
123
194
|
```
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
195
|
+
|
|
196
|
+
This repo uses [pnpm](https://pnpm.io) (`corepack enable` picks the pinned version). Install scripts are allowed only for the packages listed in `pnpm-workspace.yaml` (Cypress and `unrs-resolver`).
|
|
197
|
+
|
|
198
|
+
Run the production build through the CLI:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
pnpm build
|
|
202
|
+
node bin/cli.mjs
|
|
132
203
|
```
|
|
133
204
|
|
|
134
|
-
|
|
205
|
+
### Tests
|
|
135
206
|
|
|
136
207
|
```bash
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
208
|
+
pnpm test # all tests, fake keys, no network
|
|
209
|
+
pnpm test:cli # node:test suite only
|
|
210
|
+
pnpm test:real # against your real accounts (.env.local)
|
|
211
|
+
pnpm cy:run # Cypress tests (app must be running)
|
|
212
|
+
pnpm lint
|
|
213
|
+
pnpm send-test-data # one dummy event to Sentry and New Relic
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
`pnpm test` uses fake keys from `.env.test.example` and never reads `.env.local`. `pnpm test:real` reads `.env.local` and never prints the keys. `send-test-data` needs `SENTRY_DSN` and `NEWRELIC_INSERT_KEY`.
|
|
217
|
+
|
|
218
|
+
### Project structure
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
app/ Next.js App Router: pages and api/ route handlers
|
|
222
|
+
components/ UI, one folder per feature; ui/ is generated shadcn code
|
|
223
|
+
lib/ Data fetching (New Relic, Sentry), transforms, hooks
|
|
224
|
+
bin/ CLI (cli.mjs) and output formatter (output.mjs)
|
|
225
|
+
scripts/ send-test-data.mjs, test-env.mjs
|
|
226
|
+
test/ node:test suites
|
|
227
|
+
cypress/ End-to-end smoke test
|
|
228
|
+
docs/images/ README screenshots (not shipped in the npm package)
|
|
140
229
|
```
|
|
141
230
|
|
|
142
231
|
## Contributing
|
|
143
232
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
4. This project uses a recent Next.js with breaking changes; read `node_modules/next/dist/docs/` before changing framework code.
|
|
233
|
+
Nobody pushes straight to `main`: fork, branch, and open a pull request. Commit messages and PR titles use the `type(scope): description` format, for example `fix(api): handle an empty New Relic response` or `feat(ui): add a Sentry page`. Types are `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `build`, `ci`, `chore` and `revert`.
|
|
234
|
+
|
|
235
|
+
Full steps, the commit format and the PR checklist are in [CONTRIBUTING.md](CONTRIBUTING.md).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@karan171996/metricflow",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -10,20 +10,6 @@
|
|
|
10
10
|
"bugs": {
|
|
11
11
|
"url": "https://github.com/karan171996/MetricFlow/issues"
|
|
12
12
|
},
|
|
13
|
-
"scripts": {
|
|
14
|
-
"dev": "next dev -H 127.0.0.1",
|
|
15
|
-
"build": "next build",
|
|
16
|
-
"start": "next start -H 127.0.0.1",
|
|
17
|
-
"lint": "eslint",
|
|
18
|
-
"send-test-data": "node scripts/send-test-data.mjs",
|
|
19
|
-
"cy:open": "cypress open",
|
|
20
|
-
"cy:run": "cypress run",
|
|
21
|
-
"prepublishOnly": "next build",
|
|
22
|
-
"test:cli": "node --experimental-test-module-mocks --import ./test/register.mjs --test test/*.test.mjs",
|
|
23
|
-
"test:basic": "node scripts/test-env.mjs basic",
|
|
24
|
-
"test:real": "node scripts/test-env.mjs real",
|
|
25
|
-
"test": "npm run test:basic"
|
|
26
|
-
},
|
|
27
13
|
"dependencies": {
|
|
28
14
|
"axios": "^1.20.0",
|
|
29
15
|
"next": "16.3.8",
|
|
@@ -42,7 +28,7 @@
|
|
|
42
28
|
"cypress": "^16.1.1",
|
|
43
29
|
"dotenv": "^18.0.1",
|
|
44
30
|
"eslint": "^9",
|
|
45
|
-
"eslint-config-next": "16.3.8",
|
|
31
|
+
"eslint-config-next": "^16.3.8",
|
|
46
32
|
"lucide-react": "^1.47.0",
|
|
47
33
|
"recharts": "^3.10.1",
|
|
48
34
|
"shadcn": "^4.21.0",
|
|
@@ -68,5 +54,18 @@
|
|
|
68
54
|
},
|
|
69
55
|
"publishConfig": {
|
|
70
56
|
"access": "public"
|
|
57
|
+
},
|
|
58
|
+
"scripts": {
|
|
59
|
+
"dev": "next dev -H 127.0.0.1",
|
|
60
|
+
"build": "next build",
|
|
61
|
+
"start": "next start -H 127.0.0.1",
|
|
62
|
+
"lint": "eslint",
|
|
63
|
+
"send-test-data": "node scripts/send-test-data.mjs",
|
|
64
|
+
"cy:open": "cypress open",
|
|
65
|
+
"cy:run": "cypress run",
|
|
66
|
+
"test:cli": "node --experimental-test-module-mocks --import ./test/register.mjs --test test/*.test.mjs",
|
|
67
|
+
"test:basic": "node scripts/test-env.mjs basic",
|
|
68
|
+
"test:real": "node scripts/test-env.mjs real",
|
|
69
|
+
"test": "pnpm run test:basic"
|
|
71
70
|
}
|
|
72
|
-
}
|
|
71
|
+
}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[49719,(e,t,r)=>{t.exports=e.x("assert",()=>require("assert"))},54799,(e,t,r)=>{t.exports=e.x("crypto",()=>require("crypto"))},27699,(e,t,r)=>{t.exports=e.x("events",()=>require("events"))},22734,(e,t,r)=>{t.exports=e.x("fs",()=>require("fs"))},21517,(e,t,r)=>{t.exports=e.x("http",()=>require("http"))},25328,(e,t,r)=>{t.exports=e.x("http2",()=>require("http2"))},24836,(e,t,r)=>{t.exports=e.x("https",()=>require("https"))},4446,(e,t,r)=>{t.exports=e.x("net",()=>require("net"))},18622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},59043,(e,t,r)=>{t.exports=e.x("next/dist/server/runtime-reacts.external.js",()=>require("next/dist/server/runtime-reacts.external.js"))},93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},2157,(e,t,r)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},50227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},81111,(e,t,r)=>{t.exports=e.x("node:stream",()=>require("node:stream"))},46786,(e,t,r)=>{t.exports=e.x("os",()=>require("os"))},14747,(e,t,r)=>{t.exports=e.x("path",()=>require("path"))},88947,(e,t,r)=>{t.exports=e.x("stream",()=>require("stream"))},55004,(e,t,r)=>{t.exports=e.x("tls",()=>require("tls"))},70722,(e,t,r)=>{t.exports=e.x("tty",()=>require("tty"))},92509,(e,t,r)=>{t.exports=e.x("url",()=>require("url"))},24361,(e,t,r)=>{t.exports=e.x("util",()=>require("util"))},6461,(e,t,r)=>{t.exports=e.x("zlib",()=>require("zlib"))},83464,e=>{"use strict";var t=e.i(65617),r=e.i(12892),s=e.i(24514);let a=/[\s\0#"'`\\$]/,n=()=>Response.json({error:(0,s.REFUSAL_MESSAGE)()},{status:403}),o={gemini:e=>t.default.get("https://generativelanguage.googleapis.com/v1beta/models",{params:{key:e},timeout:8e3}),claude:e=>t.default.get("https://api.anthropic.com/v1/models",{headers:{"x-api-key":e,"anthropic-version":"2023-06-01"},timeout:8e3}),openai:e=>t.default.get("https://api.openai.com/v1/models",{headers:{Authorization:`Bearer ${e}`},timeout:8e3})};async function i(e){return(0,s.isLocalRequest)(e)?Response.json({provider:(0,r.activeAi)()?.provider??null,keys:Object.fromEntries(Object.entries(r.AI_PROVIDERS).map(([e,t])=>[e,!!process.env[t.key]]))}):n()}async function u(e){let i;if(!(0,s.isLocalRequest)(e))return n();try{i=await e.json()}catch{return Response.json({error:"Invalid request body."},{status:400})}let u=i.provider;if(!("string"==typeof u&&u in r.AI_PROVIDERS))return Response.json({saved:!1,error:"Choose a provider."},{status:400});let l="string"==typeof i.key?i.key.trim():"";if(!l)return Response.json({saved:!1,error:"Required."},{status:400});if(a.test(l))return Response.json({saved:!1,error:"Contains spaces or special characters. Paste the key without them."},{status:400});try{await o[u](l)}catch(a){let e=t.default.isAxiosError(a)?a.response?.status:void 0,s=400===e||401===e||403===e?`${r.AI_PROVIDERS[u].label} rejected this key.`:`Could not reach ${r.AI_PROVIDERS[u].label} to check the key.`;return Response.json({saved:!1,error:s},{status:422})}try{(0,r.writeEnvLocal)({[r.AI_PROVIDER_KEY]:u,[r.AI_PROVIDERS[u].key]:l})}catch{return Response.json({saved:!1,error:"Key is valid but .env.local could not be written. Check folder permissions."},{status:500})}return Response.json({saved:!0,provider:u})}e.s(["GET",0,i,"POST",0,u])},71526,e=>{"use strict";var t=e.i(47909),r=e.i(74017),s=e.i(96250),a=e.i(59756),n=e.i(61916),o=e.i(74677),i=e.i(69741),u=e.i(16795),l=e.i(87718),p=e.i(95169),d=e.i(47587),c=e.i(66012),h=e.i(70101),x=e.i(26937),R=e.i(10372),v=e.i(93695),f=e.i(9580);e.i(52474);var m=e.i(220);let g=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/setup/ai/route",pathname:"/api/setup/ai",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/app/api/setup/ai/route.ts",nextConfigOutput:"",userland:()=>e.r(83464),...{}}),{workAsyncStorage:E,workUnitAsyncStorage:w,serverHooks:y}=g;async function q(e,t,s){s.requestMeta&&(0,a.setRequestMeta)(e,s.requestMeta),g.isDev&&(0,a.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let E="/api/setup/ai/route";E=E.replace(/\/index$/,"")||"/";let w=await g.prepare(e,t,{srcPage:E,multiZoneDraftMode:!1});if(!w)return t.statusCode=400,t.end("Bad Request"),null==s.waitUntil||s.waitUntil.call(s,Promise.resolve()),null;let{buildId:y,deploymentId:q,params:C,nextConfig:A,parsedUrl:b,isDraftMode:S,prerenderManifest:O,routerServerContext:P,isOnDemandRevalidate:T,revalidateOnlyGenerated:_,resolvedPathname:I,clientReferenceManifest:k,serverActionsManifest:j}=w,N=(0,i.normalizeAppPath)(E),D=!!O.routes[I]&&(g.isDev||(0,f.isRouteCacheOwner)(I,g.cacheOwner,O.routes[I])),M=!!(O.dynamicRoutes[N]||D),H=async()=>((null==P?void 0:P.render404)?await P.render404(e,t,b,!1):t.end("This page could not be found"),null);if(M&&!S){let e=O.dynamicRoutes[N];if(e&&!1===e.fallback&&!D){if(A.adapterPath)return await H();throw new v.NoFallbackError}}let U=null;!M||g.isDev||S||(U="/index"===(U=I)?"/":U);let L=!0===g.isDev||!M,$=M&&!L;j&&k&&(0,o.setManifestsSingleton)({page:E,clientReferenceManifest:k,serverActionsManifest:j});let F=e.method||"GET",K=(0,n.getTracer)(),V=K.getActiveScopeSpan(),G=!!(null==P?void 0:P.isWrappedByNextServer),B=!!(0,a.getRequestMeta)(e,"minimalMode"),X=(0,a.getRequestMeta)(e,"incrementalCache")||await g.getIncrementalCache(e,A,O,B);null==X||X.resetRequestCache(),globalThis.__incrementalCache=X;let z={params:C,previewProps:O.preview,renderOpts:{experimental:{authInterrupts:!!A.experimental.authInterrupts,useCacheTimeout:A.experimental.useCacheTimeout},cacheComponents:!!A.cacheComponents,validationLevel:A.experimental.instantInsights.validationLevel,isDraftMode:S,supportsDynamicResponse:L,incrementalCache:X,hmrRefreshHash:(0,a.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:A.cacheLife,staticPageGenerationTimeout:A.staticPageGenerationTimeout,waitUntil:s.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,s,a)=>g.onRequestError(e,t,s,a,P)},sharedContext:{buildId:y,deploymentId:q}},W=new u.NodeNextRequest(e),Y=new u.NodeNextResponse(t),Z=l.NextRequestAdapter.fromNodeNextRequest(W,(0,l.signalFromNodeResponse)(t)),J=async({previousCacheEntry:r})=>{try{if(!B&&T&&_&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let a=await g.handle(Z,z);e.fetchMetrics=z.renderOpts.fetchMetrics;let n=z.renderOpts.pendingWaitUntil;n&&s.waitUntil&&(s.waitUntil(n),n=void 0);let o=z.renderOpts.collectedTags;if(!M)return await (0,c.sendResponse)(W,Y,a,n),null;{let e=await a.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(a.headers);o&&(t[R.NEXT_CACHE_TAGS_HEADER]=o),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==z.renderOpts.collectedRevalidate&&!(z.renderOpts.collectedRevalidate>=R.INFINITE_CACHE)&&z.renderOpts.collectedRevalidate,s=void 0===z.renderOpts.collectedExpire||z.renderOpts.collectedExpire>=R.INFINITE_CACHE?!1!==r&&r>0?A.expireTime:void 0:z.renderOpts.collectedExpire;return{value:{kind:m.CachedRouteKind.APP_ROUTE,status:a.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:s}}}}catch(t){throw(null==r?void 0:r.isStale)&&await g.onRequestError(e,t,{routerKind:"App Router",routePath:E,routeType:"route",revalidateReason:(0,d.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:T})},!1,P),t}},Q=async(a,o)=>{try{var i,u;let a=await g.handleResponse({req:e,nextConfig:A,cacheKey:U,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:O,isRoutePPREnabled:!1,isOnDemandRevalidate:T,revalidateOnlyGenerated:_,responseGenerator:J,waitUntil:s.waitUntil,isMinimalMode:B});if(!M)return;if((null==a||null==(i=a.value)?void 0:i.kind)!==m.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==a||null==(u=a.value)?void 0:u.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});B||t.setHeader("x-nextjs-cache",T?"REVALIDATED":a.isMiss?"MISS":a.isStale?"STALE":"HIT"),S&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let n=(0,h.fromNodeOutgoingHttpHeaders)(a.value.headers);B&&M||n.delete(R.NEXT_CACHE_TAGS_HEADER),!a.cacheControl||t.getHeader("Cache-Control")||n.get("Cache-Control")||n.set("Cache-Control",(0,x.getCacheControlHeader)(a.cacheControl)),await (0,c.sendResponse)(W,Y,new Response(a.value.body,{headers:n,status:a.value.status||200}));return}catch(t){if(t instanceof v.NoFallbackError||await g.onRequestError(e,t,{routerKind:"App Router",routePath:N,routeType:"route",revalidateReason:(0,d.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:T})},!1,P),M)throw t;await (0,c.sendResponse)(W,Y,new Response(null,{status:500}));return}finally{(()=>{if(!a)return;let e=t.statusCode;a.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(a.setStatus({code:n.SpanStatusCode.ERROR}),a.setAttribute("error.type",e.toString()));let r=K.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==p.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let s=r.get("next.route")||N,i=`${F} ${s}`;a.setAttributes({"next.route":s,"http.route":s,"next.span_name":i}),a.updateName(i),o&&o!==a&&(o.setAttribute("http.route",s),o.updateName(i))})()}};if(G&&V)await Q(V,void 0);else{let t=K.getActiveScopeSpan();await K.withPropagatedContext(e.headers,()=>K.trace(p.BaseServerSpan.handleRequest,{spanName:`${F} ${E}`,kind:n.SpanKind.SERVER,attributes:{"http.method":F,"http.target":e.url}},e=>Q(e,t)),void 0,!G)}}e.s(["handler",0,q,"patchFetch",0,function(){return(0,s.patchFetch)({workAsyncStorage:E,workUnitAsyncStorage:w})},"routeModule",0,g,"serverHooks",0,y,"workAsyncStorage",0,E,"workUnitAsyncStorage",0,w])},24514,e=>{"use strict";let t=new Set(["localhost","127.0.0.1","[::1]"]),r=new Set(["127.0.0.1","::1","::ffff:127.0.0.1"]);e.s(["REFUSAL_MESSAGE",0,()=>"1"===process.env.METRICFLOW_EXPOSED?"Setup and Connect are disabled because the dashboard is exposed on the network (--host). Restart without --host to use them.":"Setup is only available from localhost.","isLocalRequest",0,function(e){if("1"===process.env.METRICFLOW_EXPOSED)return!1;let s=e.headers.get("x-forwarded-for");if(s&&!s.split(",").every(e=>r.has(e.trim().replace(/^\[|\]$/g,""))))return!1;let a=(e.headers.get("host")??"").replace(/:\d+$/,"");if(!t.has(a))return!1;let n=e.headers.get("origin");try{return!n||t.has(new URL(n).hostname)}catch{return!1}}])}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__027a1hx._.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[54799,(e,t,r)=>{t.exports=e.x("crypto",()=>require("crypto"))},18622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},59043,(e,t,r)=>{t.exports=e.x("next/dist/server/runtime-reacts.external.js",()=>require("next/dist/server/runtime-reacts.external.js"))},93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},81111,(e,t,r)=>{t.exports=e.x("node:stream",()=>require("node:stream"))},14747,(e,t,r)=>{t.exports=e.x("path",()=>require("path"))},34199,e=>{"use strict";var t=e.i(90770);async function r(){return Response.json({items:(0,t.getTimings)()})}e.s(["GET",0,r])},73053,e=>{"use strict";var t=e.i(47909),r=e.i(74017),a=e.i(96250),n=e.i(59756),i=e.i(61916),s=e.i(74677),o=e.i(69741),l=e.i(16795),u=e.i(87718),d=e.i(95169),p=e.i(47587),c=e.i(66012),h=e.i(70101),x=e.i(26937),R=e.i(10372),v=e.i(93695),m=e.i(9580);e.i(52474);var g=e.i(220);let f=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/timings/route",pathname:"/api/timings",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/app/api/timings/route.ts",nextConfigOutput:"",userland:()=>e.r(34199),...{}}),{workAsyncStorage:w,workUnitAsyncStorage:E,serverHooks:C}=f;async function y(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),f.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let w="/api/timings/route";w=w.replace(/\/index$/,"")||"/";let E=await f.prepare(e,t,{srcPage:w,multiZoneDraftMode:!1});if(!E)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:C,deploymentId:y,params:T,nextConfig:A,parsedUrl:b,isDraftMode:q,prerenderManifest:P,routerServerContext:S,isOnDemandRevalidate:N,revalidateOnlyGenerated:O,resolvedPathname:_,clientReferenceManifest:k,serverActionsManifest:H}=E,j=(0,o.normalizeAppPath)(w),M=!!P.routes[_]&&(f.isDev||(0,m.isRouteCacheOwner)(_,f.cacheOwner,P.routes[_])),I=!!(P.dynamicRoutes[j]||M),U=async()=>((null==S?void 0:S.render404)?await S.render404(e,t,b,!1):t.end("This page could not be found"),null);if(I&&!q){let e=P.dynamicRoutes[j];if(e&&!1===e.fallback&&!M){if(A.adapterPath)return await U();throw new v.NoFallbackError}}let D=null;!I||f.isDev||q||(D="/index"===(D=_)?"/":D);let F=!0===f.isDev||!I,K=I&&!F;H&&k&&(0,s.setManifestsSingleton)({page:w,clientReferenceManifest:k,serverActionsManifest:H});let L=e.method||"GET",$=(0,i.getTracer)(),B=$.getActiveScopeSpan(),G=!!(null==S?void 0:S.isWrappedByNextServer),V=!!(0,n.getRequestMeta)(e,"minimalMode"),X=(0,n.getRequestMeta)(e,"incrementalCache")||await f.getIncrementalCache(e,A,P,V);null==X||X.resetRequestCache(),globalThis.__incrementalCache=X;let W={params:T,previewProps:P.preview,renderOpts:{experimental:{authInterrupts:!!A.experimental.authInterrupts,useCacheTimeout:A.experimental.useCacheTimeout},cacheComponents:!!A.cacheComponents,validationLevel:A.experimental.instantInsights.validationLevel,isDraftMode:q,supportsDynamicResponse:F,incrementalCache:X,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:A.cacheLife,staticPageGenerationTimeout:A.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>f.onRequestError(e,t,a,n,S)},sharedContext:{buildId:C,deploymentId:y}},z=new l.NodeNextRequest(e),Z=new l.NodeNextResponse(t),J=u.NextRequestAdapter.fromNodeNextRequest(z,(0,u.signalFromNodeResponse)(t)),Q=async({previousCacheEntry:r})=>{try{if(!V&&N&&O&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await f.handle(J,W);e.fetchMetrics=W.renderOpts.fetchMetrics;let i=W.renderOpts.pendingWaitUntil;i&&a.waitUntil&&(a.waitUntil(i),i=void 0);let s=W.renderOpts.collectedTags;if(!I)return await (0,c.sendResponse)(z,Z,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);s&&(t[R.NEXT_CACHE_TAGS_HEADER]=s),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==W.renderOpts.collectedRevalidate&&!(W.renderOpts.collectedRevalidate>=R.INFINITE_CACHE)&&W.renderOpts.collectedRevalidate,a=void 0===W.renderOpts.collectedExpire||W.renderOpts.collectedExpire>=R.INFINITE_CACHE?!1!==r&&r>0?A.expireTime:void 0:W.renderOpts.collectedExpire;return{value:{kind:g.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await f.onRequestError(e,t,{routerKind:"App Router",routePath:w,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:K,isOnDemandRevalidate:N})},!1,S),t}},Y=async(n,s)=>{try{var o,l;let n=await f.handleResponse({req:e,nextConfig:A,cacheKey:D,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:P,isRoutePPREnabled:!1,isOnDemandRevalidate:N,revalidateOnlyGenerated:O,responseGenerator:Q,waitUntil:a.waitUntil,isMinimalMode:V});if(!I)return;if((null==n||null==(o=n.value)?void 0:o.kind)!==g.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(l=n.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});V||t.setHeader("x-nextjs-cache",N?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),q&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);V&&I||i.delete(R.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,x.getCacheControlHeader)(n.cacheControl)),await (0,c.sendResponse)(z,Z,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof v.NoFallbackError||await f.onRequestError(e,t,{routerKind:"App Router",routePath:j,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:K,isOnDemandRevalidate:N})},!1,S),I)throw t;await (0,c.sendResponse)(z,Z,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let r=$.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||j,o=`${L} ${a}`;n.setAttributes({"next.route":a,"http.route":a,"next.span_name":o}),n.updateName(o),s&&s!==n&&(s.setAttribute("http.route",a),s.updateName(o))})()}};if(G&&B)await Y(B,void 0);else{let t=$.getActiveScopeSpan();await $.withPropagatedContext(e.headers,()=>$.trace(d.BaseServerSpan.handleRequest,{spanName:`${L} ${w}`,kind:i.SpanKind.SERVER,attributes:{"http.method":L,"http.target":e.url}},e=>Y(e,t)),void 0,!G)}}e.s(["handler",0,y,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:w,workUnitAsyncStorage:E})},"routeModule",0,f,"serverHooks",0,C,"workAsyncStorage",0,w,"workUnitAsyncStorage",0,E])},90770,e=>{"use strict";let t=new Map;e.s(["getTimings",0,function(){return Array.from(t.entries()).map(([e,t])=>({name:e,value:t})).sort((e,t)=>t.value-e.value)},"recordTiming",0,function(e,r){t.set(e,Math.round(r))}])}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__14tfjrn._.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[54799,(e,t,r)=>{t.exports=e.x("crypto",()=>require("crypto"))},18622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},59043,(e,t,r)=>{t.exports=e.x("next/dist/server/runtime-reacts.external.js",()=>require("next/dist/server/runtime-reacts.external.js"))},93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},81111,(e,t,r)=>{t.exports=e.x("node:stream",()=>require("node:stream"))},14747,(e,t,r)=>{t.exports=e.x("path",()=>require("path"))},57007,e=>{"use strict";async function t(){return Response.json({status:"ok",timestamp:new Date().toISOString(),version:"1.0.0"})}e.s(["GET",0,t])},61370,e=>{"use strict";var t=e.i(47909),r=e.i(74017),a=e.i(96250),n=e.i(59756),s=e.i(61916),i=e.i(74677),o=e.i(69741),l=e.i(16795),u=e.i(87718),d=e.i(95169),p=e.i(47587),c=e.i(66012),h=e.i(70101),x=e.i(26937),R=e.i(10372),v=e.i(93695),m=e.i(9580);e.i(52474);var g=e.i(220);let w=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/health/route",pathname:"/api/health",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/app/api/health/route.ts",nextConfigOutput:"",userland:()=>e.r(57007),...{}}),{workAsyncStorage:f,workUnitAsyncStorage:E,serverHooks:C}=w;async function y(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),w.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let f="/api/health/route";f=f.replace(/\/index$/,"")||"/";let E=await w.prepare(e,t,{srcPage:f,multiZoneDraftMode:!1});if(!E)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:C,deploymentId:y,params:A,nextConfig:T,parsedUrl:b,isDraftMode:S,prerenderManifest:q,routerServerContext:P,isOnDemandRevalidate:N,revalidateOnlyGenerated:O,resolvedPathname:_,clientReferenceManifest:k,serverActionsManifest:H}=E,j=(0,o.normalizeAppPath)(f),I=!!q.routes[_]&&(w.isDev||(0,m.isRouteCacheOwner)(_,w.cacheOwner,q.routes[_])),M=!!(q.dynamicRoutes[j]||I),D=async()=>((null==P?void 0:P.render404)?await P.render404(e,t,b,!1):t.end("This page could not be found"),null);if(M&&!S){let e=q.dynamicRoutes[j];if(e&&!1===e.fallback&&!I){if(T.adapterPath)return await D();throw new v.NoFallbackError}}let U=null;!M||w.isDev||S||(U="/index"===(U=_)?"/":U);let F=!0===w.isDev||!M,K=M&&!F;H&&k&&(0,i.setManifestsSingleton)({page:f,clientReferenceManifest:k,serverActionsManifest:H});let L=e.method||"GET",$=(0,s.getTracer)(),B=$.getActiveScopeSpan(),G=!!(null==P?void 0:P.isWrappedByNextServer),V=!!(0,n.getRequestMeta)(e,"minimalMode"),X=(0,n.getRequestMeta)(e,"incrementalCache")||await w.getIncrementalCache(e,T,q,V);null==X||X.resetRequestCache(),globalThis.__incrementalCache=X;let W={params:A,previewProps:q.preview,renderOpts:{experimental:{authInterrupts:!!T.experimental.authInterrupts,useCacheTimeout:T.experimental.useCacheTimeout},cacheComponents:!!T.cacheComponents,validationLevel:T.experimental.instantInsights.validationLevel,isDraftMode:S,supportsDynamicResponse:F,incrementalCache:X,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:T.cacheLife,staticPageGenerationTimeout:T.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>w.onRequestError(e,t,a,n,P)},sharedContext:{buildId:C,deploymentId:y}},z=new l.NodeNextRequest(e),Z=new l.NodeNextResponse(t),J=u.NextRequestAdapter.fromNodeNextRequest(z,(0,u.signalFromNodeResponse)(t)),Q=async({previousCacheEntry:r})=>{try{if(!V&&N&&O&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await w.handle(J,W);e.fetchMetrics=W.renderOpts.fetchMetrics;let s=W.renderOpts.pendingWaitUntil;s&&a.waitUntil&&(a.waitUntil(s),s=void 0);let i=W.renderOpts.collectedTags;if(!M)return await (0,c.sendResponse)(z,Z,n,s),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);i&&(t[R.NEXT_CACHE_TAGS_HEADER]=i),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==W.renderOpts.collectedRevalidate&&!(W.renderOpts.collectedRevalidate>=R.INFINITE_CACHE)&&W.renderOpts.collectedRevalidate,a=void 0===W.renderOpts.collectedExpire||W.renderOpts.collectedExpire>=R.INFINITE_CACHE?!1!==r&&r>0?T.expireTime:void 0:W.renderOpts.collectedExpire;return{value:{kind:g.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await w.onRequestError(e,t,{routerKind:"App Router",routePath:f,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:K,isOnDemandRevalidate:N})},!1,P),t}},Y=async(n,i)=>{try{var o,l;let n=await w.handleResponse({req:e,nextConfig:T,cacheKey:U,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:q,isRoutePPREnabled:!1,isOnDemandRevalidate:N,revalidateOnlyGenerated:O,responseGenerator:Q,waitUntil:a.waitUntil,isMinimalMode:V});if(!M)return;if((null==n||null==(o=n.value)?void 0:o.kind)!==g.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(l=n.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});V||t.setHeader("x-nextjs-cache",N?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),S&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let s=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);V&&M||s.delete(R.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||s.get("Cache-Control")||s.set("Cache-Control",(0,x.getCacheControlHeader)(n.cacheControl)),await (0,c.sendResponse)(z,Z,new Response(n.value.body,{headers:s,status:n.value.status||200}));return}catch(t){if(t instanceof v.NoFallbackError||await w.onRequestError(e,t,{routerKind:"App Router",routePath:j,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:K,isOnDemandRevalidate:N})},!1,P),M)throw t;await (0,c.sendResponse)(z,Z,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:s.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let r=$.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||j,o=`${L} ${a}`;n.setAttributes({"next.route":a,"http.route":a,"next.span_name":o}),n.updateName(o),i&&i!==n&&(i.setAttribute("http.route",a),i.updateName(o))})()}};if(G&&B)await Y(B,void 0);else{let t=$.getActiveScopeSpan();await $.withPropagatedContext(e.headers,()=>$.trace(d.BaseServerSpan.handleRequest,{spanName:`${L} ${f}`,kind:s.SpanKind.SERVER,attributes:{"http.method":L,"http.target":e.url}},e=>Y(e,t)),void 0,!G)}}e.s(["handler",0,y,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:f,workUnitAsyncStorage:E})},"routeModule",0,w,"serverHooks",0,C,"workAsyncStorage",0,f,"workUnitAsyncStorage",0,E])}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__1fj5wte._.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[54799,(e,t,r)=>{t.exports=e.x("crypto",()=>require("crypto"))},18622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},59043,(e,t,r)=>{t.exports=e.x("next/dist/server/runtime-reacts.external.js",()=>require("next/dist/server/runtime-reacts.external.js"))},93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},2157,(e,t,r)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},50227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},81111,(e,t,r)=>{t.exports=e.x("node:stream",()=>require("node:stream"))},14747,(e,t,r)=>{t.exports=e.x("path",()=>require("path"))},60780,e=>{"use strict";var t=e.i(2157),r=e.i(50227),n=e.i(24514);let a={loadSeconds:1.5,errorPercent:2,uptimeSLA:99.9},s=()=>process.env.METRICFLOW_SETTINGS_FILE||(0,r.join)(process.cwd(),".metricflow-settings.json"),o={loadSeconds:[.1,30],errorPercent:[.1,100],uptimeSLA:[90,100]};function i(){try{return{...a,...JSON.parse((0,t.readFileSync)(s(),"utf8"))}}catch{return a}}async function l(){return Response.json(i())}async function u(e){let r;if(!(0,n.isLocalRequest)(e))return Response.json({error:(0,n.REFUSAL_MESSAGE)()},{status:403});try{r=await e.json()}catch{return Response.json({error:"Invalid request body."},{status:400})}let a=i();for(let[e,[t,n]]of Object.entries(o)){if(void 0===r[e])continue;let s=r[e];if("number"!=typeof s||!Number.isFinite(s)||s<t||s>n)return Response.json({error:`${e} must be a number between ${t} and ${n}.`},{status:400});a[e]=s}try{let e=`${s()}.tmp`;(0,t.writeFileSync)(e,JSON.stringify(a,null,2)),(0,t.renameSync)(e,s())}catch{return Response.json({error:"Settings could not be written. Check folder permissions."},{status:500})}return Response.json(a)}e.s(["GET",0,l,"PUT",0,u],60780)},83579,e=>{"use strict";var t=e.i(47909),r=e.i(74017),n=e.i(96250),a=e.i(59756),s=e.i(61916),o=e.i(74677),i=e.i(69741),l=e.i(16795),u=e.i(87718),d=e.i(95169),c=e.i(47587),p=e.i(66012),h=e.i(70101),R=e.i(26937),x=e.i(10372),v=e.i(93695),f=e.i(9580);e.i(52474);var m=e.i(220);let g=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/settings/route",pathname:"/api/settings",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/app/api/settings/route.ts",nextConfigOutput:"",userland:()=>e.r(60780),...{}}),{workAsyncStorage:E,workUnitAsyncStorage:w,serverHooks:S}=g;async function y(e,t,n){n.requestMeta&&(0,a.setRequestMeta)(e,n.requestMeta),g.isDev&&(0,a.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let E="/api/settings/route";E=E.replace(/\/index$/,"")||"/";let w=await g.prepare(e,t,{srcPage:E,multiZoneDraftMode:!1});if(!w)return t.statusCode=400,t.end("Bad Request"),null==n.waitUntil||n.waitUntil.call(n,Promise.resolve()),null;let{buildId:S,deploymentId:y,params:C,nextConfig:b,parsedUrl:A,isDraftMode:T,prerenderManifest:q,routerServerContext:O,isOnDemandRevalidate:P,revalidateOnlyGenerated:N,resolvedPathname:_,clientReferenceManifest:j,serverActionsManifest:I}=w,k=(0,i.normalizeAppPath)(E),M=!!q.routes[_]&&(g.isDev||(0,f.isRouteCacheOwner)(_,g.cacheOwner,q.routes[_])),H=!!(q.dynamicRoutes[k]||M),U=async()=>((null==O?void 0:O.render404)?await O.render404(e,t,A,!1):t.end("This page could not be found"),null);if(H&&!T){let e=q.dynamicRoutes[k];if(e&&!1===e.fallback&&!M){if(b.adapterPath)return await U();throw new v.NoFallbackError}}let L=null;!H||g.isDev||T||(L="/index"===(L=_)?"/":L);let F=!0===g.isDev||!H,D=H&&!F;I&&j&&(0,o.setManifestsSingleton)({page:E,clientReferenceManifest:j,serverActionsManifest:I});let $=e.method||"GET",G=(0,s.getTracer)(),K=G.getActiveScopeSpan(),B=!!(null==O?void 0:O.isWrappedByNextServer),W=!!(0,a.getRequestMeta)(e,"minimalMode"),X=(0,a.getRequestMeta)(e,"incrementalCache")||await g.getIncrementalCache(e,b,q,W);null==X||X.resetRequestCache(),globalThis.__incrementalCache=X;let V={params:C,previewProps:q.preview,renderOpts:{experimental:{authInterrupts:!!b.experimental.authInterrupts,useCacheTimeout:b.experimental.useCacheTimeout},cacheComponents:!!b.cacheComponents,validationLevel:b.experimental.instantInsights.validationLevel,isDraftMode:T,supportsDynamicResponse:F,incrementalCache:X,hmrRefreshHash:(0,a.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:b.cacheLife,staticPageGenerationTimeout:b.staticPageGenerationTimeout,waitUntil:n.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,n,a)=>g.onRequestError(e,t,n,a,O)},sharedContext:{buildId:S,deploymentId:y}},J=new l.NodeNextRequest(e),z=new l.NodeNextResponse(t),Z=u.NextRequestAdapter.fromNodeNextRequest(J,(0,u.signalFromNodeResponse)(t)),Q=async({previousCacheEntry:r})=>{try{if(!W&&P&&N&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let a=await g.handle(Z,V);e.fetchMetrics=V.renderOpts.fetchMetrics;let s=V.renderOpts.pendingWaitUntil;s&&n.waitUntil&&(n.waitUntil(s),s=void 0);let o=V.renderOpts.collectedTags;if(!H)return await (0,p.sendResponse)(J,z,a,s),null;{let e=await a.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(a.headers);o&&(t[x.NEXT_CACHE_TAGS_HEADER]=o),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==V.renderOpts.collectedRevalidate&&!(V.renderOpts.collectedRevalidate>=x.INFINITE_CACHE)&&V.renderOpts.collectedRevalidate,n=void 0===V.renderOpts.collectedExpire||V.renderOpts.collectedExpire>=x.INFINITE_CACHE?!1!==r&&r>0?b.expireTime:void 0:V.renderOpts.collectedExpire;return{value:{kind:m.CachedRouteKind.APP_ROUTE,status:a.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:n}}}}catch(t){throw(null==r?void 0:r.isStale)&&await g.onRequestError(e,t,{routerKind:"App Router",routePath:E,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:D,isOnDemandRevalidate:P})},!1,O),t}},Y=async(a,o)=>{try{var i,l;let a=await g.handleResponse({req:e,nextConfig:b,cacheKey:L,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:q,isRoutePPREnabled:!1,isOnDemandRevalidate:P,revalidateOnlyGenerated:N,responseGenerator:Q,waitUntil:n.waitUntil,isMinimalMode:W});if(!H)return;if((null==a||null==(i=a.value)?void 0:i.kind)!==m.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==a||null==(l=a.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});W||t.setHeader("x-nextjs-cache",P?"REVALIDATED":a.isMiss?"MISS":a.isStale?"STALE":"HIT"),T&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let s=(0,h.fromNodeOutgoingHttpHeaders)(a.value.headers);W&&H||s.delete(x.NEXT_CACHE_TAGS_HEADER),!a.cacheControl||t.getHeader("Cache-Control")||s.get("Cache-Control")||s.set("Cache-Control",(0,R.getCacheControlHeader)(a.cacheControl)),await (0,p.sendResponse)(J,z,new Response(a.value.body,{headers:s,status:a.value.status||200}));return}catch(t){if(t instanceof v.NoFallbackError||await g.onRequestError(e,t,{routerKind:"App Router",routePath:k,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:D,isOnDemandRevalidate:P})},!1,O),H)throw t;await (0,p.sendResponse)(J,z,new Response(null,{status:500}));return}finally{(()=>{if(!a)return;let e=t.statusCode;a.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(a.setStatus({code:s.SpanStatusCode.ERROR}),a.setAttribute("error.type",e.toString()));let r=G.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let n=r.get("next.route")||k,i=`${$} ${n}`;a.setAttributes({"next.route":n,"http.route":n,"next.span_name":i}),a.updateName(i),o&&o!==a&&(o.setAttribute("http.route",n),o.updateName(i))})()}};if(B&&K)await Y(K,void 0);else{let t=G.getActiveScopeSpan();await G.withPropagatedContext(e.headers,()=>G.trace(d.BaseServerSpan.handleRequest,{spanName:`${$} ${E}`,kind:s.SpanKind.SERVER,attributes:{"http.method":$,"http.target":e.url}},e=>Y(e,t)),void 0,!B)}}e.s(["handler",0,y,"patchFetch",0,function(){return(0,n.patchFetch)({workAsyncStorage:E,workUnitAsyncStorage:w})},"routeModule",0,g,"serverHooks",0,S,"workAsyncStorage",0,E,"workUnitAsyncStorage",0,w])},24514,e=>{"use strict";let t=new Set(["localhost","127.0.0.1","[::1]"]),r=new Set(["127.0.0.1","::1","::ffff:127.0.0.1"]);e.s(["REFUSAL_MESSAGE",0,()=>"1"===process.env.METRICFLOW_EXPOSED?"Setup and Connect are disabled because the dashboard is exposed on the network (--host). Restart without --host to use them.":"Setup is only available from localhost.","isLocalRequest",0,function(e){if("1"===process.env.METRICFLOW_EXPOSED)return!1;let n=e.headers.get("x-forwarded-for");if(n&&!n.split(",").every(e=>r.has(e.trim().replace(/^\[|\]$/g,""))))return!1;let a=(e.headers.get("host")??"").replace(/:\d+$/,"");if(!t.has(a))return!1;let s=e.headers.get("origin");try{return!s||t.has(new URL(s).hostname)}catch{return!1}}])}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__1lxxc0h._.js.map
|