weapp-vite 7.5.0 → 7.6.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.
Files changed (93) hide show
  1. package/README.md +8 -2
  2. package/THIRD_PARTY_NOTICES.md +60 -0
  3. package/dist/action-B3YZMA-h.mjs +255 -0
  4. package/dist/action-BELcDNNv.mjs +139 -0
  5. package/dist/action-BOk3vGI7.mjs +1110 -0
  6. package/dist/action-DlC6JYpt.mjs +95 -0
  7. package/dist/action-zEDY7oh_.mjs +247 -0
  8. package/dist/{analyze-ZJUvEdaY.mjs → analyze-DN79YOAH.mjs} +1 -65
  9. package/dist/artifacts-BOyC9Fy-.mjs +106 -0
  10. package/dist/assets-C5_YYXNk.mjs +637 -0
  11. package/dist/auto-routes.mjs +2 -2
  12. package/dist/{budget-BD7VqLCl.d.mts → budget-CTLOHwgI.d.mts} +1 -2
  13. package/dist/budget-EOeEycc_.mjs +65 -0
  14. package/dist/builtProject-C29udgXY.mjs +541 -0
  15. package/dist/{chunkStrategy-DRA5WpB-.mjs → chunkStrategy-DY_LZIIe.mjs} +15 -3
  16. package/dist/{package-7swhyLmf.mjs → classifier-DBJY__kg.mjs} +4 -7
  17. package/dist/cli-acceptance.mjs +1 -1
  18. package/dist/cli.mjs +110 -4506
  19. package/dist/{config-V0L-IAJf.d.mts → config-Bf6DWhyb.d.mts} +136 -49
  20. package/dist/config.d.mts +2 -2
  21. package/dist/{createCompilerContextInstance-DJH_P_nZ.mjs → createCompilerContextInstance-aYwi8wQt.mjs} +15235 -9523
  22. package/dist/{createContext-BqYzHhY9.mjs → createContext-tApLtII-.mjs} +6 -3
  23. package/dist/dashboard/analyze.d.mts +1 -1
  24. package/dist/dashboard/analyze.mjs +3 -1
  25. package/dist/dashboard/vite.d.mts +1 -1
  26. package/dist/dashboard.d.mts +2 -2
  27. package/dist/dashboard.mjs +1749 -1
  28. package/dist/dashboardTransport-C_Y6jMp-.mjs +16 -0
  29. package/dist/{dashboardViteBridge-Dy3nAD4m.mjs → dashboardViteBridge-DCGR43aM.mjs} +8 -5
  30. package/dist/{dev-fR5GiJRO.mjs → dev-C2fgr_Xd.mjs} +5 -1
  31. package/dist/devProvider-D-hTfsEO.mjs +3027 -0
  32. package/dist/docs/README.md +8 -2
  33. package/dist/docs/mcp.md +10 -0
  34. package/dist/docs/troubleshooting.md +8 -0
  35. package/dist/docs/vue-sfc.md +25 -2
  36. package/dist/doctor-worker.mjs +3 -2
  37. package/dist/doctor.d.mts +2 -2
  38. package/dist/doctor.mjs +15 -13
  39. package/dist/engine-C66J0HLz.mjs +54 -0
  40. package/dist/{file-sC3jD7Fh.mjs → file-CcIOmqhC.mjs} +47 -19
  41. package/dist/file-DtcteQ4G.mjs +1 -0
  42. package/dist/forwardConsole-B0Reo8Lf.mjs +511 -0
  43. package/dist/getInstance-BAIaU2y9.mjs +1 -0
  44. package/dist/{getInstance-DiGSzBNI.mjs → getInstance-Dt9IQDKr.mjs} +1 -1
  45. package/dist/history-BIiRCzbq.mjs +784 -0
  46. package/dist/i18n.d.mts +1 -1
  47. package/dist/{index-C9HjUX5c.d.mts → index-D5rgBzYZ.d.mts} +1 -2
  48. package/dist/index.d.mts +3 -3
  49. package/dist/index.mjs +2 -2
  50. package/dist/json.d.mts +1 -1
  51. package/dist/lib-DjccSI1B.mjs +143 -0
  52. package/dist/{lifecycle-BROTlwSL.mjs → lifecycle-C36WSbQS.mjs} +120 -27
  53. package/dist/{loadConfig-C3BQhz7F.mjs → loadConfig-BWIsDXR4.mjs} +1 -1
  54. package/dist/loadConfig-D-BpBgsk.mjs +1 -0
  55. package/dist/logBuildAppFinish-ChjwATMv.mjs +57 -0
  56. package/dist/mcp-CYgX9HpO.mjs +86 -0
  57. package/dist/mcp.d.mts +1 -1
  58. package/dist/mcpClient-DVLvFLZv.mjs +287 -0
  59. package/dist/{processCleanup-B6KA30Zc.mjs → metadata-hwF7QRcS.mjs} +1 -19
  60. package/dist/nodeEnv-BmH8UZPR.mjs +7 -0
  61. package/dist/openIde-CroqOgk5.mjs +648 -0
  62. package/dist/options-jqFwfD1G.mjs +34 -0
  63. package/dist/package-Cmakyy3J.mjs +4 -0
  64. package/dist/path-CYYIQGS7.mjs +44 -0
  65. package/dist/processCleanup-BQn2kTcK.mjs +19 -0
  66. package/dist/{protocol-vg8HGJ4n.mjs → protocol-Cg6Jdlvb.mjs} +42 -39
  67. package/dist/reader-sh_POQ9-.mjs +93 -0
  68. package/dist/realpathScope-Tf9mz-fh.mjs +23 -0
  69. package/dist/report-hyonPGbZ.mjs +107 -0
  70. package/dist/{path-doV773b7.mjs → resolvedId-CiDl7SC1.mjs} +3 -46
  71. package/dist/runtime-CLUhQsdA.mjs +43 -0
  72. package/dist/{runtime-Ee2HY6gR.d.mts → runtime-DpVf714f.d.mts} +1 -1
  73. package/dist/runtime.d.mts +1 -1
  74. package/dist/schematics-kO26eQRT.mjs +91 -0
  75. package/dist/{session-PskhD-nZ.mjs → session-D3zsdzIy.mjs} +71 -9
  76. package/dist/test.mjs +10 -8
  77. package/dist/{types-CgZn5X6j.d.mts → types-D-kfuyVa.d.mts} +1 -2
  78. package/dist/types-D0FFexRF.d.mts +39 -0
  79. package/dist/types.d.mts +2 -2
  80. package/dist/{upload-D4msblBf.mjs → upload-DozK8UdN.mjs} +109 -5
  81. package/dist/upload-worker.mjs +1 -1
  82. package/dist/{utils-CJSCgEj6.mjs → utils-Dy51PYAC.mjs} +56 -116
  83. package/dist/vite.d.mts +1 -1
  84. package/dist/vite.mjs +51 -12
  85. package/dist/wxs-BT8btflA.mjs +112 -0
  86. package/dist/wxs-Z4VQDeJ_.mjs +1 -0
  87. package/package.json +52 -46
  88. package/dist/dashboard-DvqF3Key.mjs +0 -1842
  89. package/dist/devProvider-BGBkw28J.mjs +0 -1050
  90. package/dist/file-DRb4eWqw.mjs +0 -1
  91. package/dist/getInstance-SiE6WZRh.mjs +0 -1
  92. package/dist/loadConfig-VGtBF4qm.mjs +0 -1
  93. package/dist/mcp-D3Yh24Cj.mjs +0 -529
