@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 @@
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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"}
@@ -0,0 +1,45 @@
1
+ import { readJsonFile, resolveJsonPath } from "./files.mjs";
2
+
3
+ //#region src/plugin/scanConfig.ts
4
+ async function collectComponentTagsFromConfig({ json, importerDir, jsonPath, warn, resolveComponentScript, getComponentTag, collectComponent, onResolved }) {
5
+ const usingComponents = json.usingComponents;
6
+ if (!usingComponents || typeof usingComponents !== "object") return {};
7
+ const tags = {};
8
+ const resolved = [];
9
+ for (const [rawKey, rawValue] of Object.entries(usingComponents)) {
10
+ if (typeof rawValue !== "string") continue;
11
+ const key = normalizeComponentKey(rawKey);
12
+ if (!key) continue;
13
+ const script = await resolveComponentScript(rawValue, importerDir);
14
+ if (!script) {
15
+ warn(`[@weapp-vite/web] usingComponents entry "${rawKey}" not found: ${rawValue} (${jsonPath})`);
16
+ continue;
17
+ }
18
+ tags[key] = getComponentTag(script);
19
+ resolved.push({ rawValue });
20
+ }
21
+ onResolved?.(tags);
22
+ for (const entry of resolved) await collectComponent(entry.rawValue, importerDir);
23
+ return tags;
24
+ }
25
+ async function collectComponentTagsFromJson({ jsonBasePath, importerDir, warn, collectFromConfig }) {
26
+ const resolvedPath = await resolveJsonPath(jsonBasePath);
27
+ if (!resolvedPath) return {};
28
+ const json = await readJsonFile(resolvedPath);
29
+ if (!json) return {};
30
+ return collectFromConfig(json, importerDir, resolvedPath, warn);
31
+ }
32
+ function mergeComponentTags(base, overrides) {
33
+ if (!Object.keys(base).length && !Object.keys(overrides).length) return {};
34
+ return {
35
+ ...base,
36
+ ...overrides
37
+ };
38
+ }
39
+ function normalizeComponentKey(raw) {
40
+ return raw.trim().toLowerCase();
41
+ }
42
+
43
+ //#endregion
44
+ export { collectComponentTagsFromConfig, collectComponentTagsFromJson, mergeComponentTags };
45
+ //# sourceMappingURL=scanConfig.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanConfig.mjs","names":[],"sources":["../../src/plugin/scanConfig.ts"],"sourcesContent":["import type { WarnFn } from './types'\nimport { readJsonFile, resolveJsonPath } from './files'\n\ninterface CollectComponentTagsFromConfigOptions {\n json: Record<string, unknown>\n importerDir: string\n jsonPath: string\n warn: WarnFn\n resolveComponentScript: (raw: string, importerDir: string) => Promise<string | undefined>\n getComponentTag: (script: string) => string\n collectComponent: (componentId: string, importerDir: string) => Promise<void>\n onResolved?: (tags: Record<string, string>) => void\n}\n\nexport async function collectComponentTagsFromConfig({\n json,\n importerDir,\n jsonPath,\n warn,\n resolveComponentScript,\n getComponentTag,\n collectComponent,\n onResolved,\n}: CollectComponentTagsFromConfigOptions) {\n const usingComponents = json.usingComponents\n if (!usingComponents || typeof usingComponents !== 'object') {\n return {}\n }\n\n const tags: Record<string, string> = {}\n const resolved: Array<{ rawValue: string }> = []\n\n for (const [rawKey, rawValue] of Object.entries(usingComponents)) {\n if (typeof rawValue !== 'string') {\n continue\n }\n const key = normalizeComponentKey(rawKey)\n if (!key) {\n continue\n }\n const script = await resolveComponentScript(rawValue, importerDir)\n if (!script) {\n warn(`[@weapp-vite/web] usingComponents entry \"${rawKey}\" not found: ${rawValue} (${jsonPath})`)\n continue\n }\n const tag = getComponentTag(script)\n tags[key] = tag\n resolved.push({ rawValue })\n }\n\n onResolved?.(tags)\n for (const entry of resolved) {\n await collectComponent(entry.rawValue, importerDir)\n }\n\n return tags\n}\n\ninterface CollectComponentTagsFromJsonOptions {\n jsonBasePath: string\n importerDir: string\n warn: WarnFn\n collectFromConfig: (json: Record<string, unknown>, importerDir: string, jsonPath: string, warn: WarnFn) => Promise<Record<string, string>>\n}\n\nexport async function collectComponentTagsFromJson({\n jsonBasePath,\n importerDir,\n warn,\n collectFromConfig,\n}: CollectComponentTagsFromJsonOptions) {\n const resolvedPath = await resolveJsonPath(jsonBasePath)\n if (!resolvedPath) {\n return {}\n }\n const json = await readJsonFile(resolvedPath)\n if (!json) {\n return {}\n }\n return collectFromConfig(json, importerDir, resolvedPath, warn)\n}\n\nexport function mergeComponentTags(base: Record<string, string>, overrides: Record<string, string>) {\n if (!Object.keys(base).length && !Object.keys(overrides).length) {\n return {}\n }\n return {\n ...base,\n ...overrides,\n }\n}\n\nfunction normalizeComponentKey(raw: string) {\n return raw.trim().toLowerCase()\n}\n"],"mappings":";;;AAcA,eAAsB,+BAA+B,EACnD,MACA,aACA,UACA,MACA,wBACA,iBACA,kBACA,cACwC;CACxC,MAAM,kBAAkB,KAAK;AAC7B,KAAI,CAAC,mBAAmB,OAAO,oBAAoB,SACjD,QAAO,EAAE;CAGX,MAAM,OAA+B,EAAE;CACvC,MAAM,WAAwC,EAAE;AAEhD,MAAK,MAAM,CAAC,QAAQ,aAAa,OAAO,QAAQ,gBAAgB,EAAE;AAChE,MAAI,OAAO,aAAa,SACtB;EAEF,MAAM,MAAM,sBAAsB,OAAO;AACzC,MAAI,CAAC,IACH;EAEF,MAAM,SAAS,MAAM,uBAAuB,UAAU,YAAY;AAClE,MAAI,CAAC,QAAQ;AACX,QAAK,4CAA4C,OAAO,eAAe,SAAS,IAAI,SAAS,GAAG;AAChG;;AAGF,OAAK,OADO,gBAAgB,OAAO;AAEnC,WAAS,KAAK,EAAE,UAAU,CAAC;;AAG7B,cAAa,KAAK;AAClB,MAAK,MAAM,SAAS,SAClB,OAAM,iBAAiB,MAAM,UAAU,YAAY;AAGrD,QAAO;;AAUT,eAAsB,6BAA6B,EACjD,cACA,aACA,MACA,qBACsC;CACtC,MAAM,eAAe,MAAM,gBAAgB,aAAa;AACxD,KAAI,CAAC,aACH,QAAO,EAAE;CAEX,MAAM,OAAO,MAAM,aAAa,aAAa;AAC7C,KAAI,CAAC,KACH,QAAO,EAAE;AAEX,QAAO,kBAAkB,MAAM,aAAa,cAAc,KAAK;;AAGjE,SAAgB,mBAAmB,MAA8B,WAAmC;AAClG,KAAI,CAAC,OAAO,KAAK,KAAK,CAAC,UAAU,CAAC,OAAO,KAAK,UAAU,CAAC,OACvD,QAAO,EAAE;AAEX,QAAO;EACL,GAAG;EACH,GAAG;EACJ;;AAGH,SAAS,sBAAsB,KAAa;AAC1C,QAAO,IAAI,MAAM,CAAC,aAAa"}
@@ -0,0 +1,22 @@
1
+ //#region src/plugin/state.ts
2
+ function createEmptyScanState() {
3
+ return {
4
+ moduleMeta: /* @__PURE__ */ new Map(),
5
+ pageNavigationMap: /* @__PURE__ */ new Map(),
6
+ templateComponentMap: /* @__PURE__ */ new Map(),
7
+ templatePathSet: /* @__PURE__ */ new Set(),
8
+ componentTagMap: /* @__PURE__ */ new Map(),
9
+ componentIdMap: /* @__PURE__ */ new Map(),
10
+ appNavigationDefaults: {},
11
+ appComponentTags: {},
12
+ scanResult: {
13
+ app: void 0,
14
+ pages: [],
15
+ components: []
16
+ }
17
+ };
18
+ }
19
+
20
+ //#endregion
21
+ export { createEmptyScanState };
22
+ //# sourceMappingURL=state.mjs.map
@@ -0,0 +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;AAChD,QAAO;EACL,4BAAY,IAAI,KAAK;EACrB,mCAAmB,IAAI,KAAK;EAC5B,sCAAsB,IAAI,KAAK;EAC/B,iCAAiB,IAAI,KAAK;EAC1B,iCAAiB,IAAI,KAAK;EAC1B,gCAAgB,IAAI,KAAK;EACzB,uBAAuB,EAAE;EACzB,kBAAkB,EAAE;EACpB,YAAY;GACV,KAAK;GACL,OAAO,EAAE;GACT,YAAY,EAAE;GACf;EACF"}
@@ -0,0 +1,46 @@
1
+ import { WxssTransformOptions } from "../css/wxss.mjs";
2
+
3
+ //#region src/plugin/types.d.ts
4
+ interface WeappWebPluginOptions {
5
+ wxss?: WxssTransformOptions;
6
+ /**
7
+ * 小程序项目的源代码根目录,默认 `<root>/src`。
8
+ */
9
+ srcDir?: string;
10
+ /**
11
+ * Web 运行时的表单行为配置。
12
+ */
13
+ form?: {
14
+ /**
15
+ * 为 true 时阻止浏览器默认的表单提交,默认 true。
16
+ */
17
+ preventDefault?: boolean;
18
+ };
19
+ /**
20
+ * Web 运行时执行策略。
21
+ */
22
+ runtime?: {
23
+ /**
24
+ * 表达式与 WXS 执行模式:
25
+ * - compat: 保持当前行为(默认)
26
+ * - safe: 忽略解析/执行异常并告警
27
+ * - strict: 解析/执行异常直接抛错
28
+ */
29
+ executionMode?: 'compat' | 'safe' | 'strict';
30
+ /**
31
+ * 运行时告警策略:
32
+ * - warn: 使用 console.warn 输出(默认)
33
+ * - error: 使用 console.error 输出
34
+ * - off: 关闭告警输出
35
+ *
36
+ * dedupe 为 true 时同 key 告警仅输出一次(默认)。
37
+ */
38
+ warnings?: {
39
+ level?: 'off' | 'warn' | 'error';
40
+ dedupe?: boolean;
41
+ };
42
+ };
43
+ }
44
+ //#endregion
45
+ export { WeappWebPluginOptions };
46
+ //# sourceMappingURL=types.d.mts.map
package/dist/plugin.d.mts CHANGED
@@ -1,2 +1,3 @@
1
- import { n as WeappWebPluginOptions, t as weappWebPlugin } from "./plugin-DP2iPVmw.mjs";
2
- export { WeappWebPluginOptions, weappWebPlugin };
1
+ import { WeappWebPluginOptions } from "./plugin/types.mjs";
2
+ import { weappWebPlugin } from "./plugin/index.mjs";
3
+ export { type WeappWebPluginOptions, weappWebPlugin };
package/dist/plugin.mjs CHANGED
@@ -1,2 +1,3 @@
1
- import { t as weappWebPlugin } from "./plugin-BARxSPO8.mjs";
2
- export { weappWebPlugin };
1
+ import { weappWebPlugin } from "./plugin/index.mjs";
2
+
3
+ export { weappWebPlugin };
@@ -0,0 +1,92 @@
1
+ //#region src/runtime/button/helpers.ts
2
+ const DEFAULT_HOVER_CLASS = "button-hover";
3
+ function toBoolean(value) {
4
+ if (value === null) return false;
5
+ const normalized = value.trim().toLowerCase();
6
+ if (normalized === "" || normalized === "true") return true;
7
+ return normalized !== "false" && normalized !== "0";
8
+ }
9
+ function parseNumber(value, fallback) {
10
+ if (value === null || value === "") return fallback;
11
+ const numeric = Number(value);
12
+ return Number.isFinite(numeric) ? numeric : fallback;
13
+ }
14
+ function isDisabled(element) {
15
+ return toBoolean(element.getAttribute("disabled")) || toBoolean(element.getAttribute("loading"));
16
+ }
17
+ function normalizeType(value) {
18
+ if (!value) return "default";
19
+ const normalized = value.toLowerCase();
20
+ if (normalized === "primary" || normalized === "warn") return normalized;
21
+ return "default";
22
+ }
23
+ function getHoverClass(element) {
24
+ const hoverClass = element.getAttribute("hover-class");
25
+ if (!hoverClass) return DEFAULT_HOVER_CLASS;
26
+ if (hoverClass === "none") return "";
27
+ return hoverClass;
28
+ }
29
+ function isInternalNode(node) {
30
+ return node instanceof HTMLElement && node.dataset?.weappInternal === "true";
31
+ }
32
+ function collectFormValues(form) {
33
+ const values = {};
34
+ const appendValue = (name, value, multiple = false) => {
35
+ if (multiple) {
36
+ if (!Array.isArray(values[name])) values[name] = values[name] === void 0 ? [] : [values[name]];
37
+ values[name].push(value);
38
+ return;
39
+ }
40
+ values[name] = value;
41
+ };
42
+ const formElements = Array.from(form.elements ?? []);
43
+ for (const element of formElements) {
44
+ if (!(element instanceof HTMLElement)) continue;
45
+ const name = element.getAttribute("name")?.trim();
46
+ if (!name) continue;
47
+ if ("disabled" in element ? element.disabled : toBoolean(element.getAttribute("disabled"))) continue;
48
+ if (element instanceof HTMLInputElement) {
49
+ const type = element.type?.toLowerCase();
50
+ if (type === "checkbox") {
51
+ if (element.checked) appendValue(name, element.value, true);
52
+ continue;
53
+ }
54
+ if (type === "radio") {
55
+ if (element.checked) appendValue(name, element.value);
56
+ continue;
57
+ }
58
+ appendValue(name, element.value);
59
+ continue;
60
+ }
61
+ if (element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {
62
+ appendValue(name, element.value);
63
+ continue;
64
+ }
65
+ }
66
+ const customControls = form.querySelectorAll("switch, checkbox, radio, picker, slider, weapp-switch, weapp-checkbox, weapp-radio, weapp-picker, weapp-slider");
67
+ for (const element of Array.from(customControls)) {
68
+ const name = element.getAttribute("name")?.trim();
69
+ if (!name) continue;
70
+ if (toBoolean(element.getAttribute("disabled"))) continue;
71
+ const tag = element.tagName.toLowerCase();
72
+ const rawValue = element.value ?? element.getAttribute("value");
73
+ if (tag.includes("checkbox")) {
74
+ if (element.checked ?? toBoolean(element.getAttribute("checked"))) appendValue(name, rawValue ?? true, true);
75
+ continue;
76
+ }
77
+ if (tag.includes("radio")) {
78
+ if (element.checked ?? toBoolean(element.getAttribute("checked"))) appendValue(name, rawValue ?? true);
79
+ continue;
80
+ }
81
+ if (tag.includes("switch")) {
82
+ appendValue(name, element.checked ?? toBoolean(element.getAttribute("checked")));
83
+ continue;
84
+ }
85
+ appendValue(name, rawValue ?? "");
86
+ }
87
+ return values;
88
+ }
89
+
90
+ //#endregion
91
+ export { collectFormValues, getHoverClass, isDisabled, isInternalNode, normalizeType, parseNumber, toBoolean };
92
+ //# sourceMappingURL=helpers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.mjs","names":[],"sources":["../../../src/runtime/button/helpers.ts"],"sourcesContent":["const DEFAULT_HOVER_CLASS = 'button-hover'\n\nexport const DEFAULT_HOVER_START = 20\nexport const DEFAULT_HOVER_STAY = 70\n\nexport function toBoolean(value: string | null) {\n if (value === null) {\n return false\n }\n const normalized = value.trim().toLowerCase()\n if (normalized === '' || normalized === 'true') {\n return true\n }\n return normalized !== 'false' && normalized !== '0'\n}\n\nexport function parseNumber(value: string | null, fallback: number) {\n if (value === null || value === '') {\n return fallback\n }\n const numeric = Number(value)\n return Number.isFinite(numeric) ? numeric : fallback\n}\n\nexport function isDisabled(element: HTMLElement) {\n return toBoolean(element.getAttribute('disabled')) || toBoolean(element.getAttribute('loading'))\n}\n\nexport function normalizeType(value: string | null) {\n if (!value) {\n return 'default'\n }\n const normalized = value.toLowerCase()\n if (normalized === 'primary' || normalized === 'warn') {\n return normalized\n }\n return 'default'\n}\n\nexport function getHoverClass(element: HTMLElement) {\n const hoverClass = element.getAttribute('hover-class')\n if (!hoverClass) {\n return DEFAULT_HOVER_CLASS\n }\n if (hoverClass === 'none') {\n return ''\n }\n return hoverClass\n}\n\nexport function isInternalNode(node: Node) {\n return node instanceof HTMLElement && node.dataset?.weappInternal === 'true'\n}\n\nexport function collectFormValues(form: HTMLFormElement) {\n const values: Record<string, any> = {}\n\n const appendValue = (name: string, value: any, multiple = false) => {\n if (multiple) {\n if (!Array.isArray(values[name])) {\n values[name] = values[name] === undefined ? [] : [values[name]]\n }\n values[name].push(value)\n return\n }\n values[name] = value\n }\n\n const formElements = Array.from(form.elements ?? [])\n for (const element of formElements) {\n if (!(element instanceof HTMLElement)) {\n continue\n }\n const name = element.getAttribute('name')?.trim()\n if (!name) {\n continue\n }\n const disabled = 'disabled' in element ? (element as any).disabled : toBoolean(element.getAttribute('disabled'))\n if (disabled) {\n continue\n }\n if (element instanceof HTMLInputElement) {\n const type = element.type?.toLowerCase()\n if (type === 'checkbox') {\n if (element.checked) {\n appendValue(name, element.value, true)\n }\n continue\n }\n if (type === 'radio') {\n if (element.checked) {\n appendValue(name, element.value)\n }\n continue\n }\n appendValue(name, element.value)\n continue\n }\n if (element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n appendValue(name, (element as HTMLTextAreaElement | HTMLSelectElement).value)\n continue\n }\n }\n\n const customControls = form.querySelectorAll('switch, checkbox, radio, picker, slider, weapp-switch, weapp-checkbox, weapp-radio, weapp-picker, weapp-slider')\n for (const element of Array.from(customControls)) {\n const name = element.getAttribute('name')?.trim()\n if (!name) {\n continue\n }\n const disabled = toBoolean(element.getAttribute('disabled'))\n if (disabled) {\n continue\n }\n const tag = element.tagName.toLowerCase()\n const rawValue = (element as any).value ?? element.getAttribute('value')\n if (tag.includes('checkbox')) {\n const checked = (element as any).checked ?? toBoolean(element.getAttribute('checked'))\n if (checked) {\n appendValue(name, rawValue ?? true, true)\n }\n continue\n }\n if (tag.includes('radio')) {\n const checked = (element as any).checked ?? toBoolean(element.getAttribute('checked'))\n if (checked) {\n appendValue(name, rawValue ?? true)\n }\n continue\n }\n if (tag.includes('switch')) {\n const checked = (element as any).checked ?? toBoolean(element.getAttribute('checked'))\n appendValue(name, checked)\n continue\n }\n appendValue(name, rawValue ?? '')\n }\n\n return values\n}\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ //#region src/runtime/button/index.d.ts
2
+ interface ButtonFormConfig {
3
+ preventDefault?: boolean;
4
+ }
5
+ declare function ensureButtonDefined(): void;
6
+ declare function setButtonFormConfig(next: ButtonFormConfig): void;
7
+ //#endregion
8
+ export { type ButtonFormConfig, ensureButtonDefined, setButtonFormConfig };
9
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1,198 @@
1
+ import { collectFormValues, getHoverClass, isDisabled, isInternalNode, normalizeType, parseNumber, toBoolean } from "./helpers.mjs";
2
+ import { ensureButtonStyle } from "./style.mjs";
3
+
4
+ //#region src/runtime/button/index.ts
5
+ const DEFAULT_FORM_CONFIG = { preventDefault: true };
6
+ const NAV_BUTTON_TAG = "weapp-button";
7
+ const BaseElement = globalThis.HTMLElement ?? class {};
8
+ let formConfig = { ...DEFAULT_FORM_CONFIG };
9
+ var WeappButton = class extends BaseElement {
10
+ static observedAttributes = [
11
+ "type",
12
+ "plain",
13
+ "size",
14
+ "loading",
15
+ "disabled",
16
+ "hover-class",
17
+ "hover-start-time",
18
+ "hover-stay-time",
19
+ "form-type",
20
+ "open-type"
21
+ ];
22
+ #button;
23
+ #content;
24
+ #text;
25
+ #loading;
26
+ #hoverTimer;
27
+ #hoverRemoveTimer;
28
+ #lastTouchTime = 0;
29
+ #observer;
30
+ connectedCallback() {
31
+ const root = this.getRootNode();
32
+ if (root instanceof ShadowRoot) ensureButtonStyle(root);
33
+ else ensureButtonStyle();
34
+ this.#ensureStructure();
35
+ this.#applyState();
36
+ this.#bindEvents();
37
+ }
38
+ disconnectedCallback() {
39
+ this.#clearHoverTimers();
40
+ this.#observer?.disconnect();
41
+ this.#observer = void 0;
42
+ }
43
+ attributeChangedCallback() {
44
+ this.#applyState();
45
+ }
46
+ #ensureStructure() {
47
+ if (this.#button) return;
48
+ const button = document.createElement("button");
49
+ button.type = "button";
50
+ button.className = "weapp-btn";
51
+ button.dataset.weappInternal = "true";
52
+ const content = document.createElement("span");
53
+ content.className = "weapp-btn__content";
54
+ content.dataset.weappInternal = "true";
55
+ const loading = document.createElement("span");
56
+ loading.className = "weapp-btn__loading";
57
+ loading.dataset.weappInternal = "true";
58
+ loading.setAttribute("hidden", "");
59
+ const text = document.createElement("span");
60
+ text.className = "weapp-btn__text";
61
+ text.dataset.weappInternal = "true";
62
+ content.append(loading, text);
63
+ button.append(content);
64
+ const existing = [...this.childNodes].filter((node) => !isInternalNode(node));
65
+ for (const node of existing) text.appendChild(node);
66
+ this.appendChild(button);
67
+ this.#button = button;
68
+ this.#content = content;
69
+ this.#text = text;
70
+ this.#loading = loading;
71
+ if (typeof MutationObserver !== "undefined") {
72
+ this.#observer = new MutationObserver((records) => {
73
+ if (!this.#text) return;
74
+ for (const record of records) for (const node of [...record.addedNodes]) {
75
+ if (isInternalNode(node)) continue;
76
+ if (node === this.#button) continue;
77
+ this.#text.appendChild(node);
78
+ }
79
+ });
80
+ this.#observer.observe(this, { childList: true });
81
+ }
82
+ }
83
+ #applyState() {
84
+ if (!this.#button || !this.#loading) return;
85
+ const type = normalizeType(this.getAttribute("type"));
86
+ const plain = toBoolean(this.getAttribute("plain"));
87
+ const size = (this.getAttribute("size") ?? "default").toLowerCase();
88
+ const loading = toBoolean(this.getAttribute("loading"));
89
+ const disabled = toBoolean(this.getAttribute("disabled"));
90
+ const openType = this.getAttribute("open-type");
91
+ this.classList.toggle("weapp-btn--primary", type === "primary");
92
+ this.classList.toggle("weapp-btn--warn", type === "warn");
93
+ this.classList.toggle("weapp-btn--default", type === "default");
94
+ this.classList.toggle("weapp-btn--plain", plain);
95
+ this.classList.toggle("weapp-btn--mini", size === "mini");
96
+ this.classList.toggle("weapp-btn--loading", loading);
97
+ this.classList.toggle("weapp-btn--disabled", disabled);
98
+ if (openType) {
99
+ const openTypeClass = `weapp-btn--open-type-${openType}`;
100
+ for (const className of [...this.classList]) if (className.startsWith("weapp-btn--open-type-") && className !== openTypeClass) this.classList.remove(className);
101
+ this.classList.add(openTypeClass);
102
+ } else for (const className of [...this.classList]) if (className.startsWith("weapp-btn--open-type-")) this.classList.remove(className);
103
+ const locked = disabled || loading;
104
+ this.#button.disabled = locked;
105
+ if (locked) this.#button.setAttribute("aria-disabled", "true");
106
+ else this.#button.removeAttribute("aria-disabled");
107
+ this.#loading.toggleAttribute("hidden", !loading);
108
+ }
109
+ #bindEvents() {
110
+ if (this.__weappButtonBound) return;
111
+ this.__weappButtonBound = true;
112
+ this.addEventListener("click", this.#handleClickCapture, true);
113
+ this.addEventListener("click", this.#handleClick);
114
+ this.addEventListener("touchstart", this.#handlePressStart, { passive: true });
115
+ this.addEventListener("mousedown", this.#handlePressStart);
116
+ this.addEventListener("touchend", this.#handlePressEnd);
117
+ this.addEventListener("touchcancel", this.#handlePressEnd);
118
+ this.addEventListener("mouseup", this.#handlePressEnd);
119
+ this.addEventListener("mouseleave", this.#handlePressEnd);
120
+ }
121
+ #handleClickCapture = (event) => {
122
+ if (isDisabled(this)) {
123
+ event.preventDefault();
124
+ event.stopImmediatePropagation();
125
+ }
126
+ };
127
+ #handleClick = (event) => {
128
+ if (isDisabled(this)) return;
129
+ const formType = this.getAttribute("form-type");
130
+ if (!formType) return;
131
+ const form = this.closest("form");
132
+ if (!form) return;
133
+ if (formType === "submit") {
134
+ const detail = { value: collectFormValues(form) };
135
+ const submitEvent = new CustomEvent("submit", {
136
+ detail,
137
+ bubbles: true,
138
+ cancelable: true
139
+ });
140
+ if (form.dispatchEvent(submitEvent) && !formConfig.preventDefault) form.submit();
141
+ event.preventDefault();
142
+ return;
143
+ }
144
+ if (formType === "reset") {
145
+ form.reset();
146
+ event.preventDefault();
147
+ }
148
+ };
149
+ #handlePressStart = (event) => {
150
+ if (isDisabled(this)) return;
151
+ const hoverClass = getHoverClass(this);
152
+ if (!hoverClass) return;
153
+ if (event.type === "touchstart") this.#lastTouchTime = Date.now();
154
+ if (event.type === "mousedown" && Date.now() - this.#lastTouchTime < 400) return;
155
+ const startTime = parseNumber(this.getAttribute("hover-start-time"), 20);
156
+ this.#clearHoverTimers();
157
+ this.#hoverTimer = globalThis.setTimeout(() => {
158
+ this.classList.add(hoverClass);
159
+ }, startTime);
160
+ };
161
+ #handlePressEnd = (event) => {
162
+ const hoverClass = getHoverClass(this);
163
+ if (!hoverClass) return;
164
+ if (event.type === "mouseup" && Date.now() - this.#lastTouchTime < 400) return;
165
+ const stayTime = parseNumber(this.getAttribute("hover-stay-time"), 70);
166
+ if (this.#hoverTimer) {
167
+ clearTimeout(this.#hoverTimer);
168
+ this.#hoverTimer = void 0;
169
+ }
170
+ if (this.classList.contains(hoverClass)) this.#hoverRemoveTimer = globalThis.setTimeout(() => {
171
+ this.classList.remove(hoverClass);
172
+ }, stayTime);
173
+ };
174
+ #clearHoverTimers() {
175
+ if (this.#hoverTimer) {
176
+ clearTimeout(this.#hoverTimer);
177
+ this.#hoverTimer = void 0;
178
+ }
179
+ if (this.#hoverRemoveTimer) {
180
+ clearTimeout(this.#hoverRemoveTimer);
181
+ this.#hoverRemoveTimer = void 0;
182
+ }
183
+ }
184
+ };
185
+ function ensureButtonDefined() {
186
+ if (typeof customElements === "undefined") return;
187
+ if (!customElements.get(NAV_BUTTON_TAG)) customElements.define(NAV_BUTTON_TAG, WeappButton);
188
+ }
189
+ function setButtonFormConfig(next) {
190
+ formConfig = {
191
+ ...formConfig,
192
+ ...next
193
+ };
194
+ }
195
+
196
+ //#endregion
197
+ export { ensureButtonDefined, setButtonFormConfig };
198
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["#ensureStructure","#applyState","#bindEvents","#clearHoverTimers","#observer","#button","#content","#text","#loading","#handleClickCapture","#handleClick","#handlePressStart","#handlePressEnd","#lastTouchTime","#hoverTimer","#hoverRemoveTimer"],"sources":["../../../src/runtime/button/index.ts"],"sourcesContent":["import {\n collectFormValues,\n DEFAULT_HOVER_START,\n DEFAULT_HOVER_STAY,\n getHoverClass,\n isDisabled,\n isInternalNode,\n normalizeType,\n parseNumber,\n toBoolean,\n} from './helpers'\nimport { ensureButtonStyle } from './style'\n\ninterface ButtonFormConfig {\n preventDefault?: boolean\n}\n\nconst DEFAULT_FORM_CONFIG: Required<ButtonFormConfig> = {\n preventDefault: true,\n}\n\nconst NAV_BUTTON_TAG = 'weapp-button'\nconst BaseElement = (globalThis.HTMLElement ?? class {}) as typeof HTMLElement\n\nlet formConfig: Required<ButtonFormConfig> = { ...DEFAULT_FORM_CONFIG }\n\nclass WeappButton extends BaseElement {\n static observedAttributes = [\n 'type',\n 'plain',\n 'size',\n 'loading',\n 'disabled',\n 'hover-class',\n 'hover-start-time',\n 'hover-stay-time',\n 'form-type',\n 'open-type',\n ]\n\n #button?: HTMLButtonElement\n #content?: HTMLSpanElement\n #text?: HTMLSpanElement\n #loading?: HTMLSpanElement\n #hoverTimer?: ReturnType<typeof globalThis.setTimeout>\n #hoverRemoveTimer?: ReturnType<typeof globalThis.setTimeout>\n #lastTouchTime = 0\n #observer?: MutationObserver\n\n connectedCallback() {\n const root = this.getRootNode()\n if (root instanceof ShadowRoot) {\n ensureButtonStyle(root)\n }\n else {\n ensureButtonStyle()\n }\n this.#ensureStructure()\n this.#applyState()\n this.#bindEvents()\n }\n\n disconnectedCallback() {\n this.#clearHoverTimers()\n this.#observer?.disconnect()\n this.#observer = undefined\n }\n\n attributeChangedCallback() {\n this.#applyState()\n }\n\n #ensureStructure() {\n if (this.#button) {\n return\n }\n const button = document.createElement('button')\n button.type = 'button'\n button.className = 'weapp-btn'\n button.dataset.weappInternal = 'true'\n const content = document.createElement('span')\n content.className = 'weapp-btn__content'\n content.dataset.weappInternal = 'true'\n const loading = document.createElement('span')\n loading.className = 'weapp-btn__loading'\n loading.dataset.weappInternal = 'true'\n loading.setAttribute('hidden', '')\n const text = document.createElement('span')\n text.className = 'weapp-btn__text'\n text.dataset.weappInternal = 'true'\n content.append(loading, text)\n button.append(content)\n\n const existing = [...this.childNodes].filter(node => !isInternalNode(node))\n for (const node of existing) {\n text.appendChild(node)\n }\n this.appendChild(button)\n\n this.#button = button\n this.#content = content\n this.#text = text\n this.#loading = loading\n\n if (typeof MutationObserver !== 'undefined') {\n this.#observer = new MutationObserver((records) => {\n if (!this.#text) {\n return\n }\n for (const record of records) {\n for (const node of [...record.addedNodes]) {\n if (isInternalNode(node)) {\n continue\n }\n if (node === this.#button) {\n continue\n }\n this.#text.appendChild(node)\n }\n }\n })\n this.#observer.observe(this, { childList: true })\n }\n }\n\n #applyState() {\n if (!this.#button || !this.#loading) {\n return\n }\n const type = normalizeType(this.getAttribute('type'))\n const plain = toBoolean(this.getAttribute('plain'))\n const size = (this.getAttribute('size') ?? 'default').toLowerCase()\n const loading = toBoolean(this.getAttribute('loading'))\n const disabled = toBoolean(this.getAttribute('disabled'))\n const openType = this.getAttribute('open-type')\n\n this.classList.toggle('weapp-btn--primary', type === 'primary')\n this.classList.toggle('weapp-btn--warn', type === 'warn')\n this.classList.toggle('weapp-btn--default', type === 'default')\n this.classList.toggle('weapp-btn--plain', plain)\n this.classList.toggle('weapp-btn--mini', size === 'mini')\n this.classList.toggle('weapp-btn--loading', loading)\n this.classList.toggle('weapp-btn--disabled', disabled)\n\n if (openType) {\n const openTypeClass = `weapp-btn--open-type-${openType}`\n for (const className of [...this.classList]) {\n if (className.startsWith('weapp-btn--open-type-') && className !== openTypeClass) {\n this.classList.remove(className)\n }\n }\n this.classList.add(openTypeClass)\n }\n else {\n for (const className of [...this.classList]) {\n if (className.startsWith('weapp-btn--open-type-')) {\n this.classList.remove(className)\n }\n }\n }\n\n const locked = disabled || loading\n this.#button.disabled = locked\n if (locked) {\n this.#button.setAttribute('aria-disabled', 'true')\n }\n else {\n this.#button.removeAttribute('aria-disabled')\n }\n this.#loading.toggleAttribute('hidden', !loading)\n }\n\n #bindEvents() {\n if ((this as any).__weappButtonBound) {\n return\n }\n ;(this as any).__weappButtonBound = true\n this.addEventListener('click', this.#handleClickCapture, true)\n this.addEventListener('click', this.#handleClick)\n this.addEventListener('touchstart', this.#handlePressStart, { passive: true })\n this.addEventListener('mousedown', this.#handlePressStart)\n this.addEventListener('touchend', this.#handlePressEnd)\n this.addEventListener('touchcancel', this.#handlePressEnd)\n this.addEventListener('mouseup', this.#handlePressEnd)\n this.addEventListener('mouseleave', this.#handlePressEnd)\n }\n\n #handleClickCapture = (event: Event) => {\n if (isDisabled(this)) {\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n }\n\n #handleClick = (event: Event) => {\n if (isDisabled(this)) {\n return\n }\n const formType = this.getAttribute('form-type')\n if (!formType) {\n return\n }\n const form = this.closest('form') as HTMLFormElement | null\n if (!form) {\n return\n }\n if (formType === 'submit') {\n const detail = { value: collectFormValues(form) }\n const submitEvent = new CustomEvent('submit', {\n detail,\n bubbles: true,\n cancelable: true,\n })\n const shouldSubmit = form.dispatchEvent(submitEvent)\n if (shouldSubmit && !formConfig.preventDefault) {\n form.submit()\n }\n event.preventDefault()\n return\n }\n if (formType === 'reset') {\n form.reset()\n event.preventDefault()\n }\n }\n\n #handlePressStart = (event: Event) => {\n if (isDisabled(this)) {\n return\n }\n const hoverClass = getHoverClass(this)\n if (!hoverClass) {\n return\n }\n if (event.type === 'touchstart') {\n this.#lastTouchTime = Date.now()\n }\n if (event.type === 'mousedown' && Date.now() - this.#lastTouchTime < 400) {\n return\n }\n const startTime = parseNumber(this.getAttribute('hover-start-time'), DEFAULT_HOVER_START)\n this.#clearHoverTimers()\n this.#hoverTimer = globalThis.setTimeout(() => {\n this.classList.add(hoverClass)\n }, startTime)\n }\n\n #handlePressEnd = (event: Event) => {\n const hoverClass = getHoverClass(this)\n if (!hoverClass) {\n return\n }\n if (event.type === 'mouseup' && Date.now() - this.#lastTouchTime < 400) {\n return\n }\n const stayTime = parseNumber(this.getAttribute('hover-stay-time'), DEFAULT_HOVER_STAY)\n if (this.#hoverTimer) {\n clearTimeout(this.#hoverTimer)\n this.#hoverTimer = undefined\n }\n if (this.classList.contains(hoverClass)) {\n this.#hoverRemoveTimer = globalThis.setTimeout(() => {\n this.classList.remove(hoverClass)\n }, stayTime)\n }\n }\n\n #clearHoverTimers() {\n if (this.#hoverTimer) {\n clearTimeout(this.#hoverTimer)\n this.#hoverTimer = undefined\n }\n if (this.#hoverRemoveTimer) {\n clearTimeout(this.#hoverRemoveTimer)\n this.#hoverRemoveTimer = undefined\n }\n }\n}\n\nexport function ensureButtonDefined(): void {\n if (typeof customElements === 'undefined') {\n return\n }\n if (!customElements.get(NAV_BUTTON_TAG)) {\n customElements.define(NAV_BUTTON_TAG, WeappButton)\n }\n}\n\nexport function setButtonFormConfig(next: ButtonFormConfig): void {\n formConfig = {\n ...formConfig,\n ...next,\n }\n}\n\nexport type { ButtonFormConfig }\n"],"mappings":"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"}