@weapp-vite/web 1.3.36 → 1.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.
Files changed (321) hide show
  1. package/README.md +144 -5
  2. package/dist/_virtual/_rolldown/runtime.mjs +19 -1
  3. package/dist/compiler/wxml/attributes.mjs +1 -1
  4. package/dist/compiler/wxml/attributes.mjs.map +1 -1
  5. package/dist/compiler/wxml/compile.mjs +6 -3
  6. package/dist/compiler/wxml/compile.mjs.map +1 -1
  7. package/dist/compiler/wxml/interpolation.mjs +1 -2
  8. package/dist/compiler/wxml/interpolation.mjs.map +1 -1
  9. package/dist/compiler/wxml/navigation.mjs +5 -7
  10. package/dist/compiler/wxml/navigation.mjs.map +1 -1
  11. package/dist/compiler/wxml/parser.mjs +5 -5
  12. package/dist/compiler/wxml/parser.mjs.map +1 -1
  13. package/dist/compiler/wxml/renderer.mjs +13 -12
  14. package/dist/compiler/wxml/renderer.mjs.map +1 -1
  15. package/dist/compiler/wxml/specialNodes.mjs +6 -1
  16. package/dist/compiler/wxml/specialNodes.mjs.map +1 -1
  17. package/dist/compiler/wxml/types.d.mts +12 -0
  18. package/dist/compiler/wxs.mjs +5 -5
  19. package/dist/compiler/wxs.mjs.map +1 -1
  20. package/dist/css/wxss.d.mts +1 -0
  21. package/dist/css/wxss.mjs +110 -9
  22. package/dist/css/wxss.mjs.map +1 -1
  23. package/dist/index.d.mts +29 -6
  24. package/dist/index.mjs +197 -4
  25. package/dist/index.mjs.map +1 -0
  26. package/dist/plugin/assets.d.mts +7 -0
  27. package/dist/plugin/assets.mjs +122 -0
  28. package/dist/plugin/assets.mjs.map +1 -0
  29. package/dist/plugin/constants.mjs +10 -1
  30. package/dist/plugin/constants.mjs.map +1 -1
  31. package/dist/plugin/dependencyScan.mjs +41 -0
  32. package/dist/plugin/dependencyScan.mjs.map +1 -0
  33. package/dist/plugin/entry.mjs +56 -7
  34. package/dist/plugin/entry.mjs.map +1 -1
  35. package/dist/plugin/files.mjs +1 -1
  36. package/dist/plugin/files.mjs.map +1 -1
  37. package/dist/plugin/index.d.mts +37 -3
  38. package/dist/plugin/index.mjs +245 -74
  39. package/dist/plugin/index.mjs.map +1 -1
  40. package/dist/plugin/layout.mjs +24 -0
  41. package/dist/plugin/layout.mjs.map +1 -0
  42. package/dist/plugin/path.mjs +4 -1
  43. package/dist/plugin/path.mjs.map +1 -1
  44. package/dist/plugin/register.mjs +48 -36
  45. package/dist/plugin/register.mjs.map +1 -1
  46. package/dist/plugin/scan.mjs +206 -94
  47. package/dist/plugin/scan.mjs.map +1 -1
  48. package/dist/plugin/scanSfc.mjs +65 -0
  49. package/dist/plugin/scanSfc.mjs.map +1 -0
  50. package/dist/plugin/state.mjs +3 -2
  51. package/dist/plugin/state.mjs.map +1 -1
  52. package/dist/plugin/styleModule.mjs +52 -0
  53. package/dist/plugin/styleModule.mjs.map +1 -0
  54. package/dist/plugin/types.d.mts +46 -1
  55. package/dist/plugin/vueSfc.mjs +149 -0
  56. package/dist/plugin/vueSfc.mjs.map +1 -0
  57. package/dist/runtime/appShell/container.mjs +25 -0
  58. package/dist/runtime/appShell/container.mjs.map +1 -0
  59. package/dist/runtime/appShell/tabBar/index.mjs +192 -0
  60. package/dist/runtime/appShell/tabBar/index.mjs.map +1 -0
  61. package/dist/runtime/appShell/tabBar/style.mjs +127 -0
  62. package/dist/runtime/appShell/tabBar/style.mjs.map +1 -0
  63. package/dist/runtime/button/helpers.mjs +1 -58
  64. package/dist/runtime/button/helpers.mjs.map +1 -1
  65. package/dist/runtime/button/index.d.mts +4 -5
  66. package/dist/runtime/button/index.mjs +6 -28
  67. package/dist/runtime/button/index.mjs.map +1 -1
  68. package/dist/runtime/button/style.mjs +53 -28
  69. package/dist/runtime/button/style.mjs.map +1 -1
  70. package/dist/runtime/component/behavior.mjs +26 -2
  71. package/dist/runtime/component/behavior.mjs.map +1 -1
  72. package/dist/runtime/component/element.mjs +107 -31
  73. package/dist/runtime/component/element.mjs.map +1 -1
  74. package/dist/runtime/component/observers.mjs +36 -0
  75. package/dist/runtime/component/observers.mjs.map +1 -0
  76. package/dist/runtime/component/publicInstance.mjs +48 -0
  77. package/dist/runtime/component/publicInstance.mjs.map +1 -0
  78. package/dist/runtime/component/relations.mjs +35 -0
  79. package/dist/runtime/component/relations.mjs.map +1 -0
  80. package/dist/runtime/component/slots.mjs +24 -0
  81. package/dist/runtime/component/slots.mjs.map +1 -0
  82. package/dist/runtime/component/state.mjs +13 -3
  83. package/dist/runtime/component/state.mjs.map +1 -1
  84. package/dist/runtime/component/types.d.mts +29 -4
  85. package/dist/runtime/component/virtualHost.mjs +83 -0
  86. package/dist/runtime/component/virtualHost.mjs.map +1 -0
  87. package/dist/runtime/host/index.d.mts +13 -0
  88. package/dist/runtime/host/index.mjs +47 -0
  89. package/dist/runtime/host/index.mjs.map +1 -0
  90. package/dist/runtime/host/types.d.mts +28 -0
  91. package/dist/runtime/hostGlobals.d.mts +9 -0
  92. package/dist/runtime/hostGlobals.mjs +39 -0
  93. package/dist/runtime/hostGlobals.mjs.map +1 -0
  94. package/dist/runtime/index.d.mts +21 -3
  95. package/dist/runtime/index.mjs +26 -4
  96. package/dist/runtime/index.mjs.map +1 -0
  97. package/dist/runtime/legacyTemplate/dom.mjs +3 -3
  98. package/dist/runtime/legacyTemplate/dom.mjs.map +1 -1
  99. package/dist/runtime/legacyTemplate/expression.mjs +9 -9
  100. package/dist/runtime/legacyTemplate/expression.mjs.map +1 -1
  101. package/dist/runtime/legacyTemplate/index.mjs +6 -6
  102. package/dist/runtime/legacyTemplate/index.mjs.map +1 -1
  103. package/dist/runtime/nativeComponents/canvas/index.mjs +53 -0
  104. package/dist/runtime/nativeComponents/canvas/index.mjs.map +1 -0
  105. package/dist/runtime/nativeComponents/checkbox.mjs +137 -0
  106. package/dist/runtime/nativeComponents/checkbox.mjs.map +1 -0
  107. package/dist/runtime/nativeComponents/cover/index.mjs +23 -0
  108. package/dist/runtime/nativeComponents/cover/index.mjs.map +1 -0
  109. package/dist/runtime/nativeComponents/form.d.mts +7 -0
  110. package/dist/runtime/nativeComponents/form.mjs +50 -0
  111. package/dist/runtime/nativeComponents/form.mjs.map +1 -0
  112. package/dist/runtime/nativeComponents/formControl.mjs +61 -0
  113. package/dist/runtime/nativeComponents/formControl.mjs.map +1 -0
  114. package/dist/runtime/nativeComponents/helpers.mjs +25 -0
  115. package/dist/runtime/nativeComponents/helpers.mjs.map +1 -0
  116. package/dist/runtime/nativeComponents/icon/helpers.mjs +42 -0
  117. package/dist/runtime/nativeComponents/icon/helpers.mjs.map +1 -0
  118. package/dist/runtime/nativeComponents/icon/index.mjs +45 -0
  119. package/dist/runtime/nativeComponents/icon/index.mjs.map +1 -0
  120. package/dist/runtime/nativeComponents/icon/style.mjs +176 -0
  121. package/dist/runtime/nativeComponents/icon/style.mjs.map +1 -0
  122. package/dist/runtime/nativeComponents/image.d.mts +8 -0
  123. package/dist/runtime/nativeComponents/image.mjs +121 -0
  124. package/dist/runtime/nativeComponents/image.mjs.map +1 -0
  125. package/dist/runtime/nativeComponents/index.d.mts +11 -0
  126. package/dist/runtime/nativeComponents/index.mjs +83 -0
  127. package/dist/runtime/nativeComponents/index.mjs.map +1 -0
  128. package/dist/runtime/nativeComponents/input.d.mts +8 -0
  129. package/dist/runtime/nativeComponents/input.mjs +131 -0
  130. package/dist/runtime/nativeComponents/input.mjs.map +1 -0
  131. package/dist/runtime/nativeComponents/label.mjs +36 -0
  132. package/dist/runtime/nativeComponents/label.mjs.map +1 -0
  133. package/dist/runtime/nativeComponents/mediaRegistry.mjs +47 -0
  134. package/dist/runtime/nativeComponents/mediaRegistry.mjs.map +1 -0
  135. package/dist/runtime/nativeComponents/movable/helpers.mjs +23 -0
  136. package/dist/runtime/nativeComponents/movable/helpers.mjs.map +1 -0
  137. package/dist/runtime/nativeComponents/movable/index.mjs +117 -0
  138. package/dist/runtime/nativeComponents/movable/index.mjs.map +1 -0
  139. package/dist/runtime/nativeComponents/navigator.mjs +200 -0
  140. package/dist/runtime/nativeComponents/navigator.mjs.map +1 -0
  141. package/dist/runtime/nativeComponents/picker/editors.mjs +74 -0
  142. package/dist/runtime/nativeComponents/picker/editors.mjs.map +1 -0
  143. package/dist/runtime/nativeComponents/picker/helpers.mjs +57 -0
  144. package/dist/runtime/nativeComponents/picker/helpers.mjs.map +1 -0
  145. package/dist/runtime/nativeComponents/picker/index.mjs +210 -0
  146. package/dist/runtime/nativeComponents/picker/index.mjs.map +1 -0
  147. package/dist/runtime/nativeComponents/picker/style.mjs +71 -0
  148. package/dist/runtime/nativeComponents/picker/style.mjs.map +1 -0
  149. package/dist/runtime/nativeComponents/pickerView/column.mjs +134 -0
  150. package/dist/runtime/nativeComponents/pickerView/column.mjs.map +1 -0
  151. package/dist/runtime/nativeComponents/pickerView/helpers.mjs +17 -0
  152. package/dist/runtime/nativeComponents/pickerView/helpers.mjs.map +1 -0
  153. package/dist/runtime/nativeComponents/pickerView/index.mjs +128 -0
  154. package/dist/runtime/nativeComponents/pickerView/index.mjs.map +1 -0
  155. package/dist/runtime/nativeComponents/pickerView/style.mjs +58 -0
  156. package/dist/runtime/nativeComponents/pickerView/style.mjs.map +1 -0
  157. package/dist/runtime/nativeComponents/primitives.mjs +16 -0
  158. package/dist/runtime/nativeComponents/primitives.mjs.map +1 -0
  159. package/dist/runtime/nativeComponents/progress/helpers.mjs +29 -0
  160. package/dist/runtime/nativeComponents/progress/helpers.mjs.map +1 -0
  161. package/dist/runtime/nativeComponents/progress/index.mjs +130 -0
  162. package/dist/runtime/nativeComponents/progress/index.mjs.map +1 -0
  163. package/dist/runtime/nativeComponents/progress/style.mjs +40 -0
  164. package/dist/runtime/nativeComponents/progress/style.mjs.map +1 -0
  165. package/dist/runtime/nativeComponents/radio.mjs +147 -0
  166. package/dist/runtime/nativeComponents/radio.mjs.map +1 -0
  167. package/dist/runtime/nativeComponents/richText/helpers.mjs +230 -0
  168. package/dist/runtime/nativeComponents/richText/helpers.mjs.map +1 -0
  169. package/dist/runtime/nativeComponents/richText/index.mjs +74 -0
  170. package/dist/runtime/nativeComponents/richText/index.mjs.map +1 -0
  171. package/dist/runtime/nativeComponents/scrollView.d.mts +15 -0
  172. package/dist/runtime/nativeComponents/scrollView.mjs +79 -0
  173. package/dist/runtime/nativeComponents/scrollView.mjs.map +1 -0
  174. package/dist/runtime/nativeComponents/slider/helpers.mjs +28 -0
  175. package/dist/runtime/nativeComponents/slider/helpers.mjs.map +1 -0
  176. package/dist/runtime/nativeComponents/slider/index.mjs +120 -0
  177. package/dist/runtime/nativeComponents/slider/index.mjs.map +1 -0
  178. package/dist/runtime/nativeComponents/slider/style.mjs +60 -0
  179. package/dist/runtime/nativeComponents/slider/style.mjs.map +1 -0
  180. package/dist/runtime/nativeComponents/style.mjs +41 -0
  181. package/dist/runtime/nativeComponents/style.mjs.map +1 -0
  182. package/dist/runtime/nativeComponents/swiper/helpers.mjs +52 -0
  183. package/dist/runtime/nativeComponents/swiper/helpers.mjs.map +1 -0
  184. package/dist/runtime/nativeComponents/swiper/index.mjs +235 -0
  185. package/dist/runtime/nativeComponents/swiper/index.mjs.map +1 -0
  186. package/dist/runtime/nativeComponents/swiper/item.mjs +14 -0
  187. package/dist/runtime/nativeComponents/swiper/item.mjs.map +1 -0
  188. package/dist/runtime/nativeComponents/swiper/style.mjs +20 -0
  189. package/dist/runtime/nativeComponents/swiper/style.mjs.map +1 -0
  190. package/dist/runtime/nativeComponents/switch.d.mts +7 -0
  191. package/dist/runtime/nativeComponents/switch.mjs +132 -0
  192. package/dist/runtime/nativeComponents/switch.mjs.map +1 -0
  193. package/dist/runtime/nativeComponents/textarea.d.mts +9 -0
  194. package/dist/runtime/nativeComponents/textarea.mjs +144 -0
  195. package/dist/runtime/nativeComponents/textarea.mjs.map +1 -0
  196. package/dist/runtime/nativeComponents/video/helpers.d.mts +12 -0
  197. package/dist/runtime/nativeComponents/video/helpers.mjs +21 -0
  198. package/dist/runtime/nativeComponents/video/helpers.mjs.map +1 -0
  199. package/dist/runtime/nativeComponents/video/index.mjs +124 -0
  200. package/dist/runtime/nativeComponents/video/index.mjs.map +1 -0
  201. package/dist/runtime/nativeComponents/video/style.mjs +14 -0
  202. package/dist/runtime/nativeComponents/video/style.mjs.map +1 -0
  203. package/dist/runtime/navigationBar/index.mjs +1 -3
  204. package/dist/runtime/navigationBar/index.mjs.map +1 -1
  205. package/dist/runtime/pageLayout.d.mts +9 -0
  206. package/dist/runtime/pageLayout.mjs +16 -0
  207. package/dist/runtime/pageLayout.mjs.map +1 -0
  208. package/dist/runtime/polyfill/animation.mjs +120 -0
  209. package/dist/runtime/polyfill/animation.mjs.map +1 -0
  210. package/dist/runtime/polyfill/appState.mjs +1 -1
  211. package/dist/runtime/polyfill/appState.mjs.map +1 -1
  212. package/dist/runtime/polyfill/async.d.mts +7 -0
  213. package/dist/runtime/polyfill/async.mjs.map +1 -1
  214. package/dist/runtime/polyfill/canvasContext.mjs +41 -0
  215. package/dist/runtime/polyfill/canvasContext.mjs.map +1 -1
  216. package/dist/runtime/polyfill/device.mjs +1 -1
  217. package/dist/runtime/polyfill/device.mjs.map +1 -1
  218. package/dist/runtime/polyfill/deviceAuthSystemApi.mjs +8 -2
  219. package/dist/runtime/polyfill/deviceAuthSystemApi.mjs.map +1 -1
  220. package/dist/runtime/polyfill/eventBus.mjs +56 -0
  221. package/dist/runtime/polyfill/eventBus.mjs.map +1 -0
  222. package/dist/runtime/polyfill/fileSystemManager.mjs +5 -2
  223. package/dist/runtime/polyfill/fileSystemManager.mjs.map +1 -1
  224. package/dist/runtime/polyfill/files.mjs +10 -10
  225. package/dist/runtime/polyfill/files.mjs.map +1 -1
  226. package/dist/runtime/polyfill/font.mjs +32 -0
  227. package/dist/runtime/polyfill/font.mjs.map +1 -0
  228. package/dist/runtime/polyfill/index.d.mts +2 -2
  229. package/dist/runtime/polyfill/index.mjs +49 -45
  230. package/dist/runtime/polyfill/index.mjs.map +1 -1
  231. package/dist/runtime/polyfill/interaction.mjs +7 -6
  232. package/dist/runtime/polyfill/interaction.mjs.map +1 -1
  233. package/dist/runtime/polyfill/interactionApi.mjs +3 -2
  234. package/dist/runtime/polyfill/interactionApi.mjs.map +1 -1
  235. package/dist/runtime/polyfill/intersectionObserver.mjs +106 -0
  236. package/dist/runtime/polyfill/intersectionObserver.mjs.map +1 -0
  237. package/dist/runtime/polyfill/locale.mjs +14 -0
  238. package/dist/runtime/polyfill/locale.mjs.map +1 -0
  239. package/dist/runtime/polyfill/locationApi.mjs +7 -4
  240. package/dist/runtime/polyfill/locationApi.mjs.map +1 -1
  241. package/dist/runtime/polyfill/mediaActions.mjs +2 -2
  242. package/dist/runtime/polyfill/mediaActions.mjs.map +1 -1
  243. package/dist/runtime/polyfill/mediaApi/file.mjs +1 -1
  244. package/dist/runtime/polyfill/mediaApi/info.mjs +6 -4
  245. package/dist/runtime/polyfill/mediaApi/info.mjs.map +1 -1
  246. package/dist/runtime/polyfill/menuApi.mjs +38 -4
  247. package/dist/runtime/polyfill/menuApi.mjs.map +1 -1
  248. package/dist/runtime/polyfill/navigationBarRuntime.mjs +6 -1
  249. package/dist/runtime/polyfill/navigationBarRuntime.mjs.map +1 -1
  250. package/dist/runtime/polyfill/network/request.mjs +2 -2
  251. package/dist/runtime/polyfill/network/request.mjs.map +1 -1
  252. package/dist/runtime/polyfill/platformApi.mjs +1 -1
  253. package/dist/runtime/polyfill/routeRuntime/appLifecycle.mjs +88 -0
  254. package/dist/runtime/polyfill/routeRuntime/appLifecycle.mjs.map +1 -0
  255. package/dist/runtime/polyfill/routeRuntime/dom.mjs +44 -15
  256. package/dist/runtime/polyfill/routeRuntime/dom.mjs.map +1 -1
  257. package/dist/runtime/polyfill/routeRuntime/history.d.mts +30 -0
  258. package/dist/runtime/polyfill/routeRuntime/history.mjs +148 -0
  259. package/dist/runtime/polyfill/routeRuntime/history.mjs.map +1 -0
  260. package/dist/runtime/polyfill/routeRuntime/lifecycle.mjs +39 -8
  261. package/dist/runtime/polyfill/routeRuntime/lifecycle.mjs.map +1 -1
  262. package/dist/runtime/polyfill/routeRuntime/options.d.mts +11 -1
  263. package/dist/runtime/polyfill/routeRuntime/options.mjs +0 -1
  264. package/dist/runtime/polyfill/routeRuntime/options.mjs.map +1 -1
  265. package/dist/runtime/polyfill/routeRuntime/result.mjs +12 -0
  266. package/dist/runtime/polyfill/routeRuntime/result.mjs.map +1 -0
  267. package/dist/runtime/polyfill/routeRuntime/scroll.mjs +39 -0
  268. package/dist/runtime/polyfill/routeRuntime/scroll.mjs.map +1 -0
  269. package/dist/runtime/polyfill/routeRuntime/stack.mjs +122 -0
  270. package/dist/runtime/polyfill/routeRuntime/stack.mjs.map +1 -0
  271. package/dist/runtime/polyfill/routeRuntime.d.mts +26 -17
  272. package/dist/runtime/polyfill/routeRuntime.mjs +121 -96
  273. package/dist/runtime/polyfill/routeRuntime.mjs.map +1 -1
  274. package/dist/runtime/polyfill/runtimeDataApi.mjs +8 -3
  275. package/dist/runtime/polyfill/runtimeDataApi.mjs.map +1 -1
  276. package/dist/runtime/polyfill/runtimeOps.mjs +10 -6
  277. package/dist/runtime/polyfill/runtimeOps.mjs.map +1 -1
  278. package/dist/runtime/polyfill/selectorQuery.mjs +70 -14
  279. package/dist/runtime/polyfill/selectorQuery.mjs.map +1 -1
  280. package/dist/runtime/polyfill/storage.mjs +5 -2
  281. package/dist/runtime/polyfill/storage.mjs.map +1 -1
  282. package/dist/runtime/polyfill/system.mjs +30 -3
  283. package/dist/runtime/polyfill/system.mjs.map +1 -1
  284. package/dist/runtime/polyfill/types/locationRuntime.d.mts +1 -4
  285. package/dist/runtime/polyfill/types/platformRuntime.d.mts +9 -0
  286. package/dist/runtime/polyfill/types/systemAuth.d.mts +20 -9
  287. package/dist/runtime/polyfill/types/tabBarRuntime.d.mts +25 -0
  288. package/dist/runtime/polyfill/ui.mjs +2 -6
  289. package/dist/runtime/polyfill/ui.mjs.map +1 -1
  290. package/dist/runtime/polyfill/uiMediaApi.d.mts +11 -10
  291. package/dist/runtime/polyfill/uiMediaApi.mjs +26 -2
  292. package/dist/runtime/polyfill/uiMediaApi.mjs.map +1 -1
  293. package/dist/runtime/polyfill/videoContext.mjs +4 -0
  294. package/dist/runtime/polyfill/videoContext.mjs.map +1 -1
  295. package/dist/runtime/polyfill/vkSession.mjs +4 -14
  296. package/dist/runtime/polyfill/vkSession.mjs.map +1 -1
  297. package/dist/runtime/polyfill.d.mts +2 -2
  298. package/dist/runtime/renderContext.mjs +1 -1
  299. package/dist/runtime/renderContext.mjs.map +1 -1
  300. package/dist/runtime/rpx.mjs +17 -8
  301. package/dist/runtime/rpx.mjs.map +1 -1
  302. package/dist/runtime/seo/index.d.mts +31 -0
  303. package/dist/runtime/seo/index.mjs +94 -0
  304. package/dist/runtime/seo/index.mjs.map +1 -0
  305. package/dist/runtime/viewport/index.d.mts +12 -0
  306. package/dist/runtime/viewport/index.mjs +44 -0
  307. package/dist/runtime/viewport/index.mjs.map +1 -0
  308. package/dist/runtime/viewport/style.mjs +62 -0
  309. package/dist/runtime/viewport/style.mjs.map +1 -0
  310. package/dist/runtime/viewport/types.d.mts +14 -0
  311. package/dist/runtime/wevu.d.mts +20 -0
  312. package/dist/runtime/wevu.mjs +73 -0
  313. package/dist/runtime/wevu.mjs.map +1 -0
  314. package/dist/shared/nativeComponents.mjs +401 -0
  315. package/dist/shared/nativeComponents.mjs.map +1 -0
  316. package/dist/shared/tabBar.d.mts +19 -0
  317. package/dist/shared/tabBar.mjs +37 -0
  318. package/dist/shared/tabBar.mjs.map +1 -0
  319. package/dist/shared/wxml.mjs +3 -20
  320. package/dist/shared/wxml.mjs.map +1 -1
  321. package/package.json +13 -5
