@weapp-vite/dashboard 7.3.0 → 7.4.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/README.md +32 -21
- package/dist/assets/AppEmptyState.js +1 -1
- package/dist/assets/AppMetricTile.js +1 -1
- package/dist/assets/AppRuntimeBadge.js +1 -1
- package/dist/assets/ChunkGraphPanel.js +1 -1
- package/dist/assets/activity.js +4 -4
- package/dist/assets/analyze.js +23 -21
- package/dist/assets/codicon.ttf +0 -0
- package/dist/assets/{css.worker-CR6cVwG0.js → css.worker-gLj4_ykt.js} +36 -36
- package/dist/assets/echarts.js +1 -1
- package/dist/assets/editor.worker-DWPaKKV_.js +33 -0
- package/dist/assets/{html.worker-ChWxMUlM.js → html.worker-DBhNYEPj.js} +27 -27
- package/dist/assets/index.css +1 -1
- package/dist/assets/index.js +1 -1
- package/dist/assets/json.worker-CrsoSj5O.js +65 -0
- package/dist/assets/monaco.css +1 -1
- package/dist/assets/monaco.js +272 -209
- package/dist/assets/pages.js +1 -1
- package/dist/assets/tokens.js +1 -1
- package/dist/assets/{ts.worker-BSZ_obF4.js → ts.worker-D0RfN2Tp.js} +131 -131
- package/dist/assets/vendor.js +1 -1
- package/dist/assets/vue.js +2 -2
- package/package.json +5 -5
- package/dist/assets/editor.worker-BbVB3hfz.js +0 -33
- package/dist/assets/json.worker-2CEmYLij.js +0 -65
package/README.md
CHANGED
|
@@ -51,46 +51,57 @@ weapp-vite dev --analyze
|
|
|
51
51
|
|
|
52
52
|
`weapp-vite` 会在运行时检查当前项目中是否安装了 `@weapp-vite/dashboard`。如果存在,就读取本包 `dist/` 中的静态资源并启动本地 DevTools 页面。
|
|
53
53
|
|
|
54
|
-
Dashboard
|
|
54
|
+
独立 Dashboard 的页面与 Devframe 1.1 bridge 共同挂载在 `/__weapp-vite/` 下([上游更新日志](https://github.com/devframes/devframe/releases/tag/v1.1.0)、[1.0 迁移说明](https://github.com/devframes/devframe/blob/v1.1.0/docs/content/7.migrations/0.migration-1.0.md)):
|
|
55
55
|
|
|
56
56
|
- Analyze 数据通过带 revision、SHA-256 描述符和固定页上限的只读 RPC 分页获取
|
|
57
57
|
- revision 与最近运行事件通过服务端单向通知同步;WebSocket 断开后会重连并重新查询权威状态
|
|
58
|
-
- Dashboard 不创建可由客户端回写的业务 shared state
|
|
58
|
+
- Dashboard 不创建可由客户端回写的业务 shared state;独立宿主额外拒绝通用 shared-state set/patch,共享宿主不会覆盖这些全局 RPC
|
|
59
59
|
- 源码读取保留当前报告 allowlist、符号链接和读取竞态防护;产物文本来自当前分析 revision 的只读快照,不回退到实时 `dist`
|
|
60
60
|
- 单文件上限为 2 MiB,当前 revision 的产物保留预算按原始字节计为 32 MiB;超限明确报错,不读取其他 revision 或磁盘上的替代内容
|
|
61
|
-
-
|
|
61
|
+
- 独立宿主显式启用 OTP 与 loopback Origin 门禁;终端会输出可直接打开的 magic link
|
|
62
62
|
- 页面不再依赖 HTML 全局变量、业务 SSE 或 Vite HMR 作为业务数据通道
|
|
63
|
-
- bridge 保持 `mcp: false
|
|
63
|
+
- 独立 bridge 保持 `mcp: false`;Vite DevTools 的认证、Origin 与 MCP 策略由其宿主配置持有,不能把共享宿主视为只读沙箱
|
|
64
|
+
|
|
65
|
+
前端使用 Devframe 的已有连接继承与相对元数据发现,不再写死独立 bridge 地址。路由和复制视图链接保留实际挂载前缀;复制链接仅包含页面路径与查询参数,不携带认证 fragment。`devframe connect --base` 是 MCP connector 的探测选项,不是 Dashboard 的挂载配置。
|
|
64
66
|
|
|
65
67
|
微信开发者工具继续负责模拟器、原生调试和真机能力;Dashboard 是构建、HMR、包体、诊断和自动化状态的伴随 DevTools。
|
|
66
68
|
|
|
67
|
-
##
|
|
69
|
+
## 体积地图工作台
|
|
68
70
|
|
|
69
|
-
|
|
71
|
+
- 图表与节点详情同屏显示;窄屏时详情排在图表下方。可点击图块,也可用详情列表搜索、逐级选择小节点;面包屑和列表支持键盘操作。
|
|
72
|
+
- “显示”控制节点范围,“着色”独立选择所属分包、模块来源、重复打包或构建增量。换色不会改变当前筛选范围和图块面积;图例说明当前颜色含义。
|
|
73
|
+
- 工具栏下拉将标签和值放在同一个轻量触发器内;选项统一左对齐,右侧勾号标明当前选择。方向键移动、Enter 确认、Escape 取消,禁用项不会被键盘选中。
|
|
74
|
+
- “查重复”同时启用重复筛选和重复着色。重复按同一个模块 ID 出现在不同包中判断,不把同包多次引用、同名路径或多个 query 变体合并成跨包重复。
|
|
75
|
+
- “看增长”使用当前选中的基线或上次构建,只显示增长部分。增量比较同一包、文件、模块位置的已记录产物字节;缺失体积标为未知,新增单独标记,不用原始源码体积替代。没有比较快照时入口禁用;已删除节点不出现在当前产物图中。
|
|
76
|
+
- 详情区保留完整路径、模块 ID、所属包、实际产物大小和已记录模块贡献。模块贡献不等于独立文件大小;缺失贡献时图块可能使用原始模块体积估算,详情会明确区分。
|
|
77
|
+
- 详情标题在滚动时保留节点身份;子节点、跨包位置和各类引用可分别折叠,支持 Enter / Space。关闭的分组只有在相关内容实际变化时才显示“有更新”,打开后清除;同值报告、无关包更新和筛选 / 着色 / 列表搜索不会触发未读。
|
|
78
|
+
- 后台报告更新不会主动滚动或移动焦点。显式展开超出可视区域的分组时才调整所属滚动容器;后续切换、收起或手动滚动优先。通过详情列表导航后,焦点回到新节点标题,详情从头显示。
|
|
79
|
+
- 引用与被引用来自报告中的静态 / 动态 import;模块的跨包位置不是源码级依赖图。无法唯一定位的引用仅展示文本,点击当前筛选之外的已知产物会先恢复全部范围。
|
|
80
|
+
- “查看源码与产物”复用只读源码对比,支持所有报告产物,不受概览 Top Files 数量限制;从模块进入时选择对应源码。第三方依赖不提供工作区源码入口,生成文件或已移除的源码仍可能返回明确的“文件不存在”提示,不回退到其他文件。
|
|
81
|
+
- 当前体积地图的选择会随报告更新按节点身份保留;节点移除时回到所属包,包被移除时恢复全部范围。
|
|
70
82
|
|
|
71
|
-
|
|
83
|
+
## 宿主无关的 Devframe 核心
|
|
72
84
|
|
|
73
|
-
|
|
85
|
+
分层参考 [Pinia Colada 的 Devframe 定义与宿主入口](https://github.com/posva/pinia-colada/tree/2f181cbcf5e1a9a9ce06599ae14acdedc24b48d3/devtools/src),通过 [Vite DevTools 官方适配器](https://devtools.vite.dev/kit/devtools-plugin) 挂载同一份定义,而不是另建 Dashboard、RPC 协议或多 target 框架。
|
|
74
86
|
|
|
75
|
-
|
|
|
87
|
+
| 职责 | 入口 | 边界 |
|
|
76
88
|
| --- | --- | --- |
|
|
77
|
-
|
|
|
78
|
-
|
|
|
79
|
-
|
|
|
80
|
-
|
|
|
89
|
+
| 报告生产 | 现有 analyze/build/dev 调用方 | 编译、历史持久化和产物捕获在发布前完成 |
|
|
90
|
+
| 共享核心 | `weapp-vite/dashboard` | 持有报告、当前产物、运行事件、revision 与 scoped 只读 RPC,不启动服务器 |
|
|
91
|
+
| 独立宿主 | CLI 的 `startAnalyzeDashboard` | 选择源码或静态页面,持有 Vite、OTP、退出信号与独立只读策略 |
|
|
92
|
+
| Vite DevTools 宿主 | `weapp-vite/dashboard/vite` | 使用 `createPluginFromDevframe`,复用现有宿主端口与传输,关闭时释放核心 |
|
|
93
|
+
| 前端 | `@weapp-vite/dashboard` | 同一份原生 Vite 构建的 SPA,不导入 Node 核心 |
|
|
94
|
+
|
|
95
|
+
`createAnalyzeDashboardDevframe` 返回 `definition`、`update`、`emitRuntimeEvents` 和 `dispose`。每个控制器对应一个宿主生命周期;提交后的报告与产物 Map 不得继续修改。报告更新先完成报告、产物、事件和 revision 的一致切换,再发送一次通知;事件更新不会改变报告 revision。`update` 完成不代表浏览器已经渲染完成。
|
|
81
96
|
|
|
82
|
-
|
|
97
|
+
`resolveDashboardClientAssets` 返回可选前端包已构建 SPA 的绝对目录,未安装或未构建时返回 `undefined`。独立开发宿主仍可选择源码入口;Vite DevTools 挂载必须提供已构建资源。接入步骤和完整 Node 端示例见 [weapp-vite 的嵌入接口](../weapp-vite/README.md#dashboard-嵌入-vite-devtools)。
|
|
83
98
|
|
|
84
|
-
|
|
99
|
+
Vite 适配器只在开发模式启用,不向生产构建导出报告,也不向小程序 AppService 注入客户端脚本。默认面板目录为 `/__weapp-vite/`;显式 `base` 与 Vite 应用自身的 `base` 独立。一个共享宿主中的其他插件仍可使用其合法的 shared-state、编辑或命令能力;Dashboard 的只读查询不构成插件之间的安全沙箱。
|
|
85
100
|
|
|
86
|
-
|
|
101
|
+
源码对比使用与当前报告同一次生成过程捕获的产物。完整分析从 `analyzeSubpackages` 的 `write: false` 输出捕获 chunk/asset;开发 fallback 在扫描产物生成报告时保存同一份字节。两者都不为界面补写 bundle。文件请求携带 revision,更新或关闭会拒绝旧请求及过期异步响应;产物只保留当前报告的快照,源码仍读取 allowlist 内的当前工作区文件。
|
|
87
102
|
|
|
88
|
-
|
|
103
|
+
`runtimeEvents` 仍是 CLI/build/HMR/diagnostic 事件,不是应用 console/network,也不自动 attach 微信 IDE、模拟器或原生设备。此次抽取只改变 DevTools 的宿主边界。
|
|
89
104
|
|
|
90
|
-
- 协议携带 target identity、协议版本、capabilities 和会话状态;构建 revision 与运行时事件序列分开,文件读取继续受 target/project allowlist 约束。
|
|
91
|
-
- 当前独立 bridge 覆盖了 Devframe 通用 shared-state set/patch 并拒绝写入。这是单工具的只读策略,不能原样放进共享 Hub,否则会阻止其他 Devframe 的 shared-state 写入;需要隔离 bridge 或改为本工具范围内的权限边界。
|
|
92
|
-
- 工作台直接依赖已升级至 Devframe 1.0;`@vitejs/devtools-kit` 的传递依赖仍使用自己的 Devframe/Hub 0.8。当前 bridge 独立运行,不强制覆盖上游 peer 版本;未来接入其 Hub 前需要先统一兼容契约。
|
|
93
|
-
- 复用 automator 时区分释放引用与真正断开连接;日志订阅、缓存和清理必须归属具体 target。当前 MCP 日志池不是多 target 隔离协议,不能直接用作统一事件流。
|
|
94
105
|
|
|
95
106
|
## 项目结构
|
|
96
107
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{C as e,F as t,J as n,P as r,R as i,V as a,Z as o,_ as s,g as c,j as l,v as u,x as d,y as f}from"./vue.js";import{t as p}from"./vendor.js";import{D as m,E as h,T as g}from"./index.js";function _(e){let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,`true`),t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);if(document.body.removeChild(t),!n)throw Error(`copy text failed`)}async function v(e){let t=null;try{await Promise.race([navigator.clipboard.writeText(e),new Promise((e,n)=>{t=setTimeout(()=>{n(Error(`clipboard write timeout`))},800)})])}finally{t&&clearTimeout(t)}}async function y(e){try{_(e);return}catch{if(navigator.clipboard&&window.isSecureContext){await v(e);return}}throw Error(`copy text failed`)}var b=p({base:`flex flex-col rounded-lg border shadow-(--dashboard-shadow)`,variants:{tone:{default:`border-(--dashboard-border) bg-(--dashboard-panel)`,strong:`border-(--dashboard-border-strong) bg-(--dashboard-panel-strong)`,muted:`border-(--dashboard-border) bg-(--dashboard-panel-muted)`},padding:{none:``,sm:`p-3`,md:`p-4`,header:`px-4 py-4 md:px-5`}},defaultVariants:{tone:`default`,padding:`md`}}),x=p({base:`flex items-center justify-center rounded-md bg-(--dashboard-accent-soft) text-(--dashboard-accent)`,variants:{size:{sm:`h-8 w-8`,md:`h-9 w-9`,lg:`h-10 w-10`}},defaultVariants:{size:`md`}}),S=p({base:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted)`,variants:{padding:{sm:`px-4 py-3`,md:`p-4`},interactive:{true:`transition hover:border-(--dashboard-border-strong) hover:bg-(--dashboard-panel)`,false:``}},defaultVariants:{padding:`md`,interactive:!1}}),C=p({base:`inline-flex items-center gap-2 rounded-full border transition`,variants:{kind:{nav:`px-3.5 py-1.5 text-sm`,theme:`px-3 py-1.5 text-xs font-medium`,badge:`px-2.5 py-1 text-[11px] uppercase tracking-[0.18em]`},active:{true:`border-(--dashboard-accent) bg-(--dashboard-accent-soft) text-(--dashboard-text)`,false:`border-(--dashboard-border) bg-(--dashboard-panel-muted) text-(--dashboard-text-soft) hover:border-(--dashboard-border-strong) hover:text-(--dashboard-text)`}},defaultVariants:{kind:`nav`,active:!1}}),w=p({base:`inline-flex shrink-0 items-center whitespace-nowrap rounded-full border px-2.5 py-1 text-[11px] font-medium uppercase tracking-[0.12em]`,variants:{tone:{neutral:`border-(--dashboard-border) bg-(--dashboard-panel-muted) text-(--dashboard-text-soft)`,info:`border-(--dashboard-border-strong) bg-(--dashboard-accent-soft) text-(--dashboard-accent)`,success:`border-emerald-200 bg-emerald-100 text-emerald-700 dark:border-emerald-500/30 dark:bg-emerald-500/12 dark:text-emerald-300`,warning:`border-amber-200 bg-amber-100 text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/12 dark:text-amber-300`,error:`border-rose-200 bg-rose-100 text-rose-700 dark:border-rose-500/30 dark:bg-rose-500/12 dark:text-rose-300`}},defaultVariants:{tone:`neutral`}});p({base:`rounded-lg border border-(--dashboard-border) bg-(--dashboard-panel) px-4 py-3 text-[11px] uppercase tracking-[0.24em] text-(--dashboard-text-soft) shadow-(--dashboard-shadow)`});var T=e({__name:`AppSurfaceCard`,props:{title:{default:void 0},description:{default:void 0},eyebrow:{default:void 0},iconName:{default:void 0},tone:{default:`default`},padding:{default:`md`},contentClass:{default:``}},setup(e,{expose:t}){t();let n=e,r=i(),a={props:n,slots:r,hasHeader:!!(n.title||n.description||r.header),get cn(){return m},get iconFrameStyles(){return x},get surfaceStyles(){return b},DashboardIcon:g};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}}),E={key:0,class:`flex items-start justify-between gap-4`},D={class:`flex min-w-0 items-start gap-3`},O={class:`h-5 w-5`},k={class:`min-w-0 sm:flex sm:flex-wrap sm:items-baseline sm:gap-x-2.5`},A={key:0,class:`text-[11px] uppercase tracking-[0.24em] text-(--dashboard-accent)`},j=[`title`],M={key:2,class:`mt-1 w-full text-sm leading-6 text-(--dashboard-text-muted)`};function N(e,t,i,a,s,p){return l(),f(`section`,{class:n(a.cn(a.surfaceStyles({tone:i.tone,padding:i.padding}),i.contentClass))},[a.hasHeader?(l(),f(`header`,E,[c(`div`,D,[i.iconName?(l(),f(`span`,{key:0,class:n([a.iconFrameStyles({size:`md`}),`shrink-0`])},[c(`span`,O,[d(a.DashboardIcon,{name:i.iconName},null,8,[`name`])])],2)):u(``,!0),c(`div`,k,[i.eyebrow?(l(),f(`p`,A,o(i.eyebrow),1)):u(``,!0),i.title?(l(),f(`h2`,{key:1,class:`truncate text-lg font-semibold tracking-tight`,title:i.title},o(i.title),9,j)):u(``,!0),i.description?(l(),f(`p`,M,o(i.description),1)):u(``,!0)])]),r(e.$slots,`header`)])):u(``,!0),c(`div`,{class:n(a.cn(`min-h-0 flex-1`,a.hasHeader?`mt-4`:``))},[r(e.$slots,`default`)],2)],2)}var P=h(T,[[`render`,N]]),F=e({__name:`AppEmptyState`,props:{as:{},compact:{type:Boolean}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function I(e,i,o,c,u,d){return l(),s(t(o.as??`div`),{class:n([`rounded-xl border border-dashed border-(--dashboard-border) bg-(--dashboard-panel-muted) text-sm text-(--dashboard-text-soft)`,o.compact?`px-3 py-4`:`p-5`])},{default:a(()=>[r(e.$slots,`default`)]),_:3},8,[`class`])}var L=h(F,[[`render`,I]]);export{C as a,y as c,S as i,P as n,w as o,x as r,b as s,L as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{C as e,J as t,P as n,V as r,Z as i,b as a,g as o,j as s,x as c,y as l}from"./vue.js";import{E as u}from"./index.js";var d=e({__name:`AppMetaLabel`,props:{accent:{type:Boolean}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function f(e,r,i,a,o,c){return s(),l(`p`,{class:t([`text-[11px] uppercase tracking-[0.18em]`,i.accent?`text-(--dashboard-accent)`:`text-(--dashboard-text-soft)`])},[n(e.$slots,`default`)],2)}var p=u(d,[[`render`,f]]),m=`rounded-xl border border-(--dashboard-border) bg-(--dashboard-panel-muted) p-3`,h=e({__name:`AppMetricTile`,props:{label:{},value:{}},setup(e,{expose:t}){t();let n={panelClassName:m,AppMetaLabel:p};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),g={class:`mt-1.5 text-base font-semibold text-(--dashboard-text)`};function _(e,n,u,d,f,p){return s(),l(`div`,{class:t(d.panelClassName)},[c(d.AppMetaLabel,null,{default:r(()=>[a(i(u.label),1)]),_:1}),o(`p`,g,i(u.value),1)])}var v=u(h,[[`render`,_]]);export{p as n,v as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e,
|
|
1
|
+
import{C as e,J as t,Z as n,j as r,y as i}from"./vue.js";import{E as a}from"./index.js";import{o}from"./AppEmptyState.js";var s=e({__name:`AppRuntimeBadge`,props:{label:{},tone:{default:`neutral`}},setup(e,{expose:t}){t();let n={get runtimeBadgeStyles(){return o}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function c(e,a,o,s,c,l){return r(),i(`span`,{class:t(s.runtimeBadgeStyles({tone:o.tone}))},n(o.label),3)}var l=a(s,[[`render`,c]]);export{l as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,C as t,N as n,O as r,U as i,V as a,W as o,X as s,b as c,g as l,h as u,j as d,k as f,l as p,p as m,u as h,v as g,x as _,y as v,z as y}from"./vue.js";import{E as b,f as x,x as ee}from"./index.js";import{a as te,c as S,i as C,l as w,n as T,o as E,r as D,s as O,t as k,u as A}from"./d3.js";function j(e){return e.replaceAll(`\\`,`/`).replace(/^\.\//,``).replace(/^\//,``).split(/[?#]/,1)[0]??``}function M(e,t){let n=j(t);if(!t.startsWith(`.`))return n;let r=[...j(e).split(`/`).slice(0,-1),...n.split(`/`)],i=[];for(let e of r)if(e&&e!==`.`){if(e===`..`){i.pop();continue}i.push(e)}return i.join(`/`)}function N(e,t,n){return{id:`chunk:${n.file}`,kind:`chunk`,label:n.file,packageId:e,packageLabel:t,size:n.size??0,isEntry:n.isEntry,moduleCount:n.modules?.length??0}}function P(e){let t=[],n=new Map,r=new Map,i=[];for(let a of e.packages){let e=a.files.filter(e=>e.type===`chunk`),o={id:`package:${a.id}`,kind:`package`,label:a.label,packageId:a.id,packageLabel:a.label,size:a.files.reduce((e,t)=>e+(t.size??0),0),fileCount:a.files.length};t.push(o);for(let s of e){let e=N(a.id,a.label,s);t.push(e),i.push({file:s,node:e}),r.set(j(s.file),e.id);let c={id:`${o.id}->${e.id}:contains`,kind:`contains`,source:o.id,target:e.id};n.set(c.id,c)}}let a=0,o=0,s=0;for(let{file:e,node:t}of i){let i=[...(e.imports??[]).map(e=>({file:e,kind:`static-import`})),...(e.dynamicImports??[]).map(e=>({file:e,kind:`dynamic-import`}))];for(let c of i){let i=r.get(M(e.file,c.file));if(!i){a+=1;continue}let l={id:`${t.id}->${i}:${c.kind}`,kind:c.kind,source:t.id,target:i};n.has(l.id)||(n.set(l.id,l),c.kind===`dynamic-import`?s+=1:o+=1)}}return{dynamicImportCount:s,edges:[...n.values()],nodes:t,staticImportCount:o,unresolvedImportCount:a}}function F(e,t){let n=e.nodes.filter(e=>e.kind===`package`),r=e.nodes.filter(e=>e.kind===`chunk`),i=t.query.trim().toLowerCase(),a=r.filter(e=>t.packageId===`all`||e.packageId===t.packageId).filter(e=>!i||e.label.toLowerCase().includes(i)).sort((e,t)=>t.size-e.size),o=new Set(a.map(e=>e.id)),s=new Set;for(let t of e.edges){if(t.kind===`contains`)continue;let e=o.has(t.source),n=o.has(t.target);e&&!n?s.add(t.target):n&&!e&&s.add(t.source)}let c=r.filter(e=>s.has(e.id)).sort((e,t)=>t.size-e.size),l=[...new Map([...a,...c].map(e=>[e.id,e])).values()],u=new Set(n.map(e=>e.packageId)),d=[],f=new Set,p=t.maxNodes;for(let e of l){let t=u.has(e.packageId)&&!f.has(e.packageId),n=t?2:1;n>p||(d.push(e),t&&f.add(e.packageId),p-=n)}let m=[...n.filter(e=>f.has(e.packageId)),...d],h=new Set(m.map(e=>e.id)),g=new Set(l.map(e=>e.packageId)),_=new Set([...l.map(e=>e.id),...n.filter(e=>g.has(e.packageId)).map(e=>e.id)]),v=e.edges.filter(e=>_.has(e.source)&&_.has(e.target)),y=e.edges.filter(e=>h.has(e.source)&&h.has(e.target)).sort((e,t)=>Number(e.kind===`contains`)-Number(t.kind===`contains`)).slice(0,t.maxEdges);return{edges:y,nodes:m,truncatedEdgeCount:Math.max(0,v.length-y.length),truncatedNodeCount:Math.max(0,_.size-m.length)}}var I=220,L=900,R=80,z=t({__name:`ChunkGraphPanel`,props:{result:{},theme:{}},setup(t,{expose:n}){n();let a=t,s=o(),c=i(`all`),l=i(``),d=i(null),p,m,h,g=u(()=>P(a.result)),_=u(()=>g.value.nodes.filter(e=>e.kind===`package`)),v=u(()=>[{label:`全部 package`,value:`all`},..._.value.map(e=>({label:e.packageLabel,value:e.packageId}))]),b=u(()=>F(g.value,{maxEdges:l.value.trim()?320:L,maxNodes:l.value.trim()?R:I,packageId:c.value,query:l.value})),j=u(()=>b.value.nodes.find(e=>e.id===d.value)??null),M=u(()=>new Map(b.value.nodes.map(e=>[e.id,e]))),N=u(()=>{let e=j.value;return e?b.value.edges.filter(t=>t.kind!==`contains`&&(t.source===e.id||t.target===e.id)).map(t=>{let n=t.source===e.id,r=M.value.get(n?t.target:t.source);return{id:t.id,kind:t.kind===`dynamic-import`?`动态`:`静态`,label:r?.label??(n?t.target:t.source),relation:n?`导入`:`被导入`}}):[]}),z=u(()=>{let e=a.theme===`dark`?[`#5eead4`,`#a78bfa`,`#60a5fa`,`#fbbf24`,`#fb7185`,`#34d399`,`#f472b6`,`#c4b5fd`]:[`#0f766e`,`#7c3aed`,`#2563eb`,`#b45309`,`#be123c`,`#047857`,`#be185d`,`#6d28d9`];return new Map(_.value.map((t,n)=>[t.packageId,e[n%e.length]??`#64748b`]))});function B(e){return e.length>20?`${e.slice(0,19)}…`:e}function V(e,t){return typeof e==`string`?t.get(e):e}function H(e){return e.graphNode.kind===`package`?3:e.graphNode.isEntry?2.5:1.5}function U(e){d.value=e.id}function W(e,t,n){if(n===`start`){e.active||m?.alphaTarget(.18).restart(),t.fx=t.x,t.fy=t.y;return}if(n===`update`){t.fx=e.x,t.fy=e.y;return}e.active||m?.alphaTarget(0),t.fx=null,t.fy=null}function G(e){s.value&&h&&A(s.value).call(h.scaleBy,e)}function K(e,t){s.value&&h&&A(s.value).call(h.translateBy,e,t)}function q(){d.value=null,s.value&&h&&A(s.value).call(h.transform,T)}async function J(){await r();let e=s.value;if(!e||e.clientWidth===0||e.clientHeight===0)return;m?.stop();let t=A(e);t.selectAll(`*`).remove();let n=e.clientWidth,i=e.clientHeight;t.attr(`viewBox`,`0 0 ${n} ${i}`);let o=t.append(`defs`);for(let e of[{id:`chunk-graph-arrow-static`,color:a.theme===`dark`?`#60a5fa`:`#2563eb`},{id:`chunk-graph-arrow-dynamic`,color:`#f59e0b`}])o.append(`marker`).attr(`id`,e.id).attr(`viewBox`,`0 -5 10 10`).attr(`refX`,16).attr(`refY`,0).attr(`markerWidth`,5).attr(`markerHeight`,5).attr(`orient`,`auto`).append(`path`).attr(`d`,`M0,-5L10,0L0,5`).attr(`fill`,e.color);let c=t.append(`g`);h=k().scaleExtent([.2,5]).on(`zoom`,e=>c.attr(`transform`,e.transform.toString())),t.call(h),c.attr(`transform`,D(e).toString());let l=b.value.nodes.map(e=>{let t=e.kind===`package`?18:Math.max(5,Math.min(14,5+Math.log2(Math.max(e.size,1))*.65));return{id:e.id,graphNode:e,color:z.value.get(e.packageId)??`#64748b`,radius:t}}),u=new Map(l.map(e=>[e.id,e])),d=b.value.edges.map(e=>({graphEdge:e,source:e.source,target:e.target})),f=c.append(`g`).attr(`fill`,`none`).selectAll(`line`).data(d).join(`line`).attr(`stroke`,e=>e.graphEdge.kind===`dynamic-import`?`#f59e0b`:e.graphEdge.kind===`static-import`?a.theme===`dark`?`#60a5fa`:`#2563eb`:a.theme===`dark`?`#292f3a`:`#d9dee7`).attr(`stroke-width`,e=>e.graphEdge.kind===`contains`?1:1.4).attr(`stroke-opacity`,e=>e.graphEdge.kind===`contains`?.26:.68).attr(`stroke-dasharray`,e=>e.graphEdge.kind===`dynamic-import`?`5 4`:null).attr(`marker-end`,e=>e.graphEdge.kind===`dynamic-import`?`url(#chunk-graph-arrow-dynamic)`:e.graphEdge.kind===`static-import`?`url(#chunk-graph-arrow-static)`:null),p=c.append(`g`).selectAll(`g`).data(l,e=>e.id).join(`g`).attr(`cursor`,`pointer`).on(`click`,(e,t)=>U(t)).call(w().on(`start`,(e,t)=>W(e,t,`start`)).on(`drag`,(e,t)=>W(e,t,`update`)).on(`end`,(e,t)=>W(e,t,`end`)));p.append(`circle`).attr(`r`,e=>e.radius).attr(`fill`,e=>e.graphNode.kind===`package`?e.color:`${e.color}cc`).attr(`stroke`,e=>e.graphNode.kind===`package`?e.color:a.theme===`dark`?`#11141a`:`#ffffff`).attr(`stroke-width`,e=>H(e)),p.append(`title`).text(e=>`${e.graphNode.label}\n${e.graphNode.packageLabel}\n${x(e.graphNode.size)}`),p.filter(e=>e.graphNode.kind===`package`).append(`text`).attr(`x`,0).attr(`y`,e=>e.radius+15).attr(`text-anchor`,`middle`).attr(`font-size`,11).attr(`font-weight`,600).attr(`fill`,a.theme===`dark`?`#d7dce5`:`#334155`).text(e=>B(e.graphNode.label)),m=te(l).force(`link`,E(d).id(e=>e.id).distance(e=>e.graphEdge.kind===`contains`?68:e.graphEdge.kind===`dynamic-import`?120:92).strength(e=>e.graphEdge.kind===`contains`?.2:.5)).force(`charge`,C().strength(l.length>180?-78:-120)).force(`collision`,O().radius(e=>e.graphNode.kind===`package`?52:e.radius+6).strength(.95)).force(`center`,S(n/2,i/2)).alphaDecay(.035).on(`tick`,()=>{for(let e of l){let t=e.graphNode.kind===`package`?58:e.radius+4;e.x=Math.max(t,Math.min(n-t,e.x??n/2)),e.y=Math.max(t,Math.min(i-t,e.y??i/2))}f.attr(`x1`,e=>V(e.source,u)?.x??0).attr(`y1`,e=>V(e.source,u)?.y??0).attr(`x2`,e=>V(e.target,u)?.x??0).attr(`y2`,e=>V(e.target,u)?.y??0),p.attr(`transform`,e=>`translate(${e.x??0},${e.y??0})`)})}e(()=>{s.value&&(p=new ResizeObserver(()=>void J()),p.observe(s.value)),J()}),f(()=>{p?.disconnect(),m?.stop(),m=void 0}),y(_,e=>{c.value!==`all`&&!e.some(e=>e.packageId===c.value)&&(c.value=`all`)}),y([b,z],([e])=>{d.value&&!e.nodes.some(e=>e.id===d.value)&&(d.value=null),J()},{deep:!0}),y(()=>a.theme,()=>void J());let Y={props:a,MAX_VISIBLE_NODES:I,MAX_VISIBLE_EDGES:L,MAX_SEARCH_NODES:R,svgRef:s,packageFilter:c,searchQuery:l,selectedNodeId:d,get resizeObserver(){return p},set resizeObserver(e){p=e},get simulation(){return m},set simulation(e){m=e},get zoomBehavior(){return h},set zoomBehavior(e){h=e},graph:g,packageOptions:_,packageFilterOptions:v,visibleGraph:b,selectedNode:j,visibleNodeById:M,selectedImportEdges:N,packageColorById:z,formatPackageLabel:B,resolveLinkNode:V,resolveNodeStrokeWidth:H,selectNode:U,bindNodeDrag:W,zoomGraph:G,panGraph:K,resetGraphView:q,renderGraph:J,get formatBytes(){return x},AppSelect:ee};return Object.defineProperty(Y,"__isScriptSetup",{enumerable:!1,value:!0}),Y}}),B={class:`grid min-h-[calc(100dvh-9rem)] min-w-0 overflow-hidden rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) xl:grid-cols-[minmax(0,1fr)_18rem]`},V={class:`grid min-h-0 min-w-0 grid-rows-[auto_minmax(30rem,1fr)]`},H={class:`grid min-w-0 grid-cols-1 gap-2 border-b border-(--dashboard-border) px-3 py-2 sm:grid-cols-[minmax(0,1fr)_minmax(10rem,14rem)_auto]`},U={class:`relative min-w-0`},W={class:`flex items-center gap-1`,role:`group`,"aria-label":`依赖图视图控制`},G={ref:`svgRef`,class:`block h-full min-h-0 w-full min-w-0 max-w-full touch-none overflow-hidden`,"aria-hidden":`true`,focusable:`false`},K={class:`grid min-w-0 overflow-hidden border-t border-(--dashboard-border) bg-(--dashboard-panel-muted) sm:grid-cols-2 xl:block xl:border-t-0 xl:border-l`},q={class:`border-b border-(--dashboard-border) px-3 py-3`},J={class:`mt-2 grid grid-cols-2 gap-2 text-xs`},Y={class:`font-mono`},X={class:`font-mono`},Z={class:`font-mono text-blue-500`},Q={class:`font-mono text-amber-500`},ne={class:`mt-3 grid min-w-0 gap-1.5 text-[10px] font-medium uppercase tracking-[0.12em] text-(--dashboard-text-soft)`},re=[`value`],$={class:`mt-3 grid grid-cols-3 gap-1`,role:`group`,"aria-label":`依赖图平移控制`},ie={key:0,class:`min-w-0 border-l-0 border-(--dashboard-border) px-3 py-3 sm:border-l xl:border-l-0`},ae=[`title`],oe={class:`mt-3 grid min-w-0 gap-2 text-xs`},se={class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},ce={class:`min-w-0 truncate text-right`},le={class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},ue=[`title`],de={class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},fe={class:`min-w-0 truncate text-right font-mono`},pe={key:0,class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},me={class:`min-w-0 truncate text-right font-mono`},he={key:1,class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},ge={class:`min-w-0 truncate text-right font-mono`},_e={class:`mt-3 min-w-0`},ve={key:0,class:`mt-1 text-xs text-(--dashboard-text-soft)`},ye={key:1,class:`mt-1 grid max-h-32 gap-1 overflow-y-auto text-xs`},be={class:`font-medium`},xe={class:`ml-1 break-all text-(--dashboard-text-soft)`},Se={key:1,class:`min-w-0 border-l-0 border-(--dashboard-border) px-3 py-5 text-xs leading-5 text-(--dashboard-text-soft) sm:border-l xl:border-l-0`},Ce={key:2,class:`border-t border-(--dashboard-border) px-3 py-3 text-[11px] text-amber-500 sm:col-span-2 xl:col-auto`},we={key:3,class:`border-t border-(--dashboard-border) px-3 py-3 text-[11px] text-(--dashboard-text-soft) sm:col-span-2 xl:col-auto`};function Te(e,t,r,i,o,u){return d(),v(`section`,B,[l(`div`,V,[l(`header`,H,[l(`label`,U,[t[9]||=l(`span`,{class:`sr-only`},`搜索 chunk`,-1),a(l(`input`,{"onUpdate:modelValue":t[0]||=e=>i.searchQuery=e,class:`h-8 w-full min-w-0 rounded border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-2.5 text-xs outline-none focus:border-(--dashboard-accent)`,placeholder:`搜索 chunk 文件`,type:`search`},null,512),[[h,i.searchQuery]])]),_(i.AppSelect,{modelValue:i.packageFilter,"onUpdate:modelValue":t[1]||=e=>i.packageFilter=e,class:`min-w-0`,label:`筛选依赖图 package`,options:i.packageFilterOptions,size:`sm`},null,8,[`modelValue`,`options`]),l(`div`,W,[l(`button`,{class:`h-8 w-8 rounded border border-(--dashboard-border) text-sm hover:bg-(--dashboard-panel-muted) focus-visible:ring-2 focus-visible:ring-(--dashboard-accent)`,type:`button`,"aria-label":`缩小依赖图`,title:`缩小(-)`,onClick:t[2]||=e=>i.zoomGraph(.8)},` − `),l(`button`,{class:`h-8 w-8 rounded border border-(--dashboard-border) text-sm hover:bg-(--dashboard-panel-muted) focus-visible:ring-2 focus-visible:ring-(--dashboard-accent)`,type:`button`,"aria-label":`放大依赖图`,title:`放大(+)`,onClick:t[3]||=e=>i.zoomGraph(1.25)},` + `),l(`button`,{class:`h-8 whitespace-nowrap rounded border border-(--dashboard-border) px-2 text-xs hover:bg-(--dashboard-panel-muted) focus-visible:ring-2 focus-visible:ring-(--dashboard-accent)`,type:`button`,"aria-label":`适配依赖图视图`,title:`适配视图(0)`,onClick:i.resetGraphView},` 适配 `)])]),(d(),v(`svg`,G,null,512))]),l(`aside`,K,[l(`div`,q,[t[17]||=l(`p`,{class:`text-[10px] font-medium uppercase tracking-[0.12em] text-(--dashboard-text-soft)`},`Graph summary`,-1),l(`dl`,J,[l(`div`,null,[t[10]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Nodes`,-1),l(`dd`,Y,s(i.visibleGraph.nodes.length),1)]),l(`div`,null,[t[11]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Edges`,-1),l(`dd`,X,s(i.visibleGraph.edges.length),1)]),l(`div`,null,[t[12]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Static`,-1),l(`dd`,Z,s(i.graph.staticImportCount),1)]),l(`div`,null,[t[13]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Dynamic`,-1),l(`dd`,Q,s(i.graph.dynamicImportCount),1)])]),l(`label`,ne,[t[14]||=c(` 节点选择 `,-1),a(l(`select`,{"onUpdate:modelValue":t[4]||=e=>i.selectedNodeId=e,class:`min-h-32 w-full min-w-0 rounded border border-(--dashboard-border) bg-(--dashboard-panel) p-1.5 text-xs normal-case tracking-normal text-(--dashboard-text)`,size:`6`},[(d(!0),v(m,null,n(i.visibleGraph.nodes,e=>(d(),v(`option`,{key:e.id,value:e.id},s(e.label)+` · `+s(e.packageLabel),9,re))),128))],512),[[p,i.selectedNodeId]])]),l(`div`,$,[t[15]||=l(`span`,{"aria-hidden":`true`},null,-1),l(`button`,{class:`h-7 rounded border border-(--dashboard-border) text-xs hover:bg-(--dashboard-panel)`,type:`button`,"aria-label":`向上平移依赖图`,onClick:t[5]||=e=>i.panGraph(0,-40)},`↑`),t[16]||=l(`span`,{"aria-hidden":`true`},null,-1),l(`button`,{class:`h-7 rounded border border-(--dashboard-border) text-xs hover:bg-(--dashboard-panel)`,type:`button`,"aria-label":`向左平移依赖图`,onClick:t[6]||=e=>i.panGraph(-40,0)},`←`),l(`button`,{class:`h-7 rounded border border-(--dashboard-border) text-xs hover:bg-(--dashboard-panel)`,type:`button`,"aria-label":`向下平移依赖图`,onClick:t[7]||=e=>i.panGraph(0,40)},`↓`),l(`button`,{class:`h-7 rounded border border-(--dashboard-border) text-xs hover:bg-(--dashboard-panel)`,type:`button`,"aria-label":`向右平移依赖图`,onClick:t[8]||=e=>i.panGraph(40,0)},`→`)])]),i.selectedNode?(d(),v(`div`,ie,[t[24]||=l(`p`,{class:`text-[10px] font-medium uppercase tracking-[0.12em] text-(--dashboard-text-soft)`},`Selected`,-1),l(`h3`,{class:`mt-2 overflow-hidden text-ellipsis whitespace-nowrap font-mono text-xs font-semibold text-(--dashboard-text)`,title:i.selectedNode.label},s(i.selectedNode.label),9,ae),l(`dl`,oe,[l(`div`,se,[t[18]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Kind`,-1),l(`dd`,ce,s(i.selectedNode.kind),1)]),l(`div`,le,[t[19]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Package`,-1),l(`dd`,{class:`min-w-0 truncate text-right`,title:i.selectedNode.packageLabel},s(i.selectedNode.packageLabel),9,ue)]),l(`div`,de,[t[20]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Size`,-1),l(`dd`,fe,s(i.formatBytes(i.selectedNode.size)),1)]),i.selectedNode.moduleCount===void 0?g(``,!0):(d(),v(`div`,pe,[t[21]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Modules`,-1),l(`dd`,me,s(i.selectedNode.moduleCount),1)])),i.selectedNode.fileCount===void 0?g(``,!0):(d(),v(`div`,he,[t[22]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Files`,-1),l(`dd`,ge,s(i.selectedNode.fileCount),1)]))]),l(`div`,_e,[t[23]||=l(`h4`,{class:`text-[10px] font-medium uppercase tracking-[0.12em] text-(--dashboard-text-soft)`},` Import edges `,-1),i.selectedImportEdges.length?(d(),v(`ul`,ye,[(d(!0),v(m,null,n(i.selectedImportEdges,e=>(d(),v(`li`,{key:e.id,class:`min-w-0`},[l(`span`,be,s(e.relation)+` · `+s(e.kind),1),l(`span`,xe,s(e.label),1)]))),128))])):(d(),v(`p`,ve,` 当前节点没有可见的静态或动态 import。 `))])])):(d(),v(`div`,Se,` 使用节点选择器查看 package、体积和模块数;图中仍可滚轮缩放与拖动画布。蓝色实线是静态 import,橙色虚线是动态 import。 `)),i.graph.unresolvedImportCount?(d(),v(`div`,Ce,s(i.graph.unresolvedImportCount)+` 条 import 指向未输出或外部 chunk。 `,1)):g(``,!0),i.visibleGraph.truncatedNodeCount||i.visibleGraph.truncatedEdgeCount?(d(),v(`div`,we,` 为保持交互流畅,当前隐藏 `+s(i.visibleGraph.truncatedNodeCount)+` 个节点与 `+s(i.visibleGraph.truncatedEdgeCount)+` 条边。 `,1)):g(``,!0)])])}var Ee=b(z,[[`render`,Te]]);export{Ee as default};
|
|
1
|
+
import{A as e,B as t,C as n,G as r,H as i,N as a,O as o,W as s,Z as c,b as l,g as u,h as d,j as f,k as p,l as m,p as h,u as g,v as _,x as v,y}from"./vue.js";import{E as b,f as x,x as S}from"./index.js";import{a as C,c as w,i as T,l as E,n as D,o as O,r as k,s as A,t as j,u as M}from"./d3.js";import{n as ee,r as N}from"./analyze.js";var P=220,F=900,I=80,L=n({__name:`ChunkGraphPanel`,props:{result:{},theme:{}},setup(n,{expose:i}){i();let a=n,c=r(),l=s(`all`),u=s(``),f=s(null),m,h,g,_=d(()=>ee(a.result)),v=d(()=>_.value.nodes.filter(e=>e.kind===`package`)),y=d(()=>[{label:`全部 package`,value:`all`},...v.value.map(e=>({label:e.packageLabel,value:e.packageId}))]),b=d(()=>N(_.value,{maxEdges:u.value.trim()?320:F,maxNodes:u.value.trim()?I:P,packageId:l.value,query:u.value})),L=d(()=>b.value.nodes.find(e=>e.id===f.value)??null),R=d(()=>new Map(b.value.nodes.map(e=>[e.id,e]))),z=d(()=>{let e=L.value;return e?b.value.edges.filter(t=>t.kind!==`contains`&&(t.source===e.id||t.target===e.id)).map(t=>{let n=t.source===e.id,r=R.value.get(n?t.target:t.source);return{id:t.id,kind:t.kind===`dynamic-import`?`动态`:`静态`,label:r?.label??(n?t.target:t.source),relation:n?`导入`:`被导入`}}):[]}),B=d(()=>{let e=a.theme===`dark`?[`#5eead4`,`#a78bfa`,`#60a5fa`,`#fbbf24`,`#fb7185`,`#34d399`,`#f472b6`,`#c4b5fd`]:[`#0f766e`,`#7c3aed`,`#2563eb`,`#b45309`,`#be123c`,`#047857`,`#be185d`,`#6d28d9`];return new Map(v.value.map((t,n)=>[t.packageId,e[n%e.length]??`#64748b`]))});function V(e){return e.length>20?`${e.slice(0,19)}…`:e}function H(e,t){return typeof e==`string`?t.get(e):e}function U(e){return e.graphNode.kind===`package`?3:e.graphNode.isEntry?2.5:1.5}function W(e){f.value=e.id}function G(e,t,n){if(n===`start`){e.active||h?.alphaTarget(.18).restart(),t.fx=t.x,t.fy=t.y;return}if(n===`update`){t.fx=e.x,t.fy=e.y;return}e.active||h?.alphaTarget(0),t.fx=null,t.fy=null}function K(e){c.value&&g&&M(c.value).call(g.scaleBy,e)}function q(e,t){c.value&&g&&M(c.value).call(g.translateBy,e,t)}function J(){f.value=null,c.value&&g&&M(c.value).call(g.transform,D)}async function Y(){await o();let e=c.value;if(!e||e.clientWidth===0||e.clientHeight===0)return;h?.stop();let t=M(e);t.selectAll(`*`).remove();let n=e.clientWidth,r=e.clientHeight;t.attr(`viewBox`,`0 0 ${n} ${r}`);let i=t.append(`defs`);for(let e of[{id:`chunk-graph-arrow-static`,color:a.theme===`dark`?`#60a5fa`:`#2563eb`},{id:`chunk-graph-arrow-dynamic`,color:`#f59e0b`}])i.append(`marker`).attr(`id`,e.id).attr(`viewBox`,`0 -5 10 10`).attr(`refX`,16).attr(`refY`,0).attr(`markerWidth`,5).attr(`markerHeight`,5).attr(`orient`,`auto`).append(`path`).attr(`d`,`M0,-5L10,0L0,5`).attr(`fill`,e.color);let s=t.append(`g`);g=j().scaleExtent([.2,5]).on(`zoom`,e=>s.attr(`transform`,e.transform.toString())),t.call(g),s.attr(`transform`,k(e).toString());let l=b.value.nodes.map(e=>{let t=e.kind===`package`?18:Math.max(5,Math.min(14,5+Math.log2(Math.max(e.size,1))*.65));return{id:e.id,graphNode:e,color:B.value.get(e.packageId)??`#64748b`,radius:t}}),u=new Map(l.map(e=>[e.id,e])),d=b.value.edges.map(e=>({graphEdge:e,source:e.source,target:e.target})),f=s.append(`g`).attr(`fill`,`none`).selectAll(`line`).data(d).join(`line`).attr(`stroke`,e=>e.graphEdge.kind===`dynamic-import`?`#f59e0b`:e.graphEdge.kind===`static-import`?a.theme===`dark`?`#60a5fa`:`#2563eb`:a.theme===`dark`?`#292f3a`:`#d9dee7`).attr(`stroke-width`,e=>e.graphEdge.kind===`contains`?1:1.4).attr(`stroke-opacity`,e=>e.graphEdge.kind===`contains`?.26:.68).attr(`stroke-dasharray`,e=>e.graphEdge.kind===`dynamic-import`?`5 4`:null).attr(`marker-end`,e=>e.graphEdge.kind===`dynamic-import`?`url(#chunk-graph-arrow-dynamic)`:e.graphEdge.kind===`static-import`?`url(#chunk-graph-arrow-static)`:null),p=s.append(`g`).selectAll(`g`).data(l,e=>e.id).join(`g`).attr(`cursor`,`pointer`).on(`click`,(e,t)=>W(t)).call(E().on(`start`,(e,t)=>G(e,t,`start`)).on(`drag`,(e,t)=>G(e,t,`update`)).on(`end`,(e,t)=>G(e,t,`end`)));p.append(`circle`).attr(`r`,e=>e.radius).attr(`fill`,e=>e.graphNode.kind===`package`?e.color:`${e.color}cc`).attr(`stroke`,e=>e.graphNode.kind===`package`?e.color:a.theme===`dark`?`#11141a`:`#ffffff`).attr(`stroke-width`,e=>U(e)),p.append(`title`).text(e=>`${e.graphNode.label}\n${e.graphNode.packageLabel}\n${x(e.graphNode.size)}`),p.filter(e=>e.graphNode.kind===`package`).append(`text`).attr(`x`,0).attr(`y`,e=>e.radius+15).attr(`text-anchor`,`middle`).attr(`font-size`,11).attr(`font-weight`,600).attr(`fill`,a.theme===`dark`?`#d7dce5`:`#334155`).text(e=>V(e.graphNode.label)),h=C(l).force(`link`,O(d).id(e=>e.id).distance(e=>e.graphEdge.kind===`contains`?68:e.graphEdge.kind===`dynamic-import`?120:92).strength(e=>e.graphEdge.kind===`contains`?.2:.5)).force(`charge`,T().strength(l.length>180?-78:-120)).force(`collision`,A().radius(e=>e.graphNode.kind===`package`?52:e.radius+6).strength(.95)).force(`center`,w(n/2,r/2)).alphaDecay(.035).on(`tick`,()=>{for(let e of l){let t=e.graphNode.kind===`package`?58:e.radius+4;e.x=Math.max(t,Math.min(n-t,e.x??n/2)),e.y=Math.max(t,Math.min(r-t,e.y??r/2))}f.attr(`x1`,e=>H(e.source,u)?.x??0).attr(`y1`,e=>H(e.source,u)?.y??0).attr(`x2`,e=>H(e.target,u)?.x??0).attr(`y2`,e=>H(e.target,u)?.y??0),p.attr(`transform`,e=>`translate(${e.x??0},${e.y??0})`)})}e(()=>{c.value&&(m=new ResizeObserver(()=>void Y()),m.observe(c.value)),Y()}),p(()=>{m?.disconnect(),h?.stop(),h=void 0}),t(v,e=>{l.value!==`all`&&!e.some(e=>e.packageId===l.value)&&(l.value=`all`)}),t([b,B],([e])=>{f.value&&!e.nodes.some(e=>e.id===f.value)&&(f.value=null),Y()},{deep:!0}),t(()=>a.theme,()=>void Y());let X={props:a,MAX_VISIBLE_NODES:P,MAX_VISIBLE_EDGES:F,MAX_SEARCH_NODES:I,svgRef:c,packageFilter:l,searchQuery:u,selectedNodeId:f,get resizeObserver(){return m},set resizeObserver(e){m=e},get simulation(){return h},set simulation(e){h=e},get zoomBehavior(){return g},set zoomBehavior(e){g=e},graph:_,packageOptions:v,packageFilterOptions:y,visibleGraph:b,selectedNode:L,visibleNodeById:R,selectedImportEdges:z,packageColorById:B,formatPackageLabel:V,resolveLinkNode:H,resolveNodeStrokeWidth:U,selectNode:W,bindNodeDrag:G,zoomGraph:K,panGraph:q,resetGraphView:J,renderGraph:Y,get formatBytes(){return x},AppSelect:S};return Object.defineProperty(X,"__isScriptSetup",{enumerable:!1,value:!0}),X}}),R={class:`grid min-h-[calc(100dvh-9rem)] min-w-0 overflow-hidden rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) xl:grid-cols-[minmax(0,1fr)_18rem]`},z={class:`grid min-h-0 min-w-0 grid-rows-[auto_minmax(30rem,1fr)]`},B={class:`grid min-w-0 grid-cols-1 gap-2 border-b border-(--dashboard-border) px-3 py-2 sm:grid-cols-[minmax(0,1fr)_minmax(10rem,14rem)_auto]`},V={class:`relative min-w-0`},H={class:`flex items-center gap-1`,role:`group`,"aria-label":`依赖图视图控制`},U={ref:`svgRef`,class:`block h-full min-h-0 w-full min-w-0 max-w-full touch-none overflow-hidden`,"aria-hidden":`true`,focusable:`false`},W={class:`grid min-w-0 overflow-hidden border-t border-(--dashboard-border) bg-(--dashboard-panel-muted) sm:grid-cols-2 xl:block xl:border-t-0 xl:border-l`},G={class:`border-b border-(--dashboard-border) px-3 py-3`},K={class:`mt-2 grid grid-cols-2 gap-2 text-xs`},q={class:`font-mono`},J={class:`font-mono`},Y={class:`font-mono text-blue-500`},X={class:`font-mono text-amber-500`},Z={class:`mt-3 grid min-w-0 gap-1.5 text-[10px] font-medium uppercase tracking-[0.12em] text-(--dashboard-text-soft)`},Q=[`value`],$={class:`mt-3 grid grid-cols-3 gap-1`,role:`group`,"aria-label":`依赖图平移控制`},te={key:0,class:`min-w-0 border-l-0 border-(--dashboard-border) px-3 py-3 sm:border-l xl:border-l-0`},ne=[`title`],re={class:`mt-3 grid min-w-0 gap-2 text-xs`},ie={class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},ae={class:`min-w-0 truncate text-right`},oe={class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},se=[`title`],ce={class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},le={class:`min-w-0 truncate text-right font-mono`},ue={key:0,class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},de={class:`min-w-0 truncate text-right font-mono`},fe={key:1,class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},pe={class:`min-w-0 truncate text-right font-mono`},me={class:`mt-3 min-w-0`},he={key:0,class:`mt-1 text-xs text-(--dashboard-text-soft)`},ge={key:1,class:`mt-1 grid max-h-32 gap-1 overflow-y-auto text-xs`},_e={class:`font-medium`},ve={class:`ml-1 break-all text-(--dashboard-text-soft)`},ye={key:1,class:`min-w-0 border-l-0 border-(--dashboard-border) px-3 py-5 text-xs leading-5 text-(--dashboard-text-soft) sm:border-l xl:border-l-0`},be={key:2,class:`border-t border-(--dashboard-border) px-3 py-3 text-[11px] text-amber-500 sm:col-span-2 xl:col-auto`},xe={key:3,class:`border-t border-(--dashboard-border) px-3 py-3 text-[11px] text-(--dashboard-text-soft) sm:col-span-2 xl:col-auto`};function Se(e,t,n,r,o,s){return f(),y(`section`,R,[u(`div`,z,[u(`header`,B,[u(`label`,V,[t[9]||=u(`span`,{class:`sr-only`},`搜索 chunk`,-1),i(u(`input`,{"onUpdate:modelValue":t[0]||=e=>r.searchQuery=e,class:`h-8 w-full min-w-0 rounded border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-2.5 text-xs outline-none focus:border-(--dashboard-accent)`,placeholder:`搜索 chunk 文件`,type:`search`},null,512),[[g,r.searchQuery]])]),v(r.AppSelect,{modelValue:r.packageFilter,"onUpdate:modelValue":t[1]||=e=>r.packageFilter=e,class:`min-w-0`,label:`筛选依赖图 package`,options:r.packageFilterOptions,size:`sm`},null,8,[`modelValue`,`options`]),u(`div`,H,[u(`button`,{class:`h-8 w-8 rounded border border-(--dashboard-border) text-sm hover:bg-(--dashboard-panel-muted) focus-visible:ring-2 focus-visible:ring-(--dashboard-accent)`,type:`button`,"aria-label":`缩小依赖图`,title:`缩小(-)`,onClick:t[2]||=e=>r.zoomGraph(.8)},` − `),u(`button`,{class:`h-8 w-8 rounded border border-(--dashboard-border) text-sm hover:bg-(--dashboard-panel-muted) focus-visible:ring-2 focus-visible:ring-(--dashboard-accent)`,type:`button`,"aria-label":`放大依赖图`,title:`放大(+)`,onClick:t[3]||=e=>r.zoomGraph(1.25)},` + `),u(`button`,{class:`h-8 whitespace-nowrap rounded border border-(--dashboard-border) px-2 text-xs hover:bg-(--dashboard-panel-muted) focus-visible:ring-2 focus-visible:ring-(--dashboard-accent)`,type:`button`,"aria-label":`适配依赖图视图`,title:`适配视图(0)`,onClick:r.resetGraphView},` 适配 `)])]),(f(),y(`svg`,U,null,512))]),u(`aside`,W,[u(`div`,G,[t[17]||=u(`p`,{class:`text-[10px] font-medium uppercase tracking-[0.12em] text-(--dashboard-text-soft)`},`Graph summary`,-1),u(`dl`,K,[u(`div`,null,[t[10]||=u(`dt`,{class:`text-(--dashboard-text-soft)`},`Nodes`,-1),u(`dd`,q,c(r.visibleGraph.nodes.length),1)]),u(`div`,null,[t[11]||=u(`dt`,{class:`text-(--dashboard-text-soft)`},`Edges`,-1),u(`dd`,J,c(r.visibleGraph.edges.length),1)]),u(`div`,null,[t[12]||=u(`dt`,{class:`text-(--dashboard-text-soft)`},`Static`,-1),u(`dd`,Y,c(r.graph.staticImportCount),1)]),u(`div`,null,[t[13]||=u(`dt`,{class:`text-(--dashboard-text-soft)`},`Dynamic`,-1),u(`dd`,X,c(r.graph.dynamicImportCount),1)])]),u(`label`,Z,[t[14]||=l(` 节点选择 `,-1),i(u(`select`,{"onUpdate:modelValue":t[4]||=e=>r.selectedNodeId=e,class:`min-h-32 w-full min-w-0 rounded border border-(--dashboard-border) bg-(--dashboard-panel) p-1.5 text-xs normal-case tracking-normal text-(--dashboard-text)`,size:`6`},[(f(!0),y(h,null,a(r.visibleGraph.nodes,e=>(f(),y(`option`,{key:e.id,value:e.id},c(e.label)+` · `+c(e.packageLabel),9,Q))),128))],512),[[m,r.selectedNodeId]])]),u(`div`,$,[t[15]||=u(`span`,{"aria-hidden":`true`},null,-1),u(`button`,{class:`h-7 rounded border border-(--dashboard-border) text-xs hover:bg-(--dashboard-panel)`,type:`button`,"aria-label":`向上平移依赖图`,onClick:t[5]||=e=>r.panGraph(0,-40)},`↑`),t[16]||=u(`span`,{"aria-hidden":`true`},null,-1),u(`button`,{class:`h-7 rounded border border-(--dashboard-border) text-xs hover:bg-(--dashboard-panel)`,type:`button`,"aria-label":`向左平移依赖图`,onClick:t[6]||=e=>r.panGraph(-40,0)},`←`),u(`button`,{class:`h-7 rounded border border-(--dashboard-border) text-xs hover:bg-(--dashboard-panel)`,type:`button`,"aria-label":`向下平移依赖图`,onClick:t[7]||=e=>r.panGraph(0,40)},`↓`),u(`button`,{class:`h-7 rounded border border-(--dashboard-border) text-xs hover:bg-(--dashboard-panel)`,type:`button`,"aria-label":`向右平移依赖图`,onClick:t[8]||=e=>r.panGraph(40,0)},`→`)])]),r.selectedNode?(f(),y(`div`,te,[t[24]||=u(`p`,{class:`text-[10px] font-medium uppercase tracking-[0.12em] text-(--dashboard-text-soft)`},`Selected`,-1),u(`h3`,{class:`mt-2 overflow-hidden text-ellipsis whitespace-nowrap font-mono text-xs font-semibold text-(--dashboard-text)`,title:r.selectedNode.label},c(r.selectedNode.label),9,ne),u(`dl`,re,[u(`div`,ie,[t[18]||=u(`dt`,{class:`text-(--dashboard-text-soft)`},`Kind`,-1),u(`dd`,ae,c(r.selectedNode.kind),1)]),u(`div`,oe,[t[19]||=u(`dt`,{class:`text-(--dashboard-text-soft)`},`Package`,-1),u(`dd`,{class:`min-w-0 truncate text-right`,title:r.selectedNode.packageLabel},c(r.selectedNode.packageLabel),9,se)]),u(`div`,ce,[t[20]||=u(`dt`,{class:`text-(--dashboard-text-soft)`},`Size`,-1),u(`dd`,le,c(r.formatBytes(r.selectedNode.size)),1)]),r.selectedNode.moduleCount===void 0?_(``,!0):(f(),y(`div`,ue,[t[21]||=u(`dt`,{class:`text-(--dashboard-text-soft)`},`Modules`,-1),u(`dd`,de,c(r.selectedNode.moduleCount),1)])),r.selectedNode.fileCount===void 0?_(``,!0):(f(),y(`div`,fe,[t[22]||=u(`dt`,{class:`text-(--dashboard-text-soft)`},`Files`,-1),u(`dd`,pe,c(r.selectedNode.fileCount),1)]))]),u(`div`,me,[t[23]||=u(`h4`,{class:`text-[10px] font-medium uppercase tracking-[0.12em] text-(--dashboard-text-soft)`},` Import edges `,-1),r.selectedImportEdges.length?(f(),y(`ul`,ge,[(f(!0),y(h,null,a(r.selectedImportEdges,e=>(f(),y(`li`,{key:e.id,class:`min-w-0`},[u(`span`,_e,c(e.relation)+` · `+c(e.kind),1),u(`span`,ve,c(e.label),1)]))),128))])):(f(),y(`p`,he,` 当前节点没有可见的静态或动态 import。 `))])])):(f(),y(`div`,ye,` 使用节点选择器查看 package、体积和模块数;图中仍可滚轮缩放与拖动画布。蓝色实线是静态 import,橙色虚线是动态 import。 `)),r.graph.unresolvedImportCount?(f(),y(`div`,be,c(r.graph.unresolvedImportCount)+` 条 import 指向未输出或外部 chunk。 `,1)):_(``,!0),r.visibleGraph.truncatedNodeCount||r.visibleGraph.truncatedEdgeCount?(f(),y(`div`,xe,` 为保持交互流畅,当前隐藏 `+c(r.visibleGraph.truncatedNodeCount)+` 个节点与 `+c(r.visibleGraph.truncatedEdgeCount)+` 条边。 `,1)):_(``,!0)])])}var Ce=b(L,[[`render`,Se]]);export{Ce as default};
|
package/dist/assets/activity.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{B as e,C as t,D as n,E as r,J as i,L as a,N as o,P as s,
|
|
2
|
-
`,` `)}let u=
|
|
3
|
-
`));function d(e){o.value=e,s&&clearTimeout(s),s=setTimeout(()=>{o.value=``,s=null},1800)}async function f(){try{await A(u.value),d(`已复制`)}catch{d(`复制失败`)}}function m(){let e=new Blob([`${JSON.stringify(n.events,null,2)}\n`],{type:`application/json`}),t=URL.createObjectURL(e),r=document.createElement(`a`);r.href=t,r.download=`weapp-vite-dashboard-events.json`,r.click(),URL.revokeObjectURL(t),d(`已导出`)}h(()=>{s&&clearTimeout(s)});let g={props:n,sortMode:r,sortOptions:i,actionStatus:o,get actionStatusTimer(){return s},set actionStatusTimer(e){s=e},escapeMarkdownCell:l,reportText:u,setActionStatus:d,copyEventReport:f,exportEventJson:m,AppSelect:O};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}}),R={class:`flex flex-wrap items-center justify-between gap-2 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-3 py-2`},z={class:`text-xs text-(--dashboard-text-soft)`},B={class:`flex flex-wrap items-center gap-2`},V={key:0,class:`text-xs font-medium text-(--dashboard-accent)`},H=[`disabled`],U=[`disabled`];function W(e,t,n,r,i,a){return m(),x(`div`,R,[f(`p`,z,` 匹配 `+l(n.filteredCount)+` / `+l(n.totalCount)+` 条事件 `,1),f(`div`,B,[r.actionStatus?(m(),x(`span`,V,l(r.actionStatus),1)):v(``,!0),f(`button`,{type:`button`,class:`h-9 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 text-sm text-(--dashboard-text-soft) transition hover:border-(--dashboard-border-strong) hover:text-(--dashboard-accent) focus:border-(--dashboard-border-strong) focus:outline-none disabled:opacity-50`,disabled:n.events.length===0,onClick:r.copyEventReport},` 复制事件 `,8,H),f(`button`,{type:`button`,class:`h-9 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 text-sm text-(--dashboard-text-soft) transition hover:border-(--dashboard-border-strong) hover:text-(--dashboard-accent) focus:border-(--dashboard-border-strong) focus:outline-none disabled:opacity-50`,disabled:n.events.length===0,onClick:r.exportEventJson},` 导出 JSON `,8,U),b(r.AppSelect,{modelValue:r.sortMode,"onUpdate:modelValue":t[0]||=e=>r.sortMode=e,class:`w-28`,label:`排序运行事件`,options:r.sortOptions},null,8,[`modelValue`])])])}var G=S(L,[[`render`,W]]),K=t({__name:`AppRuntimeFocusCard`,props:{event:{},eyebrow:{},emptyTitle:{},emptyDetail:{},durationText:{}},setup(e,{expose:t}){t();let n=e,r={props:n,badge:p(()=>n.event?w(n.event):null),titleText:p(()=>n.event?.title??n.emptyTitle??`尚无运行事件`),detailText:p(()=>n.event?.detail??n.emptyDetail??`当前工作区还没有推入结构化运行事件。`),eventMeta:p(()=>n.event?D(n.event):null),get mutedPanelStyles(){return j},AppRuntimeBadge:P};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),q={class:`flex items-start justify-between gap-3`},J={key:0,class:`text-[11px] uppercase tracking-[0.18em] text-(--dashboard-accent)`},oe={class:`mt-1 text-lg font-semibold tracking-tight`},se={class:`mt-3 text-sm leading-6 text-(--dashboard-text-muted)`},ce={key:0,class:`mt-3 text-[11px] uppercase tracking-[0.18em] text-(--dashboard-text-soft)`},le={key:1,class:`mt-2 text-sm font-medium text-(--dashboard-text)`};function ue(e,t,r,a,o,c){return m(),x(`div`,{class:_(a.mutedPanelStyles())},[f(`div`,q,[f(`div`,null,[a.props.eyebrow?(m(),x(`p`,J,l(a.props.eyebrow),1)):v(``,!0),f(`h3`,oe,l(a.titleText),1)]),a.badge?(m(),u(a.AppRuntimeBadge,i(n({key:0},a.badge)),null,16)):v(``,!0)]),f(`p`,se,l(a.detailText),1),a.props.event?(m(),x(`p`,ce,l(a.eventMeta),1)):v(``,!0),a.props.durationText?(m(),x(`p`,le,l(a.props.durationText),1)):v(``,!0),s(e.$slots,`default`)],2)}var de=S(K,[[`render`,ue]]),fe=t({__name:`ActivitySelectedEventPanel`,props:{event:{}},setup(e,{expose:t}){t();let n=e,r={props:n,durationText:p(()=>n.event?.durationMs===void 0?void 0:`耗时 ${E(n.event.durationMs)}`),profileMetrics:p(()=>{let e=n.event?.profile;return e?[{label:`总耗时`,value:E(e.totalMs)},{label:`构建核心`,value:E(e.buildCoreMs)},{label:`转换`,value:E(e.transformMs)},{label:`写入`,value:E(e.writeMs)},{label:`监听到脏标记`,value:E(e.watchToDirtyMs)},{label:`产物发射`,value:E(e.emitMs)},{label:`共享 chunk`,value:E(e.sharedChunkResolveMs)}].filter(e=>e.value!==`未记录`):[]}),profileCounts:p(()=>{let e=n.event?.profile;return e?[{label:`脏入口`,value:e.dirtyCount},{label:`待处理`,value:e.pendingCount},{label:`已发射`,value:e.emittedCount}].filter(e=>typeof e.value==`number`):[]}),profileFile:p(()=>n.event?.profile?.sourceRootFile??n.event?.profile?.relativeFile??n.event?.profile?.file),AppRuntimeBadge:P,AppRuntimeFocusCard:de,AppSurfaceCard:M};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),pe={key:0,class:`mt-3 flex flex-wrap gap-1.5`},me={key:1,class:`mt-4 grid gap-3 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) p-3`},he={class:`flex min-w-0 items-start justify-between gap-3`},ge={class:`min-w-0`},_e={key:0,class:`mt-1 truncate font-mono text-xs text-(--dashboard-text-soft)`},ve={key:0,class:`grid gap-2 sm:grid-cols-2`},ye={class:`text-[11px] text-(--dashboard-text-soft)`},be={class:`mt-1 text-sm font-semibold text-(--dashboard-text)`},xe={key:1,class:`flex flex-wrap gap-1.5`},Se={key:2,class:`grid gap-2 text-xs leading-5 text-(--dashboard-text-muted)`},Ce={key:0},we={key:1};function Te(t,n,r,i,a,s){return m(),u(i.AppSurfaceCard,{eyebrow:`Selected`,title:`当前事件`,"icon-name":`metric-search`},{default:e(()=>[b(i.AppRuntimeFocusCard,{event:r.event,eyebrow:`focus`,"empty-title":`未选择事件`,"empty-detail":`选择左侧事件后查看详情。`,"duration-text":i.durationText},{default:e(()=>[r.event?.tags?.length?(m(),x(`div`,pe,[(m(!0),x(g,null,o(r.event.tags,e=>(m(),u(i.AppRuntimeBadge,{key:e,label:e,tone:`neutral`},null,8,[`label`]))),128))])):v(``,!0),r.event?.profile?(m(),x(`div`,me,[f(`div`,he,[f(`div`,ge,[n[0]||=f(`p`,{class:`text-sm font-semibold text-(--dashboard-text)`},` HMR 阶段明细 `,-1),i.profileFile?(m(),x(`p`,_e,l(i.profileFile),1)):v(``,!0)]),r.event.profile.event?(m(),u(i.AppRuntimeBadge,{key:0,label:r.event.profile.event,tone:`info`},null,8,[`label`])):v(``,!0)]),i.profileMetrics.length>0?(m(),x(`dl`,ve,[(m(!0),x(g,null,o(i.profileMetrics,e=>(m(),x(`div`,{key:e.label,class:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 py-2`},[f(`dt`,ye,l(e.label),1),f(`dd`,be,l(e.value),1)]))),128))])):v(``,!0),i.profileCounts.length>0?(m(),x(`div`,xe,[(m(!0),x(g,null,o(i.profileCounts,e=>(m(),u(i.AppRuntimeBadge,{key:e.label,label:`${e.label} ${e.value}`,tone:`neutral`},null,8,[`label`]))),128))])):v(``,!0),r.event.profile.dirtyReasonSummary?.length||r.event.profile.pendingReasonSummary?.length?(m(),x(`div`,Se,[r.event.profile.dirtyReasonSummary?.length?(m(),x(`p`,Ce,` 脏标记:`+l(r.event.profile.dirtyReasonSummary.join(`、`)),1)):v(``,!0),r.event.profile.pendingReasonSummary?.length?(m(),x(`p`,we,` 待处理:`+l(r.event.profile.pendingReasonSummary.join(`、`)),1)):v(``,!0)])):v(``,!0)])):v(``,!0)]),_:1},8,[`event`,`duration-text`])]),_:1})}var Ee=S(fe,[[`render`,Te]]),De=t({__name:`AppRuntimeSourceCard`,props:{source:{},count:{},errorCount:{},averageDuration:{},latestTimestamp:{},countLabel:{}},setup(e,{expose:t}){t();let n=e,r={props:n,badge:p(()=>ne(n)),subtitle:p(()=>n.latestTimestamp?`最近事件 ${n.latestTimestamp}`:`${n.count} ${n.countLabel??`条事件`}`),detailItems:p(()=>[{key:`error-count`,label:`错误 ${n.errorCount}`},{key:`average-duration`,label:`平均耗时 ${n.averageDuration}`}]),summaryText:p(()=>`平均耗时 ${n.averageDuration}`),get mutedPanelStyles(){return j},AppRuntimeBadge:P};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),Oe={class:`flex items-start justify-between gap-3`},ke={class:`min-w-0`},Ae={class:`truncate font-medium text-(--dashboard-text)`},je={class:`mt-1 text-[11px] uppercase tracking-[0.16em] text-(--dashboard-text-soft)`},Me={key:0,class:`mt-3 flex flex-wrap gap-2 text-[11px] uppercase tracking-[0.14em] text-(--dashboard-text-soft)`},Ne={key:1,class:`mt-3 text-sm text-(--dashboard-text-muted)`};function Pe(e,t,n,r,a,s){return m(),x(`div`,{class:_(r.mutedPanelStyles({padding:`sm`}))},[f(`div`,Oe,[f(`div`,ke,[f(`p`,Ae,l(r.props.source),1),f(`p`,je,l(r.subtitle),1)]),b(r.AppRuntimeBadge,i(y(r.badge)),null,16)]),r.props.latestTimestamp?(m(),x(`div`,Me,[(m(!0),x(g,null,o(r.detailItems,e=>(m(),x(`span`,{key:e.key,class:`rounded-full border border-(--dashboard-border) px-2 py-0.5`},l(e.label),1))),128))])):(m(),x(`p`,Ne,l(r.summaryText),1))],2)}var Fe=S(De,[[`render`,Pe]]),Ie=t({__name:`AppStatCard`,props:{label:{},value:{}},setup(e,{expose:t}){t();let n={panelClassName:j({padding:`sm`}),AppMetaLabel:F};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Le={class:`mt-1 text-lg font-semibold`};function Re(t,n,r,i,a,o){return m(),x(`div`,{class:_(i.panelClassName)},[b(i.AppMetaLabel,null,{default:e(()=>[d(l(r.label),1)]),_:1}),f(`p`,Le,l(r.value),1)],2)}var ze=S(Ie,[[`render`,Re]]),Be=t({__name:`RuntimeIncidentDigestPanel`,props:{digest:{}},setup(e,{expose:t}){t();let n=e,r=c(``),i=null,a=p(()=>n.digest.status===`critical`?`error`:n.digest.status===`warning`?`warning`:`success`);function o(e){return e===`error`?`text-rose-600 dark:text-rose-300`:e===`warning`?`text-amber-600 dark:text-amber-300`:`text-(--dashboard-accent)`}function s(e){return e===`critical`?`border-rose-400/60 bg-(--dashboard-panel-muted)`:e===`warning`?`border-amber-400/60 bg-(--dashboard-panel-muted)`:`border-emerald-400/60 bg-(--dashboard-panel-muted)`}function l(e){r.value=e,i&&clearTimeout(i),i=setTimeout(()=>{r.value=``,i=null},1800)}async function u(){try{await A(n.digest.report),l(`摘要已复制`)}catch{l(`复制失败`)}}h(()=>{i&&clearTimeout(i)});let d={props:n,copyStatus:r,get copyStatusTimer(){return i},set copyStatusTimer(e){i=e},badgeTone:a,getLevelClassName:o,getStatusAccentClassName:s,setCopyStatus:l,copyDigestReport:u,AppEmptyState:N,AppMetricTile:I,AppRuntimeBadge:P,AppSurfaceCard:M,DashboardIcon:te};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}}),Ve={class:`flex shrink-0 items-center gap-2`},He={key:0,class:`text-xs font-medium text-(--dashboard-accent)`},Ue={class:`h-3.5 w-3.5`},We={class:`grid gap-3`},Ge={class:`flex items-start justify-between gap-3`},Ke={class:`min-w-0`},qe={class:`text-sm font-semibold text-(--dashboard-text)`},Je={class:`mt-1 text-xs leading-5 text-(--dashboard-text-muted)`},Ye={class:`grid grid-cols-2 gap-2 sm:grid-cols-5 xl:grid-cols-2 2xl:grid-cols-5`},Xe={key:0,class:`grid max-h-52 gap-2 overflow-y-auto pr-1`},Ze={class:`flex items-start justify-between gap-3`},Qe={class:`min-w-0`},$e={class:`truncate text-sm font-medium text-(--dashboard-text)`},et={class:`mt-1 truncate text-xs text-(--dashboard-text-soft)`},tt={class:`mt-2 line-clamp-2 text-xs leading-5 text-(--dashboard-text-muted)`};function nt(t,n,r,i,a,s){return m(),u(i.AppSurfaceCard,{eyebrow:`Incident`,title:`事故摘要`,"icon-name":`metric-quality`},{header:e(()=>[f(`div`,Ve,[i.copyStatus?(m(),x(`span`,He,l(i.copyStatus),1)):v(``,!0),f(`button`,{type:`button`,class:`inline-flex h-8 items-center gap-1.5 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-3 text-xs text-(--dashboard-text-soft) transition hover:border-(--dashboard-border-strong) hover:text-(--dashboard-accent) focus:border-(--dashboard-border-strong) focus:outline-none`,onClick:i.copyDigestReport},[f(`span`,Ue,[b(i.DashboardIcon,{name:`metric-copy`})]),n[0]||=d(` 复制 `,-1)])])]),default:e(()=>[f(`div`,We,[f(`div`,{class:_([`rounded-md border px-3 py-2.5`,i.getStatusAccentClassName(r.digest.status)])},[f(`div`,Ge,[f(`div`,Ke,[f(`p`,qe,l(r.digest.statusLabel),1),f(`p`,Je,l(r.digest.statusDetail),1)]),b(i.AppRuntimeBadge,{label:r.digest.statusLabel,tone:i.badgeTone},null,8,[`label`,`tone`])])],2),f(`div`,Ye,[(m(!0),x(g,null,o(r.digest.metrics,e=>(m(),u(i.AppMetricTile,{key:e.label,label:e.label,value:e.value},null,8,[`label`,`value`]))),128))]),r.digest.incidents.length>0?(m(),x(`div`,Xe,[(m(!0),x(g,null,o(r.digest.incidents,e=>(m(),x(`article`,{key:e.id,class:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-3 py-2.5`},[f(`div`,Ze,[f(`div`,Qe,[f(`p`,$e,l(e.title),1),f(`p`,et,l(e.source)+` · `+l(e.kindLabel)+` · `+l(e.timestamp)+` · `+l(e.duration),1)]),f(`span`,{class:_([`shrink-0 text-xs font-semibold`,i.getLevelClassName(e.level)])},l(e.levelLabel),3)]),f(`p`,tt,l(e.reason)+` · `+l(e.detail),1)]))),128))])):(m(),u(i.AppEmptyState,{key:1,compact:``},{default:e(()=>[...n[1]||=[d(` 当前筛选范围内没有需要处理的运行时事件。 `,-1)]]),_:1}))])]),_:1})}var rt=S(Be,[[`render`,nt]]),it=t({__name:`ActivityInsightPanel`,props:{selectedEvent:{},incidentDigest:{},eventSummary:{},filteredEventSummary:{},diagnostics:{},sourceBreakdown:{}},setup(e,{expose:t}){t();let n={ActivitySelectedEventPanel:Ee,AppRuntimeBadge:P,AppRuntimeSourceCard:Fe,AppStatCard:ze,AppSurfaceCard:M,RuntimeIncidentDigestPanel:rt};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),at={class:`grid min-h-0 content-start gap-3 overflow-y-auto pr-1`},ot={class:`grid gap-2 sm:grid-cols-2`},st={class:`grid max-h-44 gap-2 overflow-y-auto pr-1`},ct={class:`flex items-start justify-between gap-3`},lt={class:`font-medium`},ut={class:`mt-1 text-sm leading-6 text-(--dashboard-text-muted)`},dt={key:0,class:`grid max-h-full gap-2 overflow-y-auto pr-1`};function ft(t,r,i,a,s,c){return m(),x(`div`,at,[b(a.ActivitySelectedEventPanel,{event:i.selectedEvent},null,8,[`event`]),b(a.RuntimeIncidentDigestPanel,{digest:i.incidentDigest},null,8,[`digest`]),b(a.AppSurfaceCard,{eyebrow:`Runtime`,title:`事件摘要`,"icon-name":`metric-time`},{default:e(()=>[f(`div`,ot,[(m(!0),x(g,null,o([...i.eventSummary,...i.filteredEventSummary],e=>(m(),u(a.AppStatCard,n({key:e.label},{ref_for:!0},e),null,16))),128))])]),_:1}),b(a.AppSurfaceCard,{eyebrow:`Diagnostics`,title:`当前诊断队列`,"icon-name":`metric-health`,"content-class":`min-h-0 overflow-hidden`},{default:e(()=>[f(`ul`,st,[(m(!0),x(g,null,o(i.diagnostics,e=>(m(),x(`li`,{key:e.label,class:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-4 py-3`},[f(`div`,ct,[f(`div`,null,[f(`p`,lt,l(e.label),1),f(`p`,ut,l(e.detail),1)]),b(a.AppRuntimeBadge,{label:e.status,tone:`info`},null,8,[`label`])])]))),128))])]),_:1}),b(a.AppSurfaceCard,{eyebrow:`Sources`,title:`事件来源`,"icon-name":`hero-system`,"content-class":`min-h-0 overflow-hidden`},{default:e(()=>[i.sourceBreakdown.length>0?(m(),x(`div`,dt,[(m(!0),x(g,null,o(i.sourceBreakdown,e=>(m(),u(a.AppRuntimeSourceCard,n({key:e.source},{ref_for:!0},e),null,16))),128))])):v(``,!0)]),_:1})])}var pt=S(it,[[`render`,ft]]),mt=t({__name:`AppInsetPanel`,props:{eyebrow:{}},setup(e,{expose:t}){t();let n={get mutedPanelStyles(){return j}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),ht={key:0,class:`text-[11px] uppercase tracking-[0.18em] text-(--dashboard-text-soft)`};function gt(e,t,n,r,i,a){return m(),x(`div`,{class:_(r.mutedPanelStyles())},[n.eyebrow?(m(),x(`p`,ht,l(n.eyebrow),1)):v(``,!0),f(`div`,{class:_(n.eyebrow?`mt-3`:void 0)},[s(e.$slots,`default`)],2)],2)}var _t=S(mt,[[`render`,gt]]),vt=t({__name:`AppEventFilterPanel`,props:{searchQuery:{},presetDescription:{},filterPresets:{},eventKindOptions:{},eventLevelOptions:{},eventSourceOptions:{},eventKindFilter:{},eventLevelFilter:{},eventSourceFilter:{}},emits:[`update:searchQuery`,`update:eventKindFilter`,`update:eventLevelFilter`,`update:eventSourceFilter`,`applyPreset`],setup(e,{expose:t,emit:n}){t();let r=e,i=n;function a(){return k({kind:`theme`,active:!1})}function o(e,t){return k({kind:`theme`,active:e===t})}let s={props:r,emit:i,getPresetClassName:a,getOptionClassName:o,AppInsetPanel:_t,AppMetaLabel:F};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),yt={class:`grid gap-3 xl:grid-cols-[minmax(14rem,0.85fr)_minmax(0,1.15fr)]`},bt={for:`dashboard-event-search`},xt=[`value`],St={class:`grid gap-3`},Ct={class:`mt-2 flex flex-wrap gap-2`},wt=[`onClick`],Tt={key:0,class:`mt-2 text-xs leading-5 text-(--dashboard-text-soft)`},Et={class:`grid gap-3 md:grid-cols-3`},Dt={class:`mt-2 flex flex-wrap gap-2`},Ot=[`onClick`],kt={class:`mt-2 flex flex-wrap gap-2`},At=[`onClick`],jt={class:`mt-2 flex flex-wrap gap-2`},Mt=[`onClick`];function Nt(t,n,r,i,a,s){return m(),u(i.AppInsetPanel,null,{default:e(()=>[f(`div`,yt,[f(`div`,null,[f(`label`,bt,[b(i.AppMetaLabel,null,{default:e(()=>[...n[1]||=[d(` 搜索事件 `,-1)]]),_:1})]),f(`input`,{id:`dashboard-event-search`,value:r.searchQuery,type:`text`,placeholder:`搜索标题、详情、来源或标签`,class:`mt-2 w-full rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 py-2 text-sm text-(--dashboard-text) outline-none transition focus:border-(--dashboard-border-strong)`,onInput:n[0]||=e=>i.emit(`update:searchQuery`,e.target.value)},null,40,xt)]),f(`div`,St,[f(`div`,null,[b(i.AppMetaLabel,null,{default:e(()=>[...n[2]||=[d(` 快速预设 `,-1)]]),_:1}),f(`div`,Ct,[(m(!0),x(g,null,o(r.filterPresets,e=>(m(),x(`button`,{key:e.key,class:_(i.getPresetClassName()),onClick:t=>i.emit(`applyPreset`,e.key)},l(e.label),11,wt))),128))]),r.presetDescription?(m(),x(`p`,Tt,l(r.presetDescription),1)):v(``,!0)]),f(`div`,Et,[f(`div`,null,[b(i.AppMetaLabel,null,{default:e(()=>[...n[3]||=[d(` 类型过滤 `,-1)]]),_:1}),f(`div`,Dt,[(m(!0),x(g,null,o(r.eventKindOptions,e=>(m(),x(`button`,{key:e.value,class:_(i.getOptionClassName(i.props.eventKindFilter,e.value)),onClick:t=>i.emit(`update:eventKindFilter`,e.value)},l(e.label),11,Ot))),128))])]),f(`div`,null,[b(i.AppMetaLabel,null,{default:e(()=>[...n[4]||=[d(` 等级过滤 `,-1)]]),_:1}),f(`div`,kt,[(m(!0),x(g,null,o(r.eventLevelOptions,e=>(m(),x(`button`,{key:e.value,class:_(i.getOptionClassName(i.props.eventLevelFilter,e.value)),onClick:t=>i.emit(`update:eventLevelFilter`,e.value)},l(e.label),11,At))),128))])]),f(`div`,null,[b(i.AppMetaLabel,null,{default:e(()=>[...n[5]||=[d(` 来源过滤 `,-1)]]),_:1}),f(`div`,jt,[(m(!0),x(g,null,o(r.eventSourceOptions,e=>(m(),x(`button`,{key:e.value,class:_(i.getOptionClassName(i.props.eventSourceFilter,e.value)),onClick:t=>i.emit(`update:eventSourceFilter`,e.value)},l(e.label),11,Mt))),128))])])])])])]),_:1})}var Pt=S(vt,[[`render`,Nt]]),Ft=t({__name:`AppRuntimeEventListItem`,props:{event:{},selected:{type:Boolean}},setup(e,{expose:t}){t();let n=e,r={props:n,badge:p(()=>w(n.event)),eventMeta:p(()=>D(n.event)),panelClassName:p(()=>n.selected?`border-(--dashboard-border-strong) bg-(--dashboard-panel)`:`border-(--dashboard-border)`),AppMetaLabel:F,AppRuntimeBadge:P};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),It={class:`flex min-w-0 items-start justify-between gap-3`},Lt={class:`min-w-0`},Rt=[`title`];function zt(t,r,i,a,o,s){return m(),x(`li`,{class:_([`rounded-md border bg-(--dashboard-panel-muted) px-4 py-3 transition`,a.panelClassName])},[f(`div`,It,[f(`div`,Lt,[f(`p`,{class:`truncate font-medium text-(--dashboard-text)`,title:a.props.event.title},l(a.props.event.title),9,Rt),b(a.AppMetaLabel,{class:`mt-1`},{default:e(()=>[d(l(a.eventMeta),1)]),_:1})]),b(a.AppRuntimeBadge,n({class:`shrink-0`},a.badge),null,16)])],2)}var Bt=S(Ft,[[`render`,zt]]),Vt=1e3,Ht=5,Y={error:4,warning:3,success:2,info:1};function X(e){let t=Date.parse(e.timestamp);return Number.isFinite(t)?t:0}function Z(e,t){return typeof e.durationMs==`number`&&e.durationMs>=t}function Ut(e,t){return e.level===`error`||e.level===`warning`||Z(e,t)}function Wt(e,t){let n=[];return e.level===`error`?n.push(`错误事件`):e.level===`warning`&&n.push(`警告事件`),Z(e,t)&&n.push(`耗时 ${E(e.durationMs)}`),n.join(` · `)||`需要关注`}function Gt(e,t){return{id:e.id,title:e.title,detail:e.detail,level:e.level,levelLabel:C(e.level),kindLabel:T(e.kind),source:e.source??`dashboard`,timestamp:e.timestamp,duration:E(e.durationMs),reason:Wt(e,t)}}function Kt(e,t,n){return e>0?`critical`:t>0||n>0?`warning`:`healthy`}function qt(e){return e===`critical`?`需要立即处理`:e===`warning`?`需要关注`:`运行平稳`}function Jt(e,t,n,r){return e===`critical`?`检测到 ${t} 个错误事件,优先排查失败来源。`:e===`warning`?`检测到 ${n} 个警告和 ${r} 个慢事件,建议跟进。`:`当前筛选范围内没有错误、警告或慢事件。`}function Yt(e){let t=e.incidents.length>0?e.incidents.map(e=>`- [${e.levelLabel}] ${e.title}(${e.source} · ${e.kindLabel} · ${e.timestamp} · ${e.duration}):${e.detail}`):[`- 当前筛选范围内没有需要处理的事件。`];return[`# dashboard 运行时事故摘要`,``,`状态:${e.statusLabel}`,`说明:${e.statusDetail}`,``,`## 指标`,...e.metrics.map(e=>`- ${e.label}:${e.value}`),``,`## 影响来源`,e.affectedSources.length>0?e.affectedSources.map(e=>`- ${e}`).join(`
|
|
1
|
+
import{B as e,C as t,D as n,E as r,J as i,L as a,N as o,P as s,V as c,W as l,Y as u,Z as d,_ as f,b as p,g as m,h,j as g,k as _,p as v,v as y,w as b,x,y as S}from"./vue.js";import{E as C,T as ee,_ as w,c as T,g as E,l as te,o as ne,p as D,s as re,t as ie,v as O,x as ae}from"./index.js";import{a as k,c as A,i as j,n as M,t as N}from"./AppEmptyState.js";import{t as P}from"./AppRuntimeBadge.js";import{n as F,t as I}from"./AppMetricTile.js";var L=t({__name:`ActivityEventSortBar`,props:r({events:{},filteredCount:{},totalCount:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:[`update:modelValue`],setup(e,{expose:t}){t();let n=e,r=a(e,`modelValue`),i=[{label:`按时间`,value:`time`},{label:`按耗时`,value:`duration`},{label:`按等级`,value:`severity`},{label:`按来源`,value:`source`}],o=l(``),s=null;function c(e){return e.replaceAll(`|`,`\\|`).replaceAll(`
|
|
2
|
+
`,` `)}let u=h(()=>[`# dashboard 事件流`,``,`事件数量:${n.events.length}`,``,`| 时间 | 等级 | 类型 | 来源 | 标题 | 耗时 | 标签 |`,`| --- | --- | --- | --- | --- | ---: | --- |`,...n.events.map(e=>[e.timestamp,w(e.level),E(e.kind),e.source??`dashboard`,e.title,D(e.durationMs),e.tags?.join(`, `)||`-`].map(c).join(` | `)).map(e=>`| ${e} |`),``].join(`
|
|
3
|
+
`));function d(e){o.value=e,s&&clearTimeout(s),s=setTimeout(()=>{o.value=``,s=null},1800)}async function f(){try{await A(u.value),d(`已复制`)}catch{d(`复制失败`)}}function p(){let e=new Blob([`${JSON.stringify(n.events,null,2)}\n`],{type:`application/json`}),t=URL.createObjectURL(e),r=document.createElement(`a`);r.href=t,r.download=`weapp-vite-dashboard-events.json`,r.click(),URL.revokeObjectURL(t),d(`已导出`)}_(()=>{s&&clearTimeout(s)});let m={props:n,sortMode:r,sortOptions:i,actionStatus:o,get actionStatusTimer(){return s},set actionStatusTimer(e){s=e},escapeMarkdownCell:c,reportText:u,setActionStatus:d,copyEventReport:f,exportEventJson:p,AppSelect:ae};return Object.defineProperty(m,"__isScriptSetup",{enumerable:!1,value:!0}),m}}),R={class:`flex flex-wrap items-center justify-between gap-2 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-3 py-2`},z={class:`text-xs text-(--dashboard-text-soft)`},B={class:`flex flex-wrap items-center gap-2`},V={key:0,class:`text-xs font-medium text-(--dashboard-accent)`},H=[`disabled`],U=[`disabled`];function W(e,t,n,r,i,a){return g(),S(`div`,R,[m(`p`,z,` 匹配 `+d(n.filteredCount)+` / `+d(n.totalCount)+` 条事件 `,1),m(`div`,B,[r.actionStatus?(g(),S(`span`,V,d(r.actionStatus),1)):y(``,!0),m(`button`,{type:`button`,class:`h-9 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 text-sm text-(--dashboard-text-soft) transition hover:border-(--dashboard-border-strong) hover:text-(--dashboard-accent) focus:border-(--dashboard-border-strong) focus:outline-none disabled:opacity-50`,disabled:n.events.length===0,onClick:r.copyEventReport},` 复制事件 `,8,H),m(`button`,{type:`button`,class:`h-9 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 text-sm text-(--dashboard-text-soft) transition hover:border-(--dashboard-border-strong) hover:text-(--dashboard-accent) focus:border-(--dashboard-border-strong) focus:outline-none disabled:opacity-50`,disabled:n.events.length===0,onClick:r.exportEventJson},` 导出 JSON `,8,U),x(r.AppSelect,{modelValue:r.sortMode,"onUpdate:modelValue":t[0]||=e=>r.sortMode=e,class:`w-28`,label:`排序运行事件`,options:r.sortOptions},null,8,[`modelValue`])])])}var G=C(L,[[`render`,W]]),K=t({__name:`AppRuntimeFocusCard`,props:{event:{},eyebrow:{},emptyTitle:{},emptyDetail:{},durationText:{}},setup(e,{expose:t}){t();let n=e,r={props:n,badge:h(()=>n.event?T(n.event):null),titleText:h(()=>n.event?.title??n.emptyTitle??`尚无运行事件`),detailText:h(()=>n.event?.detail??n.emptyDetail??`当前工作区还没有推入结构化运行事件。`),eventMeta:h(()=>n.event?O(n.event):null),get mutedPanelStyles(){return j},AppRuntimeBadge:P};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),q={class:`flex items-start justify-between gap-3`},J={key:0,class:`text-[11px] uppercase tracking-[0.18em] text-(--dashboard-accent)`},oe={class:`mt-1 text-lg font-semibold tracking-tight`},se={class:`mt-3 text-sm leading-6 text-(--dashboard-text-muted)`},ce={key:0,class:`mt-3 text-[11px] uppercase tracking-[0.18em] text-(--dashboard-text-soft)`},le={key:1,class:`mt-2 text-sm font-medium text-(--dashboard-text)`};function ue(e,t,r,a,o,c){return g(),S(`div`,{class:i(a.mutedPanelStyles())},[m(`div`,q,[m(`div`,null,[a.props.eyebrow?(g(),S(`p`,J,d(a.props.eyebrow),1)):y(``,!0),m(`h3`,oe,d(a.titleText),1)]),a.badge?(g(),f(a.AppRuntimeBadge,u(n({key:0},a.badge)),null,16)):y(``,!0)]),m(`p`,se,d(a.detailText),1),a.props.event?(g(),S(`p`,ce,d(a.eventMeta),1)):y(``,!0),a.props.durationText?(g(),S(`p`,le,d(a.props.durationText),1)):y(``,!0),s(e.$slots,`default`)],2)}var de=C(K,[[`render`,ue]]),fe=t({__name:`ActivitySelectedEventPanel`,props:{event:{}},setup(e,{expose:t}){t();let n=e,r={props:n,durationText:h(()=>n.event?.durationMs===void 0?void 0:`耗时 ${D(n.event.durationMs)}`),profileMetrics:h(()=>{let e=n.event?.profile;return e?[{label:`总耗时`,value:D(e.totalMs)},{label:`构建核心`,value:D(e.buildCoreMs)},{label:`转换`,value:D(e.transformMs)},{label:`写入`,value:D(e.writeMs)},{label:`监听到脏标记`,value:D(e.watchToDirtyMs)},{label:`产物发射`,value:D(e.emitMs)},{label:`共享 chunk`,value:D(e.sharedChunkResolveMs)}].filter(e=>e.value!==`未记录`):[]}),profileCounts:h(()=>{let e=n.event?.profile;return e?[{label:`脏入口`,value:e.dirtyCount},{label:`待处理`,value:e.pendingCount},{label:`已发射`,value:e.emittedCount}].filter(e=>typeof e.value==`number`):[]}),profileFile:h(()=>n.event?.profile?.sourceRootFile??n.event?.profile?.relativeFile??n.event?.profile?.file),AppRuntimeBadge:P,AppRuntimeFocusCard:de,AppSurfaceCard:M};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),pe={key:0,class:`mt-3 flex flex-wrap gap-1.5`},me={key:1,class:`mt-4 grid gap-3 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) p-3`},he={class:`flex min-w-0 items-start justify-between gap-3`},ge={class:`min-w-0`},_e={key:0,class:`mt-1 truncate font-mono text-xs text-(--dashboard-text-soft)`},ve={key:0,class:`grid gap-2 sm:grid-cols-2`},ye={class:`text-[11px] text-(--dashboard-text-soft)`},be={class:`mt-1 text-sm font-semibold text-(--dashboard-text)`},xe={key:1,class:`flex flex-wrap gap-1.5`},Se={key:2,class:`grid gap-2 text-xs leading-5 text-(--dashboard-text-muted)`},Ce={key:0},we={key:1};function Te(e,t,n,r,i,a){return g(),f(r.AppSurfaceCard,{eyebrow:`Selected`,title:`当前事件`,"icon-name":`metric-search`},{default:c(()=>[x(r.AppRuntimeFocusCard,{event:n.event,eyebrow:`focus`,"empty-title":`未选择事件`,"empty-detail":`选择左侧事件后查看详情。`,"duration-text":r.durationText},{default:c(()=>[n.event?.tags?.length?(g(),S(`div`,pe,[(g(!0),S(v,null,o(n.event.tags,e=>(g(),f(r.AppRuntimeBadge,{key:e,label:e,tone:`neutral`},null,8,[`label`]))),128))])):y(``,!0),n.event?.profile?(g(),S(`div`,me,[m(`div`,he,[m(`div`,ge,[t[0]||=m(`p`,{class:`text-sm font-semibold text-(--dashboard-text)`},` HMR 阶段明细 `,-1),r.profileFile?(g(),S(`p`,_e,d(r.profileFile),1)):y(``,!0)]),n.event.profile.event?(g(),f(r.AppRuntimeBadge,{key:0,label:n.event.profile.event,tone:`info`},null,8,[`label`])):y(``,!0)]),r.profileMetrics.length>0?(g(),S(`dl`,ve,[(g(!0),S(v,null,o(r.profileMetrics,e=>(g(),S(`div`,{key:e.label,class:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 py-2`},[m(`dt`,ye,d(e.label),1),m(`dd`,be,d(e.value),1)]))),128))])):y(``,!0),r.profileCounts.length>0?(g(),S(`div`,xe,[(g(!0),S(v,null,o(r.profileCounts,e=>(g(),f(r.AppRuntimeBadge,{key:e.label,label:`${e.label} ${e.value}`,tone:`neutral`},null,8,[`label`]))),128))])):y(``,!0),n.event.profile.dirtyReasonSummary?.length||n.event.profile.pendingReasonSummary?.length?(g(),S(`div`,Se,[n.event.profile.dirtyReasonSummary?.length?(g(),S(`p`,Ce,` 脏标记:`+d(n.event.profile.dirtyReasonSummary.join(`、`)),1)):y(``,!0),n.event.profile.pendingReasonSummary?.length?(g(),S(`p`,we,` 待处理:`+d(n.event.profile.pendingReasonSummary.join(`、`)),1)):y(``,!0)])):y(``,!0)])):y(``,!0)]),_:1},8,[`event`,`duration-text`])]),_:1})}var Ee=C(fe,[[`render`,Te]]),De=t({__name:`AppRuntimeSourceCard`,props:{source:{},count:{},errorCount:{},averageDuration:{},latestTimestamp:{},countLabel:{}},setup(e,{expose:t}){t();let n=e,r={props:n,badge:h(()=>te(n)),subtitle:h(()=>n.latestTimestamp?`最近事件 ${n.latestTimestamp}`:`${n.count} ${n.countLabel??`条事件`}`),detailItems:h(()=>[{key:`error-count`,label:`错误 ${n.errorCount}`},{key:`average-duration`,label:`平均耗时 ${n.averageDuration}`}]),summaryText:h(()=>`平均耗时 ${n.averageDuration}`),get mutedPanelStyles(){return j},AppRuntimeBadge:P};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),Oe={class:`flex items-start justify-between gap-3`},ke={class:`min-w-0`},Ae={class:`truncate font-medium text-(--dashboard-text)`},je={class:`mt-1 text-[11px] uppercase tracking-[0.16em] text-(--dashboard-text-soft)`},Me={key:0,class:`mt-3 flex flex-wrap gap-2 text-[11px] uppercase tracking-[0.14em] text-(--dashboard-text-soft)`},Ne={key:1,class:`mt-3 text-sm text-(--dashboard-text-muted)`};function Pe(e,t,n,r,a,s){return g(),S(`div`,{class:i(r.mutedPanelStyles({padding:`sm`}))},[m(`div`,Oe,[m(`div`,ke,[m(`p`,Ae,d(r.props.source),1),m(`p`,je,d(r.subtitle),1)]),x(r.AppRuntimeBadge,u(b(r.badge)),null,16)]),r.props.latestTimestamp?(g(),S(`div`,Me,[(g(!0),S(v,null,o(r.detailItems,e=>(g(),S(`span`,{key:e.key,class:`rounded-full border border-(--dashboard-border) px-2 py-0.5`},d(e.label),1))),128))])):(g(),S(`p`,Ne,d(r.summaryText),1))],2)}var Fe=C(De,[[`render`,Pe]]),Ie=t({__name:`AppStatCard`,props:{label:{},value:{}},setup(e,{expose:t}){t();let n={panelClassName:j({padding:`sm`}),AppMetaLabel:F};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Le={class:`mt-1 text-lg font-semibold`};function Re(e,t,n,r,a,o){return g(),S(`div`,{class:i(r.panelClassName)},[x(r.AppMetaLabel,null,{default:c(()=>[p(d(n.label),1)]),_:1}),m(`p`,Le,d(n.value),1)],2)}var ze=C(Ie,[[`render`,Re]]),Be=t({__name:`RuntimeIncidentDigestPanel`,props:{digest:{}},setup(e,{expose:t}){t();let n=e,r=l(``),i=null,a=h(()=>n.digest.status===`critical`?`error`:n.digest.status===`warning`?`warning`:`success`);function o(e){return e===`error`?`text-rose-600 dark:text-rose-300`:e===`warning`?`text-amber-600 dark:text-amber-300`:`text-(--dashboard-accent)`}function s(e){return e===`critical`?`border-rose-400/60 bg-(--dashboard-panel-muted)`:e===`warning`?`border-amber-400/60 bg-(--dashboard-panel-muted)`:`border-emerald-400/60 bg-(--dashboard-panel-muted)`}function c(e){r.value=e,i&&clearTimeout(i),i=setTimeout(()=>{r.value=``,i=null},1800)}async function u(){try{await A(n.digest.report),c(`摘要已复制`)}catch{c(`复制失败`)}}_(()=>{i&&clearTimeout(i)});let d={props:n,copyStatus:r,get copyStatusTimer(){return i},set copyStatusTimer(e){i=e},badgeTone:a,getLevelClassName:o,getStatusAccentClassName:s,setCopyStatus:c,copyDigestReport:u,AppEmptyState:N,AppMetricTile:I,AppRuntimeBadge:P,AppSurfaceCard:M,DashboardIcon:ee};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}}),Ve={class:`flex shrink-0 items-center gap-2`},He={key:0,class:`text-xs font-medium text-(--dashboard-accent)`},Ue={class:`h-3.5 w-3.5`},We={class:`grid gap-3`},Ge={class:`flex items-start justify-between gap-3`},Ke={class:`min-w-0`},qe={class:`text-sm font-semibold text-(--dashboard-text)`},Je={class:`mt-1 text-xs leading-5 text-(--dashboard-text-muted)`},Ye={class:`grid grid-cols-2 gap-2 sm:grid-cols-5 xl:grid-cols-2 2xl:grid-cols-5`},Xe={key:0,class:`grid max-h-52 gap-2 overflow-y-auto pr-1`},Ze={class:`flex items-start justify-between gap-3`},Qe={class:`min-w-0`},$e={class:`truncate text-sm font-medium text-(--dashboard-text)`},et={class:`mt-1 truncate text-xs text-(--dashboard-text-soft)`},tt={class:`mt-2 line-clamp-2 text-xs leading-5 text-(--dashboard-text-muted)`};function nt(e,t,n,r,a,s){return g(),f(r.AppSurfaceCard,{eyebrow:`Incident`,title:`事故摘要`,"icon-name":`metric-quality`},{header:c(()=>[m(`div`,Ve,[r.copyStatus?(g(),S(`span`,He,d(r.copyStatus),1)):y(``,!0),m(`button`,{type:`button`,class:`inline-flex h-8 items-center gap-1.5 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-3 text-xs text-(--dashboard-text-soft) transition hover:border-(--dashboard-border-strong) hover:text-(--dashboard-accent) focus:border-(--dashboard-border-strong) focus:outline-none`,onClick:r.copyDigestReport},[m(`span`,Ue,[x(r.DashboardIcon,{name:`metric-copy`})]),t[0]||=p(` 复制 `,-1)])])]),default:c(()=>[m(`div`,We,[m(`div`,{class:i([`rounded-md border px-3 py-2.5`,r.getStatusAccentClassName(n.digest.status)])},[m(`div`,Ge,[m(`div`,Ke,[m(`p`,qe,d(n.digest.statusLabel),1),m(`p`,Je,d(n.digest.statusDetail),1)]),x(r.AppRuntimeBadge,{label:n.digest.statusLabel,tone:r.badgeTone},null,8,[`label`,`tone`])])],2),m(`div`,Ye,[(g(!0),S(v,null,o(n.digest.metrics,e=>(g(),f(r.AppMetricTile,{key:e.label,label:e.label,value:e.value},null,8,[`label`,`value`]))),128))]),n.digest.incidents.length>0?(g(),S(`div`,Xe,[(g(!0),S(v,null,o(n.digest.incidents,e=>(g(),S(`article`,{key:e.id,class:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-3 py-2.5`},[m(`div`,Ze,[m(`div`,Qe,[m(`p`,$e,d(e.title),1),m(`p`,et,d(e.source)+` · `+d(e.kindLabel)+` · `+d(e.timestamp)+` · `+d(e.duration),1)]),m(`span`,{class:i([`shrink-0 text-xs font-semibold`,r.getLevelClassName(e.level)])},d(e.levelLabel),3)]),m(`p`,tt,d(e.reason)+` · `+d(e.detail),1)]))),128))])):(g(),f(r.AppEmptyState,{key:1,compact:``},{default:c(()=>[...t[1]||=[p(` 当前筛选范围内没有需要处理的运行时事件。 `,-1)]]),_:1}))])]),_:1})}var rt=C(Be,[[`render`,nt]]),it=t({__name:`ActivityInsightPanel`,props:{selectedEvent:{},incidentDigest:{},eventSummary:{},filteredEventSummary:{},diagnostics:{},sourceBreakdown:{}},setup(e,{expose:t}){t();let n={ActivitySelectedEventPanel:Ee,AppRuntimeBadge:P,AppRuntimeSourceCard:Fe,AppStatCard:ze,AppSurfaceCard:M,RuntimeIncidentDigestPanel:rt};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),at={class:`grid min-h-0 content-start gap-3 overflow-y-auto pr-1`},ot={class:`grid gap-2 sm:grid-cols-2`},st={class:`grid max-h-44 gap-2 overflow-y-auto pr-1`},ct={class:`flex items-start justify-between gap-3`},lt={class:`font-medium`},ut={class:`mt-1 text-sm leading-6 text-(--dashboard-text-muted)`},dt={key:0,class:`grid max-h-full gap-2 overflow-y-auto pr-1`};function ft(e,t,r,i,a,s){return g(),S(`div`,at,[x(i.ActivitySelectedEventPanel,{event:r.selectedEvent},null,8,[`event`]),x(i.RuntimeIncidentDigestPanel,{digest:r.incidentDigest},null,8,[`digest`]),x(i.AppSurfaceCard,{eyebrow:`Runtime`,title:`事件摘要`,"icon-name":`metric-time`},{default:c(()=>[m(`div`,ot,[(g(!0),S(v,null,o([...r.eventSummary,...r.filteredEventSummary],e=>(g(),f(i.AppStatCard,n({key:e.label},{ref_for:!0},e),null,16))),128))])]),_:1}),x(i.AppSurfaceCard,{eyebrow:`Diagnostics`,title:`当前诊断队列`,"icon-name":`metric-health`,"content-class":`min-h-0 overflow-hidden`},{default:c(()=>[m(`ul`,st,[(g(!0),S(v,null,o(r.diagnostics,e=>(g(),S(`li`,{key:e.label,class:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-4 py-3`},[m(`div`,ct,[m(`div`,null,[m(`p`,lt,d(e.label),1),m(`p`,ut,d(e.detail),1)]),x(i.AppRuntimeBadge,{label:e.status,tone:`info`},null,8,[`label`])])]))),128))])]),_:1}),x(i.AppSurfaceCard,{eyebrow:`Sources`,title:`事件来源`,"icon-name":`hero-system`,"content-class":`min-h-0 overflow-hidden`},{default:c(()=>[r.sourceBreakdown.length>0?(g(),S(`div`,dt,[(g(!0),S(v,null,o(r.sourceBreakdown,e=>(g(),f(i.AppRuntimeSourceCard,n({key:e.source},{ref_for:!0},e),null,16))),128))])):y(``,!0)]),_:1})])}var pt=C(it,[[`render`,ft]]),mt=t({__name:`AppInsetPanel`,props:{eyebrow:{}},setup(e,{expose:t}){t();let n={get mutedPanelStyles(){return j}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),ht={key:0,class:`text-[11px] uppercase tracking-[0.18em] text-(--dashboard-text-soft)`};function gt(e,t,n,r,a,o){return g(),S(`div`,{class:i(r.mutedPanelStyles())},[n.eyebrow?(g(),S(`p`,ht,d(n.eyebrow),1)):y(``,!0),m(`div`,{class:i(n.eyebrow?`mt-3`:void 0)},[s(e.$slots,`default`)],2)],2)}var _t=C(mt,[[`render`,gt]]),vt=t({__name:`AppEventFilterPanel`,props:{searchQuery:{},presetDescription:{},filterPresets:{},eventKindOptions:{},eventLevelOptions:{},eventSourceOptions:{},eventKindFilter:{},eventLevelFilter:{},eventSourceFilter:{}},emits:[`update:searchQuery`,`update:eventKindFilter`,`update:eventLevelFilter`,`update:eventSourceFilter`,`applyPreset`],setup(e,{expose:t,emit:n}){t();let r=e,i=n;function a(){return k({kind:`theme`,active:!1})}function o(e,t){return k({kind:`theme`,active:e===t})}let s={props:r,emit:i,getPresetClassName:a,getOptionClassName:o,AppInsetPanel:_t,AppMetaLabel:F};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),yt={class:`grid gap-3 xl:grid-cols-[minmax(14rem,0.85fr)_minmax(0,1.15fr)]`},bt={for:`dashboard-event-search`},xt=[`value`],St={class:`grid gap-3`},Ct={class:`mt-2 flex flex-wrap gap-2`},wt=[`onClick`],Tt={key:0,class:`mt-2 text-xs leading-5 text-(--dashboard-text-soft)`},Et={class:`grid gap-3 md:grid-cols-3`},Dt={class:`mt-2 flex flex-wrap gap-2`},Ot=[`onClick`],kt={class:`mt-2 flex flex-wrap gap-2`},At=[`onClick`],jt={class:`mt-2 flex flex-wrap gap-2`},Mt=[`onClick`];function Nt(e,t,n,r,a,s){return g(),f(r.AppInsetPanel,null,{default:c(()=>[m(`div`,yt,[m(`div`,null,[m(`label`,bt,[x(r.AppMetaLabel,null,{default:c(()=>[...t[1]||=[p(` 搜索事件 `,-1)]]),_:1})]),m(`input`,{id:`dashboard-event-search`,value:n.searchQuery,type:`text`,placeholder:`搜索标题、详情、来源或标签`,class:`mt-2 w-full rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 py-2 text-sm text-(--dashboard-text) outline-none transition focus:border-(--dashboard-border-strong)`,onInput:t[0]||=e=>r.emit(`update:searchQuery`,e.target.value)},null,40,xt)]),m(`div`,St,[m(`div`,null,[x(r.AppMetaLabel,null,{default:c(()=>[...t[2]||=[p(` 快速预设 `,-1)]]),_:1}),m(`div`,Ct,[(g(!0),S(v,null,o(n.filterPresets,e=>(g(),S(`button`,{key:e.key,class:i(r.getPresetClassName()),onClick:t=>r.emit(`applyPreset`,e.key)},d(e.label),11,wt))),128))]),n.presetDescription?(g(),S(`p`,Tt,d(n.presetDescription),1)):y(``,!0)]),m(`div`,Et,[m(`div`,null,[x(r.AppMetaLabel,null,{default:c(()=>[...t[3]||=[p(` 类型过滤 `,-1)]]),_:1}),m(`div`,Dt,[(g(!0),S(v,null,o(n.eventKindOptions,e=>(g(),S(`button`,{key:e.value,class:i(r.getOptionClassName(r.props.eventKindFilter,e.value)),onClick:t=>r.emit(`update:eventKindFilter`,e.value)},d(e.label),11,Ot))),128))])]),m(`div`,null,[x(r.AppMetaLabel,null,{default:c(()=>[...t[4]||=[p(` 等级过滤 `,-1)]]),_:1}),m(`div`,kt,[(g(!0),S(v,null,o(n.eventLevelOptions,e=>(g(),S(`button`,{key:e.value,class:i(r.getOptionClassName(r.props.eventLevelFilter,e.value)),onClick:t=>r.emit(`update:eventLevelFilter`,e.value)},d(e.label),11,At))),128))])]),m(`div`,null,[x(r.AppMetaLabel,null,{default:c(()=>[...t[5]||=[p(` 来源过滤 `,-1)]]),_:1}),m(`div`,jt,[(g(!0),S(v,null,o(n.eventSourceOptions,e=>(g(),S(`button`,{key:e.value,class:i(r.getOptionClassName(r.props.eventSourceFilter,e.value)),onClick:t=>r.emit(`update:eventSourceFilter`,e.value)},d(e.label),11,Mt))),128))])])])])])]),_:1})}var Pt=C(vt,[[`render`,Nt]]),Ft=t({__name:`AppRuntimeEventListItem`,props:{event:{},selected:{type:Boolean}},setup(e,{expose:t}){t();let n=e,r={props:n,badge:h(()=>T(n.event)),eventMeta:h(()=>O(n.event)),panelClassName:h(()=>n.selected?`border-(--dashboard-border-strong) bg-(--dashboard-panel)`:`border-(--dashboard-border)`),AppMetaLabel:F,AppRuntimeBadge:P};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),It={class:`flex min-w-0 items-start justify-between gap-3`},Lt={class:`min-w-0`},Rt=[`title`];function zt(e,t,r,a,o,s){return g(),S(`li`,{class:i([`rounded-md border bg-(--dashboard-panel-muted) px-4 py-3 transition`,a.panelClassName])},[m(`div`,It,[m(`div`,Lt,[m(`p`,{class:`truncate font-medium text-(--dashboard-text)`,title:a.props.event.title},d(a.props.event.title),9,Rt),x(a.AppMetaLabel,{class:`mt-1`},{default:c(()=>[p(d(a.eventMeta),1)]),_:1})]),x(a.AppRuntimeBadge,n({class:`shrink-0`},a.badge),null,16)])],2)}var Bt=C(Ft,[[`render`,zt]]),Vt=1e3,Ht=5,Y={error:4,warning:3,success:2,info:1};function X(e){let t=Date.parse(e.timestamp);return Number.isFinite(t)?t:0}function Z(e,t){return typeof e.durationMs==`number`&&e.durationMs>=t}function Ut(e,t){return e.level===`error`||e.level===`warning`||Z(e,t)}function Wt(e,t){let n=[];return e.level===`error`?n.push(`错误事件`):e.level===`warning`&&n.push(`警告事件`),Z(e,t)&&n.push(`耗时 ${D(e.durationMs)}`),n.join(` · `)||`需要关注`}function Gt(e,t){return{id:e.id,title:e.title,detail:e.detail,level:e.level,levelLabel:w(e.level),kindLabel:E(e.kind),source:e.source??`dashboard`,timestamp:e.timestamp,duration:D(e.durationMs),reason:Wt(e,t)}}function Kt(e,t,n){return e>0?`critical`:t>0||n>0?`warning`:`healthy`}function qt(e){return e===`critical`?`需要立即处理`:e===`warning`?`需要关注`:`运行平稳`}function Jt(e,t,n,r){return e===`critical`?`检测到 ${t} 个错误事件,优先排查失败来源。`:e===`warning`?`检测到 ${n} 个警告和 ${r} 个慢事件,建议跟进。`:`当前筛选范围内没有错误、警告或慢事件。`}function Yt(e){let t=e.incidents.length>0?e.incidents.map(e=>`- [${e.levelLabel}] ${e.title}(${e.source} · ${e.kindLabel} · ${e.timestamp} · ${e.duration}):${e.detail}`):[`- 当前筛选范围内没有需要处理的事件。`];return[`# dashboard 运行时事故摘要`,``,`状态:${e.statusLabel}`,`说明:${e.statusDetail}`,``,`## 指标`,...e.metrics.map(e=>`- ${e.label}:${e.value}`),``,`## 影响来源`,e.affectedSources.length>0?e.affectedSources.map(e=>`- ${e}`).join(`
|
|
4
4
|
`):`- 无`,``,`## 优先处理`,...t,``].join(`
|
|
5
|
-
`)}function Xt(e,t={}){let n=t.slowEventThresholdMs??Vt,r=e.filter(e=>e.level===`error`).length,i=e.filter(e=>e.level===`warning`).length,a=e.filter(e=>Z(e,n)).length,o=e.filter(e=>Ut(e,n)),s=[...new Set(o.map(e=>e.source??`dashboard`))].sort((e,t)=>e.localeCompare(t,`zh-CN`)),c=Kt(r,i,a),l=o.toSorted((e,t)=>Y[t.level]-Y[e.level]||(t.durationMs??-1)-(e.durationMs??-1)||X(t)-X(e)).slice(0,Ht).map(e=>Gt(e,n)),u={status:c,statusLabel:qt(c),statusDetail:Jt(c,r,i,a),metrics:[{label:`事件总数`,value:e.length},{label:`错误`,value:r},{label:`警告`,value:i},{label:`慢事件`,value:a},{label:`影响来源`,value:s.length}],affectedSources:s,incidents:l};return{...u,report:Yt(u)}}var Q={error:4,warning:3,success:2,info:1},Zt=[{value:`all`,label:`全部类型`},{value:`command`,label:`命令`},{value:`build`,label:`构建`},{value:`diagnostic`,label:`诊断`},{value:`hmr`,label:`HMR`},{value:`system`,label:`系统`}],Qt=[{value:`all`,label:`全部等级`},{value:`info`,label:`信息`},{value:`success`,label:`成功`},{value:`warning`,label:`警告`},{value:`error`,label:`错误`}];function $t(e,t){return[e.title,e.detail,e.kind,e.level,e.source??``,...e.tags??[]].join(` `).toLowerCase().includes(t)}function $(e,t){return[...e].sort((e,n)=>t===`duration`?(n.durationMs??-1)-(e.durationMs??-1)||Date.parse(n.timestamp)-Date.parse(e.timestamp):t===`severity`?Q[n.level]-Q[e.level]||Date.parse(n.timestamp)-Date.parse(e.timestamp):t===`source`&&(e.source??`dashboard`).localeCompare(n.source??`dashboard`)||Date.parse(n.timestamp)-Date.parse(e.timestamp))}function en(
|
|
5
|
+
`)}function Xt(e,t={}){let n=t.slowEventThresholdMs??Vt,r=e.filter(e=>e.level===`error`).length,i=e.filter(e=>e.level===`warning`).length,a=e.filter(e=>Z(e,n)).length,o=e.filter(e=>Ut(e,n)),s=[...new Set(o.map(e=>e.source??`dashboard`))].sort((e,t)=>e.localeCompare(t,`zh-CN`)),c=Kt(r,i,a),l=o.toSorted((e,t)=>Y[t.level]-Y[e.level]||(t.durationMs??-1)-(e.durationMs??-1)||X(t)-X(e)).slice(0,Ht).map(e=>Gt(e,n)),u={status:c,statusLabel:qt(c),statusDetail:Jt(c,r,i,a),metrics:[{label:`事件总数`,value:e.length},{label:`错误`,value:r},{label:`警告`,value:i},{label:`慢事件`,value:a},{label:`影响来源`,value:s.length}],affectedSources:s,incidents:l};return{...u,report:Yt(u)}}var Q={error:4,warning:3,success:2,info:1},Zt=[{value:`all`,label:`全部类型`},{value:`command`,label:`命令`},{value:`build`,label:`构建`},{value:`diagnostic`,label:`诊断`},{value:`hmr`,label:`HMR`},{value:`system`,label:`系统`}],Qt=[{value:`all`,label:`全部等级`},{value:`info`,label:`信息`},{value:`success`,label:`成功`},{value:`warning`,label:`警告`},{value:`error`,label:`错误`}];function $t(e,t){return[e.title,e.detail,e.kind,e.level,e.source??``,...e.tags??[]].join(` `).toLowerCase().includes(t)}function $(e,t){return[...e].sort((e,n)=>t===`duration`?(n.durationMs??-1)-(e.durationMs??-1)||Date.parse(n.timestamp)-Date.parse(e.timestamp):t===`severity`?Q[n.level]-Q[e.level]||Date.parse(n.timestamp)-Date.parse(e.timestamp):t===`source`&&(e.source??`dashboard`).localeCompare(n.source??`dashboard`)||Date.parse(n.timestamp)-Date.parse(e.timestamp))}function en(t){let n=l(`all`),r=l(`all`),i=l(`all`),a=l(`time`),o=l(``),s=l(null),c=[{key:`all`,label:`查看全部`,description:`回到完整事件流`,apply(){n.value=`all`,r.value=`all`,i.value=`all`,o.value=``}},{key:`issues`,label:`异常优先`,description:`只看警告和错误`,apply(){n.value=`all`,r.value=`warning`,i.value=`all`,o.value=``}},{key:`commands`,label:`命令流`,description:`聚焦命令执行事件`,apply(){n.value=`command`,r.value=`all`,i.value=`all`,o.value=``}},{key:`hmr`,label:`HMR`,description:`观察热更新相关事件`,apply(){n.value=`hmr`,r.value=`all`,i.value=`all`,o.value=``}}],u=h(()=>[{value:`all`,label:`全部来源`},...[...new Set(t.value.map(e=>e.source??`dashboard`).filter(Boolean))].sort((e,t)=>e.localeCompare(t,`zh-CN`)).map(e=>({value:e,label:e}))]),d=h(()=>{let e=o.value.trim().toLowerCase();return $(t.value.filter(t=>n.value!==`all`&&t.kind!==n.value||r.value!==`all`&&t.level!==r.value||i.value!==`all`&&(t.source??`dashboard`)!==i.value?!1:!e||$t(t,e)),a.value)}),f=h(()=>{let e=d.value.filter(e=>typeof e.durationMs==`number`),t=e.length>0?Math.round(e.reduce((e,t)=>e+(t.durationMs??0),0)/e.length):void 0;return[{label:`筛选后事件`,value:String(d.value.length)},{label:`当前类型`,value:n.value===`all`?`全部`:E(n.value)},{label:`当前等级`,value:r.value===`all`?`全部`:w(r.value)},{label:`当前来源`,value:i.value===`all`?`全部`:i.value},{label:`搜索关键字`,value:o.value.trim()||`未设置`},{label:`筛选平均耗时`,value:D(t)}]}),p=h(()=>ne(re(d.value))),m=h(()=>Xt(d.value)),g=h(()=>d.value.find(e=>e.id===s.value)??d.value[0]??null),_=h(()=>c.find(e=>e.key===`issues`?n.value===`all`&&r.value===`warning`&&i.value===`all`&&o.value===``:e.key===`commands`?n.value===`command`&&r.value===`all`&&i.value===`all`&&o.value===``:e.key===`hmr`?n.value===`hmr`&&r.value===`all`&&i.value===`all`&&o.value===``:n.value===`all`&&r.value===`all`&&i.value===`all`&&o.value===``)?.description??``);return e(d,e=>{if(e.length===0){s.value=null;return}e.some(e=>e.id===s.value)||(s.value=e[0]?.id??null)},{immediate:!0}),{eventKindFilter:n,eventKindOptions:Zt,eventLevelFilter:r,eventLevelOptions:Qt,eventSortMode:a,eventSourceFilter:i,eventSourceOptions:u,filteredEventSummary:f,filteredRuntimeEvents:d,filterPresets:c,incidentDigest:m,presetDescription:_,searchQuery:o,selectedEvent:g,selectedEventId:s,sourceBreakdown:p}}var tn=t({__name:`activity`,setup(e,{expose:t}){t();let{diagnostics:n,eventSummary:r,runtimeEvents:i}=ie(),{eventKindFilter:a,eventKindOptions:o,eventLevelFilter:s,eventLevelOptions:c,eventSortMode:l,eventSourceFilter:u,eventSourceOptions:d,filteredEventSummary:f,filteredRuntimeEvents:p,filterPresets:m,incidentDigest:h,presetDescription:g,searchQuery:_,selectedEvent:v,selectedEventId:y,sourceBreakdown:b}=en(i),x={diagnostics:n,eventSummary:r,runtimeEvents:i,eventKindFilter:a,eventKindOptions:o,eventLevelFilter:s,eventLevelOptions:c,eventSortMode:l,eventSourceFilter:u,eventSourceOptions:d,filteredEventSummary:f,filteredRuntimeEvents:p,filterPresets:m,incidentDigest:h,presetDescription:g,searchQuery:_,selectedEvent:v,selectedEventId:y,sourceBreakdown:b,ActivityEventSortBar:G,ActivityInsightPanel:pt,AppEmptyState:N,AppEventFilterPanel:Pt,AppRuntimeEventListItem:Bt,AppSurfaceCard:M};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}}),nn={class:`grid min-h-[40rem] min-w-0 items-start gap-3 xl:grid-cols-[minmax(0,1.25fr)_minmax(18rem,0.75fr)] xl:items-stretch`},rn={class:`grid min-h-0 min-w-0 grid-rows-[auto_auto_minmax(14rem,1fr)] gap-3 overflow-visible xl:h-full xl:grid-rows-[auto_auto_minmax(6rem,1fr)] xl:overflow-hidden`},an={class:`grid min-h-0 gap-2 overflow-y-auto pr-1 text-sm leading-6 text-(--dashboard-text-muted)`};function on(e,t,n,r,i,a){return g(),S(`div`,nn,[x(r.AppSurfaceCard,{eyebrow:`Event Feed`,title:`事件控制台`,"icon-name":`hero-commands`,"content-class":`min-h-[36rem] min-w-0`},{default:c(()=>[m(`div`,rn,[x(r.AppEventFilterPanel,{class:`min-h-0 min-w-0`,"search-query":r.searchQuery,"preset-description":r.presetDescription,"filter-presets":r.filterPresets,"event-kind-options":r.eventKindOptions,"event-level-options":r.eventLevelOptions,"event-source-options":r.eventSourceOptions,"event-kind-filter":r.eventKindFilter,"event-level-filter":r.eventLevelFilter,"event-source-filter":r.eventSourceFilter,"onUpdate:searchQuery":t[0]||=e=>r.searchQuery=e,"onUpdate:eventKindFilter":t[1]||=e=>r.eventKindFilter=e,"onUpdate:eventLevelFilter":t[2]||=e=>r.eventLevelFilter=e,"onUpdate:eventSourceFilter":t[3]||=e=>r.eventSourceFilter=e,onApplyPreset:t[4]||=e=>r.filterPresets.find(t=>t.key===e)?.apply()},null,8,[`search-query`,`preset-description`,`filter-presets`,`event-kind-options`,`event-level-options`,`event-source-options`,`event-kind-filter`,`event-level-filter`,`event-source-filter`]),x(r.ActivityEventSortBar,{modelValue:r.eventSortMode,"onUpdate:modelValue":t[5]||=e=>r.eventSortMode=e,events:r.filteredRuntimeEvents,"filtered-count":r.filteredRuntimeEvents.length,"total-count":r.runtimeEvents.length},null,8,[`modelValue`,`events`,`filtered-count`,`total-count`]),r.filteredRuntimeEvents.length===0?(g(),f(r.AppEmptyState,{key:0,as:`p`},{default:c(()=>[...t[6]||=[p(` 当前过滤条件下没有匹配事件。 `,-1)]]),_:1})):y(``,!0),m(`ul`,an,[(g(!0),S(v,null,o(r.filteredRuntimeEvents,e=>(g(),f(r.AppRuntimeEventListItem,{key:e.id,event:e,selected:r.selectedEvent?.id===e.id,onClick:t=>r.selectedEventId=e.id},null,8,[`event`,`selected`,`onClick`]))),128))])])]),_:1}),x(r.ActivityInsightPanel,{"selected-event":r.selectedEvent,"incident-digest":r.incidentDigest,"event-summary":r.eventSummary,"filtered-event-summary":r.filteredEventSummary,diagnostics:r.diagnostics,"source-breakdown":r.sourceBreakdown},null,8,[`selected-event`,`incident-digest`,`event-summary`,`filtered-event-summary`,`diagnostics`,`source-breakdown`])])}var sn=C(tn,[[`render`,on]]);export{sn as default};
|