@weapp-vite/web 1.3.14 → 1.3.16

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 (242) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +18 -0
  2. package/dist/compiler/wxml/attributes.mjs +93 -0
  3. package/dist/compiler/wxml/attributes.mjs.map +1 -0
  4. package/dist/compiler/wxml/compile.mjs +158 -0
  5. package/dist/compiler/wxml/compile.mjs.map +1 -0
  6. package/dist/compiler/wxml/dependency.mjs +31 -0
  7. package/dist/compiler/wxml/dependency.mjs.map +1 -0
  8. package/dist/compiler/wxml/interpolation.mjs +142 -0
  9. package/dist/compiler/wxml/interpolation.mjs.map +1 -0
  10. package/dist/compiler/wxml/navigation.mjs +85 -0
  11. package/dist/compiler/wxml/navigation.mjs.map +1 -0
  12. package/dist/compiler/wxml/parser.mjs +41 -0
  13. package/dist/compiler/wxml/parser.mjs.map +1 -0
  14. package/dist/compiler/wxml/renderer.mjs +114 -0
  15. package/dist/compiler/wxml/renderer.mjs.map +1 -0
  16. package/dist/compiler/wxml/specialNodes.mjs +84 -0
  17. package/dist/compiler/wxml/specialNodes.mjs.map +1 -0
  18. package/dist/compiler/wxs.mjs +83 -0
  19. package/dist/compiler/wxs.mjs.map +1 -0
  20. package/dist/css/wxss.d.mts +25 -0
  21. package/dist/css/wxss.mjs +17 -0
  22. package/dist/css/wxss.mjs.map +1 -0
  23. package/dist/index.d.mts +18 -2
  24. package/dist/index.mjs +18 -3
  25. package/dist/plugin/constants.mjs +43 -0
  26. package/dist/plugin/constants.mjs.map +1 -0
  27. package/dist/plugin/entry.mjs +29 -0
  28. package/dist/plugin/entry.mjs.map +1 -0
  29. package/dist/plugin/files.mjs +58 -0
  30. package/dist/plugin/files.mjs.map +1 -0
  31. package/dist/plugin/index.d.mts +33 -0
  32. package/dist/plugin/index.mjs +188 -0
  33. package/dist/plugin/index.mjs.map +1 -0
  34. package/dist/plugin/navigation.mjs +20 -0
  35. package/dist/plugin/navigation.mjs.map +1 -0
  36. package/dist/plugin/path.mjs +85 -0
  37. package/dist/plugin/path.mjs.map +1 -0
  38. package/dist/plugin/register.mjs +83 -0
  39. package/dist/plugin/register.mjs.map +1 -0
  40. package/dist/plugin/scan.mjs +195 -0
  41. package/dist/plugin/scan.mjs.map +1 -0
  42. package/dist/plugin/scanConfig.mjs +45 -0
  43. package/dist/plugin/scanConfig.mjs.map +1 -0
  44. package/dist/plugin/state.mjs +22 -0
  45. package/dist/plugin/state.mjs.map +1 -0
  46. package/dist/plugin/types.d.mts +46 -0
  47. package/dist/plugin.d.mts +3 -2
  48. package/dist/plugin.mjs +3 -2
  49. package/dist/runtime/button/helpers.mjs +92 -0
  50. package/dist/runtime/button/helpers.mjs.map +1 -0
  51. package/dist/runtime/button/index.d.mts +9 -0
  52. package/dist/runtime/button/index.mjs +198 -0
  53. package/dist/runtime/button/index.mjs.map +1 -0
  54. package/dist/runtime/button/style.mjs +168 -0
  55. package/dist/runtime/button/style.mjs.map +1 -0
  56. package/dist/runtime/component/behavior.mjs +98 -0
  57. package/dist/runtime/component/behavior.mjs.map +1 -0
  58. package/dist/runtime/component/constants.mjs +8 -0
  59. package/dist/runtime/component/constants.mjs.map +1 -0
  60. package/dist/runtime/component/dom.mjs +26 -0
  61. package/dist/runtime/component/dom.mjs.map +1 -0
  62. package/dist/runtime/component/element.mjs +208 -0
  63. package/dist/runtime/component/element.mjs.map +1 -0
  64. package/dist/runtime/component/events.mjs +48 -0
  65. package/dist/runtime/component/events.mjs.map +1 -0
  66. package/dist/runtime/component/index.d.mts +7 -0
  67. package/dist/runtime/component/index.mjs +44 -0
  68. package/dist/runtime/component/index.mjs.map +1 -0
  69. package/dist/runtime/component/state.mjs +63 -0
  70. package/dist/runtime/component/state.mjs.map +1 -0
  71. package/dist/runtime/component/types.d.mts +49 -0
  72. package/dist/runtime/component/utils.mjs +39 -0
  73. package/dist/runtime/component/utils.mjs.map +1 -0
  74. package/dist/runtime/execution.d.mts +7 -0
  75. package/dist/runtime/execution.mjs +37 -0
  76. package/dist/runtime/execution.mjs.map +1 -0
  77. package/dist/runtime/index.d.mts +16 -2
  78. package/dist/runtime/index.mjs +16 -2
  79. package/dist/runtime/legacyTemplate/dom.mjs +131 -0
  80. package/dist/runtime/legacyTemplate/dom.mjs.map +1 -0
  81. package/dist/runtime/legacyTemplate/expression.mjs +113 -0
  82. package/dist/runtime/legacyTemplate/expression.mjs.map +1 -0
  83. package/dist/runtime/legacyTemplate/index.d.mts +9 -0
  84. package/dist/runtime/legacyTemplate/index.mjs +131 -0
  85. package/dist/runtime/legacyTemplate/index.mjs.map +1 -0
  86. package/dist/runtime/legacyTemplate/types.d.mts +6 -0
  87. package/dist/runtime/navigationBar/index.d.mts +10 -0
  88. package/dist/runtime/navigationBar/index.mjs +162 -0
  89. package/dist/runtime/navigationBar/index.mjs.map +1 -0
  90. package/dist/runtime/navigationBar/style.mjs +108 -0
  91. package/dist/runtime/navigationBar/style.mjs.map +1 -0
  92. package/dist/runtime/polyfill/ad.mjs +150 -0
  93. package/dist/runtime/polyfill/ad.mjs.map +1 -0
  94. package/dist/runtime/polyfill/appState.mjs +31 -0
  95. package/dist/runtime/polyfill/appState.mjs.map +1 -0
  96. package/dist/runtime/polyfill/async.mjs +31 -0
  97. package/dist/runtime/polyfill/async.mjs.map +1 -0
  98. package/dist/runtime/polyfill/auth.mjs +120 -0
  99. package/dist/runtime/polyfill/auth.mjs.map +1 -0
  100. package/dist/runtime/polyfill/authApi.mjs +101 -0
  101. package/dist/runtime/polyfill/authApi.mjs.map +1 -0
  102. package/dist/runtime/polyfill/background.mjs +31 -0
  103. package/dist/runtime/polyfill/background.mjs.map +1 -0
  104. package/dist/runtime/polyfill/canvasContext.mjs +115 -0
  105. package/dist/runtime/polyfill/canvasContext.mjs.map +1 -0
  106. package/dist/runtime/polyfill/capability.mjs +17 -0
  107. package/dist/runtime/polyfill/capability.mjs.map +1 -0
  108. package/dist/runtime/polyfill/cloud.mjs +39 -0
  109. package/dist/runtime/polyfill/cloud.mjs.map +1 -0
  110. package/dist/runtime/polyfill/device.mjs +44 -0
  111. package/dist/runtime/polyfill/device.mjs.map +1 -0
  112. package/dist/runtime/polyfill/deviceApi.mjs +31 -0
  113. package/dist/runtime/polyfill/deviceApi.mjs.map +1 -0
  114. package/dist/runtime/polyfill/deviceAuthSystemApi.d.mts +102 -0
  115. package/dist/runtime/polyfill/deviceAuthSystemApi.mjs +144 -0
  116. package/dist/runtime/polyfill/deviceAuthSystemApi.mjs.map +1 -0
  117. package/dist/runtime/polyfill/filePicker.mjs +158 -0
  118. package/dist/runtime/polyfill/filePicker.mjs.map +1 -0
  119. package/dist/runtime/polyfill/fileSystemManager.mjs +45 -0
  120. package/dist/runtime/polyfill/fileSystemManager.mjs.map +1 -0
  121. package/dist/runtime/polyfill/files.mjs +118 -0
  122. package/dist/runtime/polyfill/files.mjs.map +1 -0
  123. package/dist/runtime/polyfill/index.d.mts +40 -0
  124. package/dist/runtime/polyfill/index.mjs +99 -0
  125. package/dist/runtime/polyfill/index.mjs.map +1 -0
  126. package/dist/runtime/polyfill/interaction.mjs +38 -0
  127. package/dist/runtime/polyfill/interaction.mjs.map +1 -0
  128. package/dist/runtime/polyfill/interactionApi.mjs +54 -0
  129. package/dist/runtime/polyfill/interactionApi.mjs.map +1 -0
  130. package/dist/runtime/polyfill/location.mjs +106 -0
  131. package/dist/runtime/polyfill/location.mjs.map +1 -0
  132. package/dist/runtime/polyfill/locationApi.mjs +120 -0
  133. package/dist/runtime/polyfill/locationApi.mjs.map +1 -0
  134. package/dist/runtime/polyfill/mediaActions.mjs +52 -0
  135. package/dist/runtime/polyfill/mediaActions.mjs.map +1 -0
  136. package/dist/runtime/polyfill/mediaApi/file.mjs +63 -0
  137. package/dist/runtime/polyfill/mediaApi/file.mjs.map +1 -0
  138. package/dist/runtime/polyfill/mediaApi/info.mjs +59 -0
  139. package/dist/runtime/polyfill/mediaApi/info.mjs.map +1 -0
  140. package/dist/runtime/polyfill/mediaApi/picker.mjs +82 -0
  141. package/dist/runtime/polyfill/mediaApi/picker.mjs.map +1 -0
  142. package/dist/runtime/polyfill/mediaApi/preview.mjs +39 -0
  143. package/dist/runtime/polyfill/mediaApi/preview.mjs.map +1 -0
  144. package/dist/runtime/polyfill/mediaApi/process.mjs +46 -0
  145. package/dist/runtime/polyfill/mediaApi/process.mjs.map +1 -0
  146. package/dist/runtime/polyfill/mediaInfo.mjs +136 -0
  147. package/dist/runtime/polyfill/mediaInfo.mjs.map +1 -0
  148. package/dist/runtime/polyfill/mediaPicker.mjs +213 -0
  149. package/dist/runtime/polyfill/mediaPicker.mjs.map +1 -0
  150. package/dist/runtime/polyfill/mediaProcess.mjs +65 -0
  151. package/dist/runtime/polyfill/mediaProcess.mjs.map +1 -0
  152. package/dist/runtime/polyfill/menuApi.mjs +70 -0
  153. package/dist/runtime/polyfill/menuApi.mjs.map +1 -0
  154. package/dist/runtime/polyfill/navigationBarRuntime.mjs +65 -0
  155. package/dist/runtime/polyfill/navigationBarRuntime.mjs.map +1 -0
  156. package/dist/runtime/polyfill/network/request.mjs +162 -0
  157. package/dist/runtime/polyfill/network/request.mjs.map +1 -0
  158. package/dist/runtime/polyfill/network/requestBridge.mjs +49 -0
  159. package/dist/runtime/polyfill/network/requestBridge.mjs.map +1 -0
  160. package/dist/runtime/polyfill/network/status.mjs +55 -0
  161. package/dist/runtime/polyfill/network/status.mjs.map +1 -0
  162. package/dist/runtime/polyfill/platformApi.mjs +33 -0
  163. package/dist/runtime/polyfill/platformApi.mjs.map +1 -0
  164. package/dist/runtime/polyfill/platformRuntime.mjs +120 -0
  165. package/dist/runtime/polyfill/platformRuntime.mjs.map +1 -0
  166. package/dist/runtime/polyfill/routeRuntime/dom.mjs +36 -0
  167. package/dist/runtime/polyfill/routeRuntime/dom.mjs.map +1 -0
  168. package/dist/runtime/polyfill/routeRuntime/lifecycle.mjs +83 -0
  169. package/dist/runtime/polyfill/routeRuntime/lifecycle.mjs.map +1 -0
  170. package/dist/runtime/polyfill/routeRuntime/options.d.mts +33 -0
  171. package/dist/runtime/polyfill/routeRuntime/options.mjs +76 -0
  172. package/dist/runtime/polyfill/routeRuntime/options.mjs.map +1 -0
  173. package/dist/runtime/polyfill/routeRuntime/url.mjs +35 -0
  174. package/dist/runtime/polyfill/routeRuntime/url.mjs.map +1 -0
  175. package/dist/runtime/polyfill/routeRuntime.d.mts +43 -0
  176. package/dist/runtime/polyfill/routeRuntime.mjs +202 -0
  177. package/dist/runtime/polyfill/routeRuntime.mjs.map +1 -0
  178. package/dist/runtime/polyfill/runtimeCapabilityApi.mjs +26 -0
  179. package/dist/runtime/polyfill/runtimeCapabilityApi.mjs.map +1 -0
  180. package/dist/runtime/polyfill/runtimeDataApi.d.mts +79 -0
  181. package/dist/runtime/polyfill/runtimeDataApi.mjs +134 -0
  182. package/dist/runtime/polyfill/runtimeDataApi.mjs.map +1 -0
  183. package/dist/runtime/polyfill/runtimeInfra.mjs +40 -0
  184. package/dist/runtime/polyfill/runtimeInfra.mjs.map +1 -0
  185. package/dist/runtime/polyfill/runtimeOps.mjs +62 -0
  186. package/dist/runtime/polyfill/runtimeOps.mjs.map +1 -0
  187. package/dist/runtime/polyfill/selectorQuery.mjs +204 -0
  188. package/dist/runtime/polyfill/selectorQuery.mjs.map +1 -0
  189. package/dist/runtime/polyfill/storage.mjs +103 -0
  190. package/dist/runtime/polyfill/storage.mjs.map +1 -0
  191. package/dist/runtime/polyfill/storageAsync.mjs +62 -0
  192. package/dist/runtime/polyfill/storageAsync.mjs.map +1 -0
  193. package/dist/runtime/polyfill/subscribe.mjs +30 -0
  194. package/dist/runtime/polyfill/subscribe.mjs.map +1 -0
  195. package/dist/runtime/polyfill/system.mjs +111 -0
  196. package/dist/runtime/polyfill/system.mjs.map +1 -0
  197. package/dist/runtime/polyfill/systemApi.mjs +65 -0
  198. package/dist/runtime/polyfill/systemApi.mjs.map +1 -0
  199. package/dist/runtime/polyfill/types/base.d.mts +12 -0
  200. package/dist/runtime/polyfill/types/common.d.mts +126 -0
  201. package/dist/runtime/polyfill/types/locationRuntime.d.mts +151 -0
  202. package/dist/runtime/polyfill/types/mediaAuth.d.mts +152 -0
  203. package/dist/runtime/polyfill/types/platformRuntime.d.mts +141 -0
  204. package/dist/runtime/polyfill/types/systemAuth.d.mts +122 -0
  205. package/dist/runtime/polyfill/ui.mjs +135 -0
  206. package/dist/runtime/polyfill/ui.mjs.map +1 -0
  207. package/dist/runtime/polyfill/uiFeedback.mjs +35 -0
  208. package/dist/runtime/polyfill/uiFeedback.mjs.map +1 -0
  209. package/dist/runtime/polyfill/uiMediaApi.d.mts +172 -0
  210. package/dist/runtime/polyfill/uiMediaApi.mjs +162 -0
  211. package/dist/runtime/polyfill/uiMediaApi.mjs.map +1 -0
  212. package/dist/runtime/polyfill/videoContext.mjs +56 -0
  213. package/dist/runtime/polyfill/videoContext.mjs.map +1 -0
  214. package/dist/runtime/polyfill/vkSession.mjs +58 -0
  215. package/dist/runtime/polyfill/vkSession.mjs.map +1 -0
  216. package/dist/runtime/polyfill/windowResize.mjs +39 -0
  217. package/dist/runtime/polyfill/windowResize.mjs.map +1 -0
  218. package/dist/runtime/polyfill/worker.mjs +77 -0
  219. package/dist/runtime/polyfill/worker.mjs.map +1 -0
  220. package/dist/runtime/polyfill.d.mts +5 -0
  221. package/dist/runtime/renderContext.d.mts +21 -0
  222. package/dist/runtime/renderContext.mjs +147 -0
  223. package/dist/runtime/renderContext.mjs.map +1 -0
  224. package/dist/runtime/rpx.d.mts +9 -0
  225. package/dist/runtime/rpx.mjs +27 -0
  226. package/dist/runtime/rpx.mjs.map +1 -0
  227. package/dist/runtime/style.d.mts +6 -0
  228. package/dist/runtime/style.mjs +37 -0
  229. package/dist/runtime/style.mjs.map +1 -0
  230. package/dist/runtime/template.d.mts +10 -0
  231. package/dist/runtime/warning.d.mts +10 -0
  232. package/dist/runtime/warning.mjs +43 -0
  233. package/dist/runtime/warning.mjs.map +1 -0
  234. package/dist/{slugify-B4l45KNs.mjs → shared/slugify.mjs} +3 -1
  235. package/dist/shared/slugify.mjs.map +1 -0
  236. package/dist/shared/wxml.mjs +64 -0
  237. package/dist/shared/wxml.mjs.map +1 -0
  238. package/package.json +2 -2
  239. package/dist/index-w9xxIH-l.d.mts +0 -1229
  240. package/dist/plugin-BARxSPO8.mjs +0 -1567
  241. package/dist/plugin-DP2iPVmw.d.mts +0 -96
  242. package/dist/runtime-D6j2_x_N.mjs +0 -6251