@@ -1 +1 @@
1
- {"version":3,"file":"scan.mjs","names":[],"sources":["../../src/plugin/scan.ts"],"sourcesContent":["import type { ComponentEntry, PageEntry, ScanState, WarnFn } from './types'\nimport process from 'node:process'\n\nimport { dirname, extname, join, posix, relative, resolve } from 'pathe'\nimport { slugify } from '../shared/slugify'\nimport { isRecord, readJsonFile, resolveJsonPath, resolveScriptFile, resolveStyleFile, resolveTemplateFile } from './files'\nimport { mergeNavigationConfig, pickNavigationConfig } from './navigation'\nimport { normalizePath, toPosixId } from './path'\nimport { collectComponentTagsFromConfig, collectComponentTagsFromJson, mergeComponentTags } from './scanConfig'\n\ninterface ScanProjectOptions {\n srcRoot: string\n warn?: WarnFn\n state: ScanState\n}\n\nexport async function scanProject({ srcRoot, warn, state }: ScanProjectOptions) {\n state.moduleMeta.clear()\n state.pageNavigationMap.clear()\n state.templateComponentMap.clear()\n state.templatePathSet.clear()\n state.componentTagMap.clear()\n state.componentIdMap.clear()\n\n let appNavigationDefaults = {}\n let appComponentTags: Record<string, string> = {}\n\n const pages = new Map<string, PageEntry>()\n const components = new Map<string, ComponentEntry>()\n\n const reportWarning = (message: string) => {\n if (warn) {\n warn(message)\n return\n }\n if (typeof process !== 'undefined' && typeof process.emitWarning === 'function') {\n process.emitWarning(message)\n }\n }\n\n const appScript = await resolveScriptFile(join(srcRoot, 'app'))\n if (appScript) {\n state.moduleMeta.set(normalizePath(appScript), {\n kind: 'app',\n id: 'app',\n scriptPath: appScript,\n stylePath: await resolveStyleFile(appScript),\n })\n }\n\n const resolveComponentScript = async (raw: string, importerDir: string) => {\n const base = resolveComponentBase(raw, importerDir, srcRoot)\n if (!base) {\n return undefined\n }\n return resolveScriptFile(base)\n }\n\n const getComponentId = (script: string) => {\n const cached = state.componentIdMap.get(script)\n if (cached) {\n return cached\n }\n const idRelative = relative(srcRoot, script).replace(new RegExp(`${extname(script)}$`), '')\n const componentIdPosix = toPosixId(idRelative)\n state.componentIdMap.set(script, componentIdPosix)\n return componentIdPosix\n }\n\n const getComponentTag = (script: string) => {\n const cached = state.componentTagMap.get(script)\n if (cached) {\n return cached\n }\n const id = getComponentId(script)\n const tag = slugify(id, 'wv-component')\n state.componentTagMap.set(script, tag)\n return tag\n }\n\n const collectComponent = async (componentId: string, importerDir: string) => {\n const base = resolveComponentBase(componentId, importerDir, srcRoot)\n const script = base ? await resolveScriptFile(base) : undefined\n if (!script || components.has(script)) {\n return\n }\n\n const idRelative = relative(srcRoot, script).replace(new RegExp(`${extname(script)}$`), '')\n const componentIdPosix = toPosixId(idRelative)\n const template = await resolveTemplateFile(script)\n const style = await resolveStyleFile(script)\n\n if (template) {\n state.templatePathSet.add(normalizePath(template))\n }\n\n state.moduleMeta.set(normalizePath(script), {\n kind: 'component',\n id: componentIdPosix,\n scriptPath: script,\n templatePath: template,\n stylePath: style,\n })\n\n components.set(script, { script, id: componentIdPosix })\n\n const componentJsonBasePath = `${script.replace(new RegExp(`${extname(script)}$`), '')}.json`\n const componentTags = await collectComponentTagsFromJson({\n jsonBasePath: componentJsonBasePath,\n importerDir: dirname(script),\n warn: reportWarning,\n collectFromConfig: (json, nextImporterDir, jsonPath, nextWarn) => collectComponentTagsFromConfig({\n json,\n importerDir: nextImporterDir,\n jsonPath,\n warn: nextWarn,\n resolveComponentScript,\n getComponentTag,\n collectComponent,\n }),\n })\n\n if (!template) {\n return\n }\n\n const mergedTags = mergeComponentTags(appComponentTags, componentTags)\n if (Object.keys(mergedTags).length > 0) {\n state.templateComponentMap.set(normalizePath(template), mergedTags)\n return\n }\n state.templateComponentMap.delete(normalizePath(template))\n }\n\n const appJsonBasePath = join(srcRoot, 'app.json')\n const appJsonPath = await resolveJsonPath(appJsonBasePath)\n if (appJsonPath) {\n const appJson = await readJsonFile(appJsonPath)\n\n if (appJson) {\n appComponentTags = await collectComponentTagsFromConfig({\n json: appJson,\n importerDir: srcRoot,\n jsonPath: appJsonPath,\n warn: reportWarning,\n resolveComponentScript,\n getComponentTag,\n collectComponent,\n onResolved: (tags) => {\n appComponentTags = tags\n },\n })\n }\n\n if (appJson?.pages && Array.isArray(appJson.pages)) {\n for (const page of appJson.pages) {\n if (typeof page === 'string') {\n await collectPage(page)\n }\n }\n }\n\n if (appJson?.subPackages && Array.isArray(appJson.subPackages)) {\n for (const pkg of appJson.subPackages) {\n if (!pkg || typeof pkg !== 'object' || !Array.isArray(pkg.pages)) {\n continue\n }\n const root = typeof pkg.root === 'string' ? pkg.root : ''\n for (const page of pkg.pages) {\n if (typeof page !== 'string') {\n continue\n }\n await collectPage(posix.join(root, page))\n }\n }\n }\n\n const windowConfig = isRecord(appJson?.window) ? appJson.window : undefined\n appNavigationDefaults = pickNavigationConfig(windowConfig)\n }\n\n state.appNavigationDefaults = appNavigationDefaults\n state.appComponentTags = appComponentTags\n state.scanResult = {\n app: appScript,\n pages: Array.from(pages.values()),\n components: Array.from(components.values()),\n }\n\n async function collectPage(pageId: string) {\n const base = join(srcRoot, pageId)\n const script = await resolveScriptFile(base)\n if (!script) {\n return\n }\n\n const template = await resolveTemplateFile(base)\n if (template) {\n state.templatePathSet.add(normalizePath(template))\n }\n\n const style = await resolveStyleFile(base)\n const pageJsonBasePath = join(srcRoot, `${pageId}.json`)\n const pageJsonPath = await resolveJsonPath(pageJsonBasePath)\n const pageJson = pageJsonPath ? await readJsonFile(pageJsonPath) : undefined\n\n state.moduleMeta.set(normalizePath(script), {\n kind: 'page',\n id: toPosixId(pageId),\n scriptPath: script,\n templatePath: template,\n stylePath: style,\n })\n\n pages.set(script, {\n script,\n id: toPosixId(pageId),\n })\n\n const pageComponentTags = pageJson && pageJsonPath\n ? await collectComponentTagsFromConfig({\n json: pageJson,\n importerDir: dirname(script),\n jsonPath: pageJsonPath,\n warn: reportWarning,\n resolveComponentScript,\n getComponentTag,\n collectComponent,\n })\n : await collectComponentTagsFromJson({\n jsonBasePath: pageJsonBasePath,\n importerDir: dirname(script),\n warn: reportWarning,\n collectFromConfig: (json, importerDir, jsonPath, nextWarn) => collectComponentTagsFromConfig({\n json,\n importerDir,\n jsonPath,\n warn: nextWarn,\n resolveComponentScript,\n getComponentTag,\n collectComponent,\n }),\n })\n\n if (template) {\n const mergedTags = mergeComponentTags(appComponentTags, pageComponentTags)\n if (Object.keys(mergedTags).length > 0) {\n state.templateComponentMap.set(normalizePath(template), mergedTags)\n }\n else {\n state.templateComponentMap.delete(normalizePath(template))\n }\n }\n\n if (!template) {\n return\n }\n\n if (pageJson) {\n state.pageNavigationMap.set(\n normalizePath(template),\n mergeNavigationConfig(appNavigationDefaults, pickNavigationConfig(pageJson)),\n )\n return\n }\n\n state.pageNavigationMap.set(normalizePath(template), { ...appNavigationDefaults })\n }\n}\n\nfunction resolveComponentBase(raw: string, importerDir: string, srcRoot: string) {\n if (!raw) {\n return undefined\n }\n if (raw.startsWith('.')) {\n return resolve(importerDir, raw)\n }\n if (raw.startsWith('/')) {\n return resolve(srcRoot, raw.slice(1))\n }\n return resolve(srcRoot, raw)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"scan.mjs","names":[],"sources":["../../src/plugin/scan.ts"],"sourcesContent":["import type { WebTabBarConfig } from '../shared/tabBar'\nimport type { ComponentEntry, LayoutEntry, ModuleMeta, PageEntry, ResolveWebAutoImportTag, ResolveWebModuleId, ScanState, WarnFn } from './types'\n\nimport { readdir } from 'node:fs/promises'\nimport process from 'node:process'\nimport { dirname, extname, join, posix, relative, resolve } from 'pathe'\nimport { slugify } from '../shared/slugify'\nimport { normalizeWebTabBarConfig } from '../shared/tabBar'\nimport { SCRIPT_EXTS } from './constants'\nimport { isRecord, readJsonFile, resolveJsonPath, resolveScriptFile, resolveStyleFile, resolveTemplateFile } from './files'\nimport { mergeNavigationConfig, pickNavigationConfig } from './navigation'\nimport { isInsideDir, normalizePath, toPosixId } from './path'\nimport { collectComponentTagsFromConfig, collectComponentTagsFromJson, mergeComponentTags } from './scanConfig'\nimport { compileScannedSfc, discoverWebPageIds } from './scanSfc'\n\ninterface ScanProjectOptions {\n srcRoot: string\n warn?: WarnFn\n state: ScanState\n resolveId?: ResolveWebModuleId\n resolveAutoImportTag?: ResolveWebAutoImportTag\n resolveAppConfig?: (appConfigPath: string) => Promise<Record<string, unknown> | undefined>\n uniApp?: { include: string[] }\n}\n\nexport function getStableWebComponentId(script: string, srcRoot: string) {\n const normalized = script.replace(/\\\\/g, '/')\n const nodeModulesIndex = normalized.lastIndexOf('/node_modules/')\n const extension = extname(script)\n if (nodeModulesIndex >= 0) {\n const packageRelative = normalized.slice(nodeModulesIndex + '/node_modules/'.length)\n return `__external__/${packageRelative.slice(0, -extension.length)}`\n }\n return toPosixId(relative(srcRoot, script).slice(0, -extension.length))\n}\n\nfunction resolveComponentBase(raw: string, importerDir: string, srcRoot: string) {\n if (!raw) {\n return undefined\n }\n if (raw.startsWith('.')) {\n return resolve(importerDir, raw)\n }\n if (raw.startsWith('/')) {\n return resolve(srcRoot, raw.slice(1))\n }\n return undefined\n}\n\nexport async function scanProject({ srcRoot, warn, state, resolveId, resolveAutoImportTag, resolveAppConfig, uniApp }: ScanProjectOptions) {\n state.moduleMeta.clear()\n state.pageNavigationMap.clear()\n state.templateComponentMap.clear()\n state.templatePathSet.clear()\n state.componentTagMap.clear()\n state.sfcResults.clear()\n\n let appNavigationDefaults = {}\n let appComponentTags: Record<string, string> = {}\n let appTabBar: WebTabBarConfig | undefined\n\n const pages = new Map<string, PageEntry>()\n const components = new Map<string, ComponentEntry>()\n const layouts = new Map<string, LayoutEntry>()\n\n async function walk(current: string, files: string[]) {\n const entries = await readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const pathname = join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(pathname, files)\n }\n else {\n files.push(pathname)\n }\n }\n }\n\n const reportWarning = (message: string) => {\n if (warn) {\n warn(message)\n return\n }\n process.emitWarning(message)\n }\n\n const appScript = await resolveScriptFile(join(srcRoot, 'app'))\n if (appScript) {\n const appMeta: ModuleMeta = {\n kind: 'app',\n id: 'app',\n scriptPath: appScript,\n stylePath: await resolveStyleFile(appScript),\n sourceType: appScript.endsWith('.vue') ? 'vue-sfc' : 'native',\n }\n state.moduleMeta.set(normalizePath(appScript), appMeta)\n }\n\n const resolveComponentScript = async (raw: string, importerDir: string) => {\n const base = resolveComponentBase(raw, importerDir, srcRoot)\n if (base) {\n const resolved = await resolveScriptFile(base)\n return resolved ? normalizePath(resolved) : undefined\n }\n const importer = join(importerDir, '__weapp_web_using_components__.ts')\n const resolved = await resolveId?.(raw, importer)\n const script = resolved ? await resolveScriptFile(resolved) : undefined\n return script ? normalizePath(script) : undefined\n }\n\n const getStableComponentId = (script: string) => {\n return getStableWebComponentId(script, srcRoot)\n }\n\n const getComponentTag = (script: string) => {\n const cached = state.componentTagMap.get(script)\n if (cached) {\n return cached\n }\n const id = getStableComponentId(script)\n const tag = slugify(id, 'wv-component')\n state.componentTagMap.set(script, tag)\n return tag\n }\n\n const collectComponent = async (componentId: string, importerDir: string) => {\n const script = await resolveComponentScript(componentId, importerDir)\n if (!script) {\n return\n }\n\n const existing = components.get(script)\n if (existing) {\n existing.importId ??= resolveComponentBase(componentId, importerDir, srcRoot)\n ? undefined\n : componentId\n return\n }\n\n const componentIdPosix = getStableComponentId(script)\n const importId = resolveComponentBase(componentId, importerDir, srcRoot)\n ? (isInsideDir(script, srcRoot) ? undefined : componentIdPosix)\n : componentId\n const template = await resolveTemplateFile(script)\n const style = await resolveStyleFile(script)\n\n if (template) {\n state.templatePathSet.add(normalizePath(template))\n }\n\n const componentMeta: ModuleMeta = {\n kind: 'component',\n id: componentIdPosix,\n scriptPath: script,\n templatePath: template,\n stylePath: style,\n sourceType: script.endsWith('.vue') ? 'vue-sfc' : 'native',\n }\n state.moduleMeta.set(normalizePath(script), componentMeta)\n\n components.set(script, { script, id: componentIdPosix, importId })\n\n const componentJsonBasePath = `${script.replace(new RegExp(`${extname(script)}$`), '')}.json`\n const sfcConfig = script.endsWith('.vue')\n ? (await compileScannedSfc({ filename: script, meta: componentMeta, srcRoot, state, resolveId, resolveAutoImportTag, uniApp })).config\n : undefined\n const componentTags = sfcConfig\n ? await collectComponentTagsFromConfig({\n json: sfcConfig,\n importerDir: dirname(script),\n jsonPath: script,\n warn: reportWarning,\n resolveComponentScript,\n getComponentTag,\n collectComponent,\n })\n : await collectComponentTagsFromJson({\n jsonBasePath: componentJsonBasePath,\n importerDir: dirname(script),\n warn: reportWarning,\n collectFromConfig: (json, nextImporterDir, jsonPath, nextWarn) => collectComponentTagsFromConfig({\n json,\n importerDir: nextImporterDir,\n jsonPath,\n warn: nextWarn,\n resolveComponentScript,\n getComponentTag,\n collectComponent,\n }),\n })\n componentMeta.componentTags = mergeComponentTags(appComponentTags, componentTags)\n\n if (!template) {\n return\n }\n\n const mergedTags = mergeComponentTags(appComponentTags, componentTags)\n if (Object.keys(mergedTags).length > 0) {\n state.templateComponentMap.set(normalizePath(template), mergedTags)\n return\n }\n state.templateComponentMap.delete(normalizePath(template))\n }\n\n async function collectPage(pageId: string) {\n const base = join(srcRoot, pageId)\n const script = await resolveScriptFile(base)\n if (!script) {\n return\n }\n\n const template = await resolveTemplateFile(base)\n if (template) {\n state.templatePathSet.add(normalizePath(template))\n }\n\n const style = await resolveStyleFile(base)\n const pageJsonBasePath = join(srcRoot, `${pageId}.json`)\n const pageJsonPath = await resolveJsonPath(pageJsonBasePath)\n const pageJson = pageJsonPath ? await readJsonFile(pageJsonPath) : undefined\n const pageMeta: ModuleMeta = {\n kind: 'page',\n id: toPosixId(pageId),\n scriptPath: script,\n templatePath: template,\n stylePath: style,\n sourceType: script.endsWith('.vue') ? 'vue-sfc' : 'native',\n }\n\n const sfcConfig = script.endsWith('.vue')\n ? (await compileScannedSfc({ filename: script, meta: pageMeta, srcRoot, state, resolveId, resolveAutoImportTag, uniApp })).config\n : undefined\n const resolvedNavigationConfig = mergeNavigationConfig(\n appNavigationDefaults,\n sfcConfig ? pickNavigationConfig(sfcConfig) : pageJson ? pickNavigationConfig(pageJson) : {},\n )\n pageMeta.navigationBar = Object.keys(resolvedNavigationConfig).length > 0\n ? resolvedNavigationConfig\n : undefined\n state.moduleMeta.set(normalizePath(script), pageMeta)\n\n pages.set(script, {\n script,\n id: toPosixId(pageId),\n })\n\n const pageComponentTags = sfcConfig\n ? await collectComponentTagsFromConfig({\n json: sfcConfig,\n importerDir: dirname(script),\n jsonPath: script,\n warn: reportWarning,\n resolveComponentScript,\n getComponentTag,\n collectComponent,\n })\n : pageJson && pageJsonPath\n ? await collectComponentTagsFromConfig({\n json: pageJson,\n importerDir: dirname(script),\n jsonPath: pageJsonPath,\n warn: reportWarning,\n resolveComponentScript,\n getComponentTag,\n collectComponent,\n })\n : {}\n\n if (template) {\n const mergedTags = mergeComponentTags(appComponentTags, pageComponentTags)\n if (Object.keys(mergedTags).length > 0) {\n state.templateComponentMap.set(normalizePath(template), mergedTags)\n }\n else {\n state.templateComponentMap.delete(normalizePath(template))\n }\n }\n pageMeta.componentTags = mergeComponentTags(appComponentTags, pageComponentTags)\n\n if (!template) {\n return\n }\n\n state.pageNavigationMap.set(normalizePath(template), resolvedNavigationConfig)\n }\n\n async function collectLayouts() {\n const layoutsRoot = join(srcRoot, 'layouts')\n const files: string[] = []\n try {\n await walk(layoutsRoot, files)\n }\n catch {\n return\n }\n for (const filename of files.sort()) {\n const script = SCRIPT_EXTS.includes(extname(filename)) ? filename : undefined\n if (!script) {\n continue\n }\n const relativePath = relative(layoutsRoot, script).replace(/\\\\/g, '/')\n const segments = relativePath.split('/')\n segments.pop()\n if (segments[segments.length - 1] === 'index') {\n segments.pop()\n }\n const name = segments.join('/')\n if (!name) {\n continue\n }\n const id = `layouts/${name}`\n const template = await resolveTemplateFile(script)\n const style = await resolveStyleFile(script)\n const tag = slugify(id, 'wv-component')\n state.moduleMeta.set(normalizePath(script), {\n kind: 'component',\n id,\n scriptPath: script,\n templatePath: template,\n stylePath: style,\n sourceType: 'native',\n })\n layouts.set(script, { script, id, name, tag, template, style })\n if (template) {\n state.templatePathSet.add(normalizePath(template))\n }\n }\n }\n\n const appJsonBasePath = join(srcRoot, 'app.json')\n const appJsonPath = await resolveJsonPath(appJsonBasePath)\n let appJson = appJsonPath\n ? await (resolveAppConfig ? resolveAppConfig(appJsonPath) : readJsonFile(appJsonPath))\n : undefined\n if (appScript?.endsWith('.vue')) {\n const appMeta = state.moduleMeta.get(normalizePath(appScript))!\n const sfcConfig = (await compileScannedSfc({ filename: appScript, meta: appMeta, srcRoot, state, resolveId, resolveAutoImportTag, uniApp })).config\n appJson = {\n ...(sfcConfig ?? {}),\n ...(appJson ?? {}),\n }\n }\n if (appJson) {\n appComponentTags = await collectComponentTagsFromConfig({\n json: appJson,\n importerDir: srcRoot,\n jsonPath: appJsonPath ?? appScript!,\n warn: reportWarning,\n resolveComponentScript,\n getComponentTag,\n collectComponent,\n onResolved: (tags) => {\n appComponentTags = tags\n },\n })\n\n const windowConfig = isRecord(appJson?.window) ? appJson.window : undefined\n appNavigationDefaults = pickNavigationConfig(windowConfig)\n\n const configuredPages = Array.isArray(appJson.pages)\n ? appJson.pages.filter((page): page is string => typeof page === 'string')\n : []\n for (const page of configuredPages.length > 0 ? configuredPages : await discoverWebPageIds(srcRoot)) {\n await collectPage(page)\n }\n\n const subPackages = Array.isArray(appJson.subPackages)\n ? appJson.subPackages\n : Array.isArray(appJson.subpackages)\n ? appJson.subpackages\n : []\n if (subPackages.length > 0) {\n for (const pkg of subPackages) {\n if (!pkg || typeof pkg !== 'object' || !Array.isArray(pkg.pages)) {\n continue\n }\n const root = typeof pkg.root === 'string' ? pkg.root : ''\n for (const page of pkg.pages) {\n if (typeof page !== 'string') {\n continue\n }\n await collectPage(posix.join(root, page))\n }\n }\n }\n\n appTabBar = normalizeWebTabBarConfig(appJson?.tabBar)\n }\n else {\n for (const page of await discoverWebPageIds(srcRoot)) {\n await collectPage(page)\n }\n }\n\n await collectLayouts()\n\n state.appNavigationDefaults = appNavigationDefaults\n state.appComponentTags = appComponentTags\n state.scanResult = {\n app: appScript,\n pages: Array.from(pages.values()),\n components: Array.from(components.values()),\n layouts: Array.from(layouts.values()),\n tabBar: appTabBar,\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { SCRIPT_EXTS } from "./constants.mjs";
2
+ import { isRecord, resolveTemplateFile } from "./files.mjs";
3
+ import { compileWebVueSfc } from "./vueSfc.mjs";
4
+ import { readFile, readdir } from "node:fs/promises";
5
+ import path from "pathe";
6
+
7
+ //#region src/plugin/scanSfc.ts
8
+ const PAGE_SEGMENT = "pages";
9
+ const EXCLUDED_PAGE_SEGMENTS = /* @__PURE__ */ new Set([
10
+ "components",
11
+ "custom-tab-bar",
12
+ "layouts"
13
+ ]);
14
+ function parseSfcJsonConfig(source) {
15
+ if (!source) return;
16
+ try {
17
+ const parsed = JSON.parse(source);
18
+ return isRecord(parsed) ? parsed : void 0;
19
+ } catch {
20
+ return;
21
+ }
22
+ }
23
+ async function compileScannedSfc(options) {
24
+ const source = await readFile(options.filename, "utf8");
25
+ const result = await compileWebVueSfc({
26
+ ...options,
27
+ source
28
+ });
29
+ return {
30
+ result,
31
+ config: parseSfcJsonConfig(result.config)
32
+ };
33
+ }
34
+ function isPageCandidate(relativePath) {
35
+ const segments = relativePath.split("/");
36
+ const pagesIndex = segments.indexOf(PAGE_SEGMENT);
37
+ if (pagesIndex < 0) return false;
38
+ return !segments.slice(pagesIndex + 1, -1).some((segment) => EXCLUDED_PAGE_SEGMENTS.has(segment));
39
+ }
40
+ async function walk(current, files) {
41
+ const entries = await readdir(current, { withFileTypes: true });
42
+ for (const entry of entries) {
43
+ const pathname = path.join(current, entry.name);
44
+ if (entry.isDirectory()) await walk(pathname, files);
45
+ else files.push(pathname);
46
+ }
47
+ }
48
+ async function discoverWebPageIds(srcRoot) {
49
+ const files = [];
50
+ await walk(srcRoot, files);
51
+ const pageIds = /* @__PURE__ */ new Set();
52
+ for (const filename of files.sort()) {
53
+ const extension = path.extname(filename);
54
+ if (!SCRIPT_EXTS.includes(extension)) continue;
55
+ const relativePath = path.relative(srcRoot, filename).replaceAll("\\", "/");
56
+ if (!isPageCandidate(relativePath)) continue;
57
+ if (extension !== ".vue" && !await resolveTemplateFile(filename)) continue;
58
+ pageIds.add(relativePath.slice(0, -extension.length));
59
+ }
60
+ return [...pageIds];
61
+ }
62
+
63
+ //#endregion
64
+ export { compileScannedSfc, discoverWebPageIds, parseSfcJsonConfig };
65
+ //# sourceMappingURL=scanSfc.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanSfc.mjs","names":[],"sources":["../../src/plugin/scanSfc.ts"],"sourcesContent":["import type { ModuleMeta, ResolveWebAutoImportTag, ResolveWebModuleId, ScanState } from './types'\nimport { readdir, readFile } from 'node:fs/promises'\nimport path from 'pathe'\nimport { SCRIPT_EXTS } from './constants'\nimport { isRecord, resolveTemplateFile } from './files'\nimport { compileWebVueSfc } from './vueSfc'\n\nconst PAGE_SEGMENT = 'pages'\nconst EXCLUDED_PAGE_SEGMENTS = new Set(['components', 'custom-tab-bar', 'layouts'])\n\nexport function parseSfcJsonConfig(source?: string) {\n if (!source) {\n return undefined\n }\n try {\n const parsed = JSON.parse(source) as unknown\n return isRecord(parsed) ? parsed : undefined\n }\n catch {\n return undefined\n }\n}\n\nexport async function compileScannedSfc(options: {\n filename: string\n meta: ModuleMeta\n srcRoot: string\n state: ScanState\n resolveId?: ResolveWebModuleId\n resolveAutoImportTag?: ResolveWebAutoImportTag\n uniApp?: { include: string[] }\n}) {\n const source = await readFile(options.filename, 'utf8')\n const result = await compileWebVueSfc({ ...options, source })\n return {\n result,\n config: parseSfcJsonConfig(result.config),\n }\n}\n\nfunction isPageCandidate(relativePath: string) {\n const segments = relativePath.split('/')\n const pagesIndex = segments.indexOf(PAGE_SEGMENT)\n if (pagesIndex < 0) {\n return false\n }\n const routeSegments = segments.slice(pagesIndex + 1, -1)\n return !routeSegments.some(segment => EXCLUDED_PAGE_SEGMENTS.has(segment))\n}\n\nasync function walk(current: string, files: string[]) {\n const entries = await readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const pathname = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(pathname, files)\n }\n else {\n files.push(pathname)\n }\n }\n}\n\nexport async function discoverWebPageIds(srcRoot: string) {\n const files: string[] = []\n await walk(srcRoot, files)\n const pageIds = new Set<string>()\n for (const filename of files.sort()) {\n const extension = path.extname(filename)\n if (!SCRIPT_EXTS.includes(extension)) {\n continue\n }\n const relativePath = path.relative(srcRoot, filename).replaceAll('\\\\', '/')\n if (!isPageCandidate(relativePath)) {\n continue\n }\n if (extension !== '.vue' && !(await resolveTemplateFile(filename))) {\n continue\n }\n pageIds.add(relativePath.slice(0, -extension.length))\n }\n return [...pageIds]\n}\n"],"mappings":";;;;;;;AAOA,MAAM,eAAe;AACrB,MAAM,yCAAyB,IAAI,IAAI;CAAC;CAAc;CAAkB;AAAS,CAAC;AAElF,SAAgB,mBAAmB,QAAiB;CAClD,IAAI,CAAC,QACH;CAEF,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,MAAM;EAChC,OAAO,SAAS,MAAM,IAAI,SAAS;CACrC,QACM;EACJ;CACF;AACF;AAEA,eAAsB,kBAAkB,SAQrC;CACD,MAAM,SAAS,MAAM,SAAS,QAAQ,UAAU,MAAM;CACtD,MAAM,SAAS,MAAM,iBAAiB;EAAE,GAAG;EAAS;CAAO,CAAC;CAC5D,OAAO;EACL;EACA,QAAQ,mBAAmB,OAAO,MAAM;CAC1C;AACF;AAEA,SAAS,gBAAgB,cAAsB;CAC7C,MAAM,WAAW,aAAa,MAAM,GAAG;CACvC,MAAM,aAAa,SAAS,QAAQ,YAAY;CAChD,IAAI,aAAa,GACf,OAAO;CAGT,OAAO,CADe,SAAS,MAAM,aAAa,GAAG,EACjC,CAAC,CAAC,MAAK,YAAW,uBAAuB,IAAI,OAAO,CAAC;AAC3E;AAEA,eAAe,KAAK,SAAiB,OAAiB;CACpD,MAAM,UAAU,MAAM,QAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;CAC9D,KAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,WAAW,KAAK,KAAK,SAAS,MAAM,IAAI;EAC9C,IAAI,MAAM,YAAY,GACpB,MAAM,KAAK,UAAU,KAAK;OAG1B,MAAM,KAAK,QAAQ;CAEvB;AACF;AAEA,eAAsB,mBAAmB,SAAiB;CACxD,MAAM,QAAkB,CAAC;CACzB,MAAM,KAAK,SAAS,KAAK;CACzB,MAAM,0BAAU,IAAI,IAAY;CAChC,KAAK,MAAM,YAAY,MAAM,KAAK,GAAG;EACnC,MAAM,YAAY,KAAK,QAAQ,QAAQ;EACvC,IAAI,CAAC,YAAY,SAAS,SAAS,GACjC;EAEF,MAAM,eAAe,KAAK,SAAS,SAAS,QAAQ,CAAC,CAAC,WAAW,MAAM,GAAG;EAC1E,IAAI,CAAC,gBAAgB,YAAY,GAC/B;EAEF,IAAI,cAAc,UAAU,CAAE,MAAM,oBAAoB,QAAQ,GAC9D;EAEF,QAAQ,IAAI,aAAa,MAAM,GAAG,CAAC,UAAU,MAAM,CAAC;CACtD;CACA,OAAO,CAAC,GAAG,OAAO;AACpB"}
@@ -6,13 +6,14 @@ function createEmptyScanState() {
6
6
  templateComponentMap: /* @__PURE__ */ new Map(),
7
7
  templatePathSet: /* @__PURE__ */ new Set(),
8
8
  componentTagMap: /* @__PURE__ */ new Map(),
9
- componentIdMap: /* @__PURE__ */ new Map(),
10
9
  appNavigationDefaults: {},
11
10
  appComponentTags: {},
11
+ sfcResults: /* @__PURE__ */ new Map(),
12
12
  scanResult: {
13
13
  app: void 0,
14
14
  pages: [],
15
- components: []
15
+ components: [],
16
+ layouts: []
16
17
  }
17
18
  };
18
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"state.mjs","names":[],"sources":["../../src/plugin/state.ts"],"sourcesContent":["import type { ScanState } from './types'\n\nexport function createEmptyScanState(): ScanState {\n return {\n moduleMeta: new Map(),\n pageNavigationMap: new Map(),\n templateComponentMap: new Map(),\n templatePathSet: new Set(),\n componentTagMap: new Map(),\n componentIdMap: new Map(),\n appNavigationDefaults: {},\n appComponentTags: {},\n scanResult: {\n app: undefined,\n pages: [],\n components: [],\n },\n }\n}\n"],"mappings":";AAEA,SAAgB,uBAAkC;CAChD,OAAO;EACL,4BAAY,IAAI,IAAI;EACpB,mCAAmB,IAAI,IAAI;EAC3B,sCAAsB,IAAI,IAAI;EAC9B,iCAAiB,IAAI,IAAI;EACzB,iCAAiB,IAAI,IAAI;EACzB,gCAAgB,IAAI,IAAI;EACxB,uBAAuB,CAAC;EACxB,kBAAkB,CAAC;EACnB,YAAY;GACV,KAAK;GACL,OAAO,CAAC;GACR,YAAY,CAAC;EACf;CACF;AACF"}
1
+ {"version":3,"file":"state.mjs","names":[],"sources":["../../src/plugin/state.ts"],"sourcesContent":["import type { ScanState } from './types'\n\nexport function createEmptyScanState(): ScanState {\n return {\n moduleMeta: new Map(),\n pageNavigationMap: new Map(),\n templateComponentMap: new Map(),\n templatePathSet: new Set(),\n componentTagMap: new Map(),\n appNavigationDefaults: {},\n appComponentTags: {},\n sfcResults: new Map(),\n scanResult: {\n app: undefined,\n pages: [],\n components: [],\n layouts: [],\n },\n }\n}\n"],"mappings":";AAEA,SAAgB,uBAAkC;CAChD,OAAO;EACL,4BAAY,IAAI,IAAI;EACpB,mCAAmB,IAAI,IAAI;EAC3B,sCAAsB,IAAI,IAAI;EAC9B,iCAAiB,IAAI,IAAI;EACzB,iCAAiB,IAAI,IAAI;EACzB,uBAAuB,CAAC;EACxB,kBAAkB,CAAC;EACnB,4BAAY,IAAI,IAAI;EACpB,YAAY;GACV,KAAK;GACL,OAAO,CAAC;GACR,YAAY,CAAC;GACb,SAAS,CAAC;EACZ;CACF;AACF"}
@@ -0,0 +1,52 @@
1
+ //#region src/plugin/styleModule.ts
2
+ function createInlineStyleModule(css) {
3
+ return [
4
+ `const __weapp_injected_styles__ = new Map()`,
5
+ `function __weapp_createStyleId__(css) {`,
6
+ ` let hash = 2166136261`,
7
+ ` for (let i = 0; i < css.length; i++) {`,
8
+ ` hash ^= css.charCodeAt(i)`,
9
+ ` hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24)`,
10
+ ` }`,
11
+ ` return 'weapp-web-style-' + (hash >>> 0).toString(36)`,
12
+ `}`,
13
+ `function __weapp_removeStyle__(id) {`,
14
+ ` if (typeof document === 'undefined') {`,
15
+ ` return`,
16
+ ` }`,
17
+ ` const style = __weapp_injected_styles__.get(id)`,
18
+ ` if (style) {`,
19
+ ` style.remove()`,
20
+ ` __weapp_injected_styles__.delete(id)`,
21
+ ` }`,
22
+ `}`,
23
+ `function injectStyle(css, id) {`,
24
+ ` if (typeof document === 'undefined') {`,
25
+ ` return () => {}`,
26
+ ` }`,
27
+ ` const styleId = id ?? __weapp_createStyleId__(css)`,
28
+ ` const existing = __weapp_injected_styles__.get(styleId)`,
29
+ ` if (existing) {`,
30
+ ` if (existing.textContent !== css) {`,
31
+ ` existing.textContent = css`,
32
+ ` }`,
33
+ ` return () => __weapp_removeStyle__(styleId)`,
34
+ ` }`,
35
+ ` const style = document.createElement('style')`,
36
+ ` style.id = styleId`,
37
+ ` style.textContent = css`,
38
+ ` document.head.append(style)`,
39
+ ` __weapp_injected_styles__.set(styleId, style)`,
40
+ ` return () => __weapp_removeStyle__(styleId)`,
41
+ `}`,
42
+ `const css = ${JSON.stringify(css)}`,
43
+ `export default css`,
44
+ `export function useStyle(id) {`,
45
+ ` return injectStyle(css, id)`,
46
+ `}`
47
+ ].join("\n");
48
+ }
49
+
50
+ //#endregion
51
+ export { createInlineStyleModule };
52
+ //# sourceMappingURL=styleModule.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styleModule.mjs","names":[],"sources":["../../src/plugin/styleModule.ts"],"sourcesContent":["export function createInlineStyleModule(css: string) {\n const serialized = JSON.stringify(css)\n return [\n `const __weapp_injected_styles__ = new Map()`,\n `function __weapp_createStyleId__(css) {`,\n ` let hash = 2166136261`,\n ` for (let i = 0; i < css.length; i++) {`,\n ` hash ^= css.charCodeAt(i)`,\n ` hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24)`,\n ` }`,\n ` return 'weapp-web-style-' + (hash >>> 0).toString(36)`,\n `}`,\n `function __weapp_removeStyle__(id) {`,\n ` if (typeof document === 'undefined') {`,\n ` return`,\n ` }`,\n ` const style = __weapp_injected_styles__.get(id)`,\n ` if (style) {`,\n ` style.remove()`,\n ` __weapp_injected_styles__.delete(id)`,\n ` }`,\n `}`,\n `function injectStyle(css, id) {`,\n ` if (typeof document === 'undefined') {`,\n ` return () => {}`,\n ` }`,\n ` const styleId = id ?? __weapp_createStyleId__(css)`,\n ` const existing = __weapp_injected_styles__.get(styleId)`,\n ` if (existing) {`,\n ` if (existing.textContent !== css) {`,\n ` existing.textContent = css`,\n ` }`,\n ` return () => __weapp_removeStyle__(styleId)`,\n ` }`,\n ` const style = document.createElement('style')`,\n ` style.id = styleId`,\n ` style.textContent = css`,\n ` document.head.append(style)`,\n ` __weapp_injected_styles__.set(styleId, style)`,\n ` return () => __weapp_removeStyle__(styleId)`,\n `}`,\n `const css = ${serialized}`,\n `export default css`,\n `export function useStyle(id) {`,\n ` return injectStyle(css, id)`,\n `}`,\n ].join('\\n')\n}\n"],"mappings":";AAAA,SAAgB,wBAAwB,KAAa;CAEnD,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,eAxCiB,KAAK,UAAU,GAwCR;EACxB;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,IAAI;AACb"}
@@ -1,4 +1,7 @@
1
1
  import { WxssTransformOptions } from "../css/wxss.mjs";
2
+ import { WebRoutingConfig } from "../runtime/polyfill/routeRuntime/history.mjs";
3
+ import { WebResourceHintsConfig, WebRuntimeSeoConfig as WebSeoConfig } from "../runtime/seo/index.mjs";
4
+ import "wevu/compiler";
2
5
  //#region src/plugin/types.d.ts
3
6
  interface WeappWebPluginOptions {
4
7
  wxss?: WxssTransformOptions;
@@ -38,8 +41,50 @@ interface WeappWebPluginOptions {
38
41
  level?: 'off' | 'warn' | 'error';
39
42
  dedupe?: boolean;
40
43
  };
44
+ /**
45
+ * Web 页面视口表现。默认使用小程序设备容器,宽屏下居中显示。
46
+ */
47
+ viewport?: {
48
+ mode?: 'mini-program' | 'responsive';
49
+ maxWidth?: number;
50
+ desktopBreakpoint?: number;
51
+ };
52
+ /** Web 路由与浏览器地址栏同步策略。 */
53
+ routing?: WebRoutingConfig;
54
+ /** 页面切换时同步浏览器 Head 的 SEO 配置。 */
55
+ seo?: WebSeoConfig;
56
+ /** 首屏或关键资源的浏览器 Resource Hints。 */
57
+ resourceHints?: WebResourceHintsConfig;
58
+ };
59
+ /**
60
+ * weapp-vite runtime provider 注入的内部绑定。
61
+ *
62
+ * @internal
63
+ */
64
+ __runtimeProvider?: {
65
+ moduleId: string;
66
+ hmrAcceptCode?: string;
41
67
  };
68
+ /** @internal */
69
+ __uniApp?: {
70
+ include: string[];
71
+ };
72
+ /** @internal */
73
+ __autoImportResolvers?: WebComponentResolver[];
74
+ /** @internal */
75
+ __resolveAppConfig?: (appConfigPath: string) => Promise<Record<string, unknown> | undefined>;
76
+ }
77
+ interface WebResolvedComponent {
78
+ name: string;
79
+ from: string;
80
+ resolvedId?: string;
81
+ sourceType?: 'wevu-sfc' | 'native';
42
82
  }
