UNPKG

pulse-dashboard

Version:

A Next.js Dashboard application for real-time monitoring and historical analysis of Playwright test executions, based on playwright-pulse-report. This component provides the UI for visualizing Playwright test results and can be run as a standalone CLI too

4 lines (3 loc) 14.1 kB
module.exports=[97953,(e,t,r)=>{"use strict";t.exports=e.r(42315).vendored["react-rsc"].ReactServerDOMTurbopackServer},45015,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"registerServerReference",{enumerable:!0,get:function(){return s.registerServerReference}});let s=e.r(97953)},95975,(e,t,r)=>{"use strict";function s(e){for(let t=0;t<e.length;t++){let r=e[t];if("function"!=typeof r)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof r}. Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ensureServerEntryExports",{enumerable:!0,get:function(){return s}})},41517,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),l=e.i(16795),u=e.i(87718),c=e.i(95169),d=e.i(47587),p=e.i(66012),f=e.i(70101),R=e.i(26937),h=e.i(10372),g=e.i(93695);e.i(52474);var m=e.i(220),E=e.i(89171),v=e.i(14747),w=e.i(45015),y=e.i(24868);function S(e){return"flaky"===e.outcome||"flaky"===e.status||"passed"===e.status&&e.retryHistory&&e.retryHistory.length>0&&e.retryHistory.some(e=>"failed"===e.status||"timedOut"===e.status)?"flaky":e.retryHistory&&e.retryHistory.length>0&&e.final_status&&"flaky"===e.final_status?"flaky":e.status}async function T(){let e=process.env.PULSE_USER_CWD,t=process.env.PULSE_REPORT_DIR,r=process.cwd(),s=e&&""!==e.trim()?e.trim():r,a=t&&""!==t.trim()?t.trim():v.default.join(s,"pulse-report"),n=v.default.join(a,"playwright-pulse-report.json");try{let e=await y.default.readFile(n,"utf-8");return JSON.parse(e)}catch(e){return console.error("[ACTIONS getCurrentRunReport] Error reading current run report:",e),null}}async function A(){console.log("[ACTIONS getRawHistoricalReports] ------------- START -------------");let e=process.env.PULSE_USER_CWD,t=process.env.PULSE_REPORT_DIR,r=process.cwd();console.log("[ACTIONS getRawHistoricalReports] process.env.PULSE_USER_CWD:",e),console.log("[ACTIONS getRawHistoricalReports] process.env.PULSE_REPORT_DIR:",t),console.log("[ACTIONS getRawHistoricalReports] process.cwd():",r);let s=e&&""!==e.trim()?e.trim():r,a=t&&""!==t.trim()?t.trim():v.default.join(s,"pulse-report");console.log("[ACTIONS getRawHistoricalReports] Effective baseDir determined:",s),console.log("[ACTIONS getRawHistoricalReports] Effective reportDir determined:",a);let n=v.default.join(a,"history");console.log("[ACTIONS getRawHistoricalReports] Attempting to read history directory:",n);try{let e=(await y.default.readdir(n)).filter(e=>e.startsWith("trend-")&&e.endsWith(".json"));console.log(`[ACTIONS getRawHistoricalReports] Found ${e.length} trend files in ${n}`);let t=[];for(let r of e){let e=v.default.join(n,r);try{let s=await y.default.readFile(e,"utf-8"),a=JSON.parse(s);a.run&&a.results?(void 0===a.run.flakinessRate&&(a.run.flakinessRate=0),t.push(a)):console.warn(`[ACTIONS getRawHistoricalReports] Skipping invalid historical report file (missing run or results): ${r}`)}catch(e){console.error(`[ACTIONS getRawHistoricalReports] Error reading or parsing historical file ${r}:`,e)}}return t.sort((e,t)=>new Date(e.run.timestamp).getTime()-new Date(t.run.timestamp).getTime()),console.log("[ACTIONS getRawHistoricalReports] ------------- END (SUCCESS) -------------"),t}catch(e){return console.error(`[ACTIONS getRawHistoricalReports] Error accessing or reading historical trends directory ${n}:`,e.message),e instanceof Error&&"ENOENT"===e.code&&console.warn(`[ACTIONS getRawHistoricalReports] History directory not found at ${n}. This is normal if no historical reports exist yet.`),console.log("[ACTIONS getRawHistoricalReports] ------------- END (ERROR) -------------"),[]}}async function C(){try{let e=await T(),t=await A(),r=[];if(e?.results&&e.results.forEach(t=>{"flaky"===S(t)&&r.push({id:t.id,name:t.name,suiteName:t.suiteName,occurrences:[{runTimestamp:e.run.timestamp,status:"flaky"}],passedCount:1,failedCount:0,skippedCount:0,pendingCount:0,totalRuns:1,firstSeen:e.run.timestamp,lastSeen:e.run.timestamp})}),0===t.length)return{success:!0,currentFlakyTests:r,historicalFlakyTests:[]};let s=new Map;for(let e of t)if(e.results)for(let t of e.results)s.has(t.id)||s.set(t.id,{name:t.name,suiteName:t.suiteName,occurrences:[]}),s.get(t.id).occurrences.push({runTimestamp:e.run.timestamp,status:t.status});let a=[];for(let[e,t]of s.entries()){let r=new Set(t.occurrences.map(e=>e.status)),s=r.has("passed"),n=r.has("failed")||r.has("timedOut");if(s&&n){let r=0,s=0,n=0,o=0;t.occurrences.forEach(e=>{"passed"===e.status?r++:"failed"===e.status||"timedOut"===e.status?s++:"skipped"===e.status?n++:"pending"===e.status&&o++});let i=t.occurrences.sort((e,t)=>new Date(e.runTimestamp).getTime()-new Date(t.runTimestamp).getTime());a.push({id:e,name:t.name,suiteName:t.suiteName,occurrences:i,passedCount:r,failedCount:s,skippedCount:n,pendingCount:o,totalRuns:t.occurrences.length,firstSeen:i[0]?.runTimestamp||"",lastSeen:i[i.length-1]?.runTimestamp||""})}}return a.sort((e,t)=>t.failedCount/t.totalRuns-e.failedCount/e.totalRuns||t.totalRuns-e.totalRuns),{success:!0,currentFlakyTests:r,historicalFlakyTests:a}}catch(e){return console.error("[ACTIONS getFlakyTestsAnalysis] Error analyzing flaky tests:",e),{success:!1,error:e instanceof Error?e.message:"An unknown error occurred during flaky test analysis."}}}async function P(){console.log("[API /api/historical-trends] Route hit.");let e=process.env.PULSE_USER_CWD,t=process.env.PULSE_REPORT_DIR,r=process.cwd();console.log("[API /api/historical-trends] process.env.PULSE_USER_CWD (inside API route):",e),console.log("[API /api/historical-trends] process.env.PULSE_REPORT_DIR (inside API route):",t),console.log("[API /api/historical-trends] process.cwd() (inside API route):",r);let s=e&&""!==e.trim()?e.trim():r,a=t&&""!==t.trim()?t.trim():v.default.join(s,"pulse-report");console.log("[API /api/historical-trends] Effective baseDir determined for API route (should match actions):",s),console.log("[API /api/historical-trends] Effective reportDir determined for API route:",a);try{let e=await A();if(!e)return console.error("[API /api/historical-trends] getRawHistoricalReports returned undefined/null. This is unexpected."),E.NextResponse.json({message:"Internal error: Failed to retrieve historical reports data structure."},{status:500});console.log(`[API /api/historical-trends] Received ${e.length} raw reports from getRawHistoricalReports.`);let t=e.filter(e=>void 0!==e.run&&null!==e.run).map(e=>{let t,r=0,s=0,a=0,n=0;if(e.results&&e.results.length>0){let o=new Set;e.results.forEach(e=>{void 0!==e.workerId&&null!==e.workerId&&Number(e.workerId)>=0&&o.add(e.workerId);let t=S(e);"passed"===t?r++:"failed"===t||"timedOut"===t?s++:"skipped"===t?a++:"flaky"===t&&n++}),o.size>0&&(t=o.size)}else r=e.run.passed,s=e.run.failed+(e.run.timedOut||0),a=e.run.skipped,n=0;return{date:e.run.timestamp,totalTests:e.run.totalTests,passed:r,failed:s,skipped:a,flaky:n,duration:e.run.duration,flakinessRate:e.run.flakinessRate,workerCount:t}}).sort((e,t)=>new Date(e.date).getTime()-new Date(t.date).getTime());return console.log(`[API /api/historical-trends] Successfully processed ${t.length} historical trend items.`),E.NextResponse.json(t,{status:200})}catch(t){console.error("[API /api/historical-trends] Error processing historical trends in API route:",t);let e=t instanceof Error?t.message:"An unknown error occurred while processing historical trends.";return E.NextResponse.json({message:`Error processing historical trends: ${e}`,details:String(t)},{status:500})}}(0,e.i(95975).ensureServerEntryExports)([T,A,C]),(0,w.registerServerReference)(T,"00dd6c8eacb439c0c4bd7a4bc356a97120ba631362",null),(0,w.registerServerReference)(A,"00c486baa1611458e5a49e3f6a5b624cc5a450103d",null),(0,w.registerServerReference)(C,"0009e5f2f02111be8b23328e5713eb34687e624ccf",null),e.s(["GET",0,P],8624);var O=e.i(8624);let I=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/historical-trends/route",pathname:"/api/historical-trends",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/historical-trends/route.ts",nextConfigOutput:"",userland:O}),{workAsyncStorage:N,workUnitAsyncStorage:_,serverHooks:b}=I;async function k(e,t,s){s.requestMeta&&(0,a.setRequestMeta)(e,s.requestMeta),I.isDev&&(0,a.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let E="/api/historical-trends/route";E=E.replace(/\/index$/,"")||"/";let v=await I.prepare(e,t,{srcPage:E,multiZoneDraftMode:!1});if(!v)return t.statusCode=400,t.end("Bad Request"),null==s.waitUntil||s.waitUntil.call(s,Promise.resolve()),null;let{buildId:w,params:y,nextConfig:S,parsedUrl:T,isDraftMode:A,prerenderManifest:C,routerServerContext:P,isOnDemandRevalidate:O,revalidateOnlyGenerated:N,resolvedPathname:_,clientReferenceManifest:b,serverActionsManifest:k}=v,x=(0,i.normalizeAppPath)(E),H=!!(C.dynamicRoutes[x]||C.routes[_]),D=async()=>((null==P?void 0:P.render404)?await P.render404(e,t,T,!1):t.end("This page could not be found"),null);if(H&&!A){let e=!!C.routes[_],t=C.dynamicRoutes[x];if(t&&!1===t.fallback&&!e){if(S.adapterPath)return await D();throw new g.NoFallbackError}}let U=null;!H||I.isDev||A||(U="/index"===(U=_)?"/":U);let j=!0===I.isDev||!H,M=H&&!j;k&&b&&(0,o.setManifestsSingleton)({page:E,clientReferenceManifest:b,serverActionsManifest:k});let $=e.method||"GET",q=(0,n.getTracer)(),L=q.getActiveScopeSpan(),F=!!(null==P?void 0:P.isWrappedByNextServer),W=!!(0,a.getRequestMeta)(e,"minimalMode"),K=(0,a.getRequestMeta)(e,"incrementalCache")||await I.getIncrementalCache(e,S,C,W);null==K||K.resetRequestCache(),globalThis.__incrementalCache=K;let B={params:y,previewProps:C.preview,renderOpts:{experimental:{authInterrupts:!!S.experimental.authInterrupts},cacheComponents:!!S.cacheComponents,supportsDynamicResponse:j,incrementalCache:K,cacheLifeProfiles:S.cacheLife,waitUntil:s.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,s,a)=>I.onRequestError(e,t,s,a,P)},sharedContext:{buildId:w}},z=new l.NodeNextRequest(e),G=new l.NodeNextResponse(t),X=u.NextRequestAdapter.fromNodeNextRequest(z,(0,u.signalFromNodeResponse)(t));try{let a,o=async e=>I.handle(X,B).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=q.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==c.BaseServerSpan.handleRequest)return void 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");if(s){let t=`${$} ${s}`;e.setAttributes({"next.route":s,"http.route":s,"next.span_name":t}),e.updateName(t),a&&a!==e&&(a.setAttribute("http.route",s),a.updateName(t))}else e.updateName(`${$} ${E}`)}),i=async a=>{var n,i;let l=async({previousCacheEntry:r})=>{try{if(!W&&O&&N&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await o(a);e.fetchMetrics=B.renderOpts.fetchMetrics;let i=B.renderOpts.pendingWaitUntil;i&&s.waitUntil&&(s.waitUntil(i),i=void 0);let l=B.renderOpts.collectedTags;if(!H)return await (0,p.sendResponse)(z,G,n,B.renderOpts.pendingWaitUntil),null;{let e=await n.blob(),t=(0,f.toNodeOutgoingHttpHeaders)(n.headers);l&&(t[h.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==B.renderOpts.collectedRevalidate&&!(B.renderOpts.collectedRevalidate>=h.INFINITE_CACHE)&&B.renderOpts.collectedRevalidate,s=void 0===B.renderOpts.collectedExpire||B.renderOpts.collectedExpire>=h.INFINITE_CACHE?void 0:B.renderOpts.collectedExpire;return{value:{kind:m.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:s}}}}catch(t){throw(null==r?void 0:r.isStale)&&await I.onRequestError(e,t,{routerKind:"App Router",routePath:E,routeType:"route",revalidateReason:(0,d.getRevalidateReason)({isStaticGeneration:M,isOnDemandRevalidate:O})},!1,P),t}},u=await I.handleResponse({req:e,nextConfig:S,cacheKey:U,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:C,isRoutePPREnabled:!1,isOnDemandRevalidate:O,revalidateOnlyGenerated:N,responseGenerator:l,waitUntil:s.waitUntil,isMinimalMode:W});if(!H)return null;if((null==u||null==(n=u.value)?void 0:n.kind)!==m.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==u||null==(i=u.value)?void 0:i.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});W||t.setHeader("x-nextjs-cache",O?"REVALIDATED":u.isMiss?"MISS":u.isStale?"STALE":"HIT"),A&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let c=(0,f.fromNodeOutgoingHttpHeaders)(u.value.headers);return W&&H||c.delete(h.NEXT_CACHE_TAGS_HEADER),!u.cacheControl||t.getHeader("Cache-Control")||c.get("Cache-Control")||c.set("Cache-Control",(0,R.getCacheControlHeader)(u.cacheControl)),await (0,p.sendResponse)(z,G,new Response(u.value.body,{headers:c,status:u.value.status||200})),null};F&&L?await i(L):(a=q.getActiveScopeSpan(),await q.withPropagatedContext(e.headers,()=>q.trace(c.BaseServerSpan.handleRequest,{spanName:`${$} ${E}`,kind:n.SpanKind.SERVER,attributes:{"http.method":$,"http.target":e.url}},i),void 0,!F))}catch(t){if(t instanceof g.NoFallbackError||await I.onRequestError(e,t,{routerKind:"App Router",routePath:x,routeType:"route",revalidateReason:(0,d.getRevalidateReason)({isStaticGeneration:M,isOnDemandRevalidate:O})},!1,P),H)throw t;return await (0,p.sendResponse)(z,G,new Response(null,{status:500})),null}}e.s(["handler",0,k,"patchFetch",0,function(){return(0,s.patchFetch)({workAsyncStorage:N,workUnitAsyncStorage:_})},"routeModule",0,I,"serverHooks",0,b,"workAsyncStorage",0,N,"workUnitAsyncStorage",0,_],41517)}]; //# sourceMappingURL=node_modules_next_dist_06kebd7._.js.map