@karan171996/metricflow 0.1.7 → 0.2.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 -1
- package/.next/build-manifest.json +3 -3
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/analyze/route.js.nft.json +1 -1
- package/.next/server/app/api/connect/route.js +2 -2
- package/.next/server/app/api/connect/route.js.nft.json +1 -1
- package/.next/server/app/api/metrics/route.js +1 -1
- package/.next/server/app/api/metrics/route.js.nft.json +1 -1
- package/.next/server/app/api/setup/ai/route.js.nft.json +1 -1
- package/.next/server/app/api/setup/route.js +1 -1
- package/.next/server/app/api/setup/route.js.nft.json +1 -1
- package/.next/server/app/connect.html +1 -1
- package/.next/server/app/connect.rsc +1 -1
- package/.next/server/app/connect.segments/_full.segment.rsc +1 -1
- package/.next/server/app/connect.segments/_index.segment.rsc +1 -1
- package/.next/server/app/connect.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/connect.segments/connect/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +1 -1
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/performance/[slug]/page.js +1 -1
- package/.next/server/app/performance/[slug]/page.js.nft.json +1 -1
- package/.next/server/app/performance.html +1 -1
- package/.next/server/app/performance.rsc +1 -1
- package/.next/server/app/performance.segments/_full.segment.rsc +1 -1
- package/.next/server/app/performance.segments/_index.segment.rsc +1 -1
- package/.next/server/app/performance.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/performance.segments/performance/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +1 -1
- package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- 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 +8 -8
- package/.next/server/app/setup.segments/_full.segment.rsc +8 -8
- package/.next/server/app/setup.segments/_index.segment.rsc +5 -5
- package/.next/server/app/setup.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +7 -7
- package/.next/server/chunks/{[root-of-the-server]__0eo1oa6._.js → [root-of-the-server]__0jh5wh2._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__0ndce1-._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__1d1y03f._.js → [root-of-the-server]__10xpkhu._.js} +2 -2
- package/.next/server/chunks/_0w8wvdn._.js +1 -1
- package/.next/server/chunks/_0wct7-r._.js +6 -6
- package/.next/server/chunks/_1l9d64o._.js +1 -1
- package/.next/server/chunks/_1lktrox._.js +3 -3
- package/.next/server/chunks/_1ze9o4l._.js +3 -3
- package/.next/server/chunks/ssr/_0defuav._.js +1 -1
- package/.next/server/chunks/ssr/_0htqt7_._.js +2 -2
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/3xupay20_o0lm.js +1 -0
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/README.md +2 -3
- package/package.json +3 -2
- package/.next/static/chunks/11ea1elg0081p.js +0 -1
- /package/.next/static/{t8OSNsKVHYWgJDib_ucGw → W3WQIPNU6SPcB55G3PD2t}/_buildManifest.js +0 -0
- /package/.next/static/{t8OSNsKVHYWgJDib_ucGw → W3WQIPNU6SPcB55G3PD2t}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{t8OSNsKVHYWgJDib_ucGw → W3WQIPNU6SPcB55G3PD2t}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -73,8 +73,7 @@ Save them in one of two ways:
|
|
|
73
73
|
NEXT_PUBLIC_NEWRELIC_ACCOUNT_ID=1234567
|
|
74
74
|
NEWRELIC_API_KEY=NRAK-...
|
|
75
75
|
SENTRY_API_KEY=sntrys_...
|
|
76
|
-
|
|
77
|
-
SENTRY_PROJECT_ID=your-project
|
|
76
|
+
SENTRY_DSN=https://<key>@o123.ingest.sentry.io/456
|
|
78
77
|
```
|
|
79
78
|
|
|
80
79
|
Restart the dashboard after editing the file.
|
|
@@ -176,7 +175,7 @@ Human text goes to stdout; errors, warnings and spinners go to stderr. Full spec
|
|
|
176
175
|
| Variable | Purpose |
|
|
177
176
|
| --- | --- |
|
|
178
177
|
| `NEXT_PUBLIC_NEWRELIC_ACCOUNT_ID`, `NEWRELIC_API_KEY` | Read metrics from New Relic (required) |
|
|
179
|
-
| `SENTRY_API_KEY`, `
|
|
178
|
+
| `SENTRY_API_KEY`, `SENTRY_DSN` | Read errors from Sentry (required). The DSN gives the project and region; the org is looked up with the token |
|
|
180
179
|
| `GEMINI_API_KEY`, `CLAUDE_API_KEY`, `OPENAI_API_KEY` | AI suggestions (optional, any one) |
|
|
181
180
|
| `AI_PROVIDER` | `gemini`, `claude` or `openai`; picks the AI key when several are set |
|
|
182
181
|
| `NEWRELIC_INSERT_KEY` | Only for **Send test event** on `/connect` and `pnpm send-test-data` |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@karan171996/metricflow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Local performance dashboard: New Relic page metrics and Sentry errors per page, with AI suggestions. Run with one npx command.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"performance",
|
|
@@ -104,6 +104,7 @@
|
|
|
104
104
|
"test:cli": "node --experimental-test-module-mocks --import ./test/register.mjs --test test/*.test.mjs",
|
|
105
105
|
"test:basic": "node scripts/test-env.mjs basic",
|
|
106
106
|
"test:real": "node scripts/test-env.mjs real",
|
|
107
|
-
"test": "pnpm run test:basic"
|
|
107
|
+
"test": "pnpm run test:basic",
|
|
108
|
+
"release:bump": "node scripts/bump-version.mjs"
|
|
108
109
|
}
|
|
109
110
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,55370,e=>{"use strict";var t=e.i(40798),a=e.i(96341),s=e.i(70065),r=e.i(67881),n=e.i(23750);let i=[{id:"gemini",label:"Google Gemini",help:"Create a key at aistudio.google.com/apikey."},{id:"claude",label:"Anthropic Claude",help:"Create a key at console.anthropic.com > API keys."},{id:"openai",label:"OpenAI",help:"Create a key at platform.openai.com/api-keys."}];e.s(["AiKeyForm",0,function(){let[e,l]=(0,a.useState)(i[0].id),[d,o]=(0,a.useState)(""),[c,m]=(0,a.useState)(null),[p,h]=(0,a.useState)({}),[x,u]=(0,a.useState)(null),[g,f]=(0,a.useState)(!1);async function y(t){t.preventDefault(),f(!0),u(null);try{let t=await fetch("/api/setup/ai",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e,key:d})}),a=await t.json();a.saved?(o(""),m(e),h({...p,[e]:!0}),u({ok:!0,text:"Saved. AI suggestions now use this provider. No restart needed."})):u({ok:!1,text:a.error??"Nothing was saved."})}catch{u({ok:!1,text:"Could not reach the dashboard server."})}finally{f(!1)}}(0,a.useEffect)(()=>{fetch("/api/setup/ai").then(e=>e.json()).then(e=>{e.keys&&(h(e.keys),m(e.provider),e.provider&&l(e.provider))}).catch(()=>{})},[]);let b=i.find(t=>t.id===e);return(0,t.jsxs)(s.Card,{className:"border-[#2d3748] bg-[#1a202c] shadow-md max-w-2xl mt-6",children:[(0,t.jsxs)(s.CardHeader,{children:[(0,t.jsx)(s.CardTitle,{className:"text-[18px] font-bold text-white tracking-tight",children:"AI suggestions (optional)"}),(0,t.jsx)(s.CardDescription,{className:"text-sm text-gray-400",children:"Add a Gemini, Claude or OpenAI key to get AI insights and recommendations for your pages. Only page names, load times and error counts are sent to the provider you pick. Without a key, the dashboard shows sample suggestions."})]}),(0,t.jsx)(s.CardContent,{children:(0,t.jsxs)("form",{onSubmit:y,className:"flex flex-col gap-5",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,t.jsx)("label",{htmlFor:"ai-provider",className:"text-sm font-medium text-gray-300",children:"Provider"}),(0,t.jsx)("select",{id:"ai-provider",value:e,onChange:e=>l(e.target.value),className:"h-9 rounded-md border border-[#2d3748] bg-[#0f1419] px-3 text-sm text-gray-200",children:i.map(e=>(0,t.jsxs)("option",{value:e.id,children:[e.label,c===e.id?" (in use)":p[e.id]?" (key saved)":""]},e.id))})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,t.jsxs)("label",{htmlFor:"ai-key",className:"text-sm font-medium text-gray-300",children:[b.label," API key ",p[e]&&(0,t.jsx)("span",{className:"ml-2 text-xs text-[#3ee0a1]",children:"✓ Set"})]}),(0,t.jsx)(n.Input,{id:"ai-key",type:"password",autoComplete:"off",spellCheck:!1,placeholder:p[e]?"•••••••• (type to replace)":"",value:d,onChange:e=>o(e.target.value),"aria-describedby":"ai-key-help",className:"bg-[#0f1419] border-[#2d3748] text-gray-200 font-mono text-xs"}),(0,t.jsx)("p",{id:"ai-key-help",className:"text-xs text-gray-400",children:b.help})]}),(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[(0,t.jsx)(r.Button,{type:"submit",disabled:g||!d.trim(),children:g?"Checking…":"Check and save"}),(0,t.jsx)("span",{"aria-live":"polite",className:`text-sm ${x?.ok?"text-[#3ee0a1]":"text-[#f87171]"}`,children:x?.text})]})]})})]})}])},4603,e=>{"use strict";var t=e.i(40798),a=e.i(96341),s=e.i(3547),r=e.i(70065),n=e.i(67881),i=e.i(23750);let l=[{name:"NEWRELIC_API_KEY",label:"New Relic User API key",secret:!0,help:'READS your data (starts NRAK-). Create it under API keys > key type "User".'},{name:"NEXT_PUBLIC_NEWRELIC_ACCOUNT_ID",label:"New Relic account ID",secret:!1,help:"A plain number, shown next to your keys in New Relic."},{name:"SENTRY_API_KEY",label:"Sentry auth token",secret:!0,help:"Lets the dashboard read issues (scopes: project:read, event:read)."},{name:"SENTRY_ORG_SLUG",label:"Sentry organization slug",secret:!1,help:"The name in your Sentry URL: sentry.io/organizations/<slug>/."},{name:"SENTRY_PROJECT_ID",label:"Sentry project slug",secret:!1,help:"The project's slug from Project settings."}];e.s(["SetupForm",0,function(){let[e,d]=(0,a.useState)({}),[o,c]=(0,a.useState)({}),[m,p]=(0,a.useState)({}),[h,x]=(0,a.useState)(null),[u,g]=(0,a.useState)(!1),[f,y]=(0,a.useState)(!1),b=(0,a.useRef)(null);async function v(t){t.preventDefault(),g(!0),x(null);try{let t=await fetch("/api/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),a=await t.json(),s=a.results??{};p(s);let r=l.find(e=>s[e.name]&&!s[e.name].ok);r&&setTimeout(()=>b.current?.querySelector(`#${r.name}`)?.focus(),0),a.saved?(y(!0),d({}),c(Object.fromEntries(l.map(e=>[e.name,!0]))),x({ok:!0,text:"Saved. Your keys are valid and stored in .env.local. No restart needed."})):x({ok:!1,text:a.error??"Nothing was saved. Fix the fields marked below."})}catch{x({ok:!1,text:"Could not reach the dashboard server."})}finally{g(!1)}}return(0,a.useEffect)(()=>{fetch("/api/setup").then(e=>e.json()).then(e=>{e.keys?c(e.keys):e.error&&x({ok:!1,text:e.error})}).catch(()=>{})},[]),(0,t.jsxs)(r.Card,{className:"border-[#2d3748] bg-[#1a202c] shadow-md max-w-2xl",children:[(0,t.jsxs)(r.CardHeader,{children:[(0,t.jsx)(r.CardTitle,{className:"text-[18px] font-bold text-white tracking-tight",children:"Connect New Relic and Sentry"}),(0,t.jsx)(r.CardDescription,{className:"text-sm text-gray-400",children:"Keys are checked once, saved to .env.local in this folder, and never shown again. The key that sends events (Ingest - License) is separate and is added later on the Connect page."})]}),(0,t.jsx)(r.CardContent,{children:(0,t.jsxs)("form",{ref:b,onSubmit:v,className:"flex flex-col gap-5",children:[l.map(a=>{let s=m[a.name];return(0,t.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,t.jsxs)("label",{htmlFor:a.name,className:"text-sm font-medium text-gray-300",children:[a.label," ",o[a.name]&&(0,t.jsx)("span",{className:"ml-2 text-xs text-[#3ee0a1]",children:"✓ Set"})]}),(0,t.jsx)(i.Input,{id:a.name,name:a.name,type:a.secret?"password":"text",autoComplete:"off",spellCheck:!1,placeholder:o[a.name]?"•••••••• (leave blank to keep, type to replace)":"",value:e[a.name]??"",onChange:t=>d({...e,[a.name]:t.target.value}),"aria-invalid":!!s&&!s.ok||void 0,"aria-describedby":`${a.name}-help ${a.name}-result`,className:"bg-[#0f1419] border-[#2d3748] text-gray-200 font-mono text-xs"}),(0,t.jsx)("p",{id:`${a.name}-help`,className:"text-xs text-gray-400",children:a.help}),(0,t.jsxs)("div",{id:`${a.name}-result`,"aria-live":"polite",children:[s&&!s.ok&&(0,t.jsxs)("p",{className:"text-xs text-[#f87171]",children:["✗ ",s.error]}),s?.ok&&(0,t.jsx)("p",{className:"text-xs text-[#3ee0a1]",children:"✓ Checked"})]})]},a.name)}),(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[(0,t.jsx)(n.Button,{type:"submit",disabled:u,children:u?"Checking…":"Check and save"}),(0,t.jsx)("span",{"aria-live":"polite",className:`text-sm ${h?.ok?"text-[#3ee0a1]":"text-[#f87171]"}`,children:h?.text}),f&&(0,t.jsx)(s.default,{href:"/connect",className:(0,n.buttonVariants)({variant:"outline"}),children:"Next: connect your app"})]})]})})]})}])},70065,e=>{"use strict";var t=e.i(40798),a=e.i(28603);e.s(["Card",0,function({className:e,size:s="default",...r}){return(0,t.jsx)("div",{"data-slot":"card","data-size":s,className:(0,a.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),...r})},"CardContent",0,function({className:e,...s}){return(0,t.jsx)("div",{"data-slot":"card-content",className:(0,a.cn)("px-(--card-spacing)",e),...s})},"CardDescription",0,function({className:e,...s}){return(0,t.jsx)("div",{"data-slot":"card-description",className:(0,a.cn)("text-sm text-muted-foreground",e),...s})},"CardHeader",0,function({className:e,...s}){return(0,t.jsx)("div",{"data-slot":"card-header",className:(0,a.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),...s})},"CardTitle",0,function({className:e,...s}){return(0,t.jsx)("div",{"data-slot":"card-title",className:(0,a.cn)("font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm",e),...s})}])}]);
|
|
File without changes
|
/package/.next/static/{t8OSNsKVHYWgJDib_ucGw → W3WQIPNU6SPcB55G3PD2t}/_clientMiddlewareManifest.js
RENAMED
|
File without changes
|
|
File without changes
|