@@ -0,0 +1,18 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __defProp = Object.defineProperty;
3
+ var __exportAll = (all, no_symbols) => {
4
+ let target = {};
5
+ for (var name in all) {
6
+ __defProp(target, name, {
7
+ get: all[name],
8
+ enumerable: true
9
+ });
10
+ }
11
+ if (!no_symbols) {
12
+ __defProp(target, Symbol.toStringTag, { value: "Module" });
13
+ }
14
+ return target;
15
+ };
16
+
17
+ //#endregion
18
+ export { __exportAll };
@@ -0,0 +1,93 @@
1
+ import { CONTROL_ATTRS, EVENT_KIND_ALIAS, EVENT_PREFIX_RE, normalizeAttributeName } from "../../shared/wxml.mjs";
2
+ import { buildExpression, parseInterpolations } from "./interpolation.mjs";
3
+
4
+ //#region src/compiler/wxml/attributes.ts
5
+ function extractFor(attribs) {
6
+ const expr = attribs["wx:for"];
7
+ const itemName = attribs["wx:for-item"]?.trim() || "item";
8
+ let indexName = attribs["wx:for-index"]?.trim() || "index";
9
+ const key = attribs["wx:key"];
10
+ const restAttribs = {};
11
+ for (const [name, value] of Object.entries(attribs)) {
12
+ if (CONTROL_ATTRS.has(name)) continue;
13
+ restAttribs[name] = value;
14
+ }
15
+ if (itemName === indexName) indexName = `${indexName}Index`;
16
+ return {
17
+ expr,
18
+ itemName,
19
+ indexName,
20
+ key,
21
+ restAttribs
22
+ };
23
+ }
24
+ function isConditionalElement(node) {
25
+ if (node.type !== "element") return false;
26
+ const attribs = node.attribs ?? {};
27
+ return "wx:if" in attribs || "wx:elif" in attribs || "wx:else" in attribs;
28
+ }
29
+ function stripControlAttributes(attribs) {
30
+ const result = {};
31
+ for (const [name, value] of Object.entries(attribs)) if (!CONTROL_ATTRS.has(name)) result[name] = value;
32
+ return result;
33
+ }
34
+ function parseEventAttribute(name) {
35
+ if (name.includes(":")) {
36
+ const [prefix, rawEvent] = name.split(":", 2);
37
+ return {
38
+ prefix,
39
+ rawEvent
40
+ };
41
+ }
42
+ const match = EVENT_PREFIX_RE.exec(name);
43
+ if (!match) return;
44
+ return {
45
+ prefix: name.slice(0, name.length - match[1].length),
46
+ rawEvent: match[1]
47
+ };
48
+ }
49
+ function resolveComponentTagName(name, componentTags) {
50
+ if (!componentTags) return;
51
+ return componentTags[name] ?? componentTags[name.toLowerCase()];
52
+ }
53
+ const PROPERTY_BIND_EXCLUSIONS = new Set([
54
+ "class",
55
+ "style",
56
+ "id",
57
+ "slot"
58
+ ]);
59
+ function shouldBindAsProperty(name) {
60
+ if (PROPERTY_BIND_EXCLUSIONS.has(name)) return false;
61
+ if (name.startsWith("data-") || name.startsWith("aria-")) return false;
62
+ return true;
63
+ }
64
+ function normalizePropertyName(name) {
65
+ return name.replace(/-([a-z])/g, (_, char) => char.toUpperCase());
66
+ }
67
+ function renderAttributes(attribs, scopeVar, wxsVar, options) {
68
+ let buffer = "";
69
+ for (const [rawName, rawValue] of Object.entries(attribs)) {
70
+ if (options?.skipControl && CONTROL_ATTRS.has(rawName)) continue;
71
+ const eventInfo = parseEventAttribute(rawName);
72
+ if (eventInfo) {
73
+ const event = eventInfo.rawEvent.toLowerCase();
74
+ const handlerExpr = buildExpression(parseInterpolations(rawValue ?? ""), scopeVar, wxsVar);
75
+ const domEvent = EVENT_KIND_ALIAS[event] ?? event;
76
+ const flags = {
77
+ catch: eventInfo.prefix.includes("catch"),
78
+ capture: eventInfo.prefix.includes("capture")
79
+ };
80
+ buffer += ` @${domEvent}=\${ctx.event(${JSON.stringify(event)}, ${handlerExpr}, ${scopeVar}, ${wxsVar}, ${JSON.stringify(flags)})}`;
81
+ continue;
82
+ }
83
+ const useProperty = options?.preferProperty && shouldBindAsProperty(rawName);
84
+ const name = useProperty ? normalizePropertyName(rawName) : normalizeAttributeName(rawName);
85
+ const expr = buildExpression(parseInterpolations(rawValue ?? ""), scopeVar, wxsVar);
86
+ buffer += ` ${useProperty ? "." : ""}${name}=\${${expr}}`;
87
+ }
88
+ return buffer;
89
+ }
90
+
91
+ //#endregion
92
+ export { extractFor, isConditionalElement, renderAttributes, resolveComponentTagName, stripControlAttributes };
93
+ //# sourceMappingURL=attributes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributes.mjs","names":[],"sources":["../../../src/compiler/wxml/attributes.ts"],"sourcesContent":["import type { RenderElementNode, RenderNode } from './types'\nimport { CONTROL_ATTRS, EVENT_KIND_ALIAS, EVENT_PREFIX_RE, normalizeAttributeName } from '../../shared/wxml'\nimport { buildExpression, parseInterpolations } from './interpolation'\n\nexport function extractFor(attribs: Record<string, string>) {\n const expr = attribs['wx:for']\n const itemName = attribs['wx:for-item']?.trim() || 'item'\n let indexName = attribs['wx:for-index']?.trim() || 'index'\n const key = attribs['wx:key']\n const restAttribs: Record<string, string> = {}\n for (const [name, value] of Object.entries(attribs)) {\n if (CONTROL_ATTRS.has(name)) {\n continue\n }\n restAttribs[name] = value\n }\n if (itemName === indexName) {\n indexName = `${indexName}Index`\n }\n return { expr, itemName, indexName, key, restAttribs }\n}\n\nexport function isConditionalElement(node: RenderNode): node is RenderElementNode {\n if (node.type !== 'element') {\n return false\n }\n const attribs = node.attribs ?? {}\n return 'wx:if' in attribs || 'wx:elif' in attribs || 'wx:else' in attribs\n}\n\nexport function stripControlAttributes(attribs: Record<string, string>) {\n const result: Record<string, string> = {}\n for (const [name, value] of Object.entries(attribs)) {\n if (!CONTROL_ATTRS.has(name)) {\n result[name] = value\n }\n }\n return result\n}\n\nfunction parseEventAttribute(name: string) {\n if (name.includes(':')) {\n const [prefix, rawEvent] = name.split(':', 2)\n return { prefix, rawEvent }\n }\n const match = EVENT_PREFIX_RE.exec(name)\n if (!match) {\n return undefined\n }\n return { prefix: name.slice(0, name.length - match[1].length), rawEvent: match[1] }\n}\n\nexport function resolveComponentTagName(name: string, componentTags?: Record<string, string>) {\n if (!componentTags) {\n return undefined\n }\n return componentTags[name] ?? componentTags[name.toLowerCase()]\n}\n\nconst PROPERTY_BIND_EXCLUSIONS = new Set(['class', 'style', 'id', 'slot'])\n\nfunction shouldBindAsProperty(name: string) {\n if (PROPERTY_BIND_EXCLUSIONS.has(name)) {\n return false\n }\n if (name.startsWith('data-') || name.startsWith('aria-')) {\n return false\n }\n return true\n}\n\nfunction normalizePropertyName(name: string) {\n return name.replace(/-([a-z])/g, (_, char: string) => char.toUpperCase())\n}\n\nexport function renderAttributes(\n attribs: Record<string, string>,\n scopeVar: string,\n wxsVar: string,\n options?: { skipControl?: boolean, preferProperty?: boolean },\n) {\n let buffer = ''\n for (const [rawName, rawValue] of Object.entries(attribs)) {\n if (options?.skipControl && CONTROL_ATTRS.has(rawName)) {\n continue\n }\n const eventInfo = parseEventAttribute(rawName)\n if (eventInfo) {\n const event = eventInfo.rawEvent.toLowerCase()\n const handlerExpr = buildExpression(parseInterpolations(rawValue ?? ''), scopeVar, wxsVar)\n const domEvent = EVENT_KIND_ALIAS[event] ?? event\n const flags = {\n catch: eventInfo.prefix.includes('catch'),\n capture: eventInfo.prefix.includes('capture'),\n }\n buffer += ` @${domEvent}=\\${ctx.event(${JSON.stringify(event)}, ${handlerExpr}, ${scopeVar}, ${wxsVar}, ${JSON.stringify(flags)})}`\n continue\n }\n const useProperty = options?.preferProperty && shouldBindAsProperty(rawName)\n const name = useProperty ? normalizePropertyName(rawName) : normalizeAttributeName(rawName)\n const expr = buildExpression(parseInterpolations(rawValue ?? ''), scopeVar, wxsVar)\n buffer += ` ${useProperty ? '.' : ''}${name}=\\${${expr}}`\n }\n return buffer\n}\n"],"mappings":";;;;AAIA,SAAgB,WAAW,SAAiC;CAC1D,MAAM,OAAO,QAAQ;CACrB,MAAM,WAAW,QAAQ,gBAAgB,MAAM,IAAI;CACnD,IAAI,YAAY,QAAQ,iBAAiB,MAAM,IAAI;CACnD,MAAM,MAAM,QAAQ;CACpB,MAAM,cAAsC,EAAE;AAC9C,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,QAAQ,EAAE;AACnD,MAAI,cAAc,IAAI,KAAK,CACzB;AAEF,cAAY,QAAQ;;AAEtB,KAAI,aAAa,UACf,aAAY,GAAG,UAAU;AAE3B,QAAO;EAAE;EAAM;EAAU;EAAW;EAAK;EAAa;;AAGxD,SAAgB,qBAAqB,MAA6C;AAChF,KAAI,KAAK,SAAS,UAChB,QAAO;CAET,MAAM,UAAU,KAAK,WAAW,EAAE;AAClC,QAAO,WAAW,WAAW,aAAa,WAAW,aAAa;;AAGpE,SAAgB,uBAAuB,SAAiC;CACtE,MAAM,SAAiC,EAAE;AACzC,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,QAAQ,CACjD,KAAI,CAAC,cAAc,IAAI,KAAK,CAC1B,QAAO,QAAQ;AAGnB,QAAO;;AAGT,SAAS,oBAAoB,MAAc;AACzC,KAAI,KAAK,SAAS,IAAI,EAAE;EACtB,MAAM,CAAC,QAAQ,YAAY,KAAK,MAAM,KAAK,EAAE;AAC7C,SAAO;GAAE;GAAQ;GAAU;;CAE7B,MAAM,QAAQ,gBAAgB,KAAK,KAAK;AACxC,KAAI,CAAC,MACH;AAEF,QAAO;EAAE,QAAQ,KAAK,MAAM,GAAG,KAAK,SAAS,MAAM,GAAG,OAAO;EAAE,UAAU,MAAM;EAAI;;AAGrF,SAAgB,wBAAwB,MAAc,eAAwC;AAC5F,KAAI,CAAC,cACH;AAEF,QAAO,cAAc,SAAS,cAAc,KAAK,aAAa;;AAGhE,MAAM,2BAA2B,IAAI,IAAI;CAAC;CAAS;CAAS;CAAM;CAAO,CAAC;AAE1E,SAAS,qBAAqB,MAAc;AAC1C,KAAI,yBAAyB,IAAI,KAAK,CACpC,QAAO;AAET,KAAI,KAAK,WAAW,QAAQ,IAAI,KAAK,WAAW,QAAQ,CACtD,QAAO;AAET,QAAO;;AAGT,SAAS,sBAAsB,MAAc;AAC3C,QAAO,KAAK,QAAQ,cAAc,GAAG,SAAiB,KAAK,aAAa,CAAC;;AAG3E,SAAgB,iBACd,SACA,UACA,QACA,SACA;CACA,IAAI,SAAS;AACb,MAAK,MAAM,CAAC,SAAS,aAAa,OAAO,QAAQ,QAAQ,EAAE;AACzD,MAAI,SAAS,eAAe,cAAc,IAAI,QAAQ,CACpD;EAEF,MAAM,YAAY,oBAAoB,QAAQ;AAC9C,MAAI,WAAW;GACb,MAAM,QAAQ,UAAU,SAAS,aAAa;GAC9C,MAAM,cAAc,gBAAgB,oBAAoB,YAAY,GAAG,EAAE,UAAU,OAAO;GAC1F,MAAM,WAAW,iBAAiB,UAAU;GAC5C,MAAM,QAAQ;IACZ,OAAO,UAAU,OAAO,SAAS,QAAQ;IACzC,SAAS,UAAU,OAAO,SAAS,UAAU;IAC9C;AACD,aAAU,KAAK,SAAS,gBAAgB,KAAK,UAAU,MAAM,CAAC,IAAI,YAAY,IAAI,SAAS,IAAI,OAAO,IAAI,KAAK,UAAU,MAAM,CAAC;AAChI;;EAEF,MAAM,cAAc,SAAS,kBAAkB,qBAAqB,QAAQ;EAC5E,MAAM,OAAO,cAAc,sBAAsB,QAAQ,GAAG,uBAAuB,QAAQ;EAC3F,MAAM,OAAO,gBAAgB,oBAAoB,YAAY,GAAG,EAAE,UAAU,OAAO;AACnF,YAAU,IAAI,cAAc,MAAM,KAAK,KAAK,MAAM,KAAK;;AAEzD,QAAO"}
@@ -0,0 +1,158 @@
1
+ import { addDependency, createDependencyContext, warnCircularTemplate, warnReadTemplate } from "./dependency.mjs";
2
+ import { buildNavigationBarAttrs, extractNavigationBarFromPageMeta } from "./navigation.mjs";
3
+ import { parseWxml } from "./parser.mjs";
4
+ import { renderer } from "./renderer.mjs";
5
+ import { collectSpecialNodes, normalizeTemplatePath, shouldMarkWxsImport, toRelativeImport } from "./specialNodes.mjs";
6
+ import { readFileSync } from "node:fs";
7
+
8
+ //#region src/compiler/wxml/compile.ts
9
+ function compileWxml(options) {
10
+ const dependencyContext = options.dependencyContext ?? createDependencyContext();
11
+ const expandDependencies = options.expandDependencies ?? !options.dependencyContext;
12
+ const warnings = dependencyContext.warnings;
13
+ const expandDependencyTree = (dependencies, importer) => {
14
+ for (const target of dependencies) {
15
+ if (!target) continue;
16
+ if (dependencyContext.active.has(target)) {
17
+ warnCircularTemplate(dependencyContext, importer, target);
18
+ continue;
19
+ }
20
+ if (dependencyContext.visited.has(target)) continue;
21
+ dependencyContext.visited.add(target);
22
+ dependencyContext.active.add(target);
23
+ let source;
24
+ try {
25
+ source = readFileSync(target, "utf8");
26
+ } catch {
27
+ warnReadTemplate(dependencyContext, target);
28
+ dependencyContext.active.delete(target);
29
+ continue;
30
+ }
31
+ try {
32
+ expandDependencyTree(compileWxml({
33
+ id: target,
34
+ source,
35
+ resolveTemplatePath: options.resolveTemplatePath,
36
+ resolveWxsPath: options.resolveWxsPath,
37
+ dependencyContext,
38
+ expandDependencies: false
39
+ }).dependencies, target);
40
+ } catch (error) {
41
+ if (error instanceof Error && error.message) warnings.push(`[web] 无法解析模板依赖: ${target} ${error.message}`);
42
+ }
43
+ dependencyContext.active.delete(target);
44
+ }
45
+ };
46
+ let nodes = parseWxml(options.source);
47
+ let navigationBarAttrs;
48
+ if (options.navigationBar) {
49
+ const extracted = extractNavigationBarFromPageMeta(nodes);
50
+ nodes = extracted.nodes;
51
+ if (extracted.warnings.length > 0) warnings.push(...extracted.warnings);
52
+ navigationBarAttrs = extracted.attrs;
53
+ }
54
+ const templates = [];
55
+ const includes = [];
56
+ const imports = [];
57
+ const wxs = [];
58
+ const renderNodesList = collectSpecialNodes(nodes, {
59
+ templates,
60
+ includes,
61
+ imports,
62
+ wxs,
63
+ wxsModules: /* @__PURE__ */ new Map(),
64
+ warnings,
65
+ sourceId: options.id,
66
+ resolveTemplate: (raw) => options.resolveTemplatePath(raw, options.id),
67
+ resolveWxs: (raw) => options.resolveWxsPath(raw, options.id)
68
+ });
69
+ if (options.navigationBar && options.navigationBar.config.navigationStyle !== "custom") {
70
+ const attrs = buildNavigationBarAttrs(options.navigationBar.config, navigationBarAttrs);
71
+ renderNodesList.unshift({
72
+ type: "element",
73
+ name: "weapp-navigation-bar",
74
+ attribs: attrs
75
+ });
76
+ }
77
+ const importLines = [`import { html } from 'lit'`, `import { repeat } from 'lit/directives/repeat.js'`];
78
+ const bodyLines = [];
79
+ const directDependencies = [];
80
+ for (const entry of imports) {
81
+ const importPath = normalizeTemplatePath(toRelativeImport(options.id, entry.id));
82
+ importLines.push(`import { templates as ${entry.importName} } from '${importPath}'`);
83
+ addDependency(entry.id, dependencyContext, directDependencies);
84
+ }
85
+ for (const entry of includes) {
86
+ const importPath = normalizeTemplatePath(toRelativeImport(options.id, entry.id));
87
+ importLines.push(`import { render as ${entry.importName} } from '${importPath}'`);
88
+ addDependency(entry.id, dependencyContext, directDependencies);
89
+ }
90
+ for (const entry of wxs) if (entry.kind === "src") {
91
+ const baseImport = normalizeTemplatePath(toRelativeImport(options.id, entry.value));
92
+ const importPath = shouldMarkWxsImport(entry.value) ? `${baseImport}?wxs` : baseImport;
93
+ importLines.push(`import ${entry.importName} from '${importPath}'`);
94
+ addDependency(entry.value, dependencyContext, directDependencies);
95
+ }
96
+ if (templates.length > 0 || imports.length > 0) {
97
+ const templatePairs = [];
98
+ for (const entry of imports) templatePairs.push(`...${entry.importName}`);
99
+ for (const template of templates) {
100
+ const rendered = renderer.renderNodes(template.nodes, "scope", "__wxs_modules", options.componentTags);
101
+ templatePairs.push(`${JSON.stringify(template.name)}: (scope, ctx) => ${rendered}`);
102
+ }
103
+ bodyLines.push(`const __templates = { ${templatePairs.join(", ")} }`);
104
+ } else bodyLines.push(`const __templates = {}`);
105
+ if (wxs.length > 0) {
106
+ bodyLines.push(`const __wxs_inline_cache = Object.create(null)`);
107
+ bodyLines.push(`let __wxs_modules = {}`);
108
+ const wxsMapEntries = [];
109
+ for (const entry of wxs) {
110
+ if (entry.kind === "inline") {
111
+ const inlineCode = entry.value.trim();
112
+ const cacheKey = JSON.stringify(entry.module);
113
+ if (inlineCode) {
114
+ bodyLines.push(`function ${entry.importName}(ctx) {`);
115
+ bodyLines.push(` if (!__wxs_inline_cache[${cacheKey}]) {`);
116
+ bodyLines.push(` __wxs_inline_cache[${cacheKey}] = ctx.createWxsModule(${JSON.stringify(inlineCode)}, ${JSON.stringify(options.id)})`);
117
+ bodyLines.push(` }`);
118
+ bodyLines.push(` return __wxs_inline_cache[${cacheKey}]`);
119
+ bodyLines.push(`}`);
120
+ } else bodyLines.push(`function ${entry.importName}() { return {} }`);
121
+ wxsMapEntries.push(`${JSON.stringify(entry.module)}: ${entry.importName}(ctx)`);
122
+ continue;
123
+ }
124
+ wxsMapEntries.push(`${JSON.stringify(entry.module)}: ${entry.importName}`);
125
+ }
126
+ bodyLines.push(`function __resolveWxsModules(ctx) {`);
127
+ bodyLines.push(` return { ${wxsMapEntries.join(", ")} }`);
128
+ bodyLines.push(`}`);
129
+ } else bodyLines.push(`const __wxs_modules = {}`);
130
+ const includesRender = includes.map((entry) => `${entry.importName}(scope, ctx)`);
131
+ const renderContent = renderer.renderNodes(renderNodesList, "scope", "__wxs_modules", options.componentTags);
132
+ const contentExpr = includesRender.length > 0 ? `[${[...includesRender, renderContent].join(", ")}]` : renderContent;
133
+ bodyLines.push(`export function render(scope, ctx) {`);
134
+ if (wxs.length > 0) bodyLines.push(` __wxs_modules = __resolveWxsModules(ctx)`);
135
+ bodyLines.push(` return ${contentExpr}`);
136
+ bodyLines.push(`}`);
137
+ bodyLines.push(`export const templates = __templates`);
138
+ bodyLines.push(`export default render`);
139
+ if (expandDependencies) {
140
+ dependencyContext.visited.add(options.id);
141
+ dependencyContext.active.add(options.id);
142
+ expandDependencyTree(directDependencies, options.id);
143
+ dependencyContext.active.delete(options.id);
144
+ }
145
+ return {
146
+ code: [
147
+ ...importLines,
148
+ "",
149
+ ...bodyLines
150
+ ].join("\n"),
151
+ dependencies: expandDependencies ? dependencyContext.dependencies : directDependencies,
152
+ warnings: warnings.length > 0 ? warnings : void 0
153
+ };
154
+ }
155
+
156
+ //#endregion
157
+ export { compileWxml };
158
+ //# sourceMappingURL=compile.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.mjs","names":[],"sources":["../../../src/compiler/wxml/compile.ts"],"sourcesContent":["import type {\n ImportEntry,\n IncludeEntry,\n TemplateDefinition,\n WxmlCompileOptions,\n WxmlCompileResult,\n WxsEntry,\n} from './types'\n\nimport { readFileSync } from 'node:fs'\nimport { addDependency, createDependencyContext, warnCircularTemplate, warnReadTemplate } from './dependency'\nimport { buildNavigationBarAttrs, extractNavigationBarFromPageMeta } from './navigation'\nimport { parseWxml } from './parser'\nimport { renderer } from './renderer'\nimport { collectSpecialNodes, normalizeTemplatePath, shouldMarkWxsImport, toRelativeImport } from './specialNodes'\n\nexport function compileWxml(options: WxmlCompileOptions): WxmlCompileResult {\n const dependencyContext = options.dependencyContext ?? createDependencyContext()\n const expandDependencies = options.expandDependencies ?? !options.dependencyContext\n const warnings = dependencyContext.warnings\n\n const expandDependencyTree = (dependencies: string[], importer: string) => {\n for (const target of dependencies) {\n if (!target) {\n continue\n }\n if (dependencyContext.active.has(target)) {\n warnCircularTemplate(dependencyContext, importer, target)\n continue\n }\n if (dependencyContext.visited.has(target)) {\n continue\n }\n dependencyContext.visited.add(target)\n dependencyContext.active.add(target)\n let source: string\n try {\n source = readFileSync(target, 'utf8')\n }\n catch {\n warnReadTemplate(dependencyContext, target)\n dependencyContext.active.delete(target)\n continue\n }\n try {\n const result = compileWxml({\n id: target,\n source,\n resolveTemplatePath: options.resolveTemplatePath,\n resolveWxsPath: options.resolveWxsPath,\n dependencyContext,\n expandDependencies: false,\n })\n expandDependencyTree(result.dependencies, target)\n }\n catch (error) {\n if (error instanceof Error && error.message) {\n warnings.push(`[web] 无法解析模板依赖: ${target} ${error.message}`)\n }\n }\n dependencyContext.active.delete(target)\n }\n }\n\n let nodes = parseWxml(options.source)\n let navigationBarAttrs: Record<string, string> | undefined\n if (options.navigationBar) {\n const extracted = extractNavigationBarFromPageMeta(nodes)\n nodes = extracted.nodes\n if (extracted.warnings.length > 0) {\n warnings.push(...extracted.warnings)\n }\n navigationBarAttrs = extracted.attrs\n }\n\n const templates: TemplateDefinition[] = []\n const includes: IncludeEntry[] = []\n const imports: ImportEntry[] = []\n const wxs: WxsEntry[] = []\n const wxsModules = new Map<string, string>()\n\n const renderNodesList = collectSpecialNodes(nodes, {\n templates,\n includes,\n imports,\n wxs,\n wxsModules,\n warnings,\n sourceId: options.id,\n resolveTemplate: (raw: string) => options.resolveTemplatePath(raw, options.id),\n resolveWxs: (raw: string) => options.resolveWxsPath(raw, options.id),\n })\n\n if (options.navigationBar && options.navigationBar.config.navigationStyle !== 'custom') {\n const attrs = buildNavigationBarAttrs(options.navigationBar.config, navigationBarAttrs)\n renderNodesList.unshift({\n type: 'element',\n name: 'weapp-navigation-bar',\n attribs: attrs,\n })\n }\n\n const importLines: string[] = [\n `import { html } from 'lit'`,\n `import { repeat } from 'lit/directives/repeat.js'`,\n ]\n const bodyLines: string[] = []\n const directDependencies: string[] = []\n\n for (const entry of imports) {\n const importPath = normalizeTemplatePath(toRelativeImport(options.id, entry.id))\n importLines.push(`import { templates as ${entry.importName} } from '${importPath}'`)\n addDependency(entry.id, dependencyContext, directDependencies)\n }\n\n for (const entry of includes) {\n const importPath = normalizeTemplatePath(toRelativeImport(options.id, entry.id))\n importLines.push(`import { render as ${entry.importName} } from '${importPath}'`)\n addDependency(entry.id, dependencyContext, directDependencies)\n }\n\n for (const entry of wxs) {\n if (entry.kind === 'src') {\n const baseImport = normalizeTemplatePath(toRelativeImport(options.id, entry.value))\n const importPath = shouldMarkWxsImport(entry.value)\n ? `${baseImport}?wxs`\n : baseImport\n importLines.push(`import ${entry.importName} from '${importPath}'`)\n addDependency(entry.value, dependencyContext, directDependencies)\n }\n }\n\n if (templates.length > 0 || imports.length > 0) {\n const templatePairs: string[] = []\n for (const entry of imports) {\n templatePairs.push(`...${entry.importName}`)\n }\n for (const template of templates) {\n const rendered = renderer.renderNodes(template.nodes, 'scope', '__wxs_modules', options.componentTags)\n templatePairs.push(`${JSON.stringify(template.name)}: (scope, ctx) => ${rendered}`)\n }\n bodyLines.push(`const __templates = { ${templatePairs.join(', ')} }`)\n }\n else {\n bodyLines.push(`const __templates = {}`)\n }\n\n if (wxs.length > 0) {\n bodyLines.push(`const __wxs_inline_cache = Object.create(null)`)\n bodyLines.push(`let __wxs_modules = {}`)\n const wxsMapEntries: string[] = []\n for (const entry of wxs) {\n if (entry.kind === 'inline') {\n const inlineCode = entry.value.trim()\n const cacheKey = JSON.stringify(entry.module)\n if (inlineCode) {\n bodyLines.push(`function ${entry.importName}(ctx) {`)\n bodyLines.push(` if (!__wxs_inline_cache[${cacheKey}]) {`)\n bodyLines.push(` __wxs_inline_cache[${cacheKey}] = ctx.createWxsModule(${JSON.stringify(inlineCode)}, ${JSON.stringify(options.id)})`)\n bodyLines.push(` }`)\n bodyLines.push(` return __wxs_inline_cache[${cacheKey}]`)\n bodyLines.push(`}`)\n }\n else {\n bodyLines.push(`function ${entry.importName}() { return {} }`)\n }\n wxsMapEntries.push(`${JSON.stringify(entry.module)}: ${entry.importName}(ctx)`)\n continue\n }\n wxsMapEntries.push(`${JSON.stringify(entry.module)}: ${entry.importName}`)\n }\n bodyLines.push(`function __resolveWxsModules(ctx) {`)\n bodyLines.push(` return { ${wxsMapEntries.join(', ')} }`)\n bodyLines.push(`}`)\n }\n else {\n bodyLines.push(`const __wxs_modules = {}`)\n }\n\n const includesRender = includes.map(entry => `${entry.importName}(scope, ctx)`)\n const renderContent = renderer.renderNodes(renderNodesList, 'scope', '__wxs_modules', options.componentTags)\n const contentExpr = includesRender.length > 0\n ? `[${[...includesRender, renderContent].join(', ')}]`\n : renderContent\n\n bodyLines.push(`export function render(scope, ctx) {`)\n if (wxs.length > 0) {\n bodyLines.push(` __wxs_modules = __resolveWxsModules(ctx)`)\n }\n bodyLines.push(` return ${contentExpr}`)\n bodyLines.push(`}`)\n bodyLines.push(`export const templates = __templates`)\n bodyLines.push(`export default render`)\n\n if (expandDependencies) {\n dependencyContext.visited.add(options.id)\n dependencyContext.active.add(options.id)\n expandDependencyTree(directDependencies, options.id)\n dependencyContext.active.delete(options.id)\n }\n\n const code = [...importLines, '', ...bodyLines].join('\\n')\n const dependencies = expandDependencies ? dependencyContext.dependencies : directDependencies\n return {\n code,\n dependencies,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ //#region src/compiler/wxml/dependency.ts
2
+ function createDependencyContext() {
3
+ return {
4
+ warnings: [],
5
+ dependencies: [],
6
+ dependencySet: /* @__PURE__ */ new Set(),
7
+ visited: /* @__PURE__ */ new Set(),
8
+ active: /* @__PURE__ */ new Set(),
9
+ circularWarnings: /* @__PURE__ */ new Set()
10
+ };
11
+ }
12
+ function addDependency(value, context, direct) {
13
+ if (!context.dependencySet.has(value)) {
14
+ context.dependencySet.add(value);
15
+ context.dependencies.push(value);
16
+ direct?.push(value);
17
+ }
18
+ }
19
+ function warnReadTemplate(context, target) {
20
+ context.warnings.push(`[web] 无法读取模板依赖: ${target}`);
21
+ }
22
+ function warnCircularTemplate(context, from, target) {
23
+ const key = `${from}=>${target}`;
24
+ if (context.circularWarnings.has(key)) return;
25
+ context.circularWarnings.add(key);
26
+ context.warnings.push(`[web] WXML 循环引用: ${from} -> ${target}`);
27
+ }
28
+
29
+ //#endregion
30
+ export { addDependency, createDependencyContext, warnCircularTemplate, warnReadTemplate };
31
+ //# sourceMappingURL=dependency.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency.mjs","names":[],"sources":["../../../src/compiler/wxml/dependency.ts"],"sourcesContent":["import type { WxmlDependencyContext } from './types'\n\nexport function createDependencyContext(): WxmlDependencyContext {\n return {\n warnings: [],\n dependencies: [],\n dependencySet: new Set(),\n visited: new Set(),\n active: new Set(),\n circularWarnings: new Set(),\n }\n}\n\nexport function addDependency(\n value: string,\n context: WxmlDependencyContext,\n direct?: string[],\n) {\n if (!context.dependencySet.has(value)) {\n context.dependencySet.add(value)\n context.dependencies.push(value)\n direct?.push(value)\n }\n}\n\nexport function warnReadTemplate(context: WxmlDependencyContext, target: string) {\n context.warnings.push(`[web] 无法读取模板依赖: ${target}`)\n}\n\nexport function warnCircularTemplate(\n context: WxmlDependencyContext,\n from: string,\n target: string,\n) {\n const key = `${from}=>${target}`\n if (context.circularWarnings.has(key)) {\n return\n }\n context.circularWarnings.add(key)\n context.warnings.push(`[web] WXML 循环引用: ${from} -> ${target}`)\n}\n"],"mappings":";AAEA,SAAgB,0BAAiD;AAC/D,QAAO;EACL,UAAU,EAAE;EACZ,cAAc,EAAE;EAChB,+BAAe,IAAI,KAAK;EACxB,yBAAS,IAAI,KAAK;EAClB,wBAAQ,IAAI,KAAK;EACjB,kCAAkB,IAAI,KAAK;EAC5B;;AAGH,SAAgB,cACd,OACA,SACA,QACA;AACA,KAAI,CAAC,QAAQ,cAAc,IAAI,MAAM,EAAE;AACrC,UAAQ,cAAc,IAAI,MAAM;AAChC,UAAQ,aAAa,KAAK,MAAM;AAChC,UAAQ,KAAK,MAAM;;;AAIvB,SAAgB,iBAAiB,SAAgC,QAAgB;AAC/E,SAAQ,SAAS,KAAK,mBAAmB,SAAS;;AAGpD,SAAgB,qBACd,SACA,MACA,QACA;CACA,MAAM,MAAM,GAAG,KAAK,IAAI;AACxB,KAAI,QAAQ,iBAAiB,IAAI,IAAI,CACnC;AAEF,SAAQ,iBAAiB,IAAI,IAAI;AACjC,SAAQ,SAAS,KAAK,oBAAoB,KAAK,MAAM,SAAS"}
@@ -0,0 +1,142 @@
1
+ //#region src/compiler/wxml/interpolation.ts
2
+ function parseInterpolations(value) {
3
+ const parts = [];
4
+ if (!value.includes("{{")) return [{
5
+ type: "text",
6
+ value
7
+ }];
8
+ let cursor = 0;
9
+ while (cursor < value.length) {
10
+ const start = value.indexOf("{{", cursor);
11
+ if (start === -1) {
12
+ parts.push({
13
+ type: "text",
14
+ value: value.slice(cursor)
15
+ });
16
+ break;
17
+ }
18
+ if (start > cursor) parts.push({
19
+ type: "text",
20
+ value: value.slice(cursor, start)
21
+ });
22
+ const end = value.indexOf("}}", start + 2);
23
+ if (end === -1) {
24
+ parts.push({
25
+ type: "text",
26
+ value: value.slice(start)
27
+ });
28
+ break;
29
+ }
30
+ const expr = value.slice(start + 2, end).trim();
31
+ if (expr) parts.push({
32
+ type: "expr",
33
+ value: expr
34
+ });
35
+ cursor = end + 2;
36
+ }
37
+ return parts;
38
+ }
39
+ function buildExpression(parts, scopeVar, wxsVar) {
40
+ if (parts.length === 0) return "\"\"";
41
+ if (parts.length === 1 && parts[0]?.type === "text") return JSON.stringify(parts[0].value);
42
+ if (parts.length === 1 && parts[0]?.type === "expr") return `ctx.eval(${JSON.stringify(parts[0].value)}, ${scopeVar}, ${wxsVar})`;
43
+ return `(${parts.map((part) => {
44
+ if (part.type === "text") return JSON.stringify(part.value);
45
+ return `ctx.eval(${JSON.stringify(part.value)}, ${scopeVar}, ${wxsVar})`;
46
+ }).join(" + ")})`;
47
+ }
48
+ function hasTopLevelColon(expression) {
49
+ let depth = 0;
50
+ let inSingleQuote = false;
51
+ let inDoubleQuote = false;
52
+ let inTemplate = false;
53
+ let escaped = false;
54
+ let sawTopLevelQuestion = false;
55
+ for (let index = 0; index < expression.length; index += 1) {
56
+ const char = expression[index];
57
+ if (inSingleQuote) {
58
+ if (escaped) {
59
+ escaped = false;
60
+ continue;
61
+ }
62
+ if (char === "\\") {
63
+ escaped = true;
64
+ continue;
65
+ }
66
+ if (char === "'") inSingleQuote = false;
67
+ continue;
68
+ }
69
+ if (inDoubleQuote) {
70
+ if (escaped) {
71
+ escaped = false;
72
+ continue;
73
+ }
74
+ if (char === "\\") {
75
+ escaped = true;
76
+ continue;
77
+ }
78
+ if (char === "\"") inDoubleQuote = false;
79
+ continue;
80
+ }
81
+ if (inTemplate) {
82
+ if (escaped) {
83
+ escaped = false;
84
+ continue;
85
+ }
86
+ if (char === "\\") {
87
+ escaped = true;
88
+ continue;
89
+ }
90
+ if (char === "`") inTemplate = false;
91
+ continue;
92
+ }
93
+ if (char === "'") {
94
+ inSingleQuote = true;
95
+ continue;
96
+ }
97
+ if (char === "\"") {
98
+ inDoubleQuote = true;
99
+ continue;
100
+ }
101
+ if (char === "`") {
102
+ inTemplate = true;
103
+ continue;
104
+ }
105
+ if (char === "(" || char === "[" || char === "{") {
106
+ depth += 1;
107
+ continue;
108
+ }
109
+ if (char === ")" || char === "]" || char === "}") {
110
+ depth = Math.max(0, depth - 1);
111
+ continue;
112
+ }
113
+ if (depth !== 0) continue;
114
+ if (char === "?") {
115
+ sawTopLevelQuestion = true;
116
+ continue;
117
+ }
118
+ if (char === ":") return !sawTopLevelQuestion;
119
+ }
120
+ return false;
121
+ }
122
+ function shouldWrapShorthandObject(expression) {
123
+ const trimmed = expression.trim();
124
+ if (!trimmed) return false;
125
+ if (trimmed.startsWith("{") || trimmed.startsWith("[") || trimmed.startsWith("(")) return false;
126
+ return hasTopLevelColon(trimmed);
127
+ }
128
+ function buildTemplateDataExpression(raw, scopeVar, wxsVar) {
129
+ const parts = parseInterpolations(raw.trim());
130
+ if (parts.length === 1 && parts[0]?.type === "expr") {
131
+ const expr = parts[0].value.trim();
132
+ if (expr) return buildExpression([{
133
+ type: "expr",
134
+ value: shouldWrapShorthandObject(expr) ? `{ ${expr} }` : expr
135
+ }], scopeVar, wxsVar);
136
+ }
137
+ return buildExpression(parseInterpolations(raw), scopeVar, wxsVar);
138
+ }
139
+
140
+ //#endregion
141
+ export { buildExpression, buildTemplateDataExpression, parseInterpolations };
142
+ //# sourceMappingURL=interpolation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolation.mjs","names":[],"sources":["../../../src/compiler/wxml/interpolation.ts"],"sourcesContent":["import type { InterpolationPart } from './types'\n\nexport function parseInterpolations(value: string): InterpolationPart[] {\n const parts: InterpolationPart[] = []\n if (!value.includes('{{')) {\n return [{ type: 'text', value }]\n }\n let cursor = 0\n while (cursor < value.length) {\n const start = value.indexOf('{{', cursor)\n if (start === -1) {\n parts.push({ type: 'text', value: value.slice(cursor) })\n break\n }\n if (start > cursor) {\n parts.push({ type: 'text', value: value.slice(cursor, start) })\n }\n const end = value.indexOf('}}', start + 2)\n if (end === -1) {\n parts.push({ type: 'text', value: value.slice(start) })\n break\n }\n const expr = value.slice(start + 2, end).trim()\n if (expr) {\n parts.push({ type: 'expr', value: expr })\n }\n cursor = end + 2\n }\n return parts\n}\n\nexport function buildExpression(parts: InterpolationPart[], scopeVar: string, wxsVar: string) {\n if (parts.length === 0) {\n return '\"\"'\n }\n if (parts.length === 1 && parts[0]?.type === 'text') {\n return JSON.stringify(parts[0].value)\n }\n if (parts.length === 1 && parts[0]?.type === 'expr') {\n return `ctx.eval(${JSON.stringify(parts[0].value)}, ${scopeVar}, ${wxsVar})`\n }\n const segments = parts.map((part) => {\n if (part.type === 'text') {\n return JSON.stringify(part.value)\n }\n return `ctx.eval(${JSON.stringify(part.value)}, ${scopeVar}, ${wxsVar})`\n })\n return `(${segments.join(' + ')})`\n}\n\nfunction hasTopLevelColon(expression: string) {\n let depth = 0\n let inSingleQuote = false\n let inDoubleQuote = false\n let inTemplate = false\n let escaped = false\n let sawTopLevelQuestion = false\n\n for (let index = 0; index < expression.length; index += 1) {\n const char = expression[index]!\n\n if (inSingleQuote) {\n if (escaped) {\n escaped = false\n continue\n }\n if (char === '\\\\') {\n escaped = true\n continue\n }\n if (char === '\\'') {\n inSingleQuote = false\n }\n continue\n }\n if (inDoubleQuote) {\n if (escaped) {\n escaped = false\n continue\n }\n if (char === '\\\\') {\n escaped = true\n continue\n }\n if (char === '\"') {\n inDoubleQuote = false\n }\n continue\n }\n if (inTemplate) {\n if (escaped) {\n escaped = false\n continue\n }\n if (char === '\\\\') {\n escaped = true\n continue\n }\n if (char === '`') {\n inTemplate = false\n }\n continue\n }\n\n if (char === '\\'') {\n inSingleQuote = true\n continue\n }\n if (char === '\"') {\n inDoubleQuote = true\n continue\n }\n if (char === '`') {\n inTemplate = true\n continue\n }\n\n if (char === '(' || char === '[' || char === '{') {\n depth += 1\n continue\n }\n if (char === ')' || char === ']' || char === '}') {\n depth = Math.max(0, depth - 1)\n continue\n }\n\n if (depth !== 0) {\n continue\n }\n\n if (char === '?') {\n sawTopLevelQuestion = true\n continue\n }\n if (char === ':') {\n return !sawTopLevelQuestion\n }\n }\n\n return false\n}\n\nfunction shouldWrapShorthandObject(expression: string) {\n const trimmed = expression.trim()\n if (!trimmed) {\n return false\n }\n if (trimmed.startsWith('{') || trimmed.startsWith('[') || trimmed.startsWith('(')) {\n return false\n }\n return hasTopLevelColon(trimmed)\n}\n\nexport function buildTemplateDataExpression(raw: string, scopeVar: string, wxsVar: string) {\n const trimmed = raw.trim()\n const parts = parseInterpolations(trimmed)\n if (parts.length === 1 && parts[0]?.type === 'expr') {\n const expr = parts[0].value.trim()\n if (expr) {\n const normalizedExpr = shouldWrapShorthandObject(expr) ? `{ ${expr} }` : expr\n return buildExpression([{ type: 'expr', value: normalizedExpr }], scopeVar, wxsVar)\n }\n }\n return buildExpression(parseInterpolations(raw), scopeVar, wxsVar)\n}\n"],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ //#region src/compiler/wxml/navigation.ts
2
+ const NAVIGATION_BAR_ATTRS = new Set([
3
+ "title",
4
+ "background-color",
5
+ "text-style",
6
+ "front-color",
7
+ "loading"
8
+ ]);
9
+ function stripPageMetaNodes(nodes) {
10
+ const stripped = [];
11
+ for (const node of nodes) {
12
+ if (node.type === "element" && node.name === "page-meta") continue;
13
+ if (node.type === "element" && node.children?.length) {
14
+ const nextChildren = stripPageMetaNodes(node.children);
15
+ if (nextChildren !== node.children) {
16
+ stripped.push({
17
+ ...node,
18
+ children: nextChildren
19
+ });
20
+ continue;
21
+ }
22
+ }
23
+ stripped.push(node);
24
+ }
25
+ return stripped;
26
+ }
27
+ function pickNavigationBarAttrs(attribs) {
28
+ if (!attribs) return;
29
+ const picked = {};
30
+ for (const [key, value] of Object.entries(attribs)) if (NAVIGATION_BAR_ATTRS.has(key)) picked[key] = value;
31
+ return Object.keys(picked).length > 0 ? picked : void 0;
32
+ }
33
+ function findNavigationBarInPageMeta(node) {
34
+ const children = node.children ?? [];
35
+ for (const child of children) if (child.type === "element" && child.name === "navigation-bar") return child;
36
+ }
37
+ function extractNavigationBarFromPageMeta(nodes) {
38
+ let pageMetaIndex = -1;
39
+ let navigationBar;
40
+ for (let i = 0; i < nodes.length; i += 1) {
41
+ const node = nodes[i];
42
+ if (node.type === "element" && node.name === "page-meta") {
43
+ if (pageMetaIndex === -1) pageMetaIndex = i;
44
+ if (!navigationBar) navigationBar = findNavigationBarInPageMeta(node);
45
+ }
46
+ }
47
+ const warnings = [];
48
+ if (pageMetaIndex > 0) warnings.push("[web] page-meta 需要作为页面第一个节点,已忽略其位置约束。");
49
+ return {
50
+ nodes: pageMetaIndex === -1 ? nodes : stripPageMetaNodes(nodes),
51
+ attrs: navigationBar ? pickNavigationBarAttrs(navigationBar.attribs) : void 0,
52
+ warnings
53
+ };
54
+ }
55
+ function toAttributeValue(value) {
56
+ if (value == null) return;
57
+ if (typeof value === "string") return value;
58
+ if (typeof value === "number" || typeof value === "boolean") return String(value);
59
+ }
60
+ function buildNavigationBarAttrs(config, overrides) {
61
+ const attrs = {};
62
+ if (config?.title !== void 0) {
63
+ const value = toAttributeValue(config.title);
64
+ if (value !== void 0) attrs.title = value;
65
+ }
66
+ if (config?.backgroundColor !== void 0) {
67
+ const value = toAttributeValue(config.backgroundColor);
68
+ if (value !== void 0) attrs["background-color"] = value;
69
+ }
70
+ if (config?.textStyle !== void 0) {
71
+ const value = toAttributeValue(config.textStyle);
72
+ if (value !== void 0) attrs["text-style"] = value;
73
+ }
74
+ if (config?.frontColor !== void 0) {
75
+ const value = toAttributeValue(config.frontColor);
76
+ if (value !== void 0) attrs["front-color"] = value;
77
+ }
78
+ if (config?.loading) attrs.loading = "true";
79
+ if (overrides) for (const [key, value] of Object.entries(overrides)) attrs[key] = value;
80
+ return attrs;
81
+ }
82
+
83
+ //#endregion
84
+ export { buildNavigationBarAttrs, extractNavigationBarFromPageMeta };
85
+ //# sourceMappingURL=navigation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.mjs","names":[],"sources":["../../../src/compiler/wxml/navigation.ts"],"sourcesContent":["import type { NavigationBarConfig, RenderElementNode, RenderNode } from './types'\n\nconst NAVIGATION_BAR_ATTRS = new Set([\n 'title',\n 'background-color',\n 'text-style',\n 'front-color',\n 'loading',\n])\n\nfunction stripPageMetaNodes(nodes: RenderNode[]): RenderNode[] {\n const stripped: RenderNode[] = []\n for (const node of nodes) {\n if (node.type === 'element' && node.name === 'page-meta') {\n continue\n }\n if (node.type === 'element' && node.children?.length) {\n const nextChildren = stripPageMetaNodes(node.children)\n if (nextChildren !== node.children) {\n stripped.push({ ...node, children: nextChildren })\n continue\n }\n }\n stripped.push(node)\n }\n return stripped\n}\n\nfunction pickNavigationBarAttrs(attribs: Record<string, string> | undefined) {\n if (!attribs) {\n return undefined\n }\n const picked: Record<string, string> = {}\n for (const [key, value] of Object.entries(attribs)) {\n if (NAVIGATION_BAR_ATTRS.has(key)) {\n picked[key] = value\n }\n }\n return Object.keys(picked).length > 0 ? picked : undefined\n}\n\nfunction findNavigationBarInPageMeta(node: RenderElementNode) {\n const children = node.children ?? []\n for (const child of children) {\n if (child.type === 'element' && child.name === 'navigation-bar') {\n return child\n }\n }\n return undefined\n}\n\nexport function extractNavigationBarFromPageMeta(nodes: RenderNode[]): {\n nodes: RenderNode[]\n attrs?: Record<string, string>\n warnings: string[]\n} {\n let pageMetaIndex = -1\n let navigationBar: RenderElementNode | undefined\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i]\n if (node.type === 'element' && node.name === 'page-meta') {\n if (pageMetaIndex === -1) {\n pageMetaIndex = i\n }\n if (!navigationBar) {\n navigationBar = findNavigationBarInPageMeta(node)\n }\n }\n }\n const warnings: string[] = []\n if (pageMetaIndex > 0) {\n warnings.push('[web] page-meta 需要作为页面第一个节点,已忽略其位置约束。')\n }\n const cleaned = pageMetaIndex === -1 ? nodes : stripPageMetaNodes(nodes)\n const attrs = navigationBar ? pickNavigationBarAttrs(navigationBar.attribs) : undefined\n return { nodes: cleaned, attrs, warnings }\n}\n\nfunction toAttributeValue(value: unknown) {\n if (value == null) {\n return undefined\n }\n if (typeof value === 'string') {\n return value\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value)\n }\n return undefined\n}\n\nexport function buildNavigationBarAttrs(\n config: NavigationBarConfig | undefined,\n overrides?: Record<string, string>,\n) {\n const attrs: Record<string, string> = {}\n if (config?.title !== undefined) {\n const value = toAttributeValue(config.title)\n if (value !== undefined) {\n attrs.title = value\n }\n }\n if (config?.backgroundColor !== undefined) {\n const value = toAttributeValue(config.backgroundColor)\n if (value !== undefined) {\n attrs['background-color'] = value\n }\n }\n if (config?.textStyle !== undefined) {\n const value = toAttributeValue(config.textStyle)\n if (value !== undefined) {\n attrs['text-style'] = value\n }\n }\n if (config?.frontColor !== undefined) {\n const value = toAttributeValue(config.frontColor)\n if (value !== undefined) {\n attrs['front-color'] = value\n }\n }\n if (config?.loading) {\n attrs.loading = 'true'\n }\n if (overrides) {\n for (const [key, value] of Object.entries(overrides)) {\n attrs[key] = value\n }\n }\n return attrs\n}\n"],"mappings":";AAEA,MAAM,uBAAuB,IAAI,IAAI;CACnC;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,mBAAmB,OAAmC;CAC7D,MAAM,WAAyB,EAAE;AACjC,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,KAAK,SAAS,aAAa,KAAK,SAAS,YAC3C;AAEF,MAAI,KAAK,SAAS,aAAa,KAAK,UAAU,QAAQ;GACpD,MAAM,eAAe,mBAAmB,KAAK,SAAS;AACtD,OAAI,iBAAiB,KAAK,UAAU;AAClC,aAAS,KAAK;KAAE,GAAG;KAAM,UAAU;KAAc,CAAC;AAClD;;;AAGJ,WAAS,KAAK,KAAK;;AAErB,QAAO;;AAGT,SAAS,uBAAuB,SAA6C;AAC3E,KAAI,CAAC,QACH;CAEF,MAAM,SAAiC,EAAE;AACzC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,CAChD,KAAI,qBAAqB,IAAI,IAAI,CAC/B,QAAO,OAAO;AAGlB,QAAO,OAAO,KAAK,OAAO,CAAC,SAAS,IAAI,SAAS;;AAGnD,SAAS,4BAA4B,MAAyB;CAC5D,MAAM,WAAW,KAAK,YAAY,EAAE;AACpC,MAAK,MAAM,SAAS,SAClB,KAAI,MAAM,SAAS,aAAa,MAAM,SAAS,iBAC7C,QAAO;;AAMb,SAAgB,iCAAiC,OAI/C;CACA,IAAI,gBAAgB;CACpB,IAAI;AACJ,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxC,MAAM,OAAO,MAAM;AACnB,MAAI,KAAK,SAAS,aAAa,KAAK,SAAS,aAAa;AACxD,OAAI,kBAAkB,GACpB,iBAAgB;AAElB,OAAI,CAAC,cACH,iBAAgB,4BAA4B,KAAK;;;CAIvD,MAAM,WAAqB,EAAE;AAC7B,KAAI,gBAAgB,EAClB,UAAS,KAAK,wCAAwC;AAIxD,QAAO;EAAE,OAFO,kBAAkB,KAAK,QAAQ,mBAAmB,MAAM;EAE/C,OADX,gBAAgB,uBAAuB,cAAc,QAAQ,GAAG;EAC9C;EAAU;;AAG5C,SAAS,iBAAiB,OAAgB;AACxC,KAAI,SAAS,KACX;AAEF,KAAI,OAAO,UAAU,SACnB,QAAO;AAET,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAChD,QAAO,OAAO,MAAM;;AAKxB,SAAgB,wBACd,QACA,WACA;CACA,MAAM,QAAgC,EAAE;AACxC,KAAI,QAAQ,UAAU,QAAW;EAC/B,MAAM,QAAQ,iBAAiB,OAAO,MAAM;AAC5C,MAAI,UAAU,OACZ,OAAM,QAAQ;;AAGlB,KAAI,QAAQ,oBAAoB,QAAW;EACzC,MAAM,QAAQ,iBAAiB,OAAO,gBAAgB;AACtD,MAAI,UAAU,OACZ,OAAM,sBAAsB;;AAGhC,KAAI,QAAQ,cAAc,QAAW;EACnC,MAAM,QAAQ,iBAAiB,OAAO,UAAU;AAChD,MAAI,UAAU,OACZ,OAAM,gBAAgB;;AAG1B,KAAI,QAAQ,eAAe,QAAW;EACpC,MAAM,QAAQ,iBAAiB,OAAO,WAAW;AACjD,MAAI,UAAU,OACZ,OAAM,iBAAiB;;AAG3B,KAAI,QAAQ,QACV,OAAM,UAAU;AAElB,KAAI,UACF,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,UAAU,CAClD,OAAM,OAAO;AAGjB,QAAO"}
@@ -0,0 +1,41 @@
1
+ import { parseDocument } from "htmlparser2";
2
+
3
+ //#region src/compiler/wxml/parser.ts
4
+ function isRenderableNode(node) {
5
+ if (node.type === "directive" || node.type === "comment") return false;
6
+ if (node.type === "text") return (node.data ?? "").trim().length > 0;
7
+ return true;
8
+ }
9
+ function hasChildren(node) {
10
+ return Array.isArray(node.children);
11
+ }
12
+ function toRenderNode(node, children) {
13
+ if (node.type === "text") return {
14
+ type: "text",
15
+ data: node.data ?? ""
16
+ };
17
+ if (node.type === "tag" || node.type === "script" || node.type === "style") {
18
+ const element = node;
19
+ return {
20
+ type: "element",
21
+ name: element.name,
22
+ attribs: element.attribs ?? {},
23
+ children
24
+ };
25
+ }
26
+ }
27
+ function convertNode(node) {
28
+ if (!isRenderableNode(node)) return;
29
+ return toRenderNode(node, hasChildren(node) && node.children.length > 0 ? node.children.map((child) => convertNode(child)).filter((child) => Boolean(child)) : void 0);
30
+ }
31
+ function parseWxml(source) {
32
+ return (parseDocument(source, {
33
+ xmlMode: true,
34
+ decodeEntities: true,
35
+ recognizeSelfClosing: true
36
+ }).children ?? []).filter(isRenderableNode).map((node) => convertNode(node)).filter((node) => Boolean(node));
37
+ }
38
+
39
+ //#endregion
40
+ export { parseWxml };
41
+ //# sourceMappingURL=parser.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.mjs","names":[],"sources":["../../../src/compiler/wxml/parser.ts"],"sourcesContent":["import type { ChildNode, DataNode, Element, Node } from 'domhandler'\n\nimport type { RenderNode } from './types'\n\nimport { parseDocument } from 'htmlparser2'\n\nfunction isRenderableNode(node: Node) {\n if (node.type === 'directive' || node.type === 'comment') {\n return false\n }\n if (node.type === 'text') {\n const data = (node as DataNode).data ?? ''\n return data.trim().length > 0\n }\n return true\n}\n\ntype NodeWithChildren = Node & { children: ChildNode[] }\n\nfunction hasChildren(node: Node): node is NodeWithChildren {\n return Array.isArray((node as NodeWithChildren).children)\n}\n\nfunction toRenderNode(node: Node, children?: RenderNode[]): RenderNode | undefined {\n if (node.type === 'text') {\n const data = (node as DataNode).data ?? ''\n return { type: 'text', data }\n }\n if (node.type === 'tag' || node.type === 'script' || node.type === 'style') {\n const element = node as Element\n return {\n type: 'element',\n name: element.name,\n attribs: element.attribs ?? {},\n children,\n }\n }\n return undefined\n}\n\nfunction convertNode(node: Node): RenderNode | undefined {\n if (!isRenderableNode(node)) {\n return undefined\n }\n const children = (hasChildren(node) && node.children.length > 0)\n ? node.children.map(child => convertNode(child)).filter((child): child is RenderNode => Boolean(child))\n : undefined\n return toRenderNode(node, children)\n}\n\nexport function parseWxml(source: string): RenderNode[] {\n const document = parseDocument(source, {\n xmlMode: true,\n decodeEntities: true,\n recognizeSelfClosing: true,\n })\n const nodes = (document.children ?? []).filter(isRenderableNode)\n return nodes\n .map(node => convertNode(node))\n .filter((node): node is RenderNode => Boolean(node))\n}\n"],"mappings":";;;AAMA,SAAS,iBAAiB,MAAY;AACpC,KAAI,KAAK,SAAS,eAAe,KAAK,SAAS,UAC7C,QAAO;AAET,KAAI,KAAK,SAAS,OAEhB,SADc,KAAkB,QAAQ,IAC5B,MAAM,CAAC,SAAS;AAE9B,QAAO;;AAKT,SAAS,YAAY,MAAsC;AACzD,QAAO,MAAM,QAAS,KAA0B,SAAS;;AAG3D,SAAS,aAAa,MAAY,UAAiD;AACjF,KAAI,KAAK,SAAS,OAEhB,QAAO;EAAE,MAAM;EAAQ,MADT,KAAkB,QAAQ;EACX;AAE/B,KAAI,KAAK,SAAS,SAAS,KAAK,SAAS,YAAY,KAAK,SAAS,SAAS;EAC1E,MAAM,UAAU;AAChB,SAAO;GACL,MAAM;GACN,MAAM,QAAQ;GACd,SAAS,QAAQ,WAAW,EAAE;GAC9B;GACD;;;AAKL,SAAS,YAAY,MAAoC;AACvD,KAAI,CAAC,iBAAiB,KAAK,CACzB;AAKF,QAAO,aAAa,MAHF,YAAY,KAAK,IAAI,KAAK,SAAS,SAAS,IAC1D,KAAK,SAAS,KAAI,UAAS,YAAY,MAAM,CAAC,CAAC,QAAQ,UAA+B,QAAQ,MAAM,CAAC,GACrG,OAC+B;;AAGrC,SAAgB,UAAU,QAA8B;AAOtD,SANiB,cAAc,QAAQ;EACrC,SAAS;EACT,gBAAgB;EAChB,sBAAsB;EACvB,CAAC,CACsB,YAAY,EAAE,EAAE,OAAO,iBAAiB,CAE7D,KAAI,SAAQ,YAAY,KAAK,CAAC,CAC9B,QAAQ,SAA6B,QAAQ,KAAK,CAAC"}