83
+ type WebComponentResolver = {
84
+ components?: Record<string, string>;
85
+ resolve?: (componentName: string, baseName: string) => WebResolvedComponent | void;
86
+ } | ((componentName: string, baseName: string) => WebResolvedComponent | void);
87
+ type ResolveWebModuleId = (source: string, importer?: string) => Promise<string | undefined>;
43
88
  //#endregion
44
- export { WeappWebPluginOptions };
89
+ export { ResolveWebModuleId, WeappWebPluginOptions, WebComponentResolver, WebResolvedComponent };
45
90
  //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1,149 @@
1
+ import { compileWxml } from "../compiler/wxml/compile.mjs";
2
+ import { appendInlineQuery, resolveTemplatePathSync, resolveWxsPathSync, toRelativeImport } from "./path.mjs";
3
+ import { resolveScriptFile } from "./files.mjs";
4
+ import path from "pathe";
5
+ import { compileVueFile, isUniAppCompatibilityFile, transformUniAppSource } from "wevu/compiler";
6
+ import { transform } from "esbuild";
7
+ import { parse } from "@babel/parser";
8
+ import _babelTraverse from "@babel/traverse";
9
+ import * as t from "@babel/types";
10
+ import MagicString from "magic-string";
11
+ import { fs } from "@weapp-core/shared/fs";
12
+
13
+ //#region src/plugin/vueSfc.ts
14
+ const traverse = _babelTraverse;
15
+ async function resolveSfcSrc(request, importer, srcRoot, resolveId) {
16
+ if (request.startsWith("@/")) return path.resolve(srcRoot, request.slice(2));
17
+ if (request.startsWith(".")) return path.resolve(path.dirname(importer), request);
18
+ if (request.startsWith("/")) return path.resolve(srcRoot, request.slice(1));
19
+ return await resolveId?.(request, importer);
20
+ }
21
+ async function compileWebVueSfc(options) {
22
+ const { filename, meta, srcRoot, state, resolveId, resolveAutoImportTag, uniApp } = options;
23
+ const result = await compileVueFile(uniApp && isUniAppCompatibilityFile(filename, srcRoot, uniApp.include) ? transformUniAppSource(options.source, {
24
+ filename,
25
+ target: "h5"
26
+ }).code : options.source, filename, {
27
+ isApp: meta.kind === "app",
28
+ isPage: meta.kind === "page",
29
+ sourceMap: false,
30
+ style: {
31
+ preserveDeepSelectors: true,
32
+ transformScoped: false
33
+ },
34
+ json: { kind: meta.kind },
35
+ autoUsingComponents: {
36
+ enabled: true,
37
+ resolveUsingComponentPath: async (request, importer) => {
38
+ const base = request.startsWith("@/") ? path.resolve(srcRoot, request.slice(2)) : request.startsWith(".") ? path.resolve(path.dirname(importer), request) : request.startsWith("/") ? path.resolve(srcRoot, request.slice(1)) : void 0;
39
+ if (!base) return;
40
+ const resolvedId = await resolveScriptFile(base);
41
+ if (!resolvedId) return;
42
+ return {
43
+ from: request,
44
+ resolvedId,
45
+ sourceType: resolvedId.endsWith(".vue") ? "wevu-sfc" : "native"
46
+ };
47
+ }
48
+ },
49
+ autoImportTags: {
50
+ enabled: Boolean(resolveAutoImportTag),
51
+ resolveUsingComponent: async (tag, importer) => resolveAutoImportTag?.(tag, importer)
52
+ },
53
+ sfcSrc: { resolveId: async (request, importer) => {
54
+ return resolveSfcSrc(request, importer, srcRoot, resolveId);
55
+ } }
56
+ });
57
+ state.sfcResults.set(filename, result);
58
+ for (const dependency of result.meta?.sfcSrcDeps ?? []) state.templatePathSet.add(dependency);
59
+ return result;
60
+ }
61
+ async function ensureWebVueSfcResult(options) {
62
+ const cached = options.state.sfcResults.get(options.filename);
63
+ if (cached) return cached;
64
+ const source = options.source ?? await fs.readFile(options.filename, "utf8");
65
+ return await compileWebVueSfc({
66
+ ...options,
67
+ source
68
+ });
69
+ }
70
+ function getSfcRegisterName(kind) {
71
+ return kind === "app" ? "registerWebWevuApp" : "registerWebWevuComponent";
72
+ }
73
+ function getSfcFactoryName(kind) {
74
+ return kind === "app" ? "createApp" : "createWevuComponent";
75
+ }
76
+ function createRegisterMetaCode(meta, templateIdent, styleIdent) {
77
+ const parts = [`id: ${JSON.stringify(meta.id)}`, `kind: ${JSON.stringify(meta.kind)}`];
78
+ if (templateIdent) parts.push(`template: ${templateIdent}`);
79
+ if (styleIdent) parts.push(`style: ${styleIdent}`);
80
+ if (meta.navigationBar) parts.push(`navigationBar: ${JSON.stringify(meta.navigationBar)}`);
81
+ return `{ ${parts.join(", ")} }`;
82
+ }
83
+ async function transformWebVueSfcScript(options) {
84
+ const { code, filename, meta, runtimeModuleId, styleLanguage, enableHmr, hmrAcceptCode } = options;
85
+ const ast = parse(code, {
86
+ sourceType: "module",
87
+ plugins: ["typescript", "jsx"],
88
+ ranges: true
89
+ });
90
+ const s = new MagicString(code);
91
+ const templateIdent = meta.kind === "app" ? void 0 : "__weapp_sfc_template__";
92
+ const styleIdent = meta.kind === "app" ? void 0 : "__weapp_sfc_style__";
93
+ const registerName = getSfcRegisterName(meta.kind);
94
+ const factoryName = getSfcFactoryName(meta.kind);
95
+ const registerMetaCode = createRegisterMetaCode(meta, templateIdent, styleIdent);
96
+ let transformed = false;
97
+ traverse(ast, { CallExpression(nodePath) {
98
+ const callee = nodePath.node.callee;
99
+ if (!t.isIdentifier(callee, { name: factoryName })) return;
100
+ s.overwrite(callee.start, callee.end, registerName);
101
+ s.appendLeft(nodePath.node.end - 1, `, ${registerMetaCode}`);
102
+ transformed = true;
103
+ } });
104
+ if (!transformed) throw new Error(`[@weapp-vite/web] Vue SFC 未生成 ${factoryName} 注册调用: ${filename}`);
105
+ const imports = [`import { ${registerName} } from '${runtimeModuleId}'`];
106
+ if (templateIdent) imports.push(`import ${templateIdent} from '${toRelativeImport(filename, filename)}?weapp-web-sfc-template'`);
107
+ if (styleIdent) {
108
+ const styleFilename = `${filename}.${styleLanguage}`;
109
+ imports.push(`import ${styleIdent} from '${appendInlineQuery(`${toRelativeImport(filename, styleFilename)}?weapp-web-sfc-style`)}'`);
110
+ }
111
+ s.prepend(`${imports.join("\n")}\n`);
112
+ if (enableHmr && hmrAcceptCode) s.append(`\n${hmrAcceptCode}\n`);
113
+ const transpiled = await transform(s.toString(), {
114
+ format: "esm",
115
+ legalComments: "inline",
116
+ loader: "ts",
117
+ sourcefile: filename,
118
+ sourcemap: "external",
119
+ target: "es2022"
120
+ });
121
+ return {
122
+ code: transpiled.code,
123
+ map: JSON.parse(transpiled.map)
124
+ };
125
+ }
126
+ function generateWebVueSfcTemplate(result, meta, filename, srcRoot) {
127
+ return compileWxml({
128
+ id: filename,
129
+ source: result.template ?? "",
130
+ navigationBar: meta.navigationBar ? { config: meta.navigationBar } : void 0,
131
+ componentTags: meta.componentTags,
132
+ resolveTemplatePath: (request, importer) => resolveTemplatePathSync(request, importer, srcRoot),
133
+ resolveWxsPath: (request, importer) => resolveWxsPathSync(request, importer, srcRoot)
134
+ });
135
+ }
136
+ function resolveWebVueSfcStyleLanguage(result, filename) {
137
+ const languages = new Set((result.meta?.styleBlocks ?? []).map((style) => style.lang?.trim() || "css"));
138
+ for (const language of languages) if (!/^[a-z][a-z0-9-]*$/i.test(language)) throw new Error(`[@weapp-vite/web] Vue SFC 样式语言无效: ${filename} -> ${language}`);
139
+ const preprocessLanguages = [...languages].filter((language) => language !== "css");
140
+ if (preprocessLanguages.length > 1) throw new Error(`[@weapp-vite/web] Vue SFC 暂不支持混合样式语言: ${filename}`);
141
+ return preprocessLanguages[0] ?? "css";
142
+ }
143
+ function generateWebVueSfcStyle(result) {
144
+ return result.style ?? "";
145
+ }
146
+
147
+ //#endregion
148
+ export { compileWebVueSfc, ensureWebVueSfcResult, generateWebVueSfcStyle, generateWebVueSfcTemplate, resolveWebVueSfcStyleLanguage, transformWebVueSfcScript };
149
+ //# sourceMappingURL=vueSfc.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vueSfc.mjs","names":[],"sources":["../../src/plugin/vueSfc.ts"],"sourcesContent":["import type { NodePath } from '@babel/traverse'\nimport type { CallExpression } from '@babel/types'\nimport type { VueTransformResult } from 'wevu/compiler'\nimport type { ModuleMeta, ResolveWebAutoImportTag, ResolveWebModuleId, ScanState } from './types'\nimport { parse } from '@babel/parser'\nimport _babelTraverse from '@babel/traverse'\nimport * as t from '@babel/types'\nimport { fs } from '@weapp-core/shared/fs'\nimport { transform } from 'esbuild'\nimport MagicString from 'magic-string'\nimport path from 'pathe'\nimport { compileVueFile, isUniAppCompatibilityFile, transformUniAppSource } from 'wevu/compiler'\nimport { compileWxml } from '../compiler/wxml'\nimport { resolveScriptFile } from './files'\nimport { appendInlineQuery, resolveTemplatePathSync, resolveWxsPathSync, toRelativeImport } from './path'\n\nconst traverse = _babelTraverse\n\nasync function resolveSfcSrc(\n request: string,\n importer: string,\n srcRoot: string,\n resolveId?: ResolveWebModuleId,\n) {\n if (request.startsWith('@/')) {\n return path.resolve(srcRoot, request.slice(2))\n }\n if (request.startsWith('.')) {\n return path.resolve(path.dirname(importer), request)\n }\n if (request.startsWith('/')) {\n return path.resolve(srcRoot, request.slice(1))\n }\n return await resolveId?.(request, importer)\n}\n\nexport async function compileWebVueSfc(options: {\n source: string\n filename: string\n meta: ModuleMeta\n srcRoot: string\n state: ScanState\n resolveId?: ResolveWebModuleId\n resolveAutoImportTag?: ResolveWebAutoImportTag\n uniApp?: { include: string[] }\n}) {\n const { filename, meta, srcRoot, state, resolveId, resolveAutoImportTag, uniApp } = options\n const source = uniApp && isUniAppCompatibilityFile(filename, srcRoot, uniApp.include)\n ? transformUniAppSource(options.source, { filename, target: 'h5' }).code\n : options.source\n const result = await compileVueFile(source, filename, {\n isApp: meta.kind === 'app',\n isPage: meta.kind === 'page',\n sourceMap: false,\n style: {\n preserveDeepSelectors: true,\n transformScoped: false,\n },\n json: { kind: meta.kind },\n autoUsingComponents: {\n enabled: true,\n resolveUsingComponentPath: async (request, importer) => {\n const base = request.startsWith('@/')\n ? path.resolve(srcRoot, request.slice(2))\n : request.startsWith('.')\n ? path.resolve(path.dirname(importer), request)\n : request.startsWith('/')\n ? path.resolve(srcRoot, request.slice(1))\n : undefined\n if (!base) {\n return undefined\n }\n const resolvedId = await resolveScriptFile(base)\n if (!resolvedId) {\n return undefined\n }\n return {\n from: request,\n resolvedId,\n sourceType: resolvedId.endsWith('.vue') ? 'wevu-sfc' : 'native',\n }\n },\n },\n autoImportTags: {\n enabled: Boolean(resolveAutoImportTag),\n resolveUsingComponent: async (tag, importer) => resolveAutoImportTag?.(tag, importer),\n },\n sfcSrc: {\n resolveId: async (request, importer) => {\n return resolveSfcSrc(request, importer!, srcRoot, resolveId)\n },\n },\n })\n state.sfcResults.set(filename, result)\n for (const dependency of result.meta?.sfcSrcDeps ?? []) {\n state.templatePathSet.add(dependency)\n }\n return result\n}\n\nexport async function ensureWebVueSfcResult(options: {\n filename: string\n meta: ModuleMeta\n srcRoot: string\n state: ScanState\n source?: string\n resolveId?: ResolveWebModuleId\n resolveAutoImportTag?: ResolveWebAutoImportTag\n uniApp?: { include: string[] }\n}) {\n const cached = options.state.sfcResults.get(options.filename)\n if (cached) {\n return cached\n }\n const source = options.source ?? await fs.readFile(options.filename, 'utf8')\n return await compileWebVueSfc({ ...options, source })\n}\n\nfunction getSfcRegisterName(kind: ModuleMeta['kind']) {\n return kind === 'app' ? 'registerWebWevuApp' : 'registerWebWevuComponent'\n}\n\nfunction getSfcFactoryName(kind: ModuleMeta['kind']) {\n return kind === 'app' ? 'createApp' : 'createWevuComponent'\n}\n\nfunction createRegisterMetaCode(meta: ModuleMeta, templateIdent?: string, styleIdent?: string) {\n const parts = [`id: ${JSON.stringify(meta.id)}`, `kind: ${JSON.stringify(meta.kind)}`]\n if (templateIdent) {\n parts.push(`template: ${templateIdent}`)\n }\n if (styleIdent) {\n parts.push(`style: ${styleIdent}`)\n }\n if (meta.navigationBar) {\n parts.push(`navigationBar: ${JSON.stringify(meta.navigationBar)}`)\n }\n return `{ ${parts.join(', ')} }`\n}\n\nexport async function transformWebVueSfcScript(options: {\n code: string\n filename: string\n meta: ModuleMeta\n runtimeModuleId: string\n styleLanguage: string\n enableHmr: boolean\n hmrAcceptCode?: string\n}) {\n const { code, filename, meta, runtimeModuleId, styleLanguage, enableHmr, hmrAcceptCode } = options\n const ast = parse(code, {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n ranges: true,\n })\n const s = new MagicString(code)\n const templateIdent = meta.kind === 'app' ? undefined : '__weapp_sfc_template__'\n const styleIdent = meta.kind === 'app' ? undefined : '__weapp_sfc_style__'\n const registerName = getSfcRegisterName(meta.kind)\n const factoryName = getSfcFactoryName(meta.kind)\n const registerMetaCode = createRegisterMetaCode(meta, templateIdent, styleIdent)\n let transformed = false\n\n traverse(ast, {\n CallExpression(nodePath: NodePath<CallExpression>) {\n const callee = nodePath.node.callee\n if (!t.isIdentifier(callee, { name: factoryName })) {\n return\n }\n s.overwrite(callee.start!, callee.end!, registerName)\n s.appendLeft(nodePath.node.end! - 1, `, ${registerMetaCode}`)\n transformed = true\n },\n })\n\n if (!transformed) {\n throw new Error(`[@weapp-vite/web] Vue SFC 未生成 ${factoryName} 注册调用: ${filename}`)\n }\n\n const imports = [`import { ${registerName} } from '${runtimeModuleId}'`]\n if (templateIdent) {\n imports.push(`import ${templateIdent} from '${toRelativeImport(filename, filename)}?weapp-web-sfc-template'`)\n }\n if (styleIdent) {\n const styleFilename = `${filename}.${styleLanguage}`\n imports.push(`import ${styleIdent} from '${appendInlineQuery(`${toRelativeImport(filename, styleFilename)}?weapp-web-sfc-style`)}'`)\n }\n s.prepend(`${imports.join('\\n')}\\n`)\n if (enableHmr && hmrAcceptCode) {\n s.append(`\\n${hmrAcceptCode}\\n`)\n }\n const transpiled = await transform(s.toString(), {\n format: 'esm',\n legalComments: 'inline',\n loader: 'ts',\n sourcefile: filename,\n sourcemap: 'external',\n target: 'es2022',\n })\n return {\n code: transpiled.code,\n map: JSON.parse(transpiled.map),\n }\n}\n\nexport function generateWebVueSfcTemplate(\n result: VueTransformResult,\n meta: ModuleMeta,\n filename: string,\n srcRoot: string,\n) {\n const compiled = compileWxml({\n id: filename,\n source: result.template ?? '',\n navigationBar: meta.navigationBar ? { config: meta.navigationBar } : undefined,\n componentTags: meta.componentTags,\n resolveTemplatePath: (request, importer) => resolveTemplatePathSync(request, importer, srcRoot),\n resolveWxsPath: (request, importer) => resolveWxsPathSync(request, importer, srcRoot),\n })\n return compiled\n}\n\nexport function resolveWebVueSfcStyleLanguage(result: VueTransformResult, filename: string) {\n const languages = new Set(\n (result.meta?.styleBlocks ?? []).map(style => style.lang?.trim() || 'css'),\n )\n for (const language of languages) {\n if (!/^[a-z][a-z0-9-]*$/i.test(language)) {\n throw new Error(`[@weapp-vite/web] Vue SFC 样式语言无效: ${filename} -> ${language}`)\n }\n }\n const preprocessLanguages = [...languages].filter(language => language !== 'css')\n if (preprocessLanguages.length > 1) {\n throw new Error(`[@weapp-vite/web] Vue SFC 暂不支持混合样式语言: ${filename}`)\n }\n return preprocessLanguages[0] ?? 'css'\n}\n\nexport function generateWebVueSfcStyle(result: VueTransformResult) {\n return result.style ?? ''\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ //#region src/runtime/appShell/container.ts
2
+ function onDocumentReady(callback) {
3
+ if (typeof document === "undefined") return;
4
+ if (document.readyState === "loading") {
5
+ document.addEventListener("DOMContentLoaded", callback, { once: true });
6
+ return;
7
+ }
8
+ callback();
9
+ }
10
+ function getAppContainer() {
11
+ if (typeof document === "undefined") return;
12
+ return document.querySelector("#app") ?? void 0;
13
+ }
14
+ function ensureAppContainer() {
15
+ const existing = getAppContainer();
16
+ if (existing || typeof document === "undefined" || !document.body) return existing;
17
+ const container = document.createElement("div");
18
+ container.setAttribute("id", "app");
19
+ document.body.append(container);
20
+ return container;
21
+ }
22
+
23
+ //#endregion
24
+ export { ensureAppContainer, getAppContainer, onDocumentReady };
25
+ //# sourceMappingURL=container.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.mjs","names":[],"sources":["../../../src/runtime/appShell/container.ts"],"sourcesContent":["export function onDocumentReady(callback: () => void) {\n if (typeof document === 'undefined') {\n return\n }\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', callback, { once: true })\n return\n }\n callback()\n}\n\nexport function getAppContainer() {\n if (typeof document === 'undefined') {\n return undefined\n }\n return document.querySelector('#app') as HTMLElement | null ?? undefined\n}\n\nexport function ensureAppContainer() {\n const existing = getAppContainer()\n if (existing || typeof document === 'undefined' || !document.body) {\n return existing\n }\n const container = document.createElement('div')\n container.setAttribute('id', 'app')\n document.body.append(container)\n return container\n}\n"],"mappings":";AAAA,SAAgB,gBAAgB,UAAsB;CACpD,IAAI,OAAO,aAAa,aACtB;CAEF,IAAI,SAAS,eAAe,WAAW;EACrC,SAAS,iBAAiB,oBAAoB,UAAU,EAAE,MAAM,KAAK,CAAC;EACtE;CACF;CACA,SAAS;AACX;AAEA,SAAgB,kBAAkB;CAChC,IAAI,OAAO,aAAa,aACtB;CAEF,OAAO,SAAS,cAAc,MAAM,KAA2B;AACjE;AAEA,SAAgB,qBAAqB;CACnC,MAAM,WAAW,gBAAgB;CACjC,IAAI,YAAY,OAAO,aAAa,eAAe,CAAC,SAAS,MAC3D,OAAO;CAET,MAAM,YAAY,SAAS,cAAc,KAAK;CAC9C,UAAU,aAAa,MAAM,KAAK;CAClC,SAAS,KAAK,OAAO,SAAS;CAC9B,OAAO;AACT"}