@@ -98,7 +98,7 @@ Hub 的 `/__devframes/__mcp` 聚合端点保持关闭,但与独立模式一样
98
98
 
99
99
  `weapp-vite/dashboard` 是 Node 端共享核心;CLI 独立工作台与 Vite DevTools 复用同一个 `DevframeDefinition` 和 `@weapp-vite/dashboard` 面板。可选适配器位于 `weapp-vite/dashboard/vite`,使用官方 `createPluginFromDevframe`,不会由普通包入口或 CLI 自动加载。
100
100
 
101
- 接入方安装 `@weapp-vite/dashboard`、`@vitejs/devtools` 和 `@vitejs/devtools-kit`。当前接入按 Vite `8.3.0`、DevTools / Kit `0.7.6`、Devframe `1.1.0` 验证;Kit 是可选 peer,宿主依赖不进入小程序产物。
101
+ 接入方安装 `@weapp-vite/dashboard`、`@vitejs/devtools` 和 `@vitejs/devtools-kit`。当前接入使用 Vite `8.3.4`、DevTools / Kit `0.8.0`、Devframe `1.2.5`;Kit 是可选 peer,宿主依赖不进入小程序产物。
102
102
 
103
103
  ```ts
104
104
  import type { DevToolsConfig } from '@vitejs/devtools/config'
@@ -133,7 +133,7 @@ export function createDashboardHost(snapshot: DashboardAnalyzeSnapshot, roots: D
133
133
 
134
134
  每个控制器只同时挂载到一个逻辑宿主。适配器记录成功安装的 Vite 配置身份,并仅在该配置拥有的环境关闭时释放核心。成功重启将所有权移交给新配置,旧实例和未安装的失败候选的清理都不会误释放当前控制器;替换前的资源校验失败时,旧宿主仍可查询和更新。首次 setup 失败或 SDK 安装开始后的失败会释放核心,不承诺回滚部分安装。自行使用 `dashboard.definition` 对接其他 Devframe 宿主时,调用方必须负责最终关闭和启动失败时的 `dashboard.dispose()`。核心不启动服务器,也不拥有外部宿主的认证、Origin 或 MCP 策略;共享宿主不是只读沙箱。
135
135
 
136
- DevTools `0.7.6` 自身存在程序化重启边界:重复使用同一个 `DevTools()` 返回值时,旧实例关闭可能同时关闭新实例的 WebSocket;不安装 Dashboard 也能复现。应在每次重载的 Vite 配置中重新调用 `DevTools()`,不要把该 SDK 插件实例长期缓存在复用的 inline 配置里。上述重启验证使用重新创建的 SDK 宿主和保留的 Dashboard 控制器,不代表修复了上游传输问题。
136
+ DevTools 自身存在程序化重启边界:重复使用同一个 `DevTools()` 返回值时,旧实例关闭可能同时关闭新实例的 WebSocket;不安装 Dashboard 也能复现。应在每次重载的 Vite 配置中重新调用 `DevTools()`,不要把该 SDK 插件实例长期缓存在复用的 inline 配置里。上述重启验证使用重新创建的 SDK 宿主和保留的 Dashboard 控制器,不代表修复了上游传输问题。
137
137
 
138
138
  面板默认位于 `/__weapp-vite/`,自定义目录与应用 `base` 独立。前端复用宿主连接或从页面相对位置发现元数据,复制视图链接保留目录和查询参数但排除认证 fragment。适配器只在开发模式挂载,生产构建不要求可选面板资源,也不导出报告。以上入口仅用于 Node 开发 / 构建宿主,不应导入小程序 AppService。
139
139
 
@@ -590,3 +590,9 @@ const artifact = await buildTestArtifact({ cwd: process.cwd() })
590
590
  ## AI 改动验收
591
591
 
592
592
  通过 `wv accept --inspect --json` 检查环境;审阅配置后运行 `wv accept --trust --json`。现有 MCP 同时提供验收启动、状态、取消和报告工具,无需模型 Key。[接入指南](https://vite.weapp.dev/guide/acceptance)。独立 `weapp-agent` CLI 同仓维护并保留原命令。
593
+
594
+ ## 微信开发者工具多版本
595
+
596
+ 默认使用本机已安装的最新 Stable。用 `wv ide devtools list` 查看安装,`wv ide devtools add "<path-to-cli>"` 登记自定义位置;`wv open --devtools-channel=nightly` 或 `wv build --open --devtools-channel=rc --devtools-version=<version>` 明确选择测试版本。旧 `cliPath` 和路径环境变量继续固定安装,显式渠道/版本可覆盖继承配置。官方版本查询不阻塞默认选择,`--require-official-latest` 可启用严格检查。
597
+
598
+ 仓库包可用 `pnpm e2e:ide:matrix --targets=stable,rc,nightly --suite=ide-smoke` 串行测试已有安装。矩阵记录实际 IDE、基础库和资源清理结果;缺失、未登录、失败或未完成项返回非零。安装与登录由用户完成。同一账号切换安装后可能需要重新扫码;矩阵以非交互模式记录“需要重新登录”并继续其他版本,无需预备多个账号。完整 CLI、编程接口和 MCP 用法见 [weapp-ide-cli 文档](https://vite.weapp.dev/packages/weapp-ide-cli)。
package/dist/docs/mcp.md CHANGED
@@ -448,3 +448,13 @@ MCP 服务端做了以下约束:
448
448
  ## 验收任务
449
449
 
450
450
  现有服务提供 weapp_project_inspect、weapp_acceptance_start/status/cancel/report,无需模型 Key。验收与其他运行操作按工程互斥;任务使用独立日志订阅。HTTP 请求共享任务服务,断开单次请求不会丢失任务;服务关闭保存取消结果,重启不重放交互。
451
+
452
+ ## 微信开发者工具安装选择
453
+
454
+ `wv mcp` 和 `weapp mcp` 共用 `weapp-ide-cli` 的安装解析。默认本机最新 Stable,保留路径与旧全局 `cliPath` 固定;RC/nightly 需要明确选择。连接工具与相关 REST 请求支持 `cliPath`、`devtoolsChannel`、`devtoolsVersion`、`requireOfficialLatest`,同层选择必须一致;会话以实际安装身份隔离。
455
+
456
+ ```json
457
+ { "projectPath": "dist/dev/mp-weixin", "devtoolsChannel": "rc", "devtoolsVersion": "2.02.2608080" }
458
+ ```
459
+
460
+ 用 `wv ide devtools list --json` 查看实际渠道、版本和配置目录,用 `wv ide devtools add "<path-to-cli>"` 登记已有安装。`wv open --devtools-channel=nightly` 自动启动的后台 MCP 会继承具体 CLI 路径。官方查询默认仅作提示,`requireOfficialLatest: true` 才启用严格检查。登录保留在各安装实际配置目录中,不复制账号数据。
@@ -70,3 +70,11 @@ pnpm --filter weapp-vite build
70
70
  ## IDE 恢复与窗口保留
71
71
 
72
72
  打开项目、刷新索引或截图重试失败时,CLI 会保留现有开发者工具窗口,只重试目标项目连接;不会自动退出整个应用或按进程名终止宿主。`--no-open-recovery` 可禁用打开后的自动重试。需要真正关闭窗口时,请在 IDE 中明确选择目标项目;`wv close` 失败会返回非零退出码,不会升级为系统级退出。
73
+
74
+ ## 自动化连接清理与 CDP
75
+
76
+ 程序化使用 `@weapp-vite/miniprogram-automator` 或 `weapp-ide-cli` 时,`disconnect()` 返回 `Promise<void>`。同步清理回调应改为返回或 `await miniProgram.disconnect()`;调用时立即拒绝未完成 RPC 并停止订阅,Promise 等待 WebSocket 关闭。独立关闭最多等待 2 秒,超时表示关闭未确认,不能记录窗口、端口租约或快照已经释放。连接断开只影响本连接,受管窗口由持有 owner 的会话 `close()` 确认关闭;重连复用原窗口和 endpoint。
77
+
78
+ SDK 的公开 `send(method, params?, { timeout }?)` 可调用原始自动化协议。`CDP()` 提供 `enable`、`sendCommand(domain, method, params?, options?)`、`listProtocol` 和返回取消订阅函数的 `onEvent`;具体域和命令依赖目标 DevTools。headless 只适配 `Tool.getInfo`、`App.getCurrentPage/getPageStack/callFunction/callWxMethod`,CDP 和其他协议明确报告 `HEADLESS_PROTOCOL_UNSUPPORTED`,不构造真实 IDE 调试证据。
79
+
80
+ 触摸脚本使用标准 `changedTouches` 字段;旧 `changeTouches` 仍兼容,同时传入时以标准字段为准。启动失败诊断会附加已脱敏的 CLI 输出尾部,截断有明确标记;结合原始 `cause` 与 `operation` 阶段、预算和清理状态定位失败。
@@ -128,13 +128,36 @@ defineOptions({ behaviors: [i18n.behavior] })
128
128
 
129
129
  `weapp.vue.template.scopedSlotsRequireProps` 默认 `false`,普通插槽仍使用增强方案。设为 `true` 时,无 scoped props 的内容保留原生 `<slot>`。
130
130
 
131
- 微信目标下,编译后的 Wevu Provider 和 Leaf 使用默认 `setupLifecycle: 'attached'` 时,`<Provider><Leaf /></Provider>` 中的 Leaf 会在 setup 前同步关联最近的插槽承载者。Leaf 的 `inject()` 能取得 Provider 提供的原始对象、ref 和方法;点击调用 action 会更新双方共享状态。具名、普通节点包裹、嵌套和多实例场景遵循同一规则,卸载重建不会沿用旧上下文。
131
+ 原生插槽上下文协议由独立的 `weapp.vue.template.nativeSlotContext` 控制,默认 `false`,**仅在微信小程序目标(`weapp`)下生效**。7.5.0 引入的该能力改为显式开启:在微信目标下,需要时同时配置 `scopedSlotsRequireProps: true` 与 `nativeSlotContext: true`。未配置或显式关闭时,不生成协议标记、声明属性及插槽事件,也不为普通组件注册协议方法、observer 或清理回调;普通 `provide/inject` 与增强插槽语义不变。
132
+
133
+ 支付宝、抖音、百度和 Web 等其他目标即使配置 `nativeSlotContext: true`,也不会启用此协议或生成对应声明属性、事件接收与清理代码,不能获得这里描述的原生插槽最近 Provider 上下文继承。普通 `provide/inject` 和增强插槽仍遵循各平台既有语义。以下启用示例仅适用于微信小程序目标:
134
+
135
+ ```ts
136
+ import { defineConfig } from 'weapp-vite/config'
137
+
138
+ export default defineConfig({
139
+ weapp: {
140
+ vue: {
141
+ template: {
142
+ scopedSlotsRequireProps: true,
143
+ nativeSlotContext: true,
144
+ },
145
+ },
146
+ },
147
+ })
148
+ ```
149
+
150
+ 开启后,编译器会跳过可静态确认与上下文无关的纯展示组件、仅使用 `ref` 的组件及其纯容器,同时移除对应声明属性。直接或间接使用上下文的组件、插槽转发者,以及拥有相关子组件的中间 Wevu 组件仍参与协议;无法确认源码或动态调用行为时保守保留。判断依据包含组件和组合函数依赖,依赖变化时会重新编译引用方,不能仅按当前文件是否导入 `provide/inject` 裁剪。
151
+
152
+ 普通 `<script>` 中跨实例共享的对象/ref 及跨模块共享值不能仅凭初始值判定安全,异步函数和生成器也保守参与;每个实例新建的纯值仍可裁剪。循环解构的默认值和计算键保留实际执行语义,但不会延长 `inject()` 的有效实例上下文。显式组件注册覆盖自动导入时,生成路径和原生/Wevu 身份来自同一个注册结果;仅更新 JSON 不会丢失 barrel 等宿主解析依赖。
153
+
154
+ 显式开启后,微信目标下编译的 Wevu Provider 和 Leaf 使用默认 `setupLifecycle: 'attached'` 时,`<Provider><Leaf /></Provider>` 中的 Leaf 会在 setup 前同步关联最近的插槽承载者。Leaf 的 `inject()` 能取得 Provider 提供的原始对象、ref 和方法;点击调用 action 会更新双方共享状态。具名、普通节点包裹、嵌套和多实例场景遵循同一规则,卸载重建不会沿用旧上下文。
132
155
 
133
156
  这条协议不新增包装节点,不复制注入值,不修改原生 `Component.export` / `selectOwnerComponent()`。显式 `setupLifecycle: 'created'` 或 attached 前的公开实例恢复仍按原时机执行 setup,不提供该保证;未经 Wevu 编译的原生/第三方组件也不自动成为注入承载者。
134
157
 
135
158
  内层 Wevu Provider 即使使用过滤后的 `export()` / `expose()`,其普通模板子组件(含 Options API 局部注册别名)和原生插槽子组件仍共享内层上下文;外部选择器只看到该 Provider 的公开导出,内部父链不依赖公开导出对象。
136
159
 
137
- 已验证环境:微信 DevTools Stable `2.02.2608080`(基础库 `3.17.2`、`3.13.2`)和 `2.02.2608060`(基础库 `3.17.2`),并保留 mpcore 回归;这些结果不代替其他版本组合或真机验证。其他小程序平台及 Web 目标不启用此协议,构建时裁剪其声明属性、事件接收与清理代码,不能由微信或 headless 结果推断支持。`false` / augmented 和实际 scoped props 继续使用既有增强插槽路径。
160
+ 已验证环境:微信 DevTools Stable `2.02.2608080`(基础库 `3.17.2`、`3.13.2`)和 `2.02.2608060`(基础库 `3.17.2`),并保留 mpcore 回归;这些结果不代替其他版本组合或真机验证,也不能由微信或 headless 结果推断其他平台支持。`false` / augmented 和实际 scoped props 继续使用既有增强插槽路径。
138
161
 
139
162
  ## 具名插槽透传 wrapper
140
163
 
@@ -1,6 +1,7 @@
1
- import { t as createCompilerContext } from "./createContext-BqYzHhY9.mjs";
2
- import { r as resolveAnalyzeBudgets, t as terminateStaleSassEmbeddedProcess } from "./processCleanup-B6KA30Zc.mjs";
1
+ import { t as createCompilerContext } from "./createContext-tApLtII-.mjs";
2
+ import { n as resolveAnalyzeBudgets } from "./metadata-hwF7QRcS.mjs";
3
3
  import { r as readDoctorFiles } from "./files-BqxFIPRp.mjs";
4
+ import { t as terminateStaleSassEmbeddedProcess } from "./processCleanup-BQn2kTcK.mjs";
4
5
  import process from "node:process";
5
6
  import path from "node:path";
6
7
  import { randomUUID } from "node:crypto";
package/dist/doctor.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { Xn as MpPlatform } from "./config-V0L-IAJf.mjs";
2
- import { i as AnalyzeBudgetConfig } from "./budget-BD7VqLCl.mjs";
1
+ import { Yn as MpPlatform } from "./config-Bf6DWhyb.mjs";
2
+ import { i as AnalyzeBudgetConfig } from "./budget-CTLOHwgI.mjs";
3
3
  import { OperationDiagnostics } from "@weapp-vite/miniprogram-automator";
4
4
  //#region src/doctor/types.d.ts
5
5
  type DoctorLayer = 'project' | 'source' | 'artifact' | 'runtime';
package/dist/doctor.mjs CHANGED
@@ -1,19 +1,20 @@
1
1
  import { l as getProjectPlatformOptions, m as resolveMiniPlatform, o as getPlatformOutputExtensions } from "./platform-CnkySBKz.mjs";
2
- import { i as createAnalyzeBudgetCheck } from "./analyze-ZJUvEdaY.mjs";
3
- import { n as classifyPackage, t as version } from "./package-7swhyLmf.mjs";
2
+ import { t as version } from "./package-Cmakyy3J.mjs";
3
+ import { t as createAnalyzeBudgetCheck } from "./budget-EOeEycc_.mjs";
4
+ import { t as classifyPackage } from "./classifier-DBJY__kg.mjs";
4
5
  import { n as parseObject, r as readDoctorFiles, t as objectValue } from "./files-BqxFIPRp.mjs";
5
6
  import process from "node:process";
6
7
  import { constants } from "node:fs";
7
8
  import { fileURLToPath } from "node:url";
8
9
  import path, { posix } from "node:path";
9
10
  import { parseJsLike, traverse } from "@weapp-vite/ast/babel";
10
- import { access, readFile, stat } from "node:fs/promises";
11
+ import { access, readFile, stat as stat$1 } from "node:fs/promises";
11
12
  import { createHash } from "node:crypto";
12
13
  import { Parser } from "htmlparser2";
13
14
  import postcss from "postcss";
14
15
  import valueParser from "postcss-value-parser";
15
- import { fork } from "node:child_process";
16
16
  import { connectOpenedAutomator, queryWechatIdeLogin, resolveProjectAutomatorPort } from "weapp-ide-cli";
17
+ import { fork } from "node:child_process";
17
18
  import { createConnection } from "node:net";
18
19
  import { miniProgramRuntimePlugin, wevuCompatibilityPlugin } from "@weapp-vite/eslint";
19
20
  import tsParser from "@typescript-eslint/parser";
@@ -458,7 +459,7 @@ async function buildDoctorSnapshot(options, target) {
458
459
  /** 仅检查文件及平台执行条件,不执行 CLI 或项目配置。 */
459
460
  async function inspectDoctorCli(cliPath) {
460
461
  try {
461
- if (!(await stat(cliPath)).isFile()) return false;
462
+ if (!(await stat$1(cliPath)).isFile()) return false;
462
463
  if (process.platform === "win32" && ![
463
464
  ".exe",
464
465
  ".cmd",
@@ -636,16 +637,17 @@ async function probeDoctorRuntime(cwd, target, port, options = {}) {
636
637
  ]) record(stage, "not-run", "connection-unavailable");
637
638
  return evidence;
638
639
  }
639
- let released = false;
640
+ let releasing;
640
641
  const release = () => {
641
- if (released) return;
642
- released = true;
643
- try {
644
- session.disconnect();
642
+ releasing ??= (async () => {
643
+ await session.disconnect();
645
644
  record("session-release", "passed", "disconnected");
646
- } catch {
645
+ })().catch((error) => {
646
+ releasing = void 0;
647
647
  record("session-release", "failed", "disconnect-failed");
648
- }
648
+ throw error;
649
+ });
650
+ return releasing;
649
651
  };
650
652
  scope.own(release, "doctor-websocket");
651
653
  const checks = [];
@@ -673,7 +675,7 @@ async function probeDoctorRuntime(cwd, target, port, options = {}) {
673
675
  return true;
674
676
  })]);
675
677
  } finally {
676
- release();
678
+ await scope.step(release, { stage: "session-release" });
677
679
  }
678
680
  for (const stage of ["host-version", "sdk-version"]) if (facts.find((fact) => fact.stage === stage)?.status === "not-run") record(stage, "unknown", "tool-info-unavailable");
679
681
  evidence.checks = checks;
@@ -0,0 +1,54 @@
1
+ import { createRequire } from "node:module";
2
+ import { readFileSync } from "node:fs";
3
+ import { pathToFileURL } from "node:url";
4
+ //#region src/runtime/viteHost/engine.ts
5
+ function readIdentity(file) {
6
+ const value = JSON.parse(readFileSync(file, "utf8"));
7
+ if (!value || typeof value !== "object" || !("name" in value) || typeof value.name !== "string" || !("version" in value) || typeof value.version !== "string") throw new Error("[weapp-vite] Vite 宿主 package.json 缺少 name/version。");
8
+ return {
9
+ name: value.name,
10
+ version: value.version
11
+ };
12
+ }
13
+ /** 按宿主的真实导出解析引擎,不依赖扁平 node_modules 布局或版本号相等。 */
14
+ function resolveViteHost(importer = import.meta.url) {
15
+ const packagePath = createRequire(importer).resolve("vite/package.json");
16
+ const identity = readIdentity(packagePath);
17
+ const hostRequire = createRequire(packagePath);
18
+ if (identity.name === "@voidzero-dev/vite-plus-core") return {
19
+ kind: "vite-plus",
20
+ packagePath,
21
+ packageVersion: identity.version,
22
+ experimentalPath: hostRequire.resolve("@voidzero-dev/vite-plus-core/rolldown/experimental")
23
+ };
24
+ if (identity.name !== "vite") throw new Error(`[weapp-vite] 不支持的 Vite 宿主:${identity.name}@${identity.version}。`);
25
+ return {
26
+ kind: "vite",
27
+ packagePath,
28
+ packageVersion: identity.version,
29
+ experimentalPath: hostRequire.resolve("rolldown/experimental")
30
+ };
31
+ }
32
+ /** 加载与宿主绑定的引擎;缺失能力时保留原始错误,禁止回退到另一套引擎。 */
33
+ async function loadHostRolldown(importer) {
34
+ let identity;
35
+ try {
36
+ identity = resolveViteHost(importer);
37
+ const runtime = await import(pathToFileURL(identity.experimentalPath).href);
38
+ if (typeof runtime.dev !== "function" || typeof runtime.scan !== "function") throw new TypeError("Rolldown 缺少 dev/scan 能力");
39
+ return runtime;
40
+ } catch (cause) {
41
+ const host = identity ? `${identity.kind}@${identity.packageVersion}` : "vite";
42
+ throw new Error(`[weapp-vite] 无法加载 ${host} 配套的 Rolldown;请检查宿主依赖和 Vite+ alias 配置。`, { cause });
43
+ }
44
+ }
45
+ /** 原生输出写出也绑定宿主引擎,避免 Vite+ 额外加载包内另一套 Rolldown。 */
46
+ async function loadHostRolldownBuild(importer) {
47
+ const identity = resolveViteHost(importer);
48
+ const entry = createRequire(identity.packagePath).resolve(identity.kind === "vite-plus" ? "@voidzero-dev/vite-plus-core/rolldown" : "rolldown");
49
+ const runtime = await import(pathToFileURL(entry).href);
50
+ if (typeof runtime.rolldown !== "function") throw new TypeError(`[weapp-vite] ${identity.kind}@${identity.packageVersion} 缺少 Rolldown 原生写出能力。`);
51
+ return runtime;
52
+ }
53
+ //#endregion
54
+ export { loadHostRolldownBuild as n, loadHostRolldown as t };
@@ -3,6 +3,7 @@ import { createRequire } from "node:module";
3
3
  import process from "node:process";
4
4
  import path from "pathe";
5
5
  import { fs } from "@weapp-core/shared/fs";
6
+ import { createBabelBackendLoader } from "@weapp-vite/ast/babelLoader";
6
7
  import { recursive } from "merge";
7
8
  import { parse } from "vue/compiler-sfc";
8
9
  //#region src/utils/file/autoRoutes.ts
@@ -54,7 +55,7 @@ function resolveAutoRoutesMacroImportPath() {
54
55
  }
55
56
  async function resolveAutoRoutesInlineSnapshot(context) {
56
57
  try {
57
- const compilerContext = context ?? (await import("./getInstance-SiE6WZRh.mjs")).getCompilerContext();
58
+ const compilerContext = context ?? (await import("./getInstance-BAIaU2y9.mjs")).getCompilerContext();
58
59
  const service = compilerContext.autoRoutesService;
59
60
  const reference = service?.getReference?.();
60
61
  if (!compilerContext.runtimeState.autoRoutes.loadingAppConfig) await service?.ensureFresh?.();
@@ -159,7 +160,28 @@ async function touch(filename) {
159
160
  }
160
161
  }
161
162
  //#endregion
163
+ //#region src/plugins/utils/sourceSnapshot/registry.ts
164
+ const snapshots = /* @__PURE__ */ new WeakMap();
165
+ function getCompilerSourceSnapshotView(owner) {
166
+ return snapshots.get(owner);
167
+ }
168
+ function replaceCompilerSourceSnapshotView(owner, snapshot) {
169
+ if (snapshot) snapshots.set(owner, snapshot);
170
+ else snapshots.delete(owner);
171
+ }
172
+ function getCompilerSourceSnapshot(owner) {
173
+ return snapshots.get(owner)?.sources;
174
+ }
175
+ function getCompilerSourceResolutions(owner) {
176
+ return snapshots.get(owner)?.resolutions;
177
+ }
178
+ /** 轻量消费者只读取已登记的代际;源码身份由登记方沿用原编译器规则解析。 */
179
+ function readCompilerSourceSnapshotInput(owner, id) {
180
+ return snapshots.get(owner)?.readSource(id);
181
+ }
182
+ //#endregion
162
183
  //#region src/utils/file/vueConfig.ts
184
+ const loadVueCompiler = createBabelBackendLoader(() => import("wevu/compiler"));
163
185
  const vueConfigCache = /* @__PURE__ */ new Map();
164
186
  const contextConfigCaches = /* @__PURE__ */ new WeakMap();
165
187
  const configMtimeInFlight = /* @__PURE__ */ new Map();
@@ -194,13 +216,17 @@ async function isVueConfigCacheValid(vueFilePath, cache) {
194
216
  async function extractConfigFromVue(vueFilePath, options) {
195
217
  try {
196
218
  const context = options?.compilerContext;
219
+ const hasExplicitSource = options?.source !== void 0 || options?.readSource !== void 0;
220
+ let snapshotSource;
221
+ if (!hasExplicitSource && context?.configService) snapshotSource = readCompilerSourceSnapshotInput(context.configService, vueFilePath);
222
+ const useDiskCache = !hasExplicitSource && snapshotSource === void 0;
197
223
  const cache = context ? contextConfigCaches.get(context) ?? /* @__PURE__ */ new Map() : vueConfigCache;
198
224
  if (context) contextConfigCaches.set(context, cache);
199
- const cached = options?.force ? void 0 : cache.get(vueFilePath);
225
+ const cached = options?.force || !useDiskCache ? void 0 : cache.get(vueFilePath);
200
226
  let autoRoutesInline;
201
227
  if (cached?.autoRoutesSignature !== void 0) autoRoutesInline = await resolveAutoRoutesInlineSnapshot(context);
202
228
  if (cached && (cached.autoRoutesSignature === void 0 || cached.autoRoutesSignature === JSON.stringify(autoRoutesInline)) && await isVueConfigCacheValid(vueFilePath, cached)) return cached.config;
203
- const content = options?.source ?? (options?.readSource ? await options.readSource() : await fs.readFile(vueFilePath, "utf-8"));
229
+ const content = options?.source ?? (options?.readSource ? await options.readSource() : snapshotSource ?? await fs.readFile(vueFilePath, "utf-8"));
204
230
  if (content === void 0) return;
205
231
  const { descriptor, errors } = parse(content, { filename: vueFilePath });
206
232
  if (errors.length > 0) return;
@@ -218,7 +244,7 @@ async function extractConfigFromVue(vueFilePath, options) {
218
244
  } catch {}
219
245
  const setupContent = descriptor.scriptSetup?.content;
220
246
  if (typeof setupContent === "string" && JSON_MACRO_HINT_RE.test(setupContent)) {
221
- const { extractJsonMacroFromScriptSetup } = await import("wevu/compiler");
247
+ const { extractJsonMacroFromScriptSetup } = await loadVueCompiler();
222
248
  try {
223
249
  const preambleContent = descriptor.script?.content;
224
250
  autoRoutesInline = hasAutoRoutesMacroImport(setupContent) || preambleContent !== void 0 && hasAutoRoutesMacroImport(preambleContent) ? autoRoutesInline ?? await resolveAutoRoutesInlineSnapshot(options?.compilerContext) : void 0;
@@ -230,21 +256,23 @@ async function extractConfigFromVue(vueFilePath, options) {
230
256
  if (jsonBlocks.length === 0) throw error;
231
257
  }
232
258
  }
233
- const normalizedDependencies = [...new Set(macroDependencies.filter((dep) => dep && !NODE_MODULES_RE.test(dep)).map((dep) => path.normalize(dep)))];
234
- const dependencyMtimeMs = /* @__PURE__ */ new Map();
235
- await Promise.all(normalizedDependencies.map(async (dep) => {
236
- const mtime = await getMtimeCached(dep);
237
- if (mtime !== void 0) dependencyMtimeMs.set(dep, mtime);
238
- }));
239
- const fileMtimeMs = await getMtimeCached(vueFilePath);
240
259
  const hasConfig = Object.keys(mergedConfig).length > 0;
241
- cache.set(vueFilePath, {
242
- config: hasConfig ? mergedConfig : void 0,
243
- autoRoutesSignature: autoRoutesInline && JSON.stringify(autoRoutesInline),
244
- fileMtimeMs,
245
- dependencies: normalizedDependencies,
246
- dependencyMtimeMs
247
- });
260
+ if (useDiskCache) {
261
+ const normalizedDependencies = [...new Set(macroDependencies.filter((dep) => dep && !NODE_MODULES_RE.test(dep)).map((dep) => path.normalize(dep)))];
262
+ const dependencyMtimeMs = /* @__PURE__ */ new Map();
263
+ await Promise.all(normalizedDependencies.map(async (dep) => {
264
+ const mtime = await getMtimeCached(dep);
265
+ if (mtime !== void 0) dependencyMtimeMs.set(dep, mtime);
266
+ }));
267
+ const fileMtimeMs = await getMtimeCached(vueFilePath);
268
+ cache.set(vueFilePath, {
269
+ config: hasConfig ? mergedConfig : void 0,
270
+ autoRoutesSignature: autoRoutesInline && JSON.stringify(autoRoutesInline),
271
+ fileMtimeMs,
272
+ dependencies: normalizedDependencies,
273
+ dependencyMtimeMs
274
+ });
275
+ }
248
276
  return hasConfig ? mergedConfig : void 0;
249
277
  } catch (error) {
250
278
  if (process.env.__WEAPP_VITE_DEBUG_VUE_CONFIG__) console.error("[extractConfigFromVue] failed:", vueFilePath, error);
@@ -252,4 +280,4 @@ async function extractConfigFromVue(vueFilePath, options) {
252
280
  }
253
281
  }
254
282
  //#endregion
255
- export { findJsonEntry as a, isJsOrTs as c, touch as d, getAutoRoutesMacroImportCandidates as f, resolveAutoRoutesInlineSnapshot as h, findJsEntry as i, isTemplate as l, inlineAutoRoutesImports as m, changeFileExtension as n, findTemplateEntry as o, hasAutoRoutesMacroImport as p, findCssEntry as r, findVueEntry as s, extractConfigFromVue as t, normalizeFileExtension as u };
283
+ export { hasAutoRoutesMacroImport as _, replaceCompilerSourceSnapshotView as a, findJsEntry as c, findVueEntry as d, isJsOrTs as f, getAutoRoutesMacroImportCandidates as g, touch as h, getCompilerSourceSnapshotView as i, findJsonEntry as l, normalizeFileExtension as m, getCompilerSourceResolutions as n, changeFileExtension as o, isTemplate as p, getCompilerSourceSnapshot as r, findCssEntry as s, extractConfigFromVue as t, findTemplateEntry as u, inlineAutoRoutesImports as v, resolveAutoRoutesInlineSnapshot as y };
@@ -0,0 +1 @@
1
+ export { t as extractConfigFromVue } from "./file-CcIOmqhC.mjs";