weapp-tailwindcss 5.1.16 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. package/README.en.md +6 -0
  2. package/README.md +6 -0
  3. package/bin/{weapp-tailwindcss.js → weapp-tailwindcss.cjs} +1 -1
  4. package/dist/bundlers/framework-selector.d.ts +2 -2
  5. package/dist/bundlers/gulp/asset-emission-plan.d.ts +10 -0
  6. package/dist/bundlers/gulp/frameworks/native/index.d.ts +10 -3
  7. package/dist/bundlers/gulp/index.d.ts +10 -3
  8. package/dist/bundlers/gulp/module-graph.d.ts +1 -1
  9. package/dist/bundlers/gulp/runtime-snapshot.d.ts +4 -2
  10. package/dist/bundlers/gulp/shared/create-native-framework-plugins/cache-state.d.ts +4 -4
  11. package/dist/bundlers/gulp/shared/create-native-framework-plugins/file-transforms.d.ts +5 -3
  12. package/dist/bundlers/gulp/shared/create-native-framework-plugins.d.ts +9 -2
  13. package/dist/bundlers/rspack/index.d.ts +2 -2
  14. package/dist/bundlers/shared/cache.d.ts +1 -1
  15. package/dist/bundlers/shared/css-imports.d.ts +1 -1
  16. package/dist/bundlers/shared/css-source-trace.d.ts +2 -2
  17. package/dist/bundlers/shared/framework-postcss.d.ts +9 -2
  18. package/dist/bundlers/shared/generator-css/candidates.d.ts +2 -0
  19. package/dist/bundlers/shared/generator-css/generation-helpers/preflight.d.ts +4 -3
  20. package/dist/bundlers/shared/generator-css/generation-helpers/results.d.ts +3 -3
  21. package/dist/bundlers/shared/generator-css/generation-helpers/runtime-isolation.d.ts +4 -4
  22. package/dist/bundlers/shared/generator-css/generation-helpers.d.ts +4 -4
  23. package/dist/bundlers/shared/generator-css/legacy-compat.d.ts +2 -2
  24. package/dist/bundlers/shared/generator-css/pipeline/context.d.ts +58 -0
  25. package/dist/bundlers/shared/generator-css/pipeline/deferred-output.d.ts +3 -14
  26. package/dist/bundlers/shared/generator-css/pipeline/execution.d.ts +3 -12
  27. package/dist/bundlers/shared/generator-css/pipeline/fallback-output.d.ts +3 -12
  28. package/dist/bundlers/shared/generator-css/pipeline/ordered-output.d.ts +3 -25
  29. package/dist/bundlers/shared/generator-css/pipeline.d.ts +1 -1
  30. package/dist/bundlers/shared/generator-css/result-helpers.d.ts +2 -2
  31. package/dist/bundlers/shared/generator-css/source-resolver/configuration.d.ts +3 -4
  32. package/dist/bundlers/shared/generator-css/source-resolver/matching.d.ts +1 -1
  33. package/dist/bundlers/shared/generator-css/source-resolver/metadata.d.ts +13 -5
  34. package/dist/bundlers/shared/generator-css/source-resolver/postcss-source.d.ts +1 -1
  35. package/dist/bundlers/shared/generator-css/source-resolver/resolve-source.d.ts +3 -3
  36. package/dist/bundlers/shared/generator-css/source-resolver/resolve-sources.d.ts +4 -3
  37. package/dist/bundlers/shared/generator-css/source-resolver/single-source.d.ts +9 -9
  38. package/dist/bundlers/shared/generator-css/source-resolver/source-entries.d.ts +3 -3
  39. package/dist/bundlers/shared/generator-css/source-resolver/source-matching.d.ts +4 -4
  40. package/dist/bundlers/shared/generator-css/source-resolver/types.d.ts +4 -4
  41. package/dist/bundlers/shared/generator-css/source-resolver.d.ts +7 -6
  42. package/dist/bundlers/shared/generator-css/types.d.ts +12 -3
  43. package/dist/bundlers/shared/generator-css/user-css/transform.d.ts +1 -1
  44. package/dist/bundlers/shared/generator-css/user-css.d.ts +5 -5
  45. package/dist/bundlers/shared/generator-css/validate.d.ts +1 -1
  46. package/dist/bundlers/shared/generator-css.d.ts +9 -9
  47. package/dist/bundlers/shared/runtime-class-set/entries.d.ts +4 -0
  48. package/dist/bundlers/shared/runtime-class-set/escaped-candidates.d.ts +9 -0
  49. package/dist/bundlers/shared/runtime-class-set.d.ts +30 -0
  50. package/dist/bundlers/shared/runtime-entry-type.d.ts +8 -0
  51. package/dist/bundlers/shared/runtime-signatures.d.ts +8 -0
  52. package/dist/bundlers/shared/source-candidate-scan-signature.d.ts +13 -0
  53. package/dist/bundlers/{vite → shared}/source-candidates/collector.d.ts +1 -1
  54. package/dist/bundlers/shared/source-candidates/scan-root.d.ts +10 -0
  55. package/dist/bundlers/{vite → shared}/source-candidates/script.d.ts +1 -1
  56. package/dist/bundlers/{vite → shared}/source-candidates/store.d.ts +1 -1
  57. package/dist/bundlers/{vite → shared}/source-candidates/types-and-cache.d.ts +3 -3
  58. package/dist/bundlers/shared/source-candidates.d.ts +4 -0
  59. package/dist/bundlers/shared/source-scan/css-entries.d.ts +18 -0
  60. package/dist/bundlers/shared/source-scan.d.ts +16 -0
  61. package/dist/bundlers/shared/static-config-content.d.ts +5 -0
  62. package/dist/bundlers/shared/v4-generation-core.d.ts +8 -3
  63. package/dist/bundlers/vite/bundle-entries.d.ts +1 -1
  64. package/dist/bundlers/vite/bundle-state.d.ts +11 -38
  65. package/dist/bundlers/vite/css-asset-identity.d.ts +11 -0
  66. package/dist/bundlers/vite/css-finalizer/options.d.ts +3 -3
  67. package/dist/bundlers/vite/css-finalizer/plugin.d.ts +1 -1
  68. package/dist/bundlers/vite/css-finalizer.d.ts +1 -1
  69. package/dist/bundlers/vite/css-memory.d.ts +1 -2
  70. package/dist/bundlers/vite/frameworks/generic/index.d.ts +2 -2
  71. package/dist/bundlers/vite/frameworks/taro/index.d.ts +2 -2
  72. package/dist/bundlers/vite/frameworks/uni-app/index.d.ts +3 -3
  73. package/dist/bundlers/vite/frameworks/uni-app-x/index.d.ts +3 -3
  74. package/dist/bundlers/vite/frameworks/weapp-vite/index.d.ts +2 -2
  75. package/dist/bundlers/vite/generate-bundle/asset-emission-plan.d.ts +8 -0
  76. package/dist/bundlers/vite/generate-bundle/bundle-markup-candidates.d.ts +4 -4
  77. package/dist/bundlers/vite/generate-bundle/configured-css-sources.d.ts +1 -1
  78. package/dist/bundlers/vite/generate-bundle/css-assets.d.ts +1 -1
  79. package/dist/bundlers/vite/generate-bundle/css-cache-task.d.ts +34 -0
  80. package/dist/bundlers/vite/generate-bundle/css-composition-plan.d.ts +58 -0
  81. package/dist/bundlers/vite/generate-bundle/css-config-directives.d.ts +1 -1
  82. package/dist/bundlers/vite/generate-bundle/css-entry-processing.d.ts +1 -0
  83. package/dist/bundlers/vite/generate-bundle/css-handler-options.d.ts +1 -1
  84. package/dist/bundlers/vite/generate-bundle/css-output-helpers.d.ts +21 -2
  85. package/dist/bundlers/vite/generate-bundle/css-output.d.ts +1 -1
  86. package/dist/bundlers/vite/generate-bundle/css-share-scope.d.ts +1 -1
  87. package/dist/bundlers/vite/generate-bundle/css-source-plan.d.ts +19 -0
  88. package/dist/bundlers/vite/generate-bundle/css-transform-decision-plan.d.ts +61 -0
  89. package/dist/bundlers/vite/generate-bundle/css-transform-result.d.ts +23 -0
  90. package/dist/bundlers/vite/generate-bundle/css-transform-task.d.ts +42 -0
  91. package/dist/bundlers/vite/generate-bundle/final-css-assets.d.ts +3 -2
  92. package/dist/bundlers/vite/generate-bundle/finalize/bundle.d.ts +1 -1
  93. package/dist/bundlers/vite/generate-bundle/finalize/root-import-shell.d.ts +5 -5
  94. package/dist/bundlers/vite/generate-bundle/finalize.d.ts +2 -2
  95. package/dist/bundlers/vite/generate-bundle/html-processing.d.ts +2 -2
  96. package/dist/bundlers/vite/generate-bundle/js-entries.d.ts +1 -1
  97. package/dist/bundlers/vite/generate-bundle/js-handler-options.d.ts +2 -1
  98. package/dist/bundlers/vite/generate-bundle/js-linking.d.ts +2 -2
  99. package/dist/bundlers/vite/generate-bundle/js-processing.d.ts +6 -5
  100. package/dist/bundlers/vite/generate-bundle/memory-debug.d.ts +1 -1
  101. package/dist/bundlers/vite/generate-bundle/process-plan.d.ts +1 -1
  102. package/dist/bundlers/vite/generate-bundle/remembered-css-plan.d.ts +35 -0
  103. package/dist/bundlers/vite/generate-bundle/remembered-css-replay.d.ts +5 -6
  104. package/dist/bundlers/vite/generate-bundle/remembered-css.d.ts +2 -2
  105. package/dist/bundlers/vite/generate-bundle/root-style-output.d.ts +20 -0
  106. package/dist/bundlers/vite/generate-bundle/runtime-configured-css.d.ts +54 -0
  107. package/dist/bundlers/vite/generate-bundle/runtime-linked-css.d.ts +1 -1
  108. package/dist/bundlers/vite/generate-bundle/runtime-linked-source-memory.d.ts +3 -3
  109. package/dist/bundlers/vite/{generate-bundle-runtime.d.ts → generate-bundle/runtime.d.ts} +4 -4
  110. package/dist/bundlers/vite/generate-bundle/scoped-generator.d.ts +2 -2
  111. package/dist/bundlers/vite/generate-bundle/sfc-style-source.d.ts +2 -2
  112. package/dist/bundlers/vite/generate-bundle/signatures.d.ts +1 -8
  113. package/dist/bundlers/vite/generate-bundle/source-candidate-scope.d.ts +3 -3
  114. package/dist/bundlers/vite/generate-bundle/source-candidate-source.d.ts +5 -0
  115. package/dist/bundlers/vite/generate-bundle/subpackages.d.ts +2 -2
  116. package/dist/bundlers/vite/generate-bundle/temporary-css-assets.d.ts +14 -1
  117. package/dist/bundlers/vite/generate-bundle/transform-filter.d.ts +1 -1
  118. package/dist/bundlers/vite/generate-bundle/transform-scheduling.d.ts +1 -0
  119. package/dist/bundlers/vite/generate-bundle/types.d.ts +8 -7
  120. package/dist/bundlers/vite/generate-bundle/uni-app-x-postprocess.d.ts +3 -2
  121. package/dist/bundlers/vite/generate-bundle/validate-runtime-candidates.d.ts +22 -0
  122. package/dist/bundlers/vite/generate-bundle.d.ts +6 -6
  123. package/dist/bundlers/vite/incremental-runtime-class-set/entries.d.ts +1 -4
  124. package/dist/bundlers/vite/incremental-runtime-class-set/escaped-candidates.d.ts +1 -3
  125. package/dist/bundlers/vite/incremental-runtime-class-set.d.ts +2 -30
  126. package/dist/bundlers/vite/index.d.ts +3 -3
  127. package/dist/bundlers/vite/js-precheck.d.ts +1 -1
  128. package/dist/bundlers/vite/processed-css-assets/cleanup.d.ts +2 -1
  129. package/dist/bundlers/vite/processed-css-assets/collector.d.ts +1 -1
  130. package/dist/bundlers/vite/processed-css-assets/coverage.d.ts +1 -1
  131. package/dist/bundlers/vite/processed-css-assets/empty-at-rule.d.ts +1 -0
  132. package/dist/bundlers/vite/processed-css-assets/injection-plan.d.ts +4 -4
  133. package/dist/bundlers/vite/processed-css-assets/markers-imports.d.ts +5 -5
  134. package/dist/bundlers/vite/processed-css-assets.d.ts +4 -4
  135. package/dist/bundlers/vite/resolve-app-type.d.ts +1 -1
  136. package/dist/bundlers/vite/rewrite-css-imports.d.ts +3 -2
  137. package/dist/bundlers/vite/runtime-affecting-signature.d.ts +1 -2
  138. package/dist/bundlers/vite/runtime-candidate-entry.d.ts +9 -0
  139. package/dist/bundlers/vite/runtime-class-set.d.ts +4 -4
  140. package/dist/bundlers/vite/serve-css-generation.d.ts +2 -1
  141. package/dist/bundlers/vite/serve-js-transform.d.ts +1 -1
  142. package/dist/bundlers/vite/serve-root-import-shell.d.ts +1 -1
  143. package/dist/bundlers/vite/shared/create-framework-plugins.d.ts +7 -7
  144. package/dist/bundlers/vite/shared/framework-hmr-candidate-state.d.ts +45 -0
  145. package/dist/bundlers/vite/shared/framework-post-plugin.d.ts +2 -0
  146. package/dist/bundlers/vite/shared/framework-processed-css-registry.d.ts +22 -0
  147. package/dist/bundlers/vite/shared/framework-runtime-options.d.ts +1 -0
  148. package/dist/bundlers/vite/shared/framework-source-candidates-plugin.d.ts +2 -0
  149. package/dist/bundlers/vite/shared/framework-source-scan-session.d.ts +38 -0
  150. package/dist/bundlers/vite/shared/framework-strategy.d.ts +4 -4
  151. package/dist/bundlers/vite/source-candidate-scan-signature.d.ts +2 -13
  152. package/dist/bundlers/vite/source-candidates/scan-root.d.ts +1 -10
  153. package/dist/bundlers/vite/source-candidates.d.ts +1 -4
  154. package/dist/bundlers/vite/source-output-relations.d.ts +24 -0
  155. package/dist/bundlers/vite/source-scan/css-entries.d.ts +2 -18
  156. package/dist/bundlers/vite/source-scan.d.ts +2 -16
  157. package/dist/bundlers/vite/static-config-content.d.ts +1 -5
  158. package/dist/bundlers/vite/uni-app-x-css-options.d.ts +1 -1
  159. package/dist/bundlers/vite/web-css-compat.d.ts +1 -1
  160. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/asset-emission-plan.d.ts +18 -0
  161. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/css-source-resolvers.d.ts +2 -2
  162. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/finalize-assets.d.ts +1 -1
  163. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/generated-css-task.d.ts +1 -1
  164. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/helpers.d.ts +11 -41
  165. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/html-js-tasks.d.ts +1 -1
  166. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/js-module-graph.d.ts +4 -10
  167. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/pipeline-helpers/finalize.d.ts +4 -4
  168. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/pipeline-helpers/memory-trace.d.ts +3 -3
  169. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/pipeline-helpers/preflight-runtime.d.ts +6 -6
  170. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/pipeline-helpers/resources.d.ts +2 -2
  171. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/pipeline-helpers/sources.d.ts +4 -4
  172. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/pipeline-helpers/user-css.d.ts +1 -1
  173. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/pipeline-helpers.d.ts +9 -9
  174. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/source-candidate-cache.d.ts +3 -3
  175. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/source-candidate-refresh.d.ts +3 -3
  176. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets.d.ts +2 -2
  177. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-loaders.d.ts +4 -4
  178. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5.d.ts +2 -2
  179. package/dist/bundlers/webpack/frameworks/generic/index.d.ts +2 -2
  180. package/dist/bundlers/webpack/frameworks/index.d.ts +7 -7
  181. package/dist/bundlers/webpack/frameworks/mpx/index.d.ts +2 -2
  182. package/dist/bundlers/webpack/frameworks/taro/index.d.ts +2 -2
  183. package/dist/bundlers/webpack/frameworks/uni-app/index.d.ts +2 -2
  184. package/dist/bundlers/webpack/frameworks/weapp-vite/index.d.ts +2 -2
  185. package/dist/bundlers/webpack/index.d.ts +1 -1
  186. package/dist/bundlers/webpack/loaders/runtime-registry.d.ts +2 -2
  187. package/dist/bundlers/webpack/loaders/weapp-tw-css-generation-loader.d.ts +1 -1
  188. package/dist/bundlers/webpack/loaders/weapp-tw-css-import-rewrite-loader.d.ts +1 -1
  189. package/dist/bundlers/webpack/loaders/weapp-tw-runtime-classset-loader.d.ts +1 -1
  190. package/dist/bundlers/webpack/shared/create-framework-plugin/plugin.d.ts +4 -4
  191. package/dist/bundlers/webpack/shared/create-framework-plugin.d.ts +3 -3
  192. package/dist/cli/context.d.ts +2 -2
  193. package/dist/cli/doctor.d.ts +1 -1
  194. package/dist/cli/helpers/options.d.ts +3 -3
  195. package/dist/cli/helpers.d.ts +1 -1
  196. package/dist/cli.cjs +37012 -0
  197. package/dist/cli.js +141 -168
  198. package/dist/compiler/artifact.d.ts +14 -0
  199. package/dist/compiler/candidate-index.d.ts +10 -0
  200. package/dist/compiler/compilation-change-coordinator.d.ts +28 -0
  201. package/dist/compiler/compilation-dependency-state.d.ts +16 -0
  202. package/dist/compiler/compilation-scope-graph.d.ts +31 -0
  203. package/dist/compiler/compilation-session-pool.d.ts +54 -0
  204. package/dist/compiler/compiler-owner-state.d.ts +3 -0
  205. package/dist/compiler/composition.d.ts +8 -0
  206. package/dist/compiler/emission-plan.d.ts +26 -0
  207. package/dist/compiler/index.d.ts +23 -0
  208. package/dist/compiler/invalidation.d.ts +3 -0
  209. package/dist/compiler/mode.d.ts +3 -0
  210. package/dist/compiler/owner-lifecycle.d.ts +1 -0
  211. package/dist/compiler/platform-adapter.d.ts +9 -0
  212. package/dist/compiler/runtime-affecting-signature.d.ts +2 -0
  213. package/dist/compiler/runtime-build-state.d.ts +6 -0
  214. package/dist/compiler/runtime-snapshot.d.ts +53 -0
  215. package/dist/compiler/scope-planner.d.ts +6 -0
  216. package/dist/compiler/semantic-css.d.ts +66 -0
  217. package/dist/compiler/session.d.ts +13 -0
  218. package/dist/compiler/shadow-gate.d.ts +26 -0
  219. package/dist/compiler/shadow-report-session.d.ts +37 -0
  220. package/dist/compiler/shadow-report.d.ts +15 -0
  221. package/dist/compiler/source-graph.d.ts +32 -0
  222. package/dist/compiler/tailwind-generation-session-pool.d.ts +22 -0
  223. package/dist/compiler/types.d.ts +95 -0
  224. package/dist/constants.d.ts +2 -2
  225. package/dist/context/compiler-context-cache.d.ts +1 -1
  226. package/dist/context/custom-attributes.d.ts +1 -1
  227. package/dist/context/handlers.d.ts +3 -3
  228. package/dist/context/index.d.ts +1 -1
  229. package/dist/context/runtime-package-replacements.d.ts +1 -1
  230. package/dist/context/style-options.d.ts +1 -1
  231. package/dist/context/tailwindcss.d.ts +3 -3
  232. package/dist/{context-BtLIID4m.js → context-PZXBqrAJ.cjs} +31 -93
  233. package/dist/{context-JzwzSX36.mjs → context-oTkxC5aZ.js} +22 -11
  234. package/dist/{core.mjs → core.cjs} +13 -12
  235. package/dist/core.d.ts +2 -2
  236. package/dist/core.js +12 -13
  237. package/dist/css-imports-DfNC3e6a.cjs +43 -0
  238. package/dist/css-loader-runtime-CSv0lKqV.cjs +11 -0
  239. package/dist/css-macro/postcss.cjs +19 -0
  240. package/dist/css-macro/postcss.js +2 -19
  241. package/dist/{css-macro.mjs → css-macro.cjs} +11 -8
  242. package/dist/css-macro.d.ts +2 -2
  243. package/dist/css-macro.js +8 -11
  244. package/dist/{defaults.mjs → defaults.cjs} +16 -11
  245. package/dist/defaults.d.ts +1 -1
  246. package/dist/defaults.js +11 -16
  247. package/dist/{escape.mjs → escape.cjs} +18 -4
  248. package/dist/escape.js +4 -18
  249. package/dist/framework/platform.d.ts +1 -1
  250. package/dist/{framework.mjs → framework.cjs} +47 -25
  251. package/dist/framework.d.ts +1 -1
  252. package/dist/framework.js +25 -47
  253. package/dist/generator/index.d.ts +6 -6
  254. package/dist/generator/options.d.ts +3 -3
  255. package/dist/generator/types.d.ts +2 -2
  256. package/dist/{generator-B91GhUJQ.js → generator-C8D5cnbe.cjs} +164 -33
  257. package/dist/{generator-Bv7myuhY.mjs → generator-CDdzqf1S.js} +155 -30
  258. package/dist/generator.cjs +12 -0
  259. package/dist/generator.d.ts +1 -1
  260. package/dist/generator.js +2 -12
  261. package/dist/{gulp-Q1wITegn.js → gulp-Cjcss8T_.cjs} +157 -103
  262. package/dist/{gulp-CKSklPlH.mjs → gulp-DNXQvDUw.js} +141 -90
  263. package/dist/gulp.cjs +5 -0
  264. package/dist/gulp.d.ts +4 -4
  265. package/dist/gulp.js +2 -5
  266. package/dist/{hmr-timing-BXg7nI8N.mjs → hmr-timing-CuJwQzDc.js} +3824 -1988
  267. package/dist/hmr-timing-DMLfNfGG.cjs +555 -0
  268. package/dist/index.cjs +45 -0
  269. package/dist/index.d.ts +9 -9
  270. package/dist/index.js +9 -45
  271. package/dist/js/JsTokenUpdater.d.ts +1 -1
  272. package/dist/js/ModuleGraph.d.ts +3 -3
  273. package/dist/js/NodePathWalker.d.ts +2 -2
  274. package/dist/js/babel/process.d.ts +2 -2
  275. package/dist/js/babel.d.ts +8 -8
  276. package/dist/js/evalTransforms.d.ts +2 -2
  277. package/dist/js/fast-path/oxc.d.ts +1 -1
  278. package/dist/js/handlers.d.ts +2 -2
  279. package/dist/js/index.d.ts +3 -3
  280. package/dist/js/literal-transform.d.ts +1 -1
  281. package/dist/js/module-graph/ignored-exports.d.ts +4 -4
  282. package/dist/js/module-graph/types.d.ts +2 -2
  283. package/dist/js/node-path-walker/export-handlers.d.ts +1 -1
  284. package/dist/js/precheck.d.ts +1 -1
  285. package/dist/js/replacement-cache.d.ts +1 -1
  286. package/dist/js/sourceAnalysis.d.ts +3 -3
  287. package/dist/js/taggedTemplateIgnore.d.ts +1 -1
  288. package/dist/object-Bvy6-w9r.js +47 -0
  289. package/dist/object-C_Vr6_S5.cjs +58 -0
  290. package/dist/options-DlvhQwWB.cjs +775 -0
  291. package/dist/pipeline-helpers-XtUmUlci.cjs +955 -0
  292. package/dist/postcss-html-transform.cjs +7 -0
  293. package/dist/postcss-html-transform.js +3 -5
  294. package/dist/postcss.cjs +15 -0
  295. package/dist/postcss.js +7 -11
  296. package/dist/presets/hbuilderx.d.ts +2 -2
  297. package/dist/presets/index.d.ts +4 -4
  298. package/dist/presets/shared.d.ts +1 -1
  299. package/dist/presets/taro.d.ts +2 -2
  300. package/dist/presets/uni-app-x.d.ts +1 -1
  301. package/dist/presets/uni-app.d.ts +2 -2
  302. package/dist/{presets.mjs → presets.cjs} +37 -24
  303. package/dist/presets.d.ts +1 -1
  304. package/dist/presets.js +24 -36
  305. package/dist/reset.cjs +19 -0
  306. package/dist/reset.d.ts +2 -2
  307. package/dist/reset.js +2 -19
  308. package/dist/{rolldown-runtime-emK7D4bc.js → rolldown-runtime-CVvi-lCc.cjs} +15 -0
  309. package/dist/{rspack.mjs → rspack.cjs} +10 -4
  310. package/dist/rspack.d.ts +3 -3
  311. package/dist/rspack.js +4 -10
  312. package/dist/runtime-branch/create-branch.d.ts +1 -1
  313. package/dist/runtime-branch/generator-target-env.d.ts +1 -1
  314. package/dist/runtime-branch/index.d.ts +2 -2
  315. package/dist/runtime-branch/mini-program.d.ts +1 -1
  316. package/dist/runtime-branch/native-app.d.ts +1 -1
  317. package/dist/runtime-branch/platform.d.ts +2 -2
  318. package/dist/runtime-branch/tailwind-version.d.ts +1 -1
  319. package/dist/runtime-branch/types.d.ts +2 -2
  320. package/dist/runtime-branch/web.d.ts +1 -1
  321. package/dist/runtime-branch.d.ts +1 -1
  322. package/dist/runtime-registry-Y7NrD2WH.cjs +31 -0
  323. package/dist/shared/classname-transform.d.ts +1 -1
  324. package/dist/shared/mpx.d.ts +1 -1
  325. package/dist/source-candidate-scan-signature-B0S7f5P7.js +421 -0
  326. package/dist/source-candidate-scan-signature-BmSuoxR9.cjs +555 -0
  327. package/dist/style-injector/internal.d.ts +6 -6
  328. package/dist/style-options-CEfXwZzX.cjs +75 -0
  329. package/dist/tailwindcss/candidates.d.ts +2 -2
  330. package/dist/tailwindcss/index.d.ts +1 -1
  331. package/dist/tailwindcss/runtime/cache.d.ts +1 -1
  332. package/dist/tailwindcss/runtime-factory.d.ts +2 -2
  333. package/dist/tailwindcss/runtime-options.d.ts +1 -1
  334. package/dist/tailwindcss/runtime-types.d.ts +2 -2
  335. package/dist/tailwindcss/runtime.d.ts +2 -2
  336. package/dist/tailwindcss/source-scan.d.ts +2 -2
  337. package/dist/tailwindcss/targets.d.ts +1 -1
  338. package/dist/tailwindcss/v4/config.d.ts +1 -1
  339. package/dist/tailwindcss/v4/css-sources.d.ts +2 -1
  340. package/dist/tailwindcss/v4/index.d.ts +2 -2
  341. package/dist/tailwindcss/v4/multi-runtime.d.ts +1 -1
  342. package/dist/tailwindcss/v4/runtime-factory.d.ts +5 -5
  343. package/dist/tailwindcss/v4/runtime-options.d.ts +1 -1
  344. package/dist/tailwindcss/v4-engine/css-macro-source.d.ts +1 -1
  345. package/dist/tailwindcss/v4-engine/generator/css-compat.d.ts +1 -1
  346. package/dist/tailwindcss/v4-engine/generator/engine.d.ts +1 -1
  347. package/dist/tailwindcss/v4-engine/generator/incremental-cache.d.ts +4 -5
  348. package/dist/tailwindcss/v4-engine/generator/native-session.d.ts +17 -0
  349. package/dist/tailwindcss/v4-engine/generator/scan-sources.d.ts +2 -1
  350. package/dist/tailwindcss/v4-engine/generator.d.ts +2 -2
  351. package/dist/tailwindcss/v4-engine/index.d.ts +5 -5
  352. package/dist/tailwindcss/v4-engine/miniprogram.d.ts +2 -2
  353. package/dist/tailwindcss/v4-engine/source.d.ts +2 -2
  354. package/dist/tailwindcss/v4-engine/types.d.ts +1 -0
  355. package/dist/{tailwindcss-B4phC0kB.js → tailwindcss-Cs94gJgf.cjs} +9 -769
  356. package/dist/{tailwindcss-BTcXX8Ka.mjs → tailwindcss-D7TGiZR2.js} +22 -22
  357. package/dist/transform-BUEyOCT7.cjs +341 -0
  358. package/dist/transform-BbaPIji9.js +342 -0
  359. package/dist/typedoc.export.d.ts +4 -4
  360. package/dist/types/index.d.ts +7 -7
  361. package/dist/types/shared.d.ts +1 -1
  362. package/dist/types/typedoc-tailwindcss-runtime.d.ts +3 -3
  363. package/dist/types/user-defined-options/general.d.ts +5 -5
  364. package/dist/types/user-defined-options/important.d.ts +2 -2
  365. package/dist/types/user-defined-options/index.d.ts +9 -9
  366. package/dist/types/user-defined-options/matcher.d.ts +2 -2
  367. package/dist/types.cjs +0 -0
  368. package/dist/types.d.ts +1 -1
  369. package/dist/types.js +1 -0
  370. package/dist/uni-app-x/harmony.d.ts +1 -0
  371. package/dist/uni-app-x/index.d.ts +2 -2
  372. package/dist/uni-app-x/options.d.ts +1 -1
  373. package/dist/uni-app-x/style-asset/harmony-apply.d.ts +1 -0
  374. package/dist/uni-app-x/style-asset/style-value.d.ts +3 -0
  375. package/dist/uni-app-x/style-asset.d.ts +5 -4
  376. package/dist/uni-app-x/transform.d.ts +1 -1
  377. package/dist/uni-app-x/vite/harmony-apply.d.ts +19 -0
  378. package/dist/uni-app-x/vite/native-target.d.ts +2 -0
  379. package/dist/uni-app-x/vite.d.ts +5 -2
  380. package/dist/unocss/index.d.ts +1 -1
  381. package/dist/utils/disabled.d.ts +1 -1
  382. package/dist/utils/index.d.ts +3 -3
  383. package/dist/{hmr-timing-CMPaWn9P.js → v4-generation-core-D7MuR5ZF.cjs} +3468 -2059
  384. package/dist/{vite-BwQWl9ft.mjs → vite-BI1TeUPO.js} +5968 -4456
  385. package/dist/{vite-DhVnXvAQ.js → vite-CBzmUTu-.cjs} +6159 -4672
  386. package/dist/vite.cjs +4 -0
  387. package/dist/vite.d.ts +3 -3
  388. package/dist/vite.js +2 -4
  389. package/dist/watch-dependencies-BZGubvuJ.cjs +40 -0
  390. package/dist/{weapp-tw-css-generation-loader.js → weapp-tw-css-generation-loader.cjs} +3 -2
  391. package/dist/weapp-tw-css-import-rewrite-loader.cjs +201 -0
  392. package/dist/{weapp-tw-runtime-classset-loader.js → weapp-tw-runtime-classset-loader.cjs} +9 -11
  393. package/dist/{webpack-kh78iMSS.js → webpack-Dao6bWEj.cjs} +208 -954
  394. package/dist/{webpack-Bo1QrFPf.mjs → webpack-dAY9h8r8.js} +105 -101
  395. package/dist/webpack.cjs +5 -0
  396. package/dist/webpack.d.ts +2 -2
  397. package/dist/webpack.js +2 -5
  398. package/dist/wxml/Tokenizer.d.ts +2 -2
  399. package/dist/wxml/custom-attributes.d.ts +1 -1
  400. package/dist/wxml/index.d.ts +2 -2
  401. package/dist/wxml/shared.d.ts +1 -1
  402. package/dist/wxml/utils/codegen/legacy-rewriter.d.ts +1 -1
  403. package/dist/wxml/utils/codegen/legacy-visitor.d.ts +2 -2
  404. package/dist/wxml/utils/codegen.d.ts +1 -1
  405. package/dist/wxml/utils/custom-template.d.ts +2 -2
  406. package/dist/wxml/utils/fragment-helpers.d.ts +2 -2
  407. package/dist/wxml/utils/fragment-updater.d.ts +2 -2
  408. package/dist/wxml/utils/template-fragments.d.ts +2 -2
  409. package/dist/wxml/utils.d.ts +5 -5
  410. package/dist/wxml-DSMNuUaP.cjs +38609 -0
  411. package/dist/{cli.mjs → wxml-IBzZSaQC.js} +237 -714
  412. package/package.json +56 -53
  413. package/dist/css-macro/postcss.mjs +0 -2
  414. package/dist/generator.mjs +0 -2
  415. package/dist/gulp.mjs +0 -2
  416. package/dist/index.mjs +0 -9
  417. package/dist/object-BJSWl-E5.mjs +0 -9
  418. package/dist/object-COs_Mw6p.js +0 -14
  419. package/dist/postcss-html-transform.mjs +0 -5
  420. package/dist/postcss.mjs +0 -11
  421. package/dist/reset.mjs +0 -2
  422. package/dist/source-candidate-scan-signature-BKZZk_e6.js +0 -1078
  423. package/dist/source-candidate-scan-signature-CtK-mB_C.mjs +0 -854
  424. package/dist/transform-B_KM9sLX.mjs +0 -14930
  425. package/dist/transform-CcYptivi.js +0 -14927
  426. package/dist/types.mjs +0 -1
  427. package/dist/vite.mjs +0 -2
  428. package/dist/watch-dependencies-bpG6kmAf.js +0 -80
  429. package/dist/weapp-tw-css-import-rewrite-loader-B0tVkJLH.js +0 -10524
  430. package/dist/weapp-tw-css-import-rewrite-loader.js +0 -10
  431. package/dist/webpack.mjs +0 -2
  432. package/dist/wxml-Ce10eREX.js +0 -3979
  433. package/dist/wxml-DdGdeqaH.mjs +0 -3861
  434. /package/dist/{auto-2dg_uhEJ.mjs → auto-2dg_uhEJ.js} +0 -0
  435. /package/dist/{auto-DtU6f3X6.js → auto-DtU6f3X6.cjs} +0 -0
  436. /package/dist/bundlers/{vite → shared}/source-scan/dependencies.d.ts +0 -0
  437. /package/dist/{cache-options-DavPxrhC.js → cache-options-DavPxrhC.cjs} +0 -0
  438. /package/dist/{cache-options-DwBtLwQe.mjs → cache-options-DwBtLwQe.js} +0 -0
  439. /package/dist/{logger-BNzxZbZj.mjs → logger-BNzxZbZj.js} +0 -0
  440. /package/dist/{logger-TlKT3xmR.js → logger-TlKT3xmR.cjs} +0 -0
  441. /package/dist/{utils-CuKLf1Zv.js → utils-CuKLf1Zv.cjs} +0 -0
  442. /package/dist/{utils-MVwpU07P.mjs → utils-MVwpU07P.js} +0 -0
@@ -1,3979 +0,0 @@
1
- const require_rolldown_runtime = require("./rolldown-runtime-emK7D4bc.js");
2
- const require_object = require("./object-COs_Mw6p.js");
3
- const require_cache_options = require("./cache-options-DavPxrhC.js");
4
- let _tailwindcss_mangle_engine = require("@tailwindcss-mangle/engine");
5
- let lru_cache = require("lru-cache");
6
- let _weapp_tailwindcss_shared_node = require("@weapp-tailwindcss/shared/node");
7
- let _weapp_core_escape = require("@weapp-core/escape");
8
- let debug = require("debug");
9
- debug = require_rolldown_runtime.__toESM(debug);
10
- let _babel_traverse = require("@babel/traverse");
11
- _babel_traverse = require_rolldown_runtime.__toESM(_babel_traverse);
12
- let _babel_parser = require("@babel/parser");
13
- let magic_string = require("magic-string");
14
- magic_string = require_rolldown_runtime.__toESM(magic_string);
15
- let _babel_types = require("@babel/types");
16
- _babel_types = require_rolldown_runtime.__toESM(_babel_types);
17
- //#region src/debug/index.ts
18
- const _debug = (0, debug.default)("weapp-tw");
19
- function createDebug(prefix) {
20
- const debug$2 = ((formatter, ...args) => {
21
- return _debug((prefix ?? "") + formatter, ...args);
22
- });
23
- Object.defineProperty(debug$2, "enabled", {
24
- enumerable: false,
25
- configurable: false,
26
- get() {
27
- return _debug.enabled;
28
- }
29
- });
30
- return debug$2;
31
- }
32
- //#endregion
33
- //#region src/babel/index.ts
34
- function _interopDefaultCompat(e) {
35
- return e && typeof e === "object" && "default" in e ? e.default : e;
36
- }
37
- const traverse = _interopDefaultCompat(_babel_traverse.default);
38
- //#endregion
39
- //#region src/utils/regex.ts
40
- function escapeStringRegexp(str) {
41
- if (typeof str !== "string") throw new TypeError("Expected a string");
42
- return str.replaceAll(/[$()*+.?[\\\]^{|}]/g, "\\$&").replaceAll("-", "\\x2d");
43
- }
44
- //#endregion
45
- //#region src/utils/nameMatcher.ts
46
- const NEVER_MATCH_NAME$1 = () => false;
47
- const GLOBAL_FLAG_REGEXP = /g/g;
48
- function buildFuzzyMatcher(fuzzyStrings) {
49
- if (fuzzyStrings.length === 0) return;
50
- if (fuzzyStrings.length === 1) {
51
- const [needle] = fuzzyStrings;
52
- if (needle === void 0) return;
53
- return (value) => value.includes(needle);
54
- }
55
- const unique = [...new Set(fuzzyStrings)];
56
- const pattern = new RegExp(unique.map(escapeStringRegexp).join("|"));
57
- return (value) => pattern.test(value);
58
- }
59
- function normaliseRegex(regex) {
60
- const { source, flags } = regex;
61
- if (!flags.includes("g")) return regex;
62
- return new RegExp(source, flags.replace(GLOBAL_FLAG_REGEXP, ""));
63
- }
64
- function createNameMatcher(list, { exact = false } = {}) {
65
- if (!list || list.length === 0) return NEVER_MATCH_NAME$1;
66
- const exactStrings = exact ? /* @__PURE__ */ new Set() : void 0;
67
- const fuzzyStrings = [];
68
- const regexList = [];
69
- for (const item of list) if (typeof item === "string") if (exact) exactStrings.add(item);
70
- else fuzzyStrings.push(item);
71
- else regexList.push(normaliseRegex(item));
72
- if (exact) {
73
- const exactStringCount = exactStrings?.size ?? 0;
74
- if (exactStringCount === 1 && regexList.length === 0) {
75
- const [needle] = exactStrings;
76
- if (needle === void 0) return NEVER_MATCH_NAME$1;
77
- return (value) => value === needle;
78
- }
79
- if (regexList.length === 0) return (value) => exactStrings.has(value);
80
- if (exactStringCount === 0 && regexList.length === 1) {
81
- const [regex] = regexList;
82
- if (!regex) return NEVER_MATCH_NAME$1;
83
- return (value) => regex.test(value);
84
- }
85
- return (value) => {
86
- if (exactStrings?.has(value)) return true;
87
- return regexList.some((regex) => regex.test(value));
88
- };
89
- }
90
- const fuzzyMatcher = exact ? void 0 : buildFuzzyMatcher(fuzzyStrings);
91
- const hasRegex = regexList.length > 0;
92
- if (fuzzyMatcher && !hasRegex) return fuzzyMatcher;
93
- if (!fuzzyMatcher && regexList.length === 1) {
94
- const [regex] = regexList;
95
- if (!regex) return NEVER_MATCH_NAME$1;
96
- return (value) => regex.test(value);
97
- }
98
- return (value) => {
99
- if (fuzzyMatcher?.(value)) return true;
100
- if (!hasRegex) return false;
101
- return regexList.some((regex) => regex.test(value));
102
- };
103
- }
104
- //#endregion
105
- //#region src/js/babel/parse.ts
106
- const parseCache = new lru_cache.LRUCache({ max: require_cache_options.HARD_PARSE_CACHE_MAX_ENTRIES });
107
- function genCacheKey(source, options) {
108
- if (typeof options === "string") return `${(0, _weapp_tailwindcss_shared_node.md5)(source)}:${options}`;
109
- return `${(0, _weapp_tailwindcss_shared_node.md5)(source)}:${JSON.stringify(options, (_, val) => typeof val === "function" ? val.toString() : val)}`;
110
- }
111
- function normalizeCacheMaxEntries(value) {
112
- if (typeof value !== "number" || !Number.isFinite(value)) return 128;
113
- return Math.min(Math.max(Math.floor(value), 0), require_cache_options.HARD_PARSE_CACHE_MAX_ENTRIES);
114
- }
115
- function normalizeCacheMaxSourceLength(value) {
116
- if (typeof value !== "number" || !Number.isFinite(value)) return require_cache_options.DEFAULT_PARSE_CACHE_MAX_SOURCE_LENGTH;
117
- return Math.max(Math.floor(value), 0);
118
- }
119
- function trimParseCache(maxEntries) {
120
- while (parseCache.size > maxEntries) parseCache.pop();
121
- }
122
- function babelParse(code, opts = {}) {
123
- const { cache, cacheKey, cacheMaxEntries, cacheMaxSourceLength, ...rest } = opts;
124
- const maxEntries = normalizeCacheMaxEntries(cacheMaxEntries);
125
- const maxSourceLength = normalizeCacheMaxSourceLength(cacheMaxSourceLength);
126
- const shouldCache = cache === true && maxEntries > 0 && code.length <= maxSourceLength;
127
- const cacheKeyString = shouldCache ? genCacheKey(code, cacheKey ?? rest) : void 0;
128
- let result;
129
- if (shouldCache) {
130
- trimParseCache(maxEntries);
131
- result = parseCache.get(cacheKeyString);
132
- }
133
- if (!result) {
134
- const { cache: _cache, cacheKey: _cacheKey, cacheMaxEntries: _cacheMaxEntries, cacheMaxSourceLength: _cacheMaxSourceLength, ...parseOptions } = opts;
135
- result = (0, _babel_parser.parse)(code, parseOptions);
136
- if (shouldCache) {
137
- parseCache.set(cacheKeyString, result);
138
- trimParseCache(maxEntries);
139
- }
140
- }
141
- return result;
142
- }
143
- //#endregion
144
- //#region src/wxml/shared.ts
145
- const NEWLINE_RE = /[\n\r]+/g;
146
- function replaceWxml(original, options = {
147
- keepEOL: false,
148
- escapeMap: _weapp_core_escape.MappingChars2String
149
- }) {
150
- const { keepEOL, escapeMap, ignoreHead } = options;
151
- let res = original;
152
- if (!keepEOL) res = res.replaceAll(NEWLINE_RE, "");
153
- res = (0, _weapp_core_escape.escape)(res, require_object.omitUndefined({
154
- map: escapeMap,
155
- ignoreHead
156
- }));
157
- return res;
158
- }
159
- //#endregion
160
- //#region src/shared/classname-transform.ts
161
- const escapedCandidateCacheByEscapeMap = /* @__PURE__ */ new WeakMap();
162
- const defaultEscapedCandidateCache = /* @__PURE__ */ new Map();
163
- let lastEscapedCandidateEscapeMap;
164
- let lastEscapedCandidateCacheStore;
165
- function isUrlLikeCandidate(candidate) {
166
- return candidate.startsWith("//") || candidate.startsWith("http://") || candidate.startsWith("https://");
167
- }
168
- function isPlainSlashPathCandidate(candidate) {
169
- const slashIndex = candidate.indexOf("/");
170
- if (slashIndex <= 0) return false;
171
- if (isUrlLikeCandidate(candidate)) return true;
172
- if (candidate.includes("[") || candidate.includes("]") || candidate.includes(":")) return false;
173
- return !candidate.slice(0, slashIndex).includes("-");
174
- }
175
- function isArbitraryValueCandidate(candidate) {
176
- let hasOpenBracket = false;
177
- let hasCloseBracket = false;
178
- for (let i = 0; i < candidate.length; i++) {
179
- const char = candidate[i];
180
- if (char === "[") hasOpenBracket = true;
181
- else if (char === "]") hasCloseBracket = true;
182
- if (hasOpenBracket && hasCloseBracket) break;
183
- }
184
- if (!hasOpenBracket || !hasCloseBracket) return false;
185
- if (isUrlLikeCandidate(candidate.trim())) return false;
186
- return true;
187
- }
188
- function shouldEnableArbitraryValueFallbackByInputs(classNameSet, jsArbitraryValueFallback, tailwindcssMajorVersion) {
189
- if (jsArbitraryValueFallback === true) return true;
190
- if (jsArbitraryValueFallback === false) return false;
191
- return tailwindcssMajorVersion === 4 && (!classNameSet || classNameSet.size === 0);
192
- }
193
- function shouldEnableArbitraryValueFallback({ classNameSet, jsArbitraryValueFallback, tailwindcssMajorVersion }) {
194
- return shouldEnableArbitraryValueFallbackByInputs(classNameSet, jsArbitraryValueFallback, tailwindcssMajorVersion);
195
- }
196
- const SKIP_RESULT = { decision: "skip" };
197
- const DIRECT_RESULT = { decision: "direct" };
198
- const FALLBACK_RESULT = { decision: "fallback" };
199
- function getEscapedCandidateCacheStore(escapeMap) {
200
- if (!escapeMap) return defaultEscapedCandidateCache;
201
- if (escapeMap === lastEscapedCandidateEscapeMap && lastEscapedCandidateCacheStore) return lastEscapedCandidateCacheStore;
202
- let store = escapedCandidateCacheByEscapeMap.get(escapeMap);
203
- if (!store) {
204
- store = /* @__PURE__ */ new Map();
205
- escapedCandidateCacheByEscapeMap.set(escapeMap, store);
206
- }
207
- lastEscapedCandidateEscapeMap = escapeMap;
208
- lastEscapedCandidateCacheStore = store;
209
- return store;
210
- }
211
- function getEscapedCandidate(candidate, escapeMap, store = getEscapedCandidateCacheStore(escapeMap)) {
212
- let cached = store.get(candidate);
213
- if (cached === void 0) {
214
- cached = replaceWxml(candidate, { escapeMap });
215
- store.set(candidate, cached);
216
- }
217
- return cached;
218
- }
219
- /**
220
- * JS 转译严格遵循 runtime class set:
221
- * 1. 直接命中 classNameSet 原始值;
222
- * 2. 兼容命中 classNameSet 中已转义值;
223
- * 3. 仅在受控条件下允许 class 语义兜底。
224
- *
225
- * 返回结构化结果,附带已计算的 escapedValue 以避免下游重复 escape。
226
- */
227
- function resolveClassNameTransformWithResult(candidate, { alwaysEscape, classNameSet, escapeMap, jsArbitraryValueFallback, jsPreserveClass, tailwindcssMajorVersion, classContext }) {
228
- if (jsPreserveClass?.(candidate)) return SKIP_RESULT;
229
- if (alwaysEscape) return DIRECT_RESULT;
230
- if (!classContext && isPlainSlashPathCandidate(candidate)) return SKIP_RESULT;
231
- if (classNameSet?.has(candidate)) return DIRECT_RESULT;
232
- if (classNameSet && classNameSet.size > 0) {
233
- const escapedCandidate = getEscapedCandidate(candidate, escapeMap);
234
- if (escapedCandidate !== candidate && classNameSet.has(escapedCandidate)) return {
235
- decision: "escaped",
236
- escapedValue: escapedCandidate
237
- };
238
- }
239
- if (classContext && shouldEnableArbitraryValueFallbackByInputs(classNameSet, jsArbitraryValueFallback, tailwindcssMajorVersion) && isArbitraryValueCandidate(candidate)) return FALLBACK_RESULT;
240
- return SKIP_RESULT;
241
- }
242
- //#endregion
243
- //#region src/utils/decode.ts
244
- const unicodeEscapeRE = /\\u([\dA-Fa-f]{4})/g;
245
- const unicodeEscapeTestRE = /\\u[\dA-Fa-f]{4}/;
246
- function decodeUnicode(value) {
247
- if (!unicodeEscapeTestRE.test(value)) return value;
248
- return value.replace(unicodeEscapeRE, (_match, hex) => {
249
- const codePoint = Number.parseInt(hex, 16);
250
- return Number.isNaN(codePoint) ? _match : String.fromCharCode(codePoint);
251
- });
252
- }
253
- function decodeUnicode2(input) {
254
- if (!unicodeEscapeTestRE.test(input)) return input;
255
- try {
256
- return JSON.parse(`"${input}"`);
257
- } catch (_error) {
258
- return decodeUnicode(input);
259
- }
260
- }
261
- //#endregion
262
- //#region src/js/class-context.ts
263
- const CLASS_LIKE_KEYWORDS = /* @__PURE__ */ new Set([
264
- "class",
265
- "classname",
266
- "hoverclass",
267
- "virtualhostclass",
268
- "rootclass"
269
- ]);
270
- const CLASS_HELPER_IDENTIFIERS = /* @__PURE__ */ new Set([
271
- "cn",
272
- "clsx",
273
- "classnames",
274
- "twmerge",
275
- "cva",
276
- "tv",
277
- "cx",
278
- "r"
279
- ]);
280
- const DASH_CODE = 45;
281
- const COLON_CODE = 58;
282
- const UPPERCASE_A_CODE = 65;
283
- const UPPERCASE_Z_CODE = 90;
284
- const UNDERSCORE_CODE = 95;
285
- const ASCII_MAX_CODE = 127;
286
- const NORMALIZE_KEYWORD_REGEXP = /[-_:]/g;
287
- function normalizeKeyword(name) {
288
- const length = name.length;
289
- let firstNormalizedIndex = -1;
290
- for (let i = 0; i < length; i++) {
291
- const code = name.charCodeAt(i);
292
- if (code === DASH_CODE || code === UNDERSCORE_CODE || code === COLON_CODE || code >= UPPERCASE_A_CODE && code <= UPPERCASE_Z_CODE) {
293
- firstNormalizedIndex = i;
294
- break;
295
- }
296
- if (code > ASCII_MAX_CODE) return name.replace(NORMALIZE_KEYWORD_REGEXP, "").toLowerCase();
297
- }
298
- if (firstNormalizedIndex === -1) return name;
299
- let normalized = name.slice(0, firstNormalizedIndex);
300
- for (let i = firstNormalizedIndex; i < length; i++) {
301
- const code = name.charCodeAt(i);
302
- if (code === DASH_CODE || code === UNDERSCORE_CODE || code === COLON_CODE) continue;
303
- if (code >= UPPERCASE_A_CODE && code <= UPPERCASE_Z_CODE) {
304
- normalized += String.fromCharCode(code + 32);
305
- continue;
306
- }
307
- if (code > ASCII_MAX_CODE) return name.replace(NORMALIZE_KEYWORD_REGEXP, "").toLowerCase();
308
- normalized += name[i];
309
- }
310
- return normalized;
311
- }
312
- function readObjectKeyName(path) {
313
- if (path.isIdentifier()) return path.node.name;
314
- if (path.isStringLiteral()) return path.node.value;
315
- if (path.isTemplateLiteral() && path.node.expressions.length === 0) return path.node.quasis[0]?.value.cooked ?? path.node.quasis[0]?.value.raw;
316
- }
317
- function isClassLikeObjectProperty(path, valuePath) {
318
- if (!path.isObjectProperty()) return false;
319
- if (path.get("value") !== valuePath) return false;
320
- const keyName = readObjectKeyName(path.get("key"));
321
- if (!keyName) return false;
322
- return CLASS_LIKE_KEYWORDS.has(normalizeKeyword(keyName));
323
- }
324
- function isClassLikeJsxAttribute(path) {
325
- if (!path.isJSXAttribute()) return false;
326
- const namePath = path.get("name");
327
- if (!namePath.isJSXIdentifier()) return false;
328
- return CLASS_LIKE_KEYWORDS.has(normalizeKeyword(namePath.node.name));
329
- }
330
- function readCallHelperName(calleePath) {
331
- if (calleePath.isIdentifier()) return calleePath.node.name;
332
- if (calleePath.isMemberExpression()) {
333
- const propertyPath = calleePath.get("property");
334
- if (propertyPath.isIdentifier()) return propertyPath.node.name;
335
- if (propertyPath.isStringLiteral()) return propertyPath.node.value;
336
- }
337
- }
338
- function isClassLikeCallExpression(path, valuePath) {
339
- if (!path.isCallExpression()) return false;
340
- const helperName = readCallHelperName(path.get("callee"));
341
- if (!helperName || !CLASS_HELPER_IDENTIFIERS.has(normalizeKeyword(helperName))) return false;
342
- return path.get("arguments").some((argumentPath) => argumentPath.node === valuePath.node);
343
- }
344
- /**
345
- * 判断字符串字面量是否处于 class 语义上下文。
346
- * 仅用于受控兜底场景,避免将普通业务文本误判为 class。
347
- */
348
- function isClassContextLiteralPath(path) {
349
- let current = path;
350
- while (current.parentPath) {
351
- const parent = current.parentPath;
352
- if (isClassLikeObjectProperty(parent, current)) return true;
353
- if (isClassLikeJsxAttribute(parent)) return true;
354
- if (isClassLikeCallExpression(parent, current)) return true;
355
- current = parent;
356
- }
357
- return false;
358
- }
359
- //#endregion
360
- //#region src/js/js-string-escape.ts
361
- function jsStringEscape(value) {
362
- return String(value).replaceAll(/[\n\r"'\\\u2028\u2029]/g, (character) => {
363
- switch (character) {
364
- case "\"":
365
- case "'":
366
- case "\\": return `\\${character}`;
367
- case "\n": return "\\n";
368
- case "\r": return "\\r";
369
- case "\u2028": return "\\u2028";
370
- case "\u2029": return "\\u2029";
371
- default: return character;
372
- }
373
- });
374
- }
375
- //#endregion
376
- //#region src/js/replacement-cache.ts
377
- const replacementCacheByEscapeMap = /* @__PURE__ */ new WeakMap();
378
- const defaultReplacementCache = /* @__PURE__ */ new Map();
379
- function getReplacementCacheStore(escapeMap) {
380
- if (!escapeMap) return defaultReplacementCache;
381
- let store = replacementCacheByEscapeMap.get(escapeMap);
382
- if (!store) {
383
- store = /* @__PURE__ */ new Map();
384
- replacementCacheByEscapeMap.set(escapeMap, store);
385
- }
386
- return store;
387
- }
388
- function getReplacement(candidate, escapeMap, store = getReplacementCacheStore(escapeMap)) {
389
- let cached = store.get(candidate);
390
- if (cached === void 0) {
391
- cached = replaceWxml(candidate, { escapeMap });
392
- store.set(candidate, cached);
393
- }
394
- return cached;
395
- }
396
- //#endregion
397
- //#region src/js/handlers.ts
398
- const debug$1 = createDebug("[js:handlers] ");
399
- const WEAPP_TW_IGNORE_MARKER = "weapp-tw";
400
- const IGNORE_MARKER = "ignore";
401
- function hasIgnoreComment(node) {
402
- const { leadingComments } = node;
403
- if (!Array.isArray(leadingComments) || leadingComments.length === 0) return false;
404
- for (const comment of leadingComments) {
405
- const { value } = comment;
406
- if (value.includes(WEAPP_TW_IGNORE_MARKER) && value.includes(IGNORE_MARKER)) return true;
407
- }
408
- return false;
409
- }
410
- function isConditionTestLiteral(path) {
411
- let current = path;
412
- while (current?.parentPath) {
413
- const parent = current.parentPath;
414
- if (parent.isConditionalExpression()) return parent.node.test === current.node;
415
- if (parent.isBinaryExpression() || parent.isCallExpression() || parent.isLogicalExpression() || parent.isMemberExpression() || parent.isUnaryExpression()) {
416
- current = parent;
417
- continue;
418
- }
419
- return false;
420
- }
421
- return false;
422
- }
423
- function extractLiteralValue(path, { unescapeUnicode }) {
424
- const { node } = path;
425
- let offset = 0;
426
- let original;
427
- if (node.type === "StringLiteral") {
428
- offset = 1;
429
- original = node.value;
430
- } else if (node.type === "TemplateElement") original = node.value.raw;
431
- else original = "";
432
- let literal = original;
433
- if (unescapeUnicode && original.includes("\\u")) literal = decodeUnicode2(original);
434
- return {
435
- literal,
436
- offset,
437
- original
438
- };
439
- }
440
- function createCandidatePlanResolver(options, classContext) {
441
- const { escapeMap } = options;
442
- const replacementCache = getReplacementCacheStore(escapeMap);
443
- const transformOptions = classContext ? {
444
- ...options,
445
- classContext
446
- } : options;
447
- let firstCandidate = "";
448
- let firstPlan;
449
- let cache;
450
- const buildCandidatePlan = (candidate) => {
451
- const result = resolveClassNameTransformWithResult(candidate, transformOptions);
452
- if (result.decision === "skip") return { result };
453
- let replacement;
454
- if (result.decision === "escaped" && result.escapedValue) {
455
- replacement = result.escapedValue;
456
- replacementCache.set(candidate, replacement);
457
- } else replacement = getReplacement(candidate, escapeMap, replacementCache);
458
- return {
459
- result,
460
- replacement
461
- };
462
- };
463
- return (candidate) => {
464
- if (cache) {
465
- const cached = cache.get(candidate);
466
- if (cached) return cached;
467
- } else if (firstPlan && candidate === firstCandidate) return firstPlan;
468
- const plan = buildCandidatePlan(candidate);
469
- if (!firstPlan) {
470
- firstCandidate = candidate;
471
- firstPlan = plan;
472
- return plan;
473
- }
474
- if (!cache) {
475
- cache = /* @__PURE__ */ new Map();
476
- cache.set(firstCandidate, firstPlan);
477
- }
478
- cache.set(candidate, plan);
479
- return plan;
480
- };
481
- }
482
- function replaceHandleValue(path, options) {
483
- const { needEscaped = false } = options;
484
- const { classNameSet, alwaysEscape } = options;
485
- const fallbackEnabled = shouldEnableArbitraryValueFallback(options);
486
- if (!alwaysEscape && !fallbackEnabled && (!classNameSet || classNameSet.size === 0)) return;
487
- if (hasIgnoreComment(path.node)) return;
488
- if (isConditionTestLiteral(path)) return;
489
- const { literal, original, offset } = extractLiteralValue(path, options);
490
- const candidates = (0, _tailwindcss_mangle_engine.splitCandidateTokens)(literal);
491
- if (candidates.length === 0) return;
492
- const debugEnabled = debug$1.enabled;
493
- const classContext = options.wrapExpression || isClassContextLiteralPath(path);
494
- let transformed = literal;
495
- let mutated = false;
496
- let matchedCandidateCount = 0;
497
- let escapedDecisionCount = 0;
498
- let fallbackDecisionCount = 0;
499
- let escapedSamples;
500
- let skippedSamples;
501
- const resolveCandidatePlan = createCandidatePlanResolver(options, classContext);
502
- for (const candidate of candidates) {
503
- const plan = resolveCandidatePlan(candidate);
504
- if (plan.result.decision === "skip") {
505
- if (debugEnabled) {
506
- if (!skippedSamples) skippedSamples = [];
507
- if (skippedSamples.length < 6) skippedSamples.push(candidate);
508
- }
509
- continue;
510
- }
511
- if (debugEnabled) {
512
- matchedCandidateCount += 1;
513
- if (plan.result.decision === "escaped") {
514
- escapedDecisionCount += 1;
515
- if (!escapedSamples) escapedSamples = [];
516
- if (escapedSamples.length < 6) escapedSamples.push(candidate);
517
- }
518
- if (plan.result.decision === "fallback") fallbackDecisionCount += 1;
519
- }
520
- const replaced = transformed.replace(candidate, plan.replacement);
521
- if (replaced !== transformed) {
522
- transformed = replaced;
523
- mutated = true;
524
- }
525
- }
526
- const node = path.node;
527
- if (!mutated || typeof node.start !== "number" || typeof node.end !== "number") return;
528
- if (debugEnabled) debug$1("runtimeSet size=%d fallbackTriggered=%s candidates=%d matched=%d escapedHits=%d skipped=%d file=%s escapedSamples=%s skippedSamples=%s", classNameSet?.size ?? 0, fallbackDecisionCount > 0, candidates.length, matchedCandidateCount, escapedDecisionCount, skippedSamples?.length ?? 0, options.filename ?? "unknown", escapedSamples?.join(",") || "-", skippedSamples?.join(",") || "-");
529
- const start = node.start + offset;
530
- const end = node.end - offset;
531
- if (start >= end || transformed === original) return;
532
- return {
533
- start,
534
- end,
535
- value: needEscaped ? jsStringEscape(transformed) : transformed,
536
- path
537
- };
538
- }
539
- //#endregion
540
- //#region src/js/sourceAnalysis.ts
541
- function hasReplacementEntries(replacements) {
542
- for (const key in replacements) if (Object.hasOwn(replacements, key)) return true;
543
- return false;
544
- }
545
- function createModuleSpecifierReplacementToken(path, replacement) {
546
- const node = path.node;
547
- if (node.value === replacement) return;
548
- if (typeof node.start !== "number" || typeof node.end !== "number") return;
549
- const start = node.start + 1;
550
- const end = node.end - 1;
551
- if (start >= end) return;
552
- return {
553
- start,
554
- end,
555
- value: replacement,
556
- path
557
- };
558
- }
559
- function collectModuleSpecifierReplacementTokens(analysis, replacements) {
560
- if (!hasReplacementEntries(replacements)) return [];
561
- if (analysis.importDeclarations.size === 0 && analysis.exportDeclarations.size === 0 && analysis.requireCallPaths.length === 0 && analysis.walker.imports.size === 0) return [];
562
- const tokens = [];
563
- const applyReplacement = (path) => {
564
- const replacement = replacements[path.node.value];
565
- if (!replacement) return;
566
- const token = createModuleSpecifierReplacementToken(path, replacement);
567
- if (token) tokens.push(token);
568
- };
569
- for (const importPath of analysis.importDeclarations) {
570
- const source = importPath.get("source");
571
- if (source.isStringLiteral()) applyReplacement(source);
572
- }
573
- for (const exportPath of analysis.exportDeclarations) if (exportPath.isExportNamedDeclaration() || exportPath.isExportAllDeclaration()) {
574
- const source = exportPath.get("source");
575
- if (source && !Array.isArray(source) && source.isStringLiteral()) applyReplacement(source);
576
- }
577
- for (const literalPath of analysis.requireCallPaths) applyReplacement(literalPath);
578
- for (const token of analysis.walker.imports) {
579
- const replacement = replacements[token.source];
580
- if (replacement) token.source = replacement;
581
- }
582
- return tokens;
583
- }
584
- //#endregion
585
- //#region src/js/babel/process.ts
586
- const optionVariantsCache = /* @__PURE__ */ new WeakMap();
587
- function getNeedEscapedOptions(options, needEscaped) {
588
- if (options.needEscaped === needEscaped) return options;
589
- let cached = optionVariantsCache.get(options);
590
- if (!cached) {
591
- cached = {};
592
- optionVariantsCache.set(options, cached);
593
- }
594
- if (needEscaped) {
595
- if (!cached.stringLiteralOptions) cached.stringLiteralOptions = {
596
- ...options,
597
- needEscaped: true
598
- };
599
- return cached.stringLiteralOptions;
600
- }
601
- if (!cached.templateLiteralOptions) cached.templateLiteralOptions = {
602
- ...options,
603
- needEscaped: false
604
- };
605
- return cached.templateLiteralOptions;
606
- }
607
- function processUpdatedSource(rawSource, options, analysis) {
608
- const { targetPaths, jsTokenUpdater, ignoredPaths } = analysis;
609
- if (targetPaths.length === 0 && !options.moduleSpecifierReplacements && jsTokenUpdater.length === 0) return new magic_string.default(rawSource);
610
- const replacementTokens = [];
611
- for (const path of targetPaths) {
612
- if (ignoredPaths.has(path)) continue;
613
- const token = replaceHandleValue(path, path.isStringLiteral() ? getNeedEscapedOptions(options, true) : getNeedEscapedOptions(options, false));
614
- if (token) replacementTokens.push(token);
615
- }
616
- if (options.moduleSpecifierReplacements) replacementTokens.push(...collectModuleSpecifierReplacementTokens(analysis, options.moduleSpecifierReplacements));
617
- if (jsTokenUpdater.length + replacementTokens.length === 0) return new magic_string.default(rawSource);
618
- const ms = new magic_string.default(rawSource);
619
- jsTokenUpdater.push(...replacementTokens).filter((token) => !ignoredPaths.has(token.path)).updateMagicString(ms);
620
- return ms;
621
- }
622
- //#endregion
623
- //#region src/js/evalTransforms.ts
624
- const evalHandlerOptionsCache = /* @__PURE__ */ new WeakMap();
625
- const EVAL_SCOPE_ERROR_REGEXP = /pass a scope and parentPath|traversing a Program\/File/i;
626
- function isEvalPath(path) {
627
- if (path.isCallExpression()) return path.get("callee").isIdentifier({ name: "eval" });
628
- return false;
629
- }
630
- function createEvalReplacementToken(path, updated) {
631
- const node = path.node;
632
- let offset = 0;
633
- let original;
634
- if (path.isStringLiteral()) {
635
- offset = 1;
636
- original = path.node.value;
637
- } else if (path.isTemplateElement()) original = path.node.value.raw;
638
- else original = "";
639
- if (typeof node.start !== "number" || typeof node.end !== "number") return;
640
- const start = node.start + offset;
641
- const end = node.end - offset;
642
- if (start >= end) return;
643
- if (original === updated) return;
644
- return {
645
- start,
646
- end,
647
- value: path.isStringLiteral() ? jsStringEscape(updated) : updated,
648
- path
649
- };
650
- }
651
- function handleEvalStringLiteral(path, handlerOptions, updater, handler) {
652
- const { code } = handler(path.node.value, handlerOptions);
653
- if (!code) return;
654
- const token = createEvalReplacementToken(path, code);
655
- if (token) updater.addToken(token);
656
- }
657
- function handleEvalTemplateElement(path, handlerOptions, updater, handler) {
658
- const { code } = handler(path.node.value.raw, handlerOptions);
659
- if (!code) return;
660
- const token = createEvalReplacementToken(path, code);
661
- if (token) updater.addToken(token);
662
- }
663
- function getEvalStringHandlerOptions(options) {
664
- if (options.needEscaped === false && options.generateMap === false) return options;
665
- let cached = evalHandlerOptionsCache.get(options);
666
- if (!cached) {
667
- cached = {};
668
- evalHandlerOptionsCache.set(options, cached);
669
- }
670
- if (!cached.stringLiteralOptions) cached.stringLiteralOptions = {
671
- ...options,
672
- needEscaped: false,
673
- generateMap: false
674
- };
675
- return cached.stringLiteralOptions;
676
- }
677
- function getEvalTemplateHandlerOptions(options) {
678
- if (options.generateMap === false) return options;
679
- let cached = evalHandlerOptionsCache.get(options);
680
- if (!cached) {
681
- cached = {};
682
- evalHandlerOptionsCache.set(options, cached);
683
- }
684
- if (!cached.templateLiteralOptions) cached.templateLiteralOptions = {
685
- ...options,
686
- generateMap: false
687
- };
688
- return cached.templateLiteralOptions;
689
- }
690
- function walkEvalExpression(path, options, updater, handler) {
691
- const stringHandlerOptions = getEvalStringHandlerOptions(options);
692
- const templateHandlerOptions = getEvalTemplateHandlerOptions(options);
693
- const maybeTraverse = path?.traverse;
694
- if (typeof maybeTraverse === "function") try {
695
- return maybeTraverse.call(path, {
696
- StringLiteral(innerPath) {
697
- handleEvalStringLiteral(innerPath, stringHandlerOptions, updater, handler);
698
- },
699
- TemplateElement(innerPath) {
700
- handleEvalTemplateElement(innerPath, templateHandlerOptions, updater, handler);
701
- }
702
- });
703
- } catch (error) {
704
- const msg = error?.message ?? "";
705
- if (!EVAL_SCOPE_ERROR_REGEXP.test(msg)) throw error;
706
- }
707
- const getArgs = path?.get?.("arguments");
708
- if (Array.isArray(getArgs)) {
709
- for (const arg of getArgs) {
710
- if (arg?.isStringLiteral?.()) {
711
- handleEvalStringLiteral(arg, stringHandlerOptions, updater, handler);
712
- continue;
713
- }
714
- if (arg?.isTemplateLiteral?.()) for (const quasi of arg.get("quasis")) handleEvalTemplateElement(quasi, templateHandlerOptions, updater, handler);
715
- }
716
- return;
717
- }
718
- const nodeArgs = path?.node?.arguments;
719
- if (Array.isArray(nodeArgs)) {
720
- for (const n of nodeArgs) if (n?.type === "StringLiteral") handleEvalStringLiteral({
721
- node: n,
722
- isStringLiteral: () => true
723
- }, stringHandlerOptions, updater, handler);
724
- else if (n?.type === "TemplateLiteral" && Array.isArray(n.quasis)) for (const q of n.quasis) handleEvalTemplateElement({
725
- node: q,
726
- isStringLiteral: () => false,
727
- isTemplateElement: () => true
728
- }, templateHandlerOptions, updater, handler);
729
- }
730
- }
731
- //#endregion
732
- //#region \0@oxc-project+runtime@0.139.0/helpers/esm/typeof.js
733
- function _typeof(o) {
734
- "@babel/helpers - typeof";
735
- return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
736
- return typeof o;
737
- } : function(o) {
738
- return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
739
- }, _typeof(o);
740
- }
741
- //#endregion
742
- //#region \0@oxc-project+runtime@0.139.0/helpers/esm/toPrimitive.js
743
- function toPrimitive(t, r) {
744
- if ("object" != _typeof(t) || !t) return t;
745
- var e = t[Symbol.toPrimitive];
746
- if (void 0 !== e) {
747
- var i = e.call(t, r || "default");
748
- if ("object" != _typeof(i)) return i;
749
- throw new TypeError("@@toPrimitive must return a primitive value.");
750
- }
751
- return ("string" === r ? String : Number)(t);
752
- }
753
- //#endregion
754
- //#region \0@oxc-project+runtime@0.139.0/helpers/esm/toPropertyKey.js
755
- function toPropertyKey(t) {
756
- var i = toPrimitive(t, "string");
757
- return "symbol" == _typeof(i) ? i : i + "";
758
- }
759
- //#endregion
760
- //#region \0@oxc-project+runtime@0.139.0/helpers/esm/defineProperty.js
761
- function _defineProperty(e, r, t) {
762
- return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
763
- value: t,
764
- enumerable: !0,
765
- configurable: !0,
766
- writable: !0
767
- }) : e[r] = t, e;
768
- }
769
- //#endregion
770
- //#region src/js/JsTokenUpdater.ts
771
- /**
772
- * Lightweight helper that batches updates to {@link MagicString}.
773
- * It keeps the transformation logic out of the traversal code and makes
774
- * it easier to reason about the order in which tokens are written back.
775
- */
776
- var JsTokenUpdater = class {
777
- constructor({ value } = {}) {
778
- _defineProperty(this, "tokens", void 0);
779
- this.tokens = value ? [...value] : [];
780
- }
781
- addToken(token) {
782
- if (token) this.tokens.push(token);
783
- }
784
- push(...args) {
785
- this.tokens.push(...args);
786
- return this;
787
- }
788
- /**
789
- * 待写入的 token 数量。
790
- */
791
- get length() {
792
- return this.tokens.length;
793
- }
794
- map(callbackfn) {
795
- this.tokens = this.tokens.map(callbackfn);
796
- return this;
797
- }
798
- filter(callbackfn) {
799
- this.tokens = this.tokens.filter(callbackfn);
800
- return this;
801
- }
802
- updateMagicString(ms) {
803
- for (const { start, end, value } of this.tokens) ms.update(start, end, value);
804
- return ms;
805
- }
806
- };
807
- //#endregion
808
- //#region src/js/module-graph/ignored-exports.ts
809
- var IgnoredExportsTracker = class {
810
- constructor(options) {
811
- this.options = options;
812
- _defineProperty(this, "ignoredExportNames", /* @__PURE__ */ new Map());
813
- }
814
- addIgnoredExport(filename, exportName) {
815
- if (!exportName) return;
816
- let pending = this.ignoredExportNames.get(filename);
817
- if (!pending) {
818
- pending = /* @__PURE__ */ new Set();
819
- this.ignoredExportNames.set(filename, pending);
820
- }
821
- if (pending.has(exportName)) return;
822
- pending.add(exportName);
823
- const existing = this.options.modules.get(filename);
824
- if (existing) this.applyIgnoredExportsToAnalysis(filename, existing.analysis);
825
- }
826
- registerIgnoredExportsFromTokens(resolved, tokens) {
827
- for (const token of tokens) if (token.type === "ImportSpecifier") this.addIgnoredExport(resolved, token.imported);
828
- else if (token.type === "ImportDefaultSpecifier") this.addIgnoredExport(resolved, "default");
829
- }
830
- applyIgnoredExportsToAnalysis(filename, analysis) {
831
- const pending = this.ignoredExportNames.get(filename);
832
- if (!pending || pending.size === 0) return;
833
- const names = new Set(pending);
834
- pending.clear();
835
- const propagate = [];
836
- for (const exportPath of analysis.exportDeclarations) {
837
- if (names.size === 0) break;
838
- if (exportPath.isExportDefaultDeclaration()) {
839
- if (names.has("default")) {
840
- analysis.walker.walkExportDefaultDeclaration(exportPath);
841
- names.delete("default");
842
- }
843
- continue;
844
- }
845
- if (exportPath.isExportNamedDeclaration()) {
846
- const source = exportPath.node.source?.value;
847
- if (typeof source === "string") {
848
- for (const spec of exportPath.get("specifiers")) {
849
- if (!spec.isExportSpecifier()) continue;
850
- const exported = spec.get("exported");
851
- let exportedName;
852
- if (exported.isIdentifier()) exportedName = exported.node.name;
853
- else if (exported.isStringLiteral()) exportedName = exported.node.value;
854
- if (!exportedName || !names.has(exportedName)) continue;
855
- const local = spec.get("local");
856
- if (local.isIdentifier()) {
857
- propagate.push({
858
- specifier: source,
859
- exportName: local.node.name
860
- });
861
- names.delete(exportedName);
862
- } else if (local.isStringLiteral()) {
863
- propagate.push({
864
- specifier: source,
865
- exportName: local.node.value
866
- });
867
- names.delete(exportedName);
868
- }
869
- }
870
- continue;
871
- }
872
- const declaration = exportPath.get("declaration");
873
- if (declaration.isVariableDeclaration()) for (const decl of declaration.get("declarations")) {
874
- const id = decl.get("id");
875
- if (id.isIdentifier()) {
876
- const exportName = id.node.name;
877
- if (names.has(exportName)) {
878
- analysis.walker.walkVariableDeclarator(decl);
879
- names.delete(exportName);
880
- }
881
- }
882
- }
883
- for (const spec of exportPath.get("specifiers")) {
884
- if (!spec.isExportSpecifier()) continue;
885
- const exported = spec.get("exported");
886
- let exportedName;
887
- if (exported.isIdentifier()) exportedName = exported.node.name;
888
- else if (exported.isStringLiteral()) exportedName = exported.node.value;
889
- if (!exportedName || !names.has(exportedName)) continue;
890
- const local = spec.get("local");
891
- analysis.walker.walkNode(local);
892
- names.delete(exportedName);
893
- }
894
- continue;
895
- }
896
- if (exportPath.isExportAllDeclaration()) {
897
- const source = exportPath.node.source?.value;
898
- if (typeof source === "string") {
899
- for (const exportName of names) propagate.push({
900
- specifier: source,
901
- exportName
902
- });
903
- names.clear();
904
- }
905
- }
906
- }
907
- for (const { specifier, exportName } of propagate) {
908
- let resolved;
909
- try {
910
- resolved = this.options.resolve(specifier, filename);
911
- } catch {
912
- resolved = void 0;
913
- }
914
- if (!resolved) {
915
- pending.add(exportName);
916
- continue;
917
- }
918
- if (this.options.filter && !this.options.filter(resolved, specifier, filename)) {
919
- pending.add(exportName);
920
- continue;
921
- }
922
- this.addIgnoredExport(resolved, exportName);
923
- }
924
- for (const name of names) pending.add(name);
925
- }
926
- };
927
- //#endregion
928
- //#region src/js/ModuleGraph.ts
929
- var JsModuleGraph = class {
930
- constructor(entry, graphOptions) {
931
- _defineProperty(this, "modules", /* @__PURE__ */ new Map());
932
- _defineProperty(this, "queue", []);
933
- _defineProperty(this, "resolve", void 0);
934
- _defineProperty(this, "load", void 0);
935
- _defineProperty(this, "filter", void 0);
936
- _defineProperty(this, "maxDepth", void 0);
937
- _defineProperty(this, "baseOptions", void 0);
938
- _defineProperty(this, "parserOptions", void 0);
939
- _defineProperty(this, "rootFilename", void 0);
940
- _defineProperty(this, "ignoredExports", void 0);
941
- this.resolve = graphOptions.resolve;
942
- this.load = graphOptions.load;
943
- this.filter = graphOptions.filter;
944
- this.maxDepth = graphOptions.maxDepth ?? Number.POSITIVE_INFINITY;
945
- const { moduleGraph: _moduleGraph, filename: _ignoredFilename, ...rest } = entry.handlerOptions;
946
- this.baseOptions = {
947
- ...rest,
948
- filename: entry.filename
949
- };
950
- this.parserOptions = entry.handlerOptions.babelParserOptions;
951
- this.rootFilename = entry.filename;
952
- this.ignoredExports = new IgnoredExportsTracker({
953
- resolve: this.resolve,
954
- filter: this.filter,
955
- modules: this.modules
956
- });
957
- this.modules.set(entry.filename, {
958
- filename: entry.filename,
959
- source: entry.source,
960
- analysis: entry.analysis
961
- });
962
- this.queue.push({
963
- filename: entry.filename,
964
- depth: 0
965
- });
966
- }
967
- build() {
968
- this.collectDependencies();
969
- let linked;
970
- for (const [filename, state] of this.modules) {
971
- if (filename === this.rootFilename) continue;
972
- const childOptions = {
973
- ...this.baseOptions,
974
- filename
975
- };
976
- const code = processUpdatedSource(state.source, childOptions, state.analysis).toString();
977
- if (code !== state.source) {
978
- if (!linked) linked = {};
979
- linked[filename] = { code };
980
- }
981
- }
982
- return linked;
983
- }
984
- collectDependencies() {
985
- while (this.queue.length > 0) {
986
- const { filename, depth } = this.queue.shift();
987
- if (depth >= this.maxDepth) continue;
988
- const state = this.modules.get(filename);
989
- if (!state) continue;
990
- const dependencySpecifiers = /* @__PURE__ */ new Map();
991
- for (const token of state.analysis.walker.imports) {
992
- if (!dependencySpecifiers.has(token.source)) dependencySpecifiers.set(token.source, []);
993
- dependencySpecifiers.get(token.source).push(token);
994
- }
995
- for (const exportPath of state.analysis.exportDeclarations) if (exportPath.isExportAllDeclaration() || exportPath.isExportNamedDeclaration()) {
996
- const source = exportPath.node.source?.value;
997
- if (typeof source === "string" && !dependencySpecifiers.has(source)) dependencySpecifiers.set(source, []);
998
- }
999
- for (const [specifier, tokens] of dependencySpecifiers) {
1000
- let resolved;
1001
- try {
1002
- resolved = this.resolve(specifier, filename);
1003
- } catch {
1004
- continue;
1005
- }
1006
- if (!resolved) continue;
1007
- if (this.filter && !this.filter(resolved, specifier, filename)) continue;
1008
- if (tokens.length > 0) this.ignoredExports.registerIgnoredExportsFromTokens(resolved, tokens);
1009
- if (this.modules.has(resolved)) continue;
1010
- let source;
1011
- try {
1012
- source = this.load(resolved);
1013
- } catch {
1014
- continue;
1015
- }
1016
- if (typeof source !== "string") continue;
1017
- let analysis;
1018
- try {
1019
- analysis = analyzeSource(babelParse(source, {
1020
- ...this.parserOptions,
1021
- sourceFilename: resolved
1022
- }), {
1023
- ...this.baseOptions,
1024
- filename: resolved
1025
- });
1026
- this.ignoredExports.applyIgnoredExportsToAnalysis(resolved, analysis);
1027
- } catch {
1028
- continue;
1029
- }
1030
- this.modules.set(resolved, {
1031
- filename: resolved,
1032
- source,
1033
- analysis
1034
- });
1035
- this.queue.push({
1036
- filename: resolved,
1037
- depth: depth + 1
1038
- });
1039
- }
1040
- }
1041
- }
1042
- };
1043
- //#endregion
1044
- //#region src/js/node-path-walker/export-handlers.ts
1045
- function walkExportDeclaration(ctx, path) {
1046
- if (path.isExportDeclaration()) {
1047
- if (path.isExportNamedDeclaration()) walkExportNamedDeclaration(ctx, path);
1048
- else if (path.isExportDefaultDeclaration()) walkExportDefaultDeclaration(ctx, path);
1049
- else if (path.isExportAllDeclaration()) walkExportAllDeclaration(ctx, path);
1050
- }
1051
- }
1052
- function walkExportNamedDeclaration(ctx, path) {
1053
- const declaration = path.get("declaration");
1054
- if (declaration.isVariableDeclaration()) for (const decl of declaration.get("declarations")) ctx.walkNode(decl);
1055
- const specifiers = path.get("specifiers");
1056
- for (const spec of specifiers) if (spec.isExportSpecifier()) {
1057
- const local = spec.get("local");
1058
- if (local.isIdentifier()) ctx.walkNode(local);
1059
- }
1060
- }
1061
- function walkExportDefaultDeclaration(ctx, path) {
1062
- const decl = path.get("declaration");
1063
- if (decl.isIdentifier()) ctx.walkNode(decl);
1064
- else ctx.walkNode(decl);
1065
- }
1066
- function walkExportAllDeclaration(ctx, path) {
1067
- const source = path.get("source");
1068
- if (source.isStringLiteral()) ctx.addImportToken({
1069
- declaration: path,
1070
- source: source.node.value,
1071
- type: "ExportAllDeclaration"
1072
- });
1073
- }
1074
- //#endregion
1075
- //#region src/js/node-path-walker/import-tokens.ts
1076
- function maybeAddImportToken(imports, arg) {
1077
- if (!(arg.isImportSpecifier() && arg.node.importKind !== "type" || arg.isImportDefaultSpecifier())) return false;
1078
- const importDeclaration = arg.parentPath;
1079
- if (!importDeclaration.isImportDeclaration() || importDeclaration.node.importKind === "type") return false;
1080
- if (arg.isImportSpecifier()) {
1081
- const imported = arg.get("imported");
1082
- if (imported.isIdentifier()) imports.add({
1083
- declaration: importDeclaration,
1084
- specifier: arg,
1085
- imported: imported.node.name,
1086
- local: arg.node.local.name,
1087
- source: importDeclaration.node.source.value,
1088
- type: "ImportSpecifier"
1089
- });
1090
- return true;
1091
- }
1092
- imports.add({
1093
- declaration: importDeclaration,
1094
- specifier: arg,
1095
- local: arg.node.local.name,
1096
- source: importDeclaration.node.source.value,
1097
- type: "ImportDefaultSpecifier"
1098
- });
1099
- return true;
1100
- }
1101
- //#endregion
1102
- //#region src/js/NodePathWalker.ts
1103
- const EMPTY_IGNORE_CALL_EXPRESSION_IDENTIFIERS = [];
1104
- const EMPTY_IMPORT_TOKENS = /* @__PURE__ */ new Set();
1105
- function NOOP_STRING_PATH_CALLBACK() {}
1106
- const NEVER_MATCH_NAME = () => false;
1107
- /**
1108
- * 遍历我们关注的调用表达式所关联的绑定,收集后续需要转换的字符串节点。
1109
- */
1110
- var NodePathWalker = class {
1111
- constructor({ ignoreCallExpressionIdentifiers, callback } = {}) {
1112
- _defineProperty(this, "ignoreCallExpressionIdentifiers", void 0);
1113
- _defineProperty(this, "callback", void 0);
1114
- _defineProperty(this, "isIgnoredCallIdentifier", void 0);
1115
- _defineProperty(this, "hasIgnoredCallIdentifiers", void 0);
1116
- _defineProperty(this, "importsStore", void 0);
1117
- _defineProperty(this, "visitedStore", void 0);
1118
- this.hasIgnoredCallIdentifiers = Boolean(ignoreCallExpressionIdentifiers && ignoreCallExpressionIdentifiers.length > 0);
1119
- this.ignoreCallExpressionIdentifiers = ignoreCallExpressionIdentifiers ?? EMPTY_IGNORE_CALL_EXPRESSION_IDENTIFIERS;
1120
- this.callback = callback ?? NOOP_STRING_PATH_CALLBACK;
1121
- this.isIgnoredCallIdentifier = this.hasIgnoredCallIdentifiers ? createNameMatcher(this.ignoreCallExpressionIdentifiers, { exact: true }) : NEVER_MATCH_NAME;
1122
- }
1123
- get imports() {
1124
- return this.importsStore ?? EMPTY_IMPORT_TOKENS;
1125
- }
1126
- getWritableImports() {
1127
- if (!this.importsStore) this.importsStore = /* @__PURE__ */ new Set();
1128
- return this.importsStore;
1129
- }
1130
- addImportToken(token) {
1131
- this.getWritableImports().add(token);
1132
- }
1133
- getVisited() {
1134
- if (!this.visitedStore) this.visitedStore = /* @__PURE__ */ new WeakSet();
1135
- return this.visitedStore;
1136
- }
1137
- walkVariableDeclarator(path) {
1138
- const init = path.get("init");
1139
- this.walkNode(init);
1140
- }
1141
- walkTemplateLiteral(path) {
1142
- for (const exp of path.get("expressions")) this.walkNode(exp);
1143
- for (const quasis of path.get("quasis")) this.callback(quasis);
1144
- }
1145
- walkStringLiteral(path) {
1146
- this.callback(path);
1147
- }
1148
- walkBinaryExpression(path) {
1149
- const left = path.get("left");
1150
- this.walkNode(left);
1151
- const right = path.get("right");
1152
- this.walkNode(right);
1153
- }
1154
- walkLogicalExpression(path) {
1155
- const left = path.get("left");
1156
- this.walkNode(left);
1157
- const right = path.get("right");
1158
- this.walkNode(right);
1159
- }
1160
- walkObjectExpression(path) {
1161
- const props = path.get("properties");
1162
- for (const prop of props) if (prop.isObjectProperty()) {
1163
- const key = prop.get("key");
1164
- this.walkNode(key);
1165
- const value = prop.get("value");
1166
- this.walkNode(value);
1167
- }
1168
- }
1169
- walkArrayExpression(path) {
1170
- const elements = path.get("elements");
1171
- for (const element of elements) this.walkNode(element);
1172
- }
1173
- walkNode(arg) {
1174
- const visited = this.getVisited();
1175
- if (visited.has(arg)) return;
1176
- visited.add(arg);
1177
- if (arg.isIdentifier()) {
1178
- const binding = arg?.scope?.getBinding?.(arg.node.name);
1179
- if (binding) this.walkNode(binding.path);
1180
- } else if (arg.isMemberExpression()) {
1181
- const objectPath = arg.get("object");
1182
- if (objectPath.isIdentifier()) {
1183
- const binding = arg?.scope?.getBinding?.(objectPath.node.name);
1184
- if (binding) {
1185
- if (binding.path.isVariableDeclarator()) this.walkVariableDeclarator(binding.path);
1186
- }
1187
- }
1188
- } else if (arg.isTemplateLiteral()) this.walkTemplateLiteral(arg);
1189
- else if (arg.isStringLiteral()) this.walkStringLiteral(arg);
1190
- else if (arg.isBinaryExpression()) this.walkBinaryExpression(arg);
1191
- else if (arg.isLogicalExpression()) this.walkLogicalExpression(arg);
1192
- else if (arg.isObjectExpression()) this.walkObjectExpression(arg);
1193
- else if (arg.isArrayExpression()) this.walkArrayExpression(arg);
1194
- else if (arg.isVariableDeclarator()) this.walkVariableDeclarator(arg);
1195
- else if (maybeAddImportToken(this.getWritableImports(), arg)) {}
1196
- }
1197
- /**
1198
- * Walk the arguments of a desired call expression so their bindings can be analysed.
1199
- */
1200
- walkCallExpression(path) {
1201
- if (!this.hasIgnoredCallIdentifiers) return;
1202
- const calleePath = path.get("callee");
1203
- if (calleePath.isIdentifier() && this.isIgnoredCallIdentifier(calleePath.node.name)) for (const arg of path.get("arguments")) this.walkNode(arg);
1204
- }
1205
- walkExportDeclaration(path) {
1206
- walkExportDeclaration(this, path);
1207
- }
1208
- walkExportNamedDeclaration(path) {
1209
- walkExportNamedDeclaration(this, path);
1210
- }
1211
- walkExportDefaultDeclaration(path) {
1212
- walkExportDefaultDeclaration(this, path);
1213
- }
1214
- walkExportAllDeclaration(path) {
1215
- walkExportAllDeclaration(this, path);
1216
- }
1217
- };
1218
- //#endregion
1219
- //#region src/js/taggedTemplateIgnore.ts
1220
- function createTaggedTemplateIgnore({ matcher, names }) {
1221
- const bindingIgnoreCache = /* @__PURE__ */ new Map();
1222
- const taggedTemplateIgnoreCache = /* @__PURE__ */ new WeakMap();
1223
- const seenBindings = /* @__PURE__ */ new Set();
1224
- let singleCanonicalIgnoreName;
1225
- let canonicalIgnoreNames;
1226
- for (const item of names ?? []) {
1227
- if (typeof item !== "string") continue;
1228
- if (singleCanonicalIgnoreName === void 0) {
1229
- singleCanonicalIgnoreName = item;
1230
- continue;
1231
- }
1232
- if (item === singleCanonicalIgnoreName) continue;
1233
- if (!canonicalIgnoreNames) {
1234
- canonicalIgnoreNames = /* @__PURE__ */ new Set([singleCanonicalIgnoreName, item]);
1235
- continue;
1236
- }
1237
- canonicalIgnoreNames.add(item);
1238
- }
1239
- const hasCanonicalIgnoreNames = singleCanonicalIgnoreName !== void 0;
1240
- const matchesIgnoreName = (value) => {
1241
- if (hasCanonicalIgnoreNames) {
1242
- if (canonicalIgnoreNames) {
1243
- if (canonicalIgnoreNames.has(value)) return true;
1244
- } else if (value === singleCanonicalIgnoreName) return true;
1245
- }
1246
- return matcher(value);
1247
- };
1248
- const propertyMatches = (propertyPath) => {
1249
- if (!propertyPath) return false;
1250
- if (propertyPath.isIdentifier()) return matchesIgnoreName(propertyPath.node.name);
1251
- if (propertyPath.isStringLiteral()) return matchesIgnoreName(propertyPath.node.value);
1252
- return false;
1253
- };
1254
- const resolvesMemberExpressionToIgnore = (path, seen) => {
1255
- const propertyPath = path.get("property");
1256
- if (propertyMatches(propertyPath)) return true;
1257
- const objectPath = path.get("object");
1258
- if (objectPath.isIdentifier()) {
1259
- const binding = (objectPath?.scope)?.getBinding?.(objectPath.node.name);
1260
- if (binding) return resolvesToWeappTwIgnore(binding, seen);
1261
- }
1262
- return false;
1263
- };
1264
- const resolvesToWeappTwIgnore = (binding, seen) => {
1265
- const cached = bindingIgnoreCache.get(binding);
1266
- if (cached !== void 0) return cached;
1267
- if (seen.has(binding)) return false;
1268
- seen.add(binding);
1269
- let result = false;
1270
- const bindingPath = binding.path;
1271
- if (bindingPath.isImportSpecifier()) {
1272
- const imported = bindingPath.node.imported;
1273
- if (imported.type === "Identifier" && matchesIgnoreName(imported.name)) result = true;
1274
- else if (imported.type === "StringLiteral" && matchesIgnoreName(imported.value)) result = true;
1275
- } else if (bindingPath.isVariableDeclarator()) {
1276
- const init = bindingPath.get("init");
1277
- if (init && init.node) {
1278
- if (init.isIdentifier()) {
1279
- const target = binding?.scope?.getBinding?.(init.node.name);
1280
- if (target) result = resolvesToWeappTwIgnore(target, seen);
1281
- } else if (init.isMemberExpression()) result = resolvesMemberExpressionToIgnore(init, seen);
1282
- }
1283
- }
1284
- bindingIgnoreCache.set(binding, result);
1285
- seen.delete(binding);
1286
- return result;
1287
- };
1288
- const getEffectiveTagPath = (tagPath) => {
1289
- let current = tagPath;
1290
- while (true) {
1291
- if (current.isParenthesizedExpression?.() || current.node.type === "ParenthesizedExpression") {
1292
- current = current.get("expression");
1293
- continue;
1294
- }
1295
- if (current.isTSAsExpression() || current.isTSTypeAssertion()) {
1296
- current = current.get("expression");
1297
- continue;
1298
- }
1299
- if (current.isTSNonNullExpression()) {
1300
- current = current.get("expression");
1301
- continue;
1302
- }
1303
- if (current.isTypeCastExpression?.()) {
1304
- current = current.get("expression");
1305
- continue;
1306
- }
1307
- if (current.isSequenceExpression()) {
1308
- const last = current.get("expressions").at(-1);
1309
- if (last) {
1310
- current = last;
1311
- continue;
1312
- }
1313
- }
1314
- if (current.isCallExpression?.() || current.node.type === "CallExpression") {
1315
- current = current.get("callee");
1316
- continue;
1317
- }
1318
- break;
1319
- }
1320
- return current;
1321
- };
1322
- const evaluateTagPath = (tagPath, seen) => {
1323
- if (tagPath.isCallExpression?.() || tagPath.node.type === "CallExpression") {
1324
- const calleePath = tagPath.get("callee");
1325
- return evaluateTagPath(calleePath, seen);
1326
- }
1327
- if (tagPath.isIdentifier()) {
1328
- if (matchesIgnoreName(tagPath.node.name)) return true;
1329
- const binding = tagPath?.scope?.getBinding?.(tagPath.node.name);
1330
- if (binding) return resolvesToWeappTwIgnore(binding, seen);
1331
- return false;
1332
- }
1333
- if (tagPath.isMemberExpression()) return resolvesMemberExpressionToIgnore(tagPath, seen);
1334
- return false;
1335
- };
1336
- const computeIgnore = (tagPath) => {
1337
- const cached = taggedTemplateIgnoreCache.get(tagPath.node);
1338
- if (cached !== void 0) return cached;
1339
- const effectiveTagPath = getEffectiveTagPath(tagPath);
1340
- const effectiveCached = taggedTemplateIgnoreCache.get(effectiveTagPath.node);
1341
- if (effectiveCached !== void 0) {
1342
- taggedTemplateIgnoreCache.set(tagPath.node, effectiveCached);
1343
- return effectiveCached;
1344
- }
1345
- seenBindings.clear();
1346
- const result = evaluateTagPath(effectiveTagPath, seenBindings);
1347
- taggedTemplateIgnoreCache.set(effectiveTagPath.node, result);
1348
- taggedTemplateIgnoreCache.set(tagPath.node, result);
1349
- return result;
1350
- };
1351
- return {
1352
- shouldIgnore(tagPath) {
1353
- return computeIgnore(tagPath);
1354
- },
1355
- getEffectiveTagPath
1356
- };
1357
- }
1358
- //#endregion
1359
- //#region src/js/babel.ts
1360
- const EXPRESSION_WRAPPER_PREFIX = "(\n";
1361
- const EXPRESSION_WRAPPER_SUFFIX = "\n)";
1362
- const EMPTY_IGNORED_PATHS = /* @__PURE__ */ new WeakSet();
1363
- const EMPTY_IMPORT_DECLARATIONS = /* @__PURE__ */ new Set();
1364
- const EMPTY_EXPORT_DECLARATIONS = /* @__PURE__ */ new Set();
1365
- const EMPTY_REQUIRE_CALL_PATHS = [];
1366
- const ignoredTaggedTemplateMatcherCache = /* @__PURE__ */ new WeakMap();
1367
- let defaultEvalHandler;
1368
- function getIgnoredTaggedTemplateMatcher(options) {
1369
- const cached = ignoredTaggedTemplateMatcherCache.get(options);
1370
- if (cached) return cached;
1371
- const created = createNameMatcher(options.ignoreTaggedTemplateExpressionIdentifiers, { exact: true });
1372
- ignoredTaggedTemplateMatcherCache.set(options, created);
1373
- return created;
1374
- }
1375
- function getDefaultEvalHandler() {
1376
- if (!defaultEvalHandler) throw new Error("Default JS eval handler is not initialized.");
1377
- return defaultEvalHandler;
1378
- }
1379
- function analyzeSource(ast, options, handler, collectModuleMetadata = true) {
1380
- const jsTokenUpdater = new JsTokenUpdater();
1381
- const needScope = Boolean(options.ignoreCallExpressionIdentifiers && options.ignoreCallExpressionIdentifiers.length > 0);
1382
- const ignoredPaths = needScope ? /* @__PURE__ */ new WeakSet() : EMPTY_IGNORED_PATHS;
1383
- const walker = needScope ? new NodePathWalker({
1384
- ...options.ignoreCallExpressionIdentifiers === void 0 ? {} : { ignoreCallExpressionIdentifiers: options.ignoreCallExpressionIdentifiers },
1385
- callback(path) {
1386
- ignoredPaths.add(path);
1387
- }
1388
- }) : new NodePathWalker();
1389
- let taggedTemplateIgnore;
1390
- const hasTaggedTemplateIgnoreIdentifiers = Boolean(options.ignoreTaggedTemplateExpressionIdentifiers && options.ignoreTaggedTemplateExpressionIdentifiers.length > 0);
1391
- function getTaggedTemplateIgnore() {
1392
- if (!taggedTemplateIgnore) taggedTemplateIgnore = createTaggedTemplateIgnore({
1393
- matcher: getIgnoredTaggedTemplateMatcher(options),
1394
- ...options.ignoreTaggedTemplateExpressionIdentifiers === void 0 ? {} : { names: options.ignoreTaggedTemplateExpressionIdentifiers }
1395
- });
1396
- return taggedTemplateIgnore;
1397
- }
1398
- const targetPaths = [];
1399
- const importDeclarations = collectModuleMetadata ? /* @__PURE__ */ new Set() : EMPTY_IMPORT_DECLARATIONS;
1400
- const exportDeclarations = collectModuleMetadata ? /* @__PURE__ */ new Set() : EMPTY_EXPORT_DECLARATIONS;
1401
- const requireCallPaths = collectModuleMetadata ? [] : EMPTY_REQUIRE_CALL_PATHS;
1402
- const evalHandler = handler ?? getDefaultEvalHandler();
1403
- traverse(ast, {
1404
- StringLiteral: { enter(p) {
1405
- if (isEvalPath(p.parentPath)) return;
1406
- targetPaths.push(p);
1407
- } },
1408
- TemplateElement: { enter: hasTaggedTemplateIgnoreIdentifiers ? (p) => {
1409
- const pp = p.parentPath;
1410
- if (pp.isTemplateLiteral()) {
1411
- const ppp = pp.parentPath;
1412
- if (isEvalPath(ppp)) return;
1413
- if (ppp.isTaggedTemplateExpression()) {
1414
- const tagPath = ppp.get("tag");
1415
- if (getTaggedTemplateIgnore().shouldIgnore(tagPath)) return;
1416
- }
1417
- }
1418
- targetPaths.push(p);
1419
- } : (p) => {
1420
- const pp = p.parentPath;
1421
- if (pp.isTemplateLiteral()) {
1422
- const ppp = pp.parentPath;
1423
- if (isEvalPath(ppp)) return;
1424
- }
1425
- targetPaths.push(p);
1426
- } },
1427
- CallExpression: { enter: !collectModuleMetadata && !needScope ? (p) => {
1428
- if (isEvalPath(p)) walkEvalExpression(p, options, jsTokenUpdater, evalHandler);
1429
- } : (p) => {
1430
- if (isEvalPath(p)) {
1431
- walkEvalExpression(p, options, jsTokenUpdater, evalHandler);
1432
- return;
1433
- }
1434
- const calleePath = p.get("callee");
1435
- if (collectModuleMetadata && calleePath.isIdentifier({ name: "require" }) && !p?.scope?.hasBinding?.("require")) {
1436
- const args = p.get("arguments");
1437
- if (Array.isArray(args) && args.length > 0) {
1438
- const first = args[0];
1439
- if (first?.isStringLiteral()) requireCallPaths.push(first);
1440
- }
1441
- }
1442
- if (needScope) walker.walkCallExpression(p);
1443
- } },
1444
- ...collectModuleMetadata ? {
1445
- ImportDeclaration: { enter(p) {
1446
- importDeclarations.add(p);
1447
- } },
1448
- ExportDeclaration: { enter(p) {
1449
- exportDeclarations.add(p);
1450
- } }
1451
- } : {},
1452
- noScope: !needScope
1453
- });
1454
- return {
1455
- walker,
1456
- jsTokenUpdater,
1457
- ast,
1458
- targetPaths,
1459
- importDeclarations,
1460
- exportDeclarations,
1461
- requireCallPaths,
1462
- ignoredPaths
1463
- };
1464
- }
1465
- function jsHandler(rawSource, options) {
1466
- const shouldWrapExpression = Boolean(options.wrapExpression);
1467
- const source = shouldWrapExpression ? `${EXPRESSION_WRAPPER_PREFIX}${rawSource}${EXPRESSION_WRAPPER_SUFFIX}` : rawSource;
1468
- let ast;
1469
- try {
1470
- ast = babelParse(source, options.babelParserOptions);
1471
- } catch (error) {
1472
- return {
1473
- code: rawSource,
1474
- error
1475
- };
1476
- }
1477
- const needsModuleMetadata = Boolean(options.moduleSpecifierReplacements || options.moduleGraph && options.filename);
1478
- const analysis = analyzeSource(ast, options, jsHandler, needsModuleMetadata);
1479
- const ms = processUpdatedSource(source, options, analysis);
1480
- if (shouldWrapExpression) {
1481
- const start = 0;
1482
- const end = source.length;
1483
- const suffixLength = 2;
1484
- ms.remove(start, 2);
1485
- ms.remove(end - suffixLength, end);
1486
- }
1487
- const result = { code: ms.toString() };
1488
- if (options.generateMap) Object.defineProperty(result, "map", {
1489
- configurable: true,
1490
- enumerable: true,
1491
- get() {
1492
- return ms.generateMap();
1493
- }
1494
- });
1495
- if (options.moduleGraph && options.filename) {
1496
- const linked = new JsModuleGraph({
1497
- filename: options.filename,
1498
- source: rawSource,
1499
- analysis,
1500
- handlerOptions: options
1501
- }, options.moduleGraph).build();
1502
- if (linked) result.linked = linked;
1503
- }
1504
- return result;
1505
- }
1506
- defaultEvalHandler = jsHandler;
1507
- //#endregion
1508
- //#region src/wxml/custom-attributes.ts
1509
- function regTest(reg, str) {
1510
- reg.lastIndex = 0;
1511
- return reg.test(str);
1512
- }
1513
- function isPropsMatch(props, attr) {
1514
- if (Array.isArray(props)) {
1515
- let lowerAttr;
1516
- for (const prop of props) if (typeof prop === "string") {
1517
- lowerAttr ?? (lowerAttr = attr.toLowerCase());
1518
- if (prop.toLowerCase() === lowerAttr) return true;
1519
- } else if (regTest(prop, attr)) return true;
1520
- return false;
1521
- } else if (typeof props === "string") return props === attr;
1522
- else return regTest(props, attr);
1523
- }
1524
- function createAttributeMatcher(entities) {
1525
- if (!entities || entities.length === 0) return;
1526
- const wildcardAttributeRules = [];
1527
- const tagAttributeRuleMap = /* @__PURE__ */ new Map();
1528
- const regexpAttributeRules = [];
1529
- for (const [selector, props] of entities) if (selector === "*") wildcardAttributeRules.push(props);
1530
- else if (typeof selector === "string") {
1531
- const list = tagAttributeRuleMap.get(selector);
1532
- if (list) list.push(props);
1533
- else tagAttributeRuleMap.set(selector, [props]);
1534
- } else regexpAttributeRules.push([selector, props]);
1535
- return (tag, attr) => {
1536
- for (const props of wildcardAttributeRules) if (isPropsMatch(props, attr)) return true;
1537
- const tagRules = tagAttributeRuleMap.get(tag);
1538
- if (tagRules) {
1539
- for (const props of tagRules) if (isPropsMatch(props, attr)) return true;
1540
- }
1541
- for (const [selector, props] of regexpAttributeRules) if (regTest(selector, tag) && isPropsMatch(props, attr)) return true;
1542
- return false;
1543
- };
1544
- }
1545
- //#endregion
1546
- //#region src/wxml/utils/codegen/legacy-visitor.ts
1547
- function shouldSkipLegacyStringLiteral(path) {
1548
- if (_babel_types.isMemberExpression(path.parent)) return true;
1549
- return Boolean(_babel_types.isBinaryExpression(path.parent) && (_babel_types.isConditionalExpression(path.parentPath?.parent) || _babel_types.isLogicalExpression(path.parentPath?.parent)));
1550
- }
1551
- function createLegacyTraverseOptions(options, jsTokenUpdater) {
1552
- const legacyReplaceOptions = {
1553
- escapeMap: options.escapeMap,
1554
- classNameSet: options.runtimeSet,
1555
- needEscaped: true,
1556
- alwaysEscape: true
1557
- };
1558
- return {
1559
- StringLiteral(path) {
1560
- if (shouldSkipLegacyStringLiteral(path)) return;
1561
- jsTokenUpdater.addToken(replaceHandleValue(path, legacyReplaceOptions));
1562
- },
1563
- noScope: true
1564
- };
1565
- }
1566
- //#endregion
1567
- //#region src/wxml/utils/codegen/legacy-rewriter.ts
1568
- function rewriteLegacyExpression(match, options) {
1569
- const ast = (0, _babel_parser.parseExpression)(match);
1570
- const jsTokenUpdater = new JsTokenUpdater();
1571
- traverse(ast, createLegacyTraverseOptions(options, jsTokenUpdater));
1572
- if (jsTokenUpdater.length === 0) return match;
1573
- const ms = new magic_string.default(match);
1574
- jsTokenUpdater.updateMagicString(ms);
1575
- return ms.toString();
1576
- }
1577
- //#endregion
1578
- //#region src/wxml/utils/codegen.ts
1579
- const WRAP_EXPRESSION_HANDLER_OPTIONS = Object.freeze({ wrapExpression: true });
1580
- function generateCode(match, options = {}) {
1581
- try {
1582
- const { jsHandler, runtimeSet, wrapExpression } = options;
1583
- if (jsHandler && runtimeSet) {
1584
- const initial = jsHandler(match, runtimeSet, wrapExpression ? WRAP_EXPRESSION_HANDLER_OPTIONS : void 0);
1585
- if (!initial.error || wrapExpression) return initial.code;
1586
- return jsHandler(match, runtimeSet, WRAP_EXPRESSION_HANDLER_OPTIONS).code;
1587
- } else return rewriteLegacyExpression(match, options);
1588
- } catch {
1589
- return match;
1590
- }
1591
- }
1592
- //#endregion
1593
- //#region ../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/decode-codepoint.js
1594
- const decodeMap = /* @__PURE__ */ new Map([
1595
- [0, 65533],
1596
- [128, 8364],
1597
- [130, 8218],
1598
- [131, 402],
1599
- [132, 8222],
1600
- [133, 8230],
1601
- [134, 8224],
1602
- [135, 8225],
1603
- [136, 710],
1604
- [137, 8240],
1605
- [138, 352],
1606
- [139, 8249],
1607
- [140, 338],
1608
- [142, 381],
1609
- [145, 8216],
1610
- [146, 8217],
1611
- [147, 8220],
1612
- [148, 8221],
1613
- [149, 8226],
1614
- [150, 8211],
1615
- [151, 8212],
1616
- [152, 732],
1617
- [153, 8482],
1618
- [154, 353],
1619
- [155, 8250],
1620
- [156, 339],
1621
- [158, 382],
1622
- [159, 376]
1623
- ]);
1624
- /**
1625
- * Replace the given code point with a replacement character if it is a
1626
- * surrogate or is outside the valid range. Otherwise return the code
1627
- * point unchanged.
1628
- * @param codePoint Unicode code point to convert.
1629
- */
1630
- function replaceCodePoint(codePoint) {
1631
- if (codePoint >= 55296 && codePoint <= 57343 || codePoint > 1114111) return 65533;
1632
- return decodeMap.get(codePoint) ?? codePoint;
1633
- }
1634
- //#endregion
1635
- //#region ../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/internal/decode-shared.js
1636
- /**
1637
- * Shared base64 decode helper for generated decode data.
1638
- * Assumes global atob is available.
1639
- * @param input Input string to encode or decode.
1640
- */
1641
- function decodeBase64(input) {
1642
- const binary = atob(input);
1643
- const evenLength = binary.length & -2;
1644
- const out = new Uint16Array(evenLength / 2);
1645
- for (let index = 0, outIndex = 0; index < evenLength; index += 2) {
1646
- const lo = binary.charCodeAt(index);
1647
- const hi = binary.charCodeAt(index + 1);
1648
- out[outIndex++] = lo | hi << 8;
1649
- }
1650
- return out;
1651
- }
1652
- //#endregion
1653
- //#region ../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/generated/decode-data-html.js
1654
- /** Packed HTML decode trie data. */
1655
- const htmlDecodeTree = /* #__PURE__ */ decodeBase64("QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWlsN2E6ZHIAAOA12CjdciJlZW4AOGFjAHkARWRjAHkAXGRwAGYAAOA12FzdYwByAADgNdjA3IALQUJFSGFiY2RlZmdoamxtbm9wcnN0dXYAXhxtHHEcdRx5HN8cBx0dHTwd3B3tHfEdAR4EHh0eLB5FHrwewx7hHgkfPR9LH4ABYXJ0AGQcZxxpHHIA8gBvB/IAxQLhIWlsAKAbKeEhcnIAoA4pZ6BmIgCgiyphAHIAAKBiKWMJjRwAAJAcAACVHAAAAAAAAAAAAACZHJwcAACmHKgcrRwAANIc9SF0ZTph7SJwdHl2AKC0KXIAYQDuAFoG4iFkYbtjZwAAoegnZGyhHKMcAKCRKeUAiwYAoIUqdQBvADuAqwCrQHIAgKOQIWJmaGxwc3QAuhy/HMIcxBzHHMoczhxmoOQhcwAAoB8pcwAAoB0p6wCyGnAAAKCrIWwAAKA5KWkAbQAAoHMpbAAAoKIhAKGrKmFl1hzaHGkAbAAAoBkpc6CtKgDgrSoA/oABYWJyAOUc6RztHHIAcgAAoAwpcgBrAACgcicAAWFr8Rz4HGMAAAFla/Yc9xx7YFtgAAFlc/wc/hwAoIspbAAAAWR1Ax0FHQCgjykAoI0pAAJhZXV5Dh0RHRodHB3yIW9uPmEAAWRpFR0YHWkAbAA8YewAowbiAPccO2QAAmNxcnMkHScdLB05HWEAAKA2KXUAbwDyoBwgqhEAAWR1MB00HeghYXIAoGcpcyJoYXIAAKBLKWgAAKCyIQCiZCJmZ3FzRB1FB5Qdnh10AIACYWhscnQATh1WHWUdbB2NHXIicm93AHSgkCFhAOkAzxxhI3Jwb29uAAABZHVeHWId7yF3bgCgvSFwAACgvCHlJGZ0YXJyb3dzAKDHIWkiZ2h0AIABYWhzAHUdex2DHXIicm93APOglCGdBmEAcgBwAG8AbwBuAPMAzgtxAHUAaQBnAGEAcgByAG8A9wBlGugkcmVldGltZXMAoMsi8aFkIk0HAACaHWwAYQBuAPQAXgcAon0qY2Rnc6YdqR2xHbcdYwAAoKgqbwB0AG+gfypyoIEqAKCDKmXg2iIA/nMAAKCTKoACYWRlZ3MAwB3GHcod1h3ZHXAAcAByAG8A+ACmHG8AdAAAoNYicQAAAWdxzx3SHXQA8gBGB2cAdADyAHQcdADyAFMHaQDtAGMHgAFpbHIA4h3mHeod8yFodACgfClvAG8A8gDKBgDgNdgp3UWgdiIAoJEqYQH1Hf4dcgAAAWR1YB35HWygvCEAoGopbABrAACghCVjAHkAWWQAomoiYWNodAweDx4VHhkecgDyAGsdbwByAG4AZQDyAGAW4SFyZACgaylyAGkAAKD6JQABaW8hHiQe5CFvdEBh9SFzdGGgsCPjIWhlAKCwIwACRWFlczMeNR48HkEeAKBoInAAcKCJKvIhb3gAoIkqcaCHKvGghyo0HmkAbQAAoOYiAARhYm5vcHR3elIeXB5fHoUelh6mHqsetB4AAW5yVh5ZHmcAAKDsJ3IAAKD9IXIA6wCwBmcAgAFsbXIAZh52Hnse5SFmdAABYXKIB2weaQBnAGgAdABhAHIAcgBvAPcAkwfhInBzdG8AoPwnaQBnAGgAdABhAHIAcgBvAPcAmgdwI2Fycm93AAABbHKNHpEeZQBmAPQAxhxpImdodAAAoKwhgAFhZmwAnB6fHqIecgAAoIUpAOA12F3ddQBzAACgLSppIm1lcwAAoDQqYQGvHrMecwB0AACgFyLhAIoOZaHKJbkeRhLuIWdlAKDKJWEAcgBsoCgAdAAAoJMpgAJhY2htdADMHs8e1R7bHt0ecgDyAJ0GbwByAG4AZQDyANYWYQByAGSgyyEAoG0pAKAOIHIAaQAAoL8iAANhY2hpcXTrHu8e1QfzHv0eBh/xIXVvAKA5IHIAAOA12MHcbQDloXIi+h4AAPweAKCNKgCgjyoAAWJ19xwBH28AcqAYIACgGiDyIW9rQmEAhDwAO2NkaGlscXJCBhcfxh0gHyQfKB8sHzEfAAFjaRsfHR8AoKYqcgAAoHkqcgBlAOUAkx3tIWVzAKDJIuEhcnIAoHYpdSJlc3QAAKB7KgABUGk1HzkfYQByAACglillocMlAgdfEnIAAAFkdUIfRx9zImhhcgAAoEop6CFhcgCgZikAAWVuTx9WH3IjdG5lcXEAAOBoIgD+xQBUHwAHRGFjZGVmaGlsbm9wc3VuH3Ifoh+rH68ftx+7H74f5h/uH/MfBwj/HwsgxCFvdACgOiIAAmNscHJ5H30fiR+eH3IAO4CvAK9AAAFldIEfgx8AoEImZaAgJ3MAZQAAoCAnc6CmIXQAbwCAoaYhZGx1AJQfmB+cH28AdwDuAHkDZQBmAPQA6gbwAOkO6yFlcgCgriUAAW95ph+qH+0hbWEAoCkqPGThIXNoAKAUIOElc3VyZWRhbmdsZQCgISJyAADgNdgq3W8AAKAnIYABY2RuAMQfyR/bH3IAbwA7gLUAtUBhoiMi0B8AANMf1x9zAPQAKxFpAHIAAKDwKm8AdAA7gLcAt0B1AHMA4qESIh4TAADjH3WgOCIAoCoqYwHqH+0fcAAAoNsq8gB+GnAAbAB1APMACAgAAWRw9x/7H+UhbHMAoKciZgAA4DXYXt0AAWN0AyAHIHIAAOA12MLc8CFvcwCgPiJsobwDECAVIPQiaW1hcACguCJhAPAAEyAADEdMUlZhYmNkZWZnaGlqbG1vcHJzdHV2dzwgRyBmIG0geSCqILgg2iDeIBEhFSEyIUMhTSFQIZwhnyHSIQAiIyKLIrEivyIUIwABZ3RAIEMgAODZIjgD9uBrItIgBwmAAWVsdABNIF8gYiBmAHQAAAFhclMgWCByInJvdwAAoM0h6SRnaHRhcnJvdwCgziEA4NgiOAP24Goi0iBfCekkZ2h0YXJyb3cAoM8hAAFEZHEgdSDhIXNoAKCvIuEhc2gAoK4igAJiY25wdACCIIYgiSCNIKIgbABhAACgByL1IXRlRGFnAADgICLSIACiSSJFaW9wlSCYIJwgniAA4HAqOANkAADgSyI4A3MASWFyAG8A+AAyCnUAcgBhoG4mbADzoG4mmwjzAa8gAACzIHAAO4CgAKBAbQBwAOXgTiI4AyoJgAJhZW91eQDBIMogzSDWINkg8AHGIAAAyCAAoEMqbwBuAEhh5CFpbEZhbgBnAGSgRyJvAHQAAOBtKjgDcAAAoEIqPWThIXNoAKATIACjYCJBYWRxc3jpIO0g+SD+IAIhDCFyAHIAAKDXIXIAAAFocvIg9SBrAACgJClvoJch9wAGD28AdAAA4FAiOAN1AGkA9gC7CAABZWkGIQohYQByAACgKCntAN8I6SFzdPOgBCLlCHIAAOA12CvdAAJFZXN0/wgcISshLiHxoXEiIiEAABMJ8aFxIgAJAAAnIWwAYQBuAPQAEwlpAO0AGQlyoG8iAKBvIoABQWFwADghOyE/IXIA8gBeIHIAcgAAoK4hYQByAACg8ipzogsiSiEAAAAAxwtkoPwiAKD6ImMAeQBaZIADQUVhZGVzdABcIV8hYiFmIWkhkyGWIXIA8gBXIADgZiI4A3IAcgAAoJohcgAAoCUggKFwImZxcwBwIYQhjiF0AAABYXJ1IXohcgByAG8A9wBlIWkAZwBoAHQAYQByAHIAbwD3AD4h8aFwImAhAACKIWwAYQBuAPQAZwlz4H0qOAMAoG4iaQDtAG0JcqBuImkA5aDqIkUJaQDkADoKAAFwdKMhpyFmAADgNdhf3YCBrAA7aW4AriGvIcchrEBuAIChCSJFZHYAtyG6Ib8hAOD5IjgDbwB0AADg9SI4A+EB1gjEIcYhAKD3IgCg9iJpAHagDCLhAagJzyHRIQCg/iIAoP0igAFhb3IA2CHsIfEhcgCAoSYiYXN0AOAh5SHpIWwAbABlAOwAywhsAADg/SrlIADgAiI4A2wiaW50AACgFCrjoYAi9yEAAPohdQDlAJsJY+CvKjgDZaCAIvEAkwkAAkFhaXQHIgoiFyIeInIA8gBsIHIAcgAAoZshY3cRIhQiAOAzKTgDAOCdITgDZyRodGFycm93AACgmyFyAGkA5aDrIr4JgANjaGltcHF1AC8iPCJHIpwhTSJQIloigKGBImNlcgA2Iv0JOSJ1AOUABgoA4DXYw9zvIXJ0bQKdIQAAAABEImEAcgDhAOEhbQBloEEi8aBEIiYKYQDyAMsIcwB1AAABYnBWIlgi5QDUCeUA3wmAAWJjcABgInMieCKAoYQiRWVzAGci7glqIgDgxSo4A2UAdABl4IIi0iBxAPGgiCJoImMAZaCBIvEA/gmAoYUiRWVzAH8iFgqCIgDgxio4A2UAdABl4IMi0iBxAPGgiSKAIgACZ2lscpIilCKaIpwi7AAMCWwAZABlADuA8QDxQOcAWwlpI2FuZ2xlAAABbHKkIqoi5SFmdGWg6iLxAEUJaSJnaHQAZaDrIvEAvgltoL0DAKEjAGVzuCK8InIAbwAAoBYhcAAAoAcggARESGFkZ2lscnMAziLSItYi2iLeIugi7SICIw8j4SFzaACgrSLhIXJyAKAEKXAAAOBNItIg4SFzaACgrCIAAWV04iLlIgDgZSLSIADgPgDSIG4iZmluAACg3imAAUFldADzIvci+iJyAHIAAKACKQDgZCLSIHLgPADSIGkAZQAA4LQi0iAAAUF0BiMKI3IAcgAAoAMp8iFpZQDgtSLSIGkAbQAA4Dwi0iCAAUFhbgAaIx4jKiNyAHIAAKDWIXIAAAFociMjJiNrAACgIylvoJYh9wD/DuUhYXIAoCcpUxJqFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVCMAAF4jaSN/I4IjjSOeI8AUAAAAAKYjwCMAANoj3yMAAO8jHiQvJD8kRCQAAWNzVyNsFHUAdABlADuA8wDzQAABaXlhI2cjcgBjoJoiO4D0APRAPmSAAmFiaW9zAHEjdCN3I3EBeiNzAOgAdhTsIWFjUWF2AACgOCrvIWxkAKC8KewhaWdTYQABY3KFI4kjaQByAACgvykA4DXYLN1vA5QjAAAAAJYjAACcI24A22JhAHYAZQA7gPIA8kAAoMEpAAFibaEjjAphAHIAAKC1KQACYWNpdKwjryO6I70jcgDyAFkUAAFpcrMjtiNyAACgvinvIXNzAKC7KW4A5QDZCgCgwCmAAWFlaQDFI8gjyyNjAHIATWFnAGEAyWOAAWNkbgDRI9Qj1iPyIW9uv2MAoLYpdQDzAHgBcABmAADgNdhg3YABYWVsAOQj5yPrI3IAAKC3KXIAcAAAoLkpdQDzAHwBAKMoImFkaW9zdvkj/CMPJBMkFiQbJHIA8gBeFIChXSplZm0AAyQJJAwkcgBvoDQhZgAAoDQhO4CqAKpAO4C6ALpA5yFvZgCgtiJyAACgVipsIm9wZQAAoFcqAKBbKoABY2xvACMkJSQrJPIACCRhAHMAaAA7gPgA+EBsAACgmCJpAGwBMyQ4JGQAZQA7gPUA9UBlAHMAYaCXInMAAKA2Km0AbAA7gPYA9kDiIWFyAKA9I+EKXiQAAHokAAB8JJQkAACYJKkkAAAAALUkEQsAAPAkAAAAAAQleiUAAIMlcgCAoSUiYXN0AGUkbyQBCwCBtgA7bGokayS2QGwAZQDsABgDaQJ1JAAAAAB4JG0AAKDzKgCg/Sp5AD9kcgCAAmNpbXB0AIUkiCSLJJkSjyRuAHQAJWBvAGQALmBpAGwAAKAwIOUhbmsAoDEgcgAA4DXYLd2AAWltbwCdJKAkpCR2oMYD1WNtAGEA9AD+B24AZQAAoA4m9KHAA64kAAC0JGMjaGZvcmsAAKDUItZjAAFhdbgkxCRuAAABY2u9JMIkawBooA8hAKAOIfYAaRpzAACkKwBhYmNkZW1zdNMkIRPXJNsk4STjJOck6yTjIWlyAKAjKmkAcgAAoCIqAAFvdYsW3yQAoCUqAKByKm4AO4CxALFAaQBtAACgJip3AG8AAKAnKoABaXB1APUk+iT+JO4idGludACgFSpmAADgNdhh3W4AZAA7gKMAo0CApHoiRWFjZWlub3N1ABMlFSUYJRslTCVRJVklSSV1JQCgsypwAACgtyp1AOUAPwtjoK8qgKJ6ImFjZW5zACclLSU0JTYlSSVwAHAAcgBvAPgAFyV1AHIAbAB5AGUA8QA/C/EAOAuAAWFlcwA8JUElRSXwInByb3gAoLkqcQBxAACgtSppAG0AAKDoImkA7QBEC20AZQDzoDIgIguAAUVhcwBDJVclRSXwAEAlgAFkZnAATwtfJXElgAFhbHMAZSVpJW0l7CFhcgCgLiPpIW5lAKASI/UhcmYAoBMjdKAdIu8AWQvyIWVsAKCwIgABY2l9JYElcgAA4DXYxdzIY24iY3NwAACgCCAAA2Zpb3BzdZElKxuVJZolnyWkJXIAAOA12C7dcABmAADgNdhi3XIiaW1lAACgVyBjAHIAAOA12MbcgAFhZW8AqiW6JcAldAAAAWVpryW2JXIAbgBpAG8AbgDzABkFbgB0AACgFipzAHQAZaA/APEACRj0AG0LgApBQkhhYmNkZWZoaWxtbm9wcnN0dXgA4yXyJfYl+iVpJpAmpia9JtUm5ib4JlonaCdxJ3UnnietJ7EnyCfiJ+cngAFhcnQA6SXsJe4lcgDyAJkM8gD6AuEhaWwAoBwpYQByAPIA3BVhAHIAAKBkKYADY2RlbnFydAAGJhAmEyYYJiYmKyZaJgABZXUKJg0mAOA9IjEDdABlAFVhaQDjACAN7SJwdHl2AKCzKWcAgKHpJ2RlbAAgJiImJCYAoJIpAKClKeUA9wt1AG8AO4C7ALtAcgAApZIhYWJjZmhscHN0dz0mQCZFJkcmSiZMJk4mUSZVJlgmcAAAoHUpZqDlIXMAAKAgKQCgMylzAACgHinrALka8ACVHmwAAKBFKWkAbQAAoHQpbAAAoKMhAKCdIQABYWleJmImaQBsAACgGilvAG6gNiJhAGwA8wB2C4ABYWJyAG8mciZ2JnIA8gAvEnIAawAAoHMnAAFha3omgSZjAAABZWt/JoAmfWBdYAABZXOFJocmAKCMKWwAAAFkdYwmjiYAoI4pAKCQKQACYWV1eZcmmiajJqUm8iFvbllhAAFkaZ4moSZpAGwAV2HsAA8M4gCAJkBkAAJjbHFzrSawJrUmuiZhAACgNylkImhhcgAAoGkpdQBvAPKgHSCjAWgAAKCzIYABYWNnAMMm0iaUC2wAgKEcIWlwcwDLJs4migxuAOUAoAxhAHIA9ADaC3QAAKCtJYABaWxyANsm3ybjJvMhaHQAoH0pbwBvAPIANgwA4DXYL90AAWFv6ib1JnIAAAFkde8m8SYAoMEhbKDAIQCgbCl2oMED8WOAAWducwD+Jk4nUCdoAHQAAANhaGxyc3QKJxInISc1Jz0nRydyInJvdwB0oJIhYQDpAFYmYSNycG9vbgAAAWR1GiceJ28AdwDuAPAmcAAAoMAh5SFmdAABYWgnJy0ncgByAG8AdwDzAAkMYQByAHAAbwBvAG4A8wATBGklZ2h0YXJyb3dzAACgySFxAHUAaQBnAGEAcgByAG8A9wBZJugkcmVldGltZXMAoMwiZwDaYmkAbgBnAGQAbwB0AHMAZQDxABwYgAFhaG0AYCdjJ2YncgDyAAkMYQDyABMEAKAPIG8idXN0AGGgsSPjIWhlAKCxI+0haWQAoO4qAAJhYnB0fCeGJ4knmScAAW5ygCeDJ2cAAKDtJ3IAAKD+IXIA6wAcDIABYWZsAI8nkieVJ3IAAKCGKQDgNdhj3XUAcwAAoC4qaSJtZXMAAKA1KgABYXCiJ6gncgBnoCkAdAAAoJQp7yJsaW50AKASKmEAcgDyADwnAAJhY2hxuCe8J6EMwCfxIXVvAKA6IHIAAOA12MfcAAFidYAmxCdvAPKgGSCoAYABaGlyAM4n0ifWJ3IAZQDlAE0n7SFlcwCgyiJpAIChuSVlZmwAXAxjEt4n9CFyaQCgzinsInVoYXIAoGgpAKAeIWENBSgJKA0oSyhVKIYoAACLKLAoAAAAAOMo5ygAABApJCkxKW0pcSmHKaYpAACYKgAAAACxKmMidXRlAFthcQB1AO8ABR+ApHsiRWFjZWlucHN5ABwoHignKCooLygyKEEoRihJKACgtCrwASMoAAAlKACguCpvAG4AYWF1AOUAgw1koLAqaQBsAF9hcgBjAF1hgAFFYXMAOCg6KD0oAKC2KnAAAKC6KmkAbQAAoOki7yJsaW50AKATKmkA7QCIDUFkbwB0AGKixSKRFgAAAABTKACgZiqAA0FhY21zdHgAYChkKG8ocyh1KHkogihyAHIAAKDYIXIAAAFocmkoayjrAJAab6CYIfcAzAd0ADuApwCnQGkAO2D3IWFyAKApKW0AAAFpbn4ozQBuAHUA8wDOAHQAAKA2J3IA7+A12DDdIxkAAmFjb3mRKJUonSisKHIAcAAAoG8mAAFoeZkonChjAHkASWRIZHIAdABtAqUoAAAAAKgoaQDkAFsPYQByAGEA7ABsJDuArQCtQAABZ22zKLsobQBhAAChwwNmdroouijCY4CjPCJkZWdsbnByAMgozCjPKNMo1yjaKN4obwB0AACgairxoEMiCw5FoJ4qAKCgKkWgnSoAoJ8qZQAAoEYi7CF1cwCgJCrhIXJyAKByKWEAcgDyAPwMAAJhZWl07Sj8KAEpCCkAAWxz8Sj4KGwAcwBlAHQAbQDpAH8oaABwAACgMyrwImFyc2wAoOQpAAFkbFoPBSllAACgIyNloKoqc6CsKgDgrCoA/oABZmxwABUpGCkfKfQhY3lMZGKgLwBhoMQpcgAAoD8jZgAA4DXYZN1hAAABZHIoKRcDZQBzAHWgYCZpAHQAAKBgJoABY3N1ADYpRilhKQABYXU6KUApcABzoJMiAOCTIgD+cABzoJQiAOCUIgD+dQAAAWJwSylWKQChjyJlcz4NUCllAHQAZaCPIvEAPw0AoZAiZXNIDVspZQB0AGWgkCLxAEkNAKGhJWFmZilbBHIAZQFrKVwEAKChJWEAcgDyAAMNAAJjZW10dyl7KX8pgilyAADgNdjI3HQAbQDuAM4AaQDsAAYpYQByAOYAVw0AAWFyiimOKXIA5qAGJhESAAFhbpIpoylpImdodAAAAWVwmSmgKXAAcwBpAGwAbwDuANkXaADpAKAkcwCvYIACYmNtbnAArin8KY4NJSooKgCkgiJFZGVtbnByc7wpvinCKcgpzCnUKdgp3CkAoMUqbwB0AACgvSpkoIYibwB0AACgwyr1IWx0AKDBKgABRWXQKdIpAKDLKgCgiiLsIXVzAKC/KuEhcnIAoHkpgAFlaXUA4inxKfQpdAAAoYIiZW7oKewpcQDxoIYivSllAHEA8aCKItEpbQAAoMcqAAFicPgp+ikAoNUqAKDTKmMAgKJ7ImFjZW5zAAcqDSoUKhYqRihwAHAAcgBvAPgAIyh1AHIAbAB5AGUA8QCDDfEAfA2AAWFlcwAcKiIqPShwAHAAcgBvAPgAPChxAPEAOShnAACgaiYApoMiMTIzRWRlaGxtbnBzPCo/KkIqRSpHKlIqWCpjKmcqaypzKncqO4C5ALlAO4CyALJAO4CzALNAAKDGKgABb3NLKk4qdAAAoL4qdQBiAACg2CpkoIcibwB0AACgxCpzAAABb3VdKmAqbAAAoMknYgAAoNcq4SFycgCgeyn1IWx0AKDCKgABRWVvKnEqAKDMKgCgiyLsIXVzAKDAKoABZWl1AH0qjCqPKnQAAKGDImVugyqHKnEA8aCHIkYqZQBxAPGgiyJwKm0AAKDIKgABYnCTKpUqAKDUKgCg1iqAAUFhbgCdKqEqrCpyAHIAAKDZIXIAAAFocqYqqCrrAJUab6CZIfcAxQf3IWFyAKAqKWwAaQBnADuA3wDfQOELzyrZKtwq6SrsKvEqAAD1KjQrAAAAAAAAAAAAAEwrbCsAAHErvSsAAAAAAADRK3IC1CoAAAAA2CrnIWV0AKAWI8RjcgDrAOUKgAFhZXkA4SrkKucq8iFvbmVh5CFpbGNhQmRvAPQAIg5sInJlYwAAoBUjcgAA4DXYMd0AAmVpa2/7KhIrKCsuK/IBACsAAAkrZQAAATRm6g0EK28AcgDlAOsNYQBzorgDECsAAAAAEit5AG0A0WMAAWNuFislK2sAAAFhcxsrIStwAHAAcgBvAPgAFw5pAG0AAKA8InMA8AD9DQABYXMsKyEr8AAXDnIAbgA7gP4A/kDsATgrOyswG2QA5QBnAmUAcwCAgdcAO2JkAEMrRCtJK9dAYaCgInIAAKAxKgCgMCqAAWVwcwBRK1MraSvhAAkh4qKkIlsrXysAAAAAYytvAHQAAKA2I2kAcgAAoPEqb+A12GXdcgBrAACg2irhAHgociJpbWUAAKA0IIABYWlwAHYreSu3K2QA5QC+DYADYWRlbXBzdACFK6MrmiunK6wrsCuzK24iZ2xlAACitSVkbHFykCuUK5ornCvvIXduAKC/JeUhZnRloMMl8QACBwCgXCJpImdodABloLkl8QBdDG8AdAAAoOwlaSJudXMAAKA6KuwhdXMAoDkqYgAAoM0p6SFtZQCgOyrlInppdW0AoOIjgAFjaHQAwivKK80rAAFyecYrySsA4DXYydxGZGMAeQBbZPIhb2tnYQABaW/UK9creAD0ANERaCJlYWQAAAFsct4r5ytlAGYAdABhAHIAcgBvAPcAXQbpJGdodGFycm93AKCgIQAJQUhhYmNkZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg");
1656
- //#endregion
1657
- //#region ../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/generated/decode-data-xml.js
1658
- /** Packed XML decode trie data. */
1659
- const xmlDecodeTree = /* #__PURE__ */ decodeBase64("AAJhZ2xxBwARABMAFQBtAg0AAAAAAA8AcAAmYG8AcwAnYHQAPmB0ADxg9SFvdCJg");
1660
- //#endregion
1661
- //#region ../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/internal/bin-trie-flags.js
1662
- /**
1663
- * Bit flags & masks for the binary trie encoding used for entity decoding.
1664
- *
1665
- * Bit layout (16 bits total):
1666
- * 15..14 VALUE_LENGTH (+1 encoding; 0 => no value)
1667
- * 13 FLAG13. If valueLength>0: semicolon required flag (implicit ';').
1668
- * If valueLength==0: compact run flag.
1669
- * 12..7 BRANCH_LENGTH Branch length (0 => single branch in 6..0 if jumpOffset==char) OR run length (when compact run)
1670
- * 6..0 JUMP_TABLE Jump offset (jump table) OR single-branch char code OR first run char
1671
- */
1672
- var BinTrieFlags;
1673
- (function(BinTrieFlags) {
1674
- BinTrieFlags[BinTrieFlags["VALUE_LENGTH"] = 49152] = "VALUE_LENGTH";
1675
- BinTrieFlags[BinTrieFlags["FLAG13"] = 8192] = "FLAG13";
1676
- BinTrieFlags[BinTrieFlags["BRANCH_LENGTH"] = 8064] = "BRANCH_LENGTH";
1677
- BinTrieFlags[BinTrieFlags["JUMP_TABLE"] = 127] = "JUMP_TABLE";
1678
- })(BinTrieFlags || (BinTrieFlags = {}));
1679
- //#endregion
1680
- //#region ../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/decode.js
1681
- var CharCodes$1;
1682
- (function(CharCodes) {
1683
- CharCodes[CharCodes["NUM"] = 35] = "NUM";
1684
- CharCodes[CharCodes["SEMI"] = 59] = "SEMI";
1685
- CharCodes[CharCodes["EQUALS"] = 61] = "EQUALS";
1686
- CharCodes[CharCodes["ZERO"] = 48] = "ZERO";
1687
- CharCodes[CharCodes["NINE"] = 57] = "NINE";
1688
- CharCodes[CharCodes["LOWER_A"] = 97] = "LOWER_A";
1689
- CharCodes[CharCodes["LOWER_F"] = 102] = "LOWER_F";
1690
- CharCodes[CharCodes["LOWER_X"] = 120] = "LOWER_X";
1691
- CharCodes[CharCodes["LOWER_Z"] = 122] = "LOWER_Z";
1692
- CharCodes[CharCodes["UPPER_A"] = 65] = "UPPER_A";
1693
- CharCodes[CharCodes["UPPER_F"] = 70] = "UPPER_F";
1694
- CharCodes[CharCodes["UPPER_Z"] = 90] = "UPPER_Z";
1695
- })(CharCodes$1 || (CharCodes$1 = {}));
1696
- /** Bit that needs to be set to convert an upper case ASCII character to lower case */
1697
- const TO_LOWER_BIT = 32;
1698
- function isNumber(code) {
1699
- return code >= CharCodes$1.ZERO && code <= CharCodes$1.NINE;
1700
- }
1701
- function isHexadecimalCharacter(code) {
1702
- return code >= CharCodes$1.UPPER_A && code <= CharCodes$1.UPPER_F || code >= CharCodes$1.LOWER_A && code <= CharCodes$1.LOWER_F;
1703
- }
1704
- function isAsciiAlphaNumeric(code) {
1705
- return code >= CharCodes$1.UPPER_A && code <= CharCodes$1.UPPER_Z || code >= CharCodes$1.LOWER_A && code <= CharCodes$1.LOWER_Z || isNumber(code);
1706
- }
1707
- /**
1708
- * Checks if the given character is a valid end character for an entity in an attribute.
1709
- *
1710
- * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.
1711
- * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state
1712
- * @param code Code point to decode.
1713
- */
1714
- function isEntityInAttributeInvalidEnd(code) {
1715
- return code === CharCodes$1.EQUALS || isAsciiAlphaNumeric(code);
1716
- }
1717
- var EntityDecoderState;
1718
- (function(EntityDecoderState) {
1719
- EntityDecoderState[EntityDecoderState["EntityStart"] = 0] = "EntityStart";
1720
- EntityDecoderState[EntityDecoderState["NumericStart"] = 1] = "NumericStart";
1721
- EntityDecoderState[EntityDecoderState["NumericDecimal"] = 2] = "NumericDecimal";
1722
- EntityDecoderState[EntityDecoderState["NumericHex"] = 3] = "NumericHex";
1723
- EntityDecoderState[EntityDecoderState["NamedEntity"] = 4] = "NamedEntity";
1724
- })(EntityDecoderState || (EntityDecoderState = {}));
1725
- /**
1726
- * Decoding mode for named entities.
1727
- */
1728
- var DecodingMode;
1729
- (function(DecodingMode) {
1730
- /** Entities in text nodes that can end with any character. */
1731
- DecodingMode[DecodingMode["Legacy"] = 0] = "Legacy";
1732
- /** Only allow entities terminated with a semicolon. */
1733
- DecodingMode[DecodingMode["Strict"] = 1] = "Strict";
1734
- /** Entities in attributes have limitations on ending characters. */
1735
- DecodingMode[DecodingMode["Attribute"] = 2] = "Attribute";
1736
- })(DecodingMode || (DecodingMode = {}));
1737
- /**
1738
- * Token decoder with support of writing partial entities.
1739
- */
1740
- var EntityDecoder = class {
1741
- constructor(decodeTree, emitCodePoint, errors) {
1742
- _defineProperty(this, "decodeTree", void 0);
1743
- _defineProperty(this, "emitCodePoint", void 0);
1744
- _defineProperty(this, "errors", void 0);
1745
- _defineProperty(
1746
- this,
1747
- /** The current state of the decoder. */
1748
- "state",
1749
- EntityDecoderState.EntityStart
1750
- );
1751
- _defineProperty(
1752
- this,
1753
- /** Characters that were consumed while parsing an entity. */
1754
- "consumed",
1755
- 1
1756
- );
1757
- _defineProperty(
1758
- this,
1759
- /**
1760
- * The result of the entity.
1761
- *
1762
- * Either the result index of a numeric entity, or the codepoint of a
1763
- * numeric entity.
1764
- */
1765
- "result",
1766
- 0
1767
- );
1768
- _defineProperty(
1769
- this,
1770
- /** The current index in the decode tree. */
1771
- "treeIndex",
1772
- 0
1773
- );
1774
- _defineProperty(
1775
- this,
1776
- /** The number of characters that were consumed in excess. */
1777
- "excess",
1778
- 1
1779
- );
1780
- _defineProperty(
1781
- this,
1782
- /** The mode in which the decoder is operating. */
1783
- "decodeMode",
1784
- DecodingMode.Strict
1785
- );
1786
- _defineProperty(
1787
- this,
1788
- /** The number of characters that have been consumed in the current run. */
1789
- "runConsumed",
1790
- 0
1791
- );
1792
- this.decodeTree = decodeTree;
1793
- this.emitCodePoint = emitCodePoint;
1794
- this.errors = errors;
1795
- }
1796
- /**
1797
- * Resets the instance to make it reusable.
1798
- * @param decodeMode Entity decoding mode to use.
1799
- */
1800
- startEntity(decodeMode) {
1801
- this.decodeMode = decodeMode;
1802
- this.state = EntityDecoderState.EntityStart;
1803
- this.result = 0;
1804
- this.treeIndex = 0;
1805
- this.excess = 1;
1806
- this.consumed = 1;
1807
- this.runConsumed = 0;
1808
- }
1809
- /**
1810
- * Write an entity to the decoder. This can be called multiple times with partial entities.
1811
- * If the entity is incomplete, the decoder will return -1.
1812
- *
1813
- * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the
1814
- * entity is incomplete, and resume when the next string is written.
1815
- * @param input The string containing the entity (or a continuation of the entity).
1816
- * @param offset The offset at which the entity begins. Should be 0 if this is not the first call.
1817
- * @returns The number of characters that were consumed, or -1 if the entity is incomplete.
1818
- */
1819
- write(input, offset) {
1820
- switch (this.state) {
1821
- case EntityDecoderState.EntityStart:
1822
- if (input.charCodeAt(offset) === CharCodes$1.NUM) {
1823
- this.state = EntityDecoderState.NumericStart;
1824
- this.consumed += 1;
1825
- return this.stateNumericStart(input, offset + 1);
1826
- }
1827
- this.state = EntityDecoderState.NamedEntity;
1828
- return this.stateNamedEntity(input, offset);
1829
- case EntityDecoderState.NumericStart: return this.stateNumericStart(input, offset);
1830
- case EntityDecoderState.NumericDecimal: return this.stateNumericDecimal(input, offset);
1831
- case EntityDecoderState.NumericHex: return this.stateNumericHex(input, offset);
1832
- case EntityDecoderState.NamedEntity: return this.stateNamedEntity(input, offset);
1833
- }
1834
- }
1835
- /**
1836
- * Switches between the numeric decimal and hexadecimal states.
1837
- *
1838
- * Equivalent to the `Numeric character reference state` in the HTML spec.
1839
- * @param input The string containing the entity (or a continuation of the entity).
1840
- * @param offset The current offset.
1841
- * @returns The number of characters that were consumed, or -1 if the entity is incomplete.
1842
- */
1843
- stateNumericStart(input, offset) {
1844
- if (offset >= input.length) return -1;
1845
- if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes$1.LOWER_X) {
1846
- this.state = EntityDecoderState.NumericHex;
1847
- this.consumed += 1;
1848
- return this.stateNumericHex(input, offset + 1);
1849
- }
1850
- this.state = EntityDecoderState.NumericDecimal;
1851
- return this.stateNumericDecimal(input, offset);
1852
- }
1853
- /**
1854
- * Parses a hexadecimal numeric entity.
1855
- *
1856
- * Equivalent to the `Hexademical character reference state` in the HTML spec.
1857
- * @param input The string containing the entity (or a continuation of the entity).
1858
- * @param offset The current offset.
1859
- * @returns The number of characters that were consumed, or -1 if the entity is incomplete.
1860
- */
1861
- stateNumericHex(input, offset) {
1862
- while (offset < input.length) {
1863
- const char = input.charCodeAt(offset);
1864
- if (isNumber(char) || isHexadecimalCharacter(char)) {
1865
- const digit = char <= CharCodes$1.NINE ? char - CharCodes$1.ZERO : (char | TO_LOWER_BIT) - CharCodes$1.LOWER_A + 10;
1866
- this.result = this.result * 16 + digit;
1867
- this.consumed++;
1868
- offset++;
1869
- } else return this.emitNumericEntity(char, 3);
1870
- }
1871
- return -1;
1872
- }
1873
- /**
1874
- * Parses a decimal numeric entity.
1875
- *
1876
- * Equivalent to the `Decimal character reference state` in the HTML spec.
1877
- * @param input The string containing the entity (or a continuation of the entity).
1878
- * @param offset The current offset.
1879
- * @returns The number of characters that were consumed, or -1 if the entity is incomplete.
1880
- */
1881
- stateNumericDecimal(input, offset) {
1882
- while (offset < input.length) {
1883
- const char = input.charCodeAt(offset);
1884
- if (isNumber(char)) {
1885
- this.result = this.result * 10 + (char - CharCodes$1.ZERO);
1886
- this.consumed++;
1887
- offset++;
1888
- } else return this.emitNumericEntity(char, 2);
1889
- }
1890
- return -1;
1891
- }
1892
- /**
1893
- * Validate and emit a numeric entity.
1894
- *
1895
- * Implements the logic from the `Hexademical character reference start
1896
- * state` and `Numeric character reference end state` in the HTML spec.
1897
- * @param lastCp The last code point of the entity. Used to see if the
1898
- * entity was terminated with a semicolon.
1899
- * @param expectedLength The minimum number of characters that should be
1900
- * consumed. Used to validate that at least one digit
1901
- * was consumed.
1902
- * @returns The number of characters that were consumed.
1903
- */
1904
- emitNumericEntity(lastCp, expectedLength) {
1905
- if (this.consumed <= expectedLength) {
1906
- this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);
1907
- return 0;
1908
- }
1909
- if (lastCp === CharCodes$1.SEMI) this.consumed += 1;
1910
- else if (this.decodeMode === DecodingMode.Strict) return 0;
1911
- this.emitCodePoint(replaceCodePoint(this.result), this.consumed);
1912
- if (this.errors) {
1913
- if (lastCp !== CharCodes$1.SEMI) this.errors.missingSemicolonAfterCharacterReference();
1914
- this.errors.validateNumericCharacterReference(this.result);
1915
- }
1916
- return this.consumed;
1917
- }
1918
- /**
1919
- * Parses a named entity.
1920
- *
1921
- * Equivalent to the `Named character reference state` in the HTML spec.
1922
- * @param input The string containing the entity (or a continuation of the entity).
1923
- * @param offset The current offset.
1924
- * @returns The number of characters that were consumed, or -1 if the entity is incomplete.
1925
- */
1926
- stateNamedEntity(input, offset) {
1927
- const { decodeTree } = this;
1928
- let current = decodeTree[this.treeIndex];
1929
- let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;
1930
- while (offset < input.length) {
1931
- if (valueLength === 0 && (current & BinTrieFlags.FLAG13) !== 0) {
1932
- const runLength = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;
1933
- if (this.runConsumed === 0) {
1934
- const firstChar = current & BinTrieFlags.JUMP_TABLE;
1935
- if (input.charCodeAt(offset) !== firstChar) return this.result === 0 ? 0 : this.emitNotTerminatedNamedEntity();
1936
- offset++;
1937
- this.excess++;
1938
- this.runConsumed++;
1939
- }
1940
- while (this.runConsumed < runLength) {
1941
- if (offset >= input.length) return -1;
1942
- const charIndexInPacked = this.runConsumed - 1;
1943
- const packedWord = decodeTree[this.treeIndex + 1 + (charIndexInPacked >> 1)];
1944
- const expectedChar = charIndexInPacked % 2 === 0 ? packedWord & 255 : packedWord >> 8 & 255;
1945
- if (input.charCodeAt(offset) !== expectedChar) {
1946
- this.runConsumed = 0;
1947
- return this.result === 0 ? 0 : this.emitNotTerminatedNamedEntity();
1948
- }
1949
- offset++;
1950
- this.excess++;
1951
- this.runConsumed++;
1952
- }
1953
- this.runConsumed = 0;
1954
- this.treeIndex += 1 + (runLength >> 1);
1955
- current = decodeTree[this.treeIndex];
1956
- valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;
1957
- }
1958
- if (offset >= input.length) break;
1959
- const char = input.charCodeAt(offset);
1960
- if (char === CharCodes$1.SEMI && valueLength !== 0 && (current & BinTrieFlags.FLAG13) !== 0) return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);
1961
- this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char);
1962
- if (this.treeIndex < 0) return this.result === 0 || this.decodeMode === DecodingMode.Attribute && (valueLength === 0 || isEntityInAttributeInvalidEnd(char)) ? 0 : this.emitNotTerminatedNamedEntity();
1963
- current = decodeTree[this.treeIndex];
1964
- valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;
1965
- if (valueLength !== 0) {
1966
- if (char === CharCodes$1.SEMI) return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);
1967
- if (this.decodeMode !== DecodingMode.Strict && (current & BinTrieFlags.FLAG13) === 0) {
1968
- this.result = this.treeIndex;
1969
- this.consumed += this.excess;
1970
- this.excess = 0;
1971
- }
1972
- }
1973
- offset++;
1974
- this.excess++;
1975
- }
1976
- return -1;
1977
- }
1978
- /**
1979
- * Emit a named entity that was not terminated with a semicolon.
1980
- * @returns The number of characters consumed.
1981
- */
1982
- emitNotTerminatedNamedEntity() {
1983
- const { result, decodeTree } = this;
1984
- const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;
1985
- this.emitNamedEntityData(result, valueLength, this.consumed);
1986
- this.errors?.missingSemicolonAfterCharacterReference();
1987
- return this.consumed;
1988
- }
1989
- /**
1990
- * Emit a named entity.
1991
- * @param result The index of the entity in the decode tree.
1992
- * @param valueLength The number of bytes in the entity.
1993
- * @param consumed The number of characters consumed.
1994
- * @returns The number of characters consumed.
1995
- */
1996
- emitNamedEntityData(result, valueLength, consumed) {
1997
- const { decodeTree } = this;
1998
- this.emitCodePoint(valueLength === 1 ? decodeTree[result] & ~(BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13) : decodeTree[result + 1], consumed);
1999
- if (valueLength === 3) this.emitCodePoint(decodeTree[result + 2], consumed);
2000
- return consumed;
2001
- }
2002
- /**
2003
- * Signal to the parser that the end of the input was reached.
2004
- *
2005
- * Remaining data will be emitted and relevant errors will be produced.
2006
- * @returns The number of characters consumed.
2007
- */
2008
- end() {
2009
- switch (this.state) {
2010
- case EntityDecoderState.NamedEntity: return this.result !== 0 && (this.decodeMode !== DecodingMode.Attribute || this.result === this.treeIndex) ? this.emitNotTerminatedNamedEntity() : 0;
2011
- case EntityDecoderState.NumericDecimal: return this.emitNumericEntity(0, 2);
2012
- case EntityDecoderState.NumericHex: return this.emitNumericEntity(0, 3);
2013
- case EntityDecoderState.NumericStart:
2014
- this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);
2015
- return 0;
2016
- case EntityDecoderState.EntityStart: return 0;
2017
- }
2018
- }
2019
- };
2020
- /**
2021
- * Determines the branch of the current node that is taken given the current
2022
- * character. This function is used to traverse the trie.
2023
- * @param decodeTree The trie.
2024
- * @param current The current node.
2025
- * @param nodeIndex Index immediately after the current node header.
2026
- * @param char The current character.
2027
- * @returns The index of the next node, or -1 if no branch is taken.
2028
- */
2029
- function determineBranch(decodeTree, current, nodeIndex, char) {
2030
- const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;
2031
- const jumpOffset = current & BinTrieFlags.JUMP_TABLE;
2032
- if (branchCount === 0) return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1;
2033
- if (jumpOffset) {
2034
- const value = char - jumpOffset;
2035
- return value < 0 || value >= branchCount ? -1 : decodeTree[nodeIndex + value] - 1;
2036
- }
2037
- const packedKeySlots = branchCount + 1 >> 1;
2038
- let lo = 0;
2039
- let hi = branchCount - 1;
2040
- while (lo <= hi) {
2041
- const mid = lo + hi >>> 1;
2042
- const midKey = decodeTree[nodeIndex + (mid >> 1)] >> (mid & 1) * 8 & 255;
2043
- if (midKey < char) lo = mid + 1;
2044
- else if (midKey > char) hi = mid - 1;
2045
- else return decodeTree[nodeIndex + packedKeySlots + mid];
2046
- }
2047
- return -1;
2048
- }
2049
- //#endregion
2050
- //#region ../../node_modules/.pnpm/htmlparser2@12.0.0/node_modules/htmlparser2/dist/Tokenizer.js
2051
- var CharCodes;
2052
- (function(CharCodes) {
2053
- CharCodes[CharCodes["Tab"] = 9] = "Tab";
2054
- CharCodes[CharCodes["NewLine"] = 10] = "NewLine";
2055
- CharCodes[CharCodes["FormFeed"] = 12] = "FormFeed";
2056
- CharCodes[CharCodes["CarriageReturn"] = 13] = "CarriageReturn";
2057
- CharCodes[CharCodes["Space"] = 32] = "Space";
2058
- CharCodes[CharCodes["ExclamationMark"] = 33] = "ExclamationMark";
2059
- CharCodes[CharCodes["Number"] = 35] = "Number";
2060
- CharCodes[CharCodes["Amp"] = 38] = "Amp";
2061
- CharCodes[CharCodes["SingleQuote"] = 39] = "SingleQuote";
2062
- CharCodes[CharCodes["DoubleQuote"] = 34] = "DoubleQuote";
2063
- CharCodes[CharCodes["Dash"] = 45] = "Dash";
2064
- CharCodes[CharCodes["Slash"] = 47] = "Slash";
2065
- CharCodes[CharCodes["Zero"] = 48] = "Zero";
2066
- CharCodes[CharCodes["Nine"] = 57] = "Nine";
2067
- CharCodes[CharCodes["Semi"] = 59] = "Semi";
2068
- CharCodes[CharCodes["Lt"] = 60] = "Lt";
2069
- CharCodes[CharCodes["Eq"] = 61] = "Eq";
2070
- CharCodes[CharCodes["Gt"] = 62] = "Gt";
2071
- CharCodes[CharCodes["Questionmark"] = 63] = "Questionmark";
2072
- CharCodes[CharCodes["UpperA"] = 65] = "UpperA";
2073
- CharCodes[CharCodes["LowerA"] = 97] = "LowerA";
2074
- CharCodes[CharCodes["UpperF"] = 70] = "UpperF";
2075
- CharCodes[CharCodes["LowerF"] = 102] = "LowerF";
2076
- CharCodes[CharCodes["UpperZ"] = 90] = "UpperZ";
2077
- CharCodes[CharCodes["LowerZ"] = 122] = "LowerZ";
2078
- CharCodes[CharCodes["LowerX"] = 120] = "LowerX";
2079
- CharCodes[CharCodes["OpeningSquareBracket"] = 91] = "OpeningSquareBracket";
2080
- })(CharCodes || (CharCodes = {}));
2081
- /** All the states the tokenizer can be in. */
2082
- var State;
2083
- (function(State) {
2084
- State[State["Text"] = 1] = "Text";
2085
- State[State["BeforeTagName"] = 2] = "BeforeTagName";
2086
- State[State["InTagName"] = 3] = "InTagName";
2087
- State[State["InSelfClosingTag"] = 4] = "InSelfClosingTag";
2088
- State[State["BeforeClosingTagName"] = 5] = "BeforeClosingTagName";
2089
- State[State["InClosingTagName"] = 6] = "InClosingTagName";
2090
- State[State["AfterClosingTagName"] = 7] = "AfterClosingTagName";
2091
- State[State["BeforeAttributeName"] = 8] = "BeforeAttributeName";
2092
- State[State["InAttributeName"] = 9] = "InAttributeName";
2093
- State[State["AfterAttributeName"] = 10] = "AfterAttributeName";
2094
- State[State["BeforeAttributeValue"] = 11] = "BeforeAttributeValue";
2095
- State[State["InAttributeValueDq"] = 12] = "InAttributeValueDq";
2096
- State[State["InAttributeValueSq"] = 13] = "InAttributeValueSq";
2097
- State[State["InAttributeValueNq"] = 14] = "InAttributeValueNq";
2098
- State[State["BeforeDeclaration"] = 15] = "BeforeDeclaration";
2099
- State[State["InDeclaration"] = 16] = "InDeclaration";
2100
- State[State["InProcessingInstruction"] = 17] = "InProcessingInstruction";
2101
- State[State["BeforeComment"] = 18] = "BeforeComment";
2102
- State[State["CDATASequence"] = 19] = "CDATASequence";
2103
- State[State["DeclarationSequence"] = 20] = "DeclarationSequence";
2104
- State[State["InSpecialComment"] = 21] = "InSpecialComment";
2105
- State[State["InCommentLike"] = 22] = "InCommentLike";
2106
- State[State["SpecialStartSequence"] = 23] = "SpecialStartSequence";
2107
- State[State["InSpecialTag"] = 24] = "InSpecialTag";
2108
- State[State["InPlainText"] = 25] = "InPlainText";
2109
- State[State["InEntity"] = 26] = "InEntity";
2110
- })(State || (State = {}));
2111
- function isWhitespace$1(c) {
2112
- return c === CharCodes.Space || c === CharCodes.NewLine || c === CharCodes.Tab || c === CharCodes.FormFeed || c === CharCodes.CarriageReturn;
2113
- }
2114
- function isEndOfTagSection(c) {
2115
- return c === CharCodes.Slash || c === CharCodes.Gt || isWhitespace$1(c);
2116
- }
2117
- function isASCIIAlpha(c) {
2118
- return c >= CharCodes.LowerA && c <= CharCodes.LowerZ || c >= CharCodes.UpperA && c <= CharCodes.UpperZ;
2119
- }
2120
- /**
2121
- * Quote style used for parsed attributes.
2122
- */
2123
- var QuoteType;
2124
- (function(QuoteType) {
2125
- QuoteType[QuoteType["NoValue"] = 0] = "NoValue";
2126
- QuoteType[QuoteType["Unquoted"] = 1] = "Unquoted";
2127
- QuoteType[QuoteType["Single"] = 2] = "Single";
2128
- QuoteType[QuoteType["Double"] = 3] = "Double";
2129
- })(QuoteType || (QuoteType = {}));
2130
- /**
2131
- * Sequences used to match longer strings.
2132
- *
2133
- * We don't have `Script`, `Style`, or `Title` here. Instead, we re-use the *End
2134
- * sequences with an increased offset.
2135
- */
2136
- const Sequences = {
2137
- Empty: /* @__PURE__ */ new Uint8Array(0),
2138
- Cdata: new Uint8Array([
2139
- 67,
2140
- 68,
2141
- 65,
2142
- 84,
2143
- 65,
2144
- 91
2145
- ]),
2146
- CdataEnd: new Uint8Array([
2147
- 93,
2148
- 93,
2149
- 62
2150
- ]),
2151
- CommentEnd: new Uint8Array([
2152
- 45,
2153
- 45,
2154
- 33,
2155
- 62
2156
- ]),
2157
- Doctype: new Uint8Array([
2158
- 100,
2159
- 111,
2160
- 99,
2161
- 116,
2162
- 121,
2163
- 112,
2164
- 101
2165
- ]),
2166
- IframeEnd: new Uint8Array([
2167
- 60,
2168
- 47,
2169
- 105,
2170
- 102,
2171
- 114,
2172
- 97,
2173
- 109,
2174
- 101
2175
- ]),
2176
- NoembedEnd: new Uint8Array([
2177
- 60,
2178
- 47,
2179
- 110,
2180
- 111,
2181
- 101,
2182
- 109,
2183
- 98,
2184
- 101,
2185
- 100
2186
- ]),
2187
- NoframesEnd: new Uint8Array([
2188
- 60,
2189
- 47,
2190
- 110,
2191
- 111,
2192
- 102,
2193
- 114,
2194
- 97,
2195
- 109,
2196
- 101,
2197
- 115
2198
- ]),
2199
- Plaintext: new Uint8Array([
2200
- 60,
2201
- 47,
2202
- 112,
2203
- 108,
2204
- 97,
2205
- 105,
2206
- 110,
2207
- 116,
2208
- 101,
2209
- 120,
2210
- 116
2211
- ]),
2212
- ScriptEnd: new Uint8Array([
2213
- 60,
2214
- 47,
2215
- 115,
2216
- 99,
2217
- 114,
2218
- 105,
2219
- 112,
2220
- 116
2221
- ]),
2222
- StyleEnd: new Uint8Array([
2223
- 60,
2224
- 47,
2225
- 115,
2226
- 116,
2227
- 121,
2228
- 108,
2229
- 101
2230
- ]),
2231
- TitleEnd: new Uint8Array([
2232
- 60,
2233
- 47,
2234
- 116,
2235
- 105,
2236
- 116,
2237
- 108,
2238
- 101
2239
- ]),
2240
- TextareaEnd: new Uint8Array([
2241
- 60,
2242
- 47,
2243
- 116,
2244
- 101,
2245
- 120,
2246
- 116,
2247
- 97,
2248
- 114,
2249
- 101,
2250
- 97
2251
- ]),
2252
- XmpEnd: new Uint8Array([
2253
- 60,
2254
- 47,
2255
- 120,
2256
- 109,
2257
- 112
2258
- ])
2259
- };
2260
- /**
2261
- * Maps the first lowercase character of an HTML tag name to the sequence
2262
- * used for special-tag detection. All sequences share a common layout
2263
- * where index 2 is the first tag-name character, so matching always
2264
- * continues from offset 3.
2265
- */
2266
- const specialStartSequences = /* @__PURE__ */ new Map([
2267
- [Sequences.IframeEnd[2], Sequences.IframeEnd],
2268
- [Sequences.NoembedEnd[2], Sequences.NoembedEnd],
2269
- [Sequences.Plaintext[2], Sequences.Plaintext],
2270
- [Sequences.ScriptEnd[2], Sequences.ScriptEnd],
2271
- [Sequences.TitleEnd[2], Sequences.TitleEnd],
2272
- [Sequences.XmpEnd[2], Sequences.XmpEnd]
2273
- ]);
2274
- /**
2275
- * Tokenizer implementation used by `Parser`.
2276
- */
2277
- var Tokenizer$1 = class {
2278
- constructor({ xmlMode = false, decodeEntities = true, recognizeSelfClosing = xmlMode }, cbs) {
2279
- _defineProperty(this, "cbs", void 0);
2280
- _defineProperty(
2281
- this,
2282
- /** The current state the tokenizer is in. */
2283
- "state",
2284
- State.Text
2285
- );
2286
- _defineProperty(
2287
- this,
2288
- /** The read buffer. */
2289
- "buffer",
2290
- ""
2291
- );
2292
- _defineProperty(
2293
- this,
2294
- /** The beginning of the section that is currently being read. */
2295
- "sectionStart",
2296
- 0
2297
- );
2298
- _defineProperty(
2299
- this,
2300
- /** The index within the buffer that we are currently looking at. */
2301
- "index",
2302
- 0
2303
- );
2304
- _defineProperty(
2305
- this,
2306
- /** The start of the last entity. */
2307
- "entityStart",
2308
- 0
2309
- );
2310
- _defineProperty(
2311
- this,
2312
- /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */
2313
- "baseState",
2314
- State.Text
2315
- );
2316
- _defineProperty(
2317
- this,
2318
- /** For special parsing behavior inside of script and style tags. */
2319
- "isSpecial",
2320
- false
2321
- );
2322
- _defineProperty(
2323
- this,
2324
- /** Indicates whether the tokenizer has been paused. */
2325
- "running",
2326
- true
2327
- );
2328
- _defineProperty(
2329
- this,
2330
- /** The offset of the current buffer. */
2331
- "offset",
2332
- 0
2333
- );
2334
- _defineProperty(this, "xmlMode", void 0);
2335
- _defineProperty(this, "decodeEntities", void 0);
2336
- _defineProperty(this, "recognizeSelfClosing", void 0);
2337
- _defineProperty(this, "entityDecoder", void 0);
2338
- _defineProperty(this, "currentSequence", Sequences.Empty);
2339
- _defineProperty(this, "sequenceIndex", 0);
2340
- this.cbs = cbs;
2341
- this.xmlMode = xmlMode;
2342
- this.decodeEntities = decodeEntities;
2343
- this.recognizeSelfClosing = recognizeSelfClosing;
2344
- this.entityDecoder = new EntityDecoder(xmlMode ? xmlDecodeTree : htmlDecodeTree, (cp, consumed) => this.emitCodePoint(cp, consumed));
2345
- }
2346
- reset() {
2347
- this.state = State.Text;
2348
- this.buffer = "";
2349
- this.sectionStart = 0;
2350
- this.index = 0;
2351
- this.baseState = State.Text;
2352
- this.isSpecial = false;
2353
- this.currentSequence = Sequences.Empty;
2354
- this.sequenceIndex = 0;
2355
- this.running = true;
2356
- this.offset = 0;
2357
- }
2358
- write(chunk) {
2359
- this.offset += this.buffer.length;
2360
- this.buffer = chunk;
2361
- this.parse();
2362
- }
2363
- end() {
2364
- if (this.running) this.finish();
2365
- }
2366
- pause() {
2367
- this.running = false;
2368
- }
2369
- resume() {
2370
- this.running = true;
2371
- if (this.index < this.buffer.length + this.offset) this.parse();
2372
- }
2373
- stateText(c) {
2374
- if (c === CharCodes.Lt || !this.decodeEntities && this.fastForwardTo(CharCodes.Lt)) {
2375
- if (this.index > this.sectionStart) this.cbs.ontext(this.sectionStart, this.index);
2376
- this.state = State.BeforeTagName;
2377
- this.sectionStart = this.index;
2378
- } else if (this.decodeEntities && c === CharCodes.Amp) this.startEntity();
2379
- }
2380
- enterTagBody() {
2381
- if (this.currentSequence === Sequences.Plaintext) {
2382
- this.currentSequence = Sequences.Empty;
2383
- this.state = State.InPlainText;
2384
- } else if (this.isSpecial) {
2385
- this.state = State.InSpecialTag;
2386
- this.sequenceIndex = 0;
2387
- } else this.state = State.Text;
2388
- }
2389
- /**
2390
- * Match the opening tag name against an HTML text-only tag sequence.
2391
- *
2392
- * Some tags share an initial prefix (`script`/`style`, `title`/`textarea`,
2393
- * `noembed`/`noframes`), so we may switch to an alternate sequence at the
2394
- * first distinguishing byte. On a successful full match we fall back to
2395
- * the normal tag-name state; a later `>` will enter raw-text, RCDATA, or
2396
- * plaintext mode based on `currentSequence` / `isSpecial`.
2397
- * @param c Current character code point.
2398
- */
2399
- stateSpecialStartSequence(c) {
2400
- const lower = c | 32;
2401
- if (this.sequenceIndex < this.currentSequence.length) {
2402
- if (lower === this.currentSequence[this.sequenceIndex]) {
2403
- this.sequenceIndex++;
2404
- return;
2405
- }
2406
- if (this.sequenceIndex === 3) {
2407
- if (this.currentSequence === Sequences.ScriptEnd && lower === Sequences.StyleEnd[3]) {
2408
- this.currentSequence = Sequences.StyleEnd;
2409
- this.sequenceIndex = 4;
2410
- return;
2411
- }
2412
- if (this.currentSequence === Sequences.TitleEnd && lower === Sequences.TextareaEnd[3]) {
2413
- this.currentSequence = Sequences.TextareaEnd;
2414
- this.sequenceIndex = 4;
2415
- return;
2416
- }
2417
- } else if (this.sequenceIndex === 4 && this.currentSequence === Sequences.NoembedEnd && lower === Sequences.NoframesEnd[4]) {
2418
- this.currentSequence = Sequences.NoframesEnd;
2419
- this.sequenceIndex = 5;
2420
- return;
2421
- }
2422
- } else if (isEndOfTagSection(c)) {
2423
- this.sequenceIndex = 0;
2424
- this.state = State.InTagName;
2425
- this.stateInTagName(c);
2426
- return;
2427
- }
2428
- this.isSpecial = false;
2429
- this.currentSequence = Sequences.Empty;
2430
- this.sequenceIndex = 0;
2431
- this.state = State.InTagName;
2432
- this.stateInTagName(c);
2433
- }
2434
- stateCDATASequence(c) {
2435
- if (c === Sequences.Cdata[this.sequenceIndex]) {
2436
- if (++this.sequenceIndex === Sequences.Cdata.length) {
2437
- this.state = State.InCommentLike;
2438
- this.currentSequence = Sequences.CdataEnd;
2439
- this.sequenceIndex = 0;
2440
- this.sectionStart = this.index + 1;
2441
- }
2442
- } else {
2443
- this.sequenceIndex = 0;
2444
- if (this.xmlMode) {
2445
- this.state = State.InDeclaration;
2446
- this.stateInDeclaration(c);
2447
- } else {
2448
- this.state = State.InSpecialComment;
2449
- this.stateInSpecialComment(c);
2450
- }
2451
- }
2452
- }
2453
- /**
2454
- * When we wait for one specific character, we can speed things up
2455
- * by skipping through the buffer until we find it.
2456
- * @param c Current character code point.
2457
- * @returns Whether the character was found.
2458
- */
2459
- fastForwardTo(c) {
2460
- while (++this.index < this.buffer.length + this.offset) if (this.buffer.charCodeAt(this.index - this.offset) === c) return true;
2461
- this.index = this.buffer.length + this.offset - 1;
2462
- return false;
2463
- }
2464
- /**
2465
- * Emit a comment token and return to the text state.
2466
- * @param offset Number of characters in the end sequence that have already been matched.
2467
- */
2468
- emitComment(offset) {
2469
- this.cbs.oncomment(this.sectionStart, this.index, offset);
2470
- this.sequenceIndex = 0;
2471
- this.sectionStart = this.index + 1;
2472
- this.state = State.Text;
2473
- }
2474
- /**
2475
- * Comments and CDATA end with `-->` and `]]>`.
2476
- *
2477
- * Their common qualities are:
2478
- * - Their end sequences have a distinct character they start with.
2479
- * - That character is then repeated, so we have to check multiple repeats.
2480
- * - All characters but the start character of the sequence can be skipped.
2481
- * @param c Current character code point.
2482
- */
2483
- stateInCommentLike(c) {
2484
- if (!this.xmlMode && this.currentSequence === Sequences.CommentEnd && this.sequenceIndex <= 1 && this.index === this.sectionStart + this.sequenceIndex && c === CharCodes.Gt) this.emitComment(this.sequenceIndex);
2485
- else if (this.currentSequence === Sequences.CommentEnd && this.sequenceIndex === 2 && c === CharCodes.Gt) this.emitComment(2);
2486
- else if (this.currentSequence === Sequences.CommentEnd && this.sequenceIndex === this.currentSequence.length - 1 && c !== CharCodes.Gt) this.sequenceIndex = Number(c === CharCodes.Dash);
2487
- else if (c === this.currentSequence[this.sequenceIndex]) {
2488
- if (++this.sequenceIndex === this.currentSequence.length) {
2489
- if (this.currentSequence === Sequences.CdataEnd) this.cbs.oncdata(this.sectionStart, this.index, 2);
2490
- else this.cbs.oncomment(this.sectionStart, this.index, 3);
2491
- this.sequenceIndex = 0;
2492
- this.sectionStart = this.index + 1;
2493
- this.state = State.Text;
2494
- }
2495
- } else if (this.sequenceIndex === 0) {
2496
- if (this.fastForwardTo(this.currentSequence[0])) this.sequenceIndex = 1;
2497
- } else if (c !== this.currentSequence[this.sequenceIndex - 1]) this.sequenceIndex = 0;
2498
- }
2499
- /**
2500
- * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name.
2501
- *
2502
- * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar).
2503
- * We allow anything that wouldn't end the tag.
2504
- * @param c Current character code point.
2505
- */
2506
- isTagStartChar(c) {
2507
- return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c);
2508
- }
2509
- /**
2510
- * Scan raw-text / RCDATA content for the matching end tag.
2511
- *
2512
- * For RCDATA tags (`<title>`, `<textarea>`) entities are decoded inline.
2513
- * For raw-text tags (`<script>`, `<style>`, etc.) we fast-forward to `<`.
2514
- * @param c Current character code point.
2515
- */
2516
- stateInSpecialTag(c) {
2517
- if (this.sequenceIndex === this.currentSequence.length) {
2518
- if (isEndOfTagSection(c)) {
2519
- const endOfText = this.index - this.currentSequence.length;
2520
- if (this.sectionStart < endOfText) {
2521
- const actualIndex = this.index;
2522
- this.index = endOfText;
2523
- this.cbs.ontext(this.sectionStart, endOfText);
2524
- this.index = actualIndex;
2525
- }
2526
- this.isSpecial = false;
2527
- this.sectionStart = endOfText + 2;
2528
- this.stateInClosingTagName(c);
2529
- return;
2530
- }
2531
- this.sequenceIndex = 0;
2532
- }
2533
- if ((c | 32) === this.currentSequence[this.sequenceIndex]) this.sequenceIndex += 1;
2534
- else if (this.sequenceIndex === 0) {
2535
- if (this.currentSequence === Sequences.TitleEnd || this.currentSequence === Sequences.TextareaEnd) {
2536
- if (this.decodeEntities && c === CharCodes.Amp) this.startEntity();
2537
- } else if (this.fastForwardTo(CharCodes.Lt)) this.sequenceIndex = 1;
2538
- } else this.sequenceIndex = Number(c === CharCodes.Lt);
2539
- }
2540
- stateBeforeTagName(c) {
2541
- if (c === CharCodes.ExclamationMark) {
2542
- this.state = State.BeforeDeclaration;
2543
- this.sectionStart = this.index + 1;
2544
- } else if (c === CharCodes.Questionmark) if (this.xmlMode) {
2545
- this.state = State.InProcessingInstruction;
2546
- this.sequenceIndex = 0;
2547
- this.sectionStart = this.index + 1;
2548
- } else {
2549
- this.state = State.InSpecialComment;
2550
- this.sectionStart = this.index;
2551
- }
2552
- else if (this.isTagStartChar(c)) {
2553
- this.sectionStart = this.index;
2554
- const special = this.xmlMode || this.cbs.isInForeignContext?.() ? void 0 : specialStartSequences.get(c | 32);
2555
- if (special === void 0) this.state = State.InTagName;
2556
- else {
2557
- this.isSpecial = true;
2558
- this.currentSequence = special;
2559
- this.sequenceIndex = 3;
2560
- this.state = State.SpecialStartSequence;
2561
- }
2562
- } else if (c === CharCodes.Slash) this.state = State.BeforeClosingTagName;
2563
- else {
2564
- this.state = State.Text;
2565
- this.stateText(c);
2566
- }
2567
- }
2568
- stateInTagName(c) {
2569
- if (isEndOfTagSection(c)) {
2570
- this.cbs.onopentagname(this.sectionStart, this.index);
2571
- this.sectionStart = -1;
2572
- this.state = State.BeforeAttributeName;
2573
- this.stateBeforeAttributeName(c);
2574
- }
2575
- }
2576
- stateBeforeClosingTagName(c) {
2577
- if (isWhitespace$1(c)) if (this.xmlMode) {} else {
2578
- this.state = State.InSpecialComment;
2579
- this.sectionStart = this.index;
2580
- }
2581
- else if (c === CharCodes.Gt) {
2582
- this.state = State.Text;
2583
- if (!this.xmlMode) this.sectionStart = this.index + 1;
2584
- } else {
2585
- this.state = this.isTagStartChar(c) ? State.InClosingTagName : State.InSpecialComment;
2586
- this.sectionStart = this.index;
2587
- }
2588
- }
2589
- stateInClosingTagName(c) {
2590
- if (isEndOfTagSection(c)) {
2591
- this.cbs.onclosetag(this.sectionStart, this.index);
2592
- this.sectionStart = -1;
2593
- this.state = State.AfterClosingTagName;
2594
- this.stateAfterClosingTagName(c);
2595
- }
2596
- }
2597
- stateAfterClosingTagName(c) {
2598
- if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {
2599
- this.state = State.Text;
2600
- this.sectionStart = this.index + 1;
2601
- }
2602
- }
2603
- stateBeforeAttributeName(c) {
2604
- if (c === CharCodes.Gt) {
2605
- this.cbs.onopentagend(this.index);
2606
- this.enterTagBody();
2607
- this.sectionStart = this.index + 1;
2608
- } else if (c === CharCodes.Slash) this.state = State.InSelfClosingTag;
2609
- else if (!isWhitespace$1(c)) {
2610
- this.state = State.InAttributeName;
2611
- this.sectionStart = this.index;
2612
- }
2613
- }
2614
- /**
2615
- * Handle `/` before `>` in an opening tag.
2616
- *
2617
- * In HTML mode, text-only tags ignore the self-closing flag and still enter
2618
- * their raw-text/RCDATA/plaintext state unless self-closing tags are being
2619
- * recognized. In XML mode, or for ordinary tags, the tokenizer returns to
2620
- * regular text parsing after emitting the self-closing callback.
2621
- * @param c Current character code point.
2622
- */
2623
- stateInSelfClosingTag(c) {
2624
- if (c === CharCodes.Gt) {
2625
- this.cbs.onselfclosingtag(this.index);
2626
- this.sectionStart = this.index + 1;
2627
- if (!this.recognizeSelfClosing) {
2628
- this.enterTagBody();
2629
- return;
2630
- }
2631
- this.state = State.Text;
2632
- this.isSpecial = false;
2633
- this.currentSequence = Sequences.Empty;
2634
- } else if (!isWhitespace$1(c)) {
2635
- this.state = State.BeforeAttributeName;
2636
- this.stateBeforeAttributeName(c);
2637
- }
2638
- }
2639
- stateInAttributeName(c) {
2640
- if (c === CharCodes.Eq || isEndOfTagSection(c)) {
2641
- this.cbs.onattribname(this.sectionStart, this.index);
2642
- this.sectionStart = this.index;
2643
- this.state = State.AfterAttributeName;
2644
- this.stateAfterAttributeName(c);
2645
- }
2646
- }
2647
- stateAfterAttributeName(c) {
2648
- if (c === CharCodes.Eq) this.state = State.BeforeAttributeValue;
2649
- else if (c === CharCodes.Slash || c === CharCodes.Gt) {
2650
- this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);
2651
- this.sectionStart = -1;
2652
- this.state = State.BeforeAttributeName;
2653
- this.stateBeforeAttributeName(c);
2654
- } else if (!isWhitespace$1(c)) {
2655
- this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);
2656
- this.state = State.InAttributeName;
2657
- this.sectionStart = this.index;
2658
- }
2659
- }
2660
- stateBeforeAttributeValue(c) {
2661
- if (c === CharCodes.DoubleQuote) {
2662
- this.state = State.InAttributeValueDq;
2663
- this.sectionStart = this.index + 1;
2664
- } else if (c === CharCodes.SingleQuote) {
2665
- this.state = State.InAttributeValueSq;
2666
- this.sectionStart = this.index + 1;
2667
- } else if (!isWhitespace$1(c)) {
2668
- this.sectionStart = this.index;
2669
- this.state = State.InAttributeValueNq;
2670
- this.stateInAttributeValueNoQuotes(c);
2671
- }
2672
- }
2673
- handleInAttributeValue(c, quote) {
2674
- if (c === quote || !this.decodeEntities && this.fastForwardTo(quote)) {
2675
- this.cbs.onattribdata(this.sectionStart, this.index);
2676
- this.sectionStart = -1;
2677
- this.cbs.onattribend(quote === CharCodes.DoubleQuote ? QuoteType.Double : QuoteType.Single, this.index + 1);
2678
- this.state = State.BeforeAttributeName;
2679
- } else if (this.decodeEntities && c === CharCodes.Amp) this.startEntity();
2680
- }
2681
- stateInAttributeValueDoubleQuotes(c) {
2682
- this.handleInAttributeValue(c, CharCodes.DoubleQuote);
2683
- }
2684
- stateInAttributeValueSingleQuotes(c) {
2685
- this.handleInAttributeValue(c, CharCodes.SingleQuote);
2686
- }
2687
- stateInAttributeValueNoQuotes(c) {
2688
- if (isWhitespace$1(c) || c === CharCodes.Gt) {
2689
- this.cbs.onattribdata(this.sectionStart, this.index);
2690
- this.sectionStart = -1;
2691
- this.cbs.onattribend(QuoteType.Unquoted, this.index);
2692
- this.state = State.BeforeAttributeName;
2693
- this.stateBeforeAttributeName(c);
2694
- } else if (this.decodeEntities && c === CharCodes.Amp) this.startEntity();
2695
- }
2696
- /**
2697
- * Distinguish between CDATA, declarations, HTML comments, and HTML bogus
2698
- * comments after `<!`.
2699
- *
2700
- * In HTML mode, only real comments and doctypes stay on declaration paths;
2701
- * everything else becomes a bogus comment terminated by the next `>`.
2702
- * @param c Current character code point.
2703
- */
2704
- stateBeforeDeclaration(c) {
2705
- if (c === CharCodes.OpeningSquareBracket) {
2706
- this.state = State.CDATASequence;
2707
- this.sequenceIndex = 0;
2708
- } else if (this.xmlMode) this.state = c === CharCodes.Dash ? State.BeforeComment : State.InDeclaration;
2709
- else if ((c | 32) === Sequences.Doctype[0]) {
2710
- this.state = State.DeclarationSequence;
2711
- this.currentSequence = Sequences.Doctype;
2712
- this.sequenceIndex = 1;
2713
- } else if (c === CharCodes.Gt) {
2714
- this.cbs.oncomment(this.sectionStart, this.index, 0);
2715
- this.state = State.Text;
2716
- this.sectionStart = this.index + 1;
2717
- } else if (c === CharCodes.Dash) this.state = State.BeforeComment;
2718
- else this.state = State.InSpecialComment;
2719
- }
2720
- /**
2721
- * Continue matching `doctype` after `<!d`.
2722
- *
2723
- * A full `doctype` match stays on the declaration path; any other name falls
2724
- * back to an HTML bogus comment, which matches browser behavior for
2725
- * non-doctype `<!...>` constructs.
2726
- * @param c Current character code point.
2727
- */
2728
- stateDeclarationSequence(c) {
2729
- if (this.sequenceIndex === this.currentSequence.length) {
2730
- this.state = State.InDeclaration;
2731
- this.stateInDeclaration(c);
2732
- } else if ((c | 32) === this.currentSequence[this.sequenceIndex]) this.sequenceIndex += 1;
2733
- else if (c === CharCodes.Gt) {
2734
- this.cbs.oncomment(this.sectionStart, this.index, 0);
2735
- this.state = State.Text;
2736
- this.sectionStart = this.index + 1;
2737
- } else this.state = State.InSpecialComment;
2738
- }
2739
- stateInDeclaration(c) {
2740
- if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {
2741
- this.cbs.ondeclaration(this.sectionStart, this.index);
2742
- this.state = State.Text;
2743
- this.sectionStart = this.index + 1;
2744
- }
2745
- }
2746
- /**
2747
- * XML processing instructions (`<?...?>`).
2748
- *
2749
- * In HTML mode `<?` is routed to `InSpecialComment` instead, so this
2750
- * state is only reachable in XML mode.
2751
- * @param c Current character code point.
2752
- */
2753
- stateInProcessingInstruction(c) {
2754
- if (c === CharCodes.Questionmark) this.sequenceIndex = 1;
2755
- else if (c === CharCodes.Gt && this.sequenceIndex === 1) {
2756
- this.cbs.onprocessinginstruction(this.sectionStart, this.index - 1);
2757
- this.sequenceIndex = 0;
2758
- this.state = State.Text;
2759
- this.sectionStart = this.index + 1;
2760
- } else this.sequenceIndex = Number(this.fastForwardTo(CharCodes.Questionmark));
2761
- }
2762
- stateBeforeComment(c) {
2763
- if (c === CharCodes.Dash) {
2764
- this.state = State.InCommentLike;
2765
- this.currentSequence = Sequences.CommentEnd;
2766
- this.sequenceIndex = 0;
2767
- this.sectionStart = this.index + 1;
2768
- } else if (this.xmlMode) this.state = State.InDeclaration;
2769
- else if (c === CharCodes.Gt) {
2770
- this.cbs.oncomment(this.sectionStart, this.index, 0);
2771
- this.state = State.Text;
2772
- this.sectionStart = this.index + 1;
2773
- } else this.state = State.InSpecialComment;
2774
- }
2775
- stateInSpecialComment(c) {
2776
- if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {
2777
- this.cbs.oncomment(this.sectionStart, this.index, 0);
2778
- this.state = State.Text;
2779
- this.sectionStart = this.index + 1;
2780
- }
2781
- }
2782
- startEntity() {
2783
- this.baseState = this.state;
2784
- this.state = State.InEntity;
2785
- this.entityStart = this.index;
2786
- this.entityDecoder.startEntity(this.xmlMode ? DecodingMode.Strict : this.baseState === State.Text || this.baseState === State.InSpecialTag ? DecodingMode.Legacy : DecodingMode.Attribute);
2787
- }
2788
- stateInEntity() {
2789
- const indexInBuffer = this.index - this.offset;
2790
- const length = this.entityDecoder.write(this.buffer, indexInBuffer);
2791
- if (length >= 0) {
2792
- this.state = this.baseState;
2793
- if (length === 0) this.index -= 1;
2794
- } else {
2795
- if (indexInBuffer < this.buffer.length && this.buffer.charCodeAt(indexInBuffer) === CharCodes.Amp) {
2796
- this.state = this.baseState;
2797
- this.index -= 1;
2798
- return;
2799
- }
2800
- this.index = this.offset + this.buffer.length - 1;
2801
- }
2802
- }
2803
- /**
2804
- * Remove data that has already been consumed from the buffer.
2805
- */
2806
- cleanup() {
2807
- if (this.running && this.sectionStart !== this.index) {
2808
- if (this.state === State.Text || this.state === State.InPlainText || this.state === State.InSpecialTag && this.sequenceIndex === 0) {
2809
- this.cbs.ontext(this.sectionStart, this.index);
2810
- this.sectionStart = this.index;
2811
- } else if (this.state === State.InAttributeValueDq || this.state === State.InAttributeValueSq || this.state === State.InAttributeValueNq) {
2812
- this.cbs.onattribdata(this.sectionStart, this.index);
2813
- this.sectionStart = this.index;
2814
- }
2815
- }
2816
- }
2817
- shouldContinue() {
2818
- return this.index < this.buffer.length + this.offset && this.running;
2819
- }
2820
- /**
2821
- * Iterates through the buffer, calling the function corresponding to the current state.
2822
- *
2823
- * States that are more likely to be hit are higher up, as a performance improvement.
2824
- */
2825
- parse() {
2826
- while (this.shouldContinue()) {
2827
- const c = this.buffer.charCodeAt(this.index - this.offset);
2828
- switch (this.state) {
2829
- case State.Text:
2830
- this.stateText(c);
2831
- break;
2832
- case State.InPlainText:
2833
- this.index = this.buffer.length + this.offset - 1;
2834
- break;
2835
- case State.SpecialStartSequence:
2836
- this.stateSpecialStartSequence(c);
2837
- break;
2838
- case State.InSpecialTag:
2839
- this.stateInSpecialTag(c);
2840
- break;
2841
- case State.CDATASequence:
2842
- this.stateCDATASequence(c);
2843
- break;
2844
- case State.DeclarationSequence:
2845
- this.stateDeclarationSequence(c);
2846
- break;
2847
- case State.InAttributeValueDq:
2848
- this.stateInAttributeValueDoubleQuotes(c);
2849
- break;
2850
- case State.InAttributeName:
2851
- this.stateInAttributeName(c);
2852
- break;
2853
- case State.InCommentLike:
2854
- this.stateInCommentLike(c);
2855
- break;
2856
- case State.InSpecialComment:
2857
- this.stateInSpecialComment(c);
2858
- break;
2859
- case State.BeforeAttributeName:
2860
- this.stateBeforeAttributeName(c);
2861
- break;
2862
- case State.InTagName:
2863
- this.stateInTagName(c);
2864
- break;
2865
- case State.InClosingTagName:
2866
- this.stateInClosingTagName(c);
2867
- break;
2868
- case State.BeforeTagName:
2869
- this.stateBeforeTagName(c);
2870
- break;
2871
- case State.AfterAttributeName:
2872
- this.stateAfterAttributeName(c);
2873
- break;
2874
- case State.InAttributeValueSq:
2875
- this.stateInAttributeValueSingleQuotes(c);
2876
- break;
2877
- case State.BeforeAttributeValue:
2878
- this.stateBeforeAttributeValue(c);
2879
- break;
2880
- case State.BeforeClosingTagName:
2881
- this.stateBeforeClosingTagName(c);
2882
- break;
2883
- case State.AfterClosingTagName:
2884
- this.stateAfterClosingTagName(c);
2885
- break;
2886
- case State.InAttributeValueNq:
2887
- this.stateInAttributeValueNoQuotes(c);
2888
- break;
2889
- case State.InSelfClosingTag:
2890
- this.stateInSelfClosingTag(c);
2891
- break;
2892
- case State.InDeclaration:
2893
- this.stateInDeclaration(c);
2894
- break;
2895
- case State.BeforeDeclaration:
2896
- this.stateBeforeDeclaration(c);
2897
- break;
2898
- case State.BeforeComment:
2899
- this.stateBeforeComment(c);
2900
- break;
2901
- case State.InProcessingInstruction:
2902
- this.stateInProcessingInstruction(c);
2903
- break;
2904
- case State.InEntity:
2905
- this.stateInEntity();
2906
- break;
2907
- }
2908
- this.index++;
2909
- }
2910
- this.cleanup();
2911
- }
2912
- finish() {
2913
- if (this.state === State.InEntity) {
2914
- this.entityDecoder.end();
2915
- this.state = this.baseState;
2916
- }
2917
- this.handleTrailingData();
2918
- this.cbs.onend();
2919
- }
2920
- handleTrailingCommentLikeData(endIndex) {
2921
- if (this.state !== State.InCommentLike) return false;
2922
- if (this.currentSequence === Sequences.CdataEnd) if (this.xmlMode) {
2923
- if (this.sectionStart < endIndex) this.cbs.oncdata(this.sectionStart, endIndex, 0);
2924
- } else {
2925
- const cdataStart = this.sectionStart - Sequences.Cdata.length - 1;
2926
- this.cbs.oncomment(cdataStart, endIndex, 0);
2927
- }
2928
- else {
2929
- const offset = this.xmlMode ? 0 : Math.min(this.sequenceIndex, Sequences.CommentEnd.length - 1);
2930
- this.cbs.oncomment(this.sectionStart, endIndex, offset);
2931
- }
2932
- return true;
2933
- }
2934
- handleTrailingMarkupDeclaration(endIndex) {
2935
- if (this.xmlMode) switch (this.state) {
2936
- case State.InSpecialComment:
2937
- case State.BeforeComment:
2938
- case State.CDATASequence:
2939
- case State.DeclarationSequence:
2940
- case State.InDeclaration:
2941
- this.cbs.ontext(this.sectionStart, endIndex);
2942
- return true;
2943
- default: return false;
2944
- }
2945
- switch (this.state) {
2946
- case State.BeforeDeclaration:
2947
- case State.InSpecialComment:
2948
- case State.BeforeComment:
2949
- case State.CDATASequence:
2950
- this.cbs.oncomment(this.sectionStart, endIndex, 0);
2951
- return true;
2952
- case State.DeclarationSequence:
2953
- if (this.sequenceIndex !== Sequences.Doctype.length) this.cbs.oncomment(this.sectionStart, endIndex, 0);
2954
- return true;
2955
- case State.InDeclaration: return true;
2956
- default: return false;
2957
- }
2958
- }
2959
- /** Handle any trailing data. */
2960
- handleTrailingData() {
2961
- const endIndex = this.buffer.length + this.offset;
2962
- if (this.handleTrailingCommentLikeData(endIndex) || this.handleTrailingMarkupDeclaration(endIndex)) return;
2963
- if (this.sectionStart >= endIndex) return;
2964
- switch (this.state) {
2965
- case State.InTagName:
2966
- case State.BeforeAttributeName:
2967
- case State.BeforeAttributeValue:
2968
- case State.AfterAttributeName:
2969
- case State.InAttributeName:
2970
- case State.InAttributeValueSq:
2971
- case State.InAttributeValueDq:
2972
- case State.InAttributeValueNq:
2973
- case State.InClosingTagName: break;
2974
- default: this.cbs.ontext(this.sectionStart, endIndex);
2975
- }
2976
- }
2977
- emitCodePoint(cp, consumed) {
2978
- if (this.baseState !== State.Text && this.baseState !== State.InSpecialTag) {
2979
- if (this.sectionStart < this.entityStart) this.cbs.onattribdata(this.sectionStart, this.entityStart);
2980
- this.sectionStart = this.entityStart + consumed;
2981
- this.index = this.sectionStart - 1;
2982
- this.cbs.onattribentity(cp);
2983
- } else {
2984
- if (this.sectionStart < this.entityStart) this.cbs.ontext(this.sectionStart, this.entityStart);
2985
- this.sectionStart = this.entityStart + consumed;
2986
- this.index = this.sectionStart - 1;
2987
- this.cbs.ontextentity(cp, this.sectionStart);
2988
- }
2989
- }
2990
- };
2991
- //#endregion
2992
- //#region ../../node_modules/.pnpm/htmlparser2@12.0.0/node_modules/htmlparser2/dist/Parser.js
2993
- const { fromCodePoint } = String;
2994
- const formTags = /* @__PURE__ */ new Set([
2995
- "input",
2996
- "option",
2997
- "optgroup",
2998
- "select",
2999
- "button",
3000
- "datalist",
3001
- "textarea"
3002
- ]);
3003
- const pTag = /* @__PURE__ */ new Set(["p"]);
3004
- const headingTags = /* @__PURE__ */ new Set([
3005
- "h1",
3006
- "h2",
3007
- "h3",
3008
- "h4",
3009
- "h5",
3010
- "h6",
3011
- "p"
3012
- ]);
3013
- const tableSectionTags = /* @__PURE__ */ new Set(["thead", "tbody"]);
3014
- const ddtTags = /* @__PURE__ */ new Set(["dd", "dt"]);
3015
- const rtpTags = /* @__PURE__ */ new Set(["rt", "rp"]);
3016
- const openImpliesClose = /* @__PURE__ */ new Map([
3017
- ["tr", /* @__PURE__ */ new Set([
3018
- "tr",
3019
- "th",
3020
- "td"
3021
- ])],
3022
- ["th", /* @__PURE__ */ new Set(["th"])],
3023
- ["td", /* @__PURE__ */ new Set([
3024
- "thead",
3025
- "th",
3026
- "td"
3027
- ])],
3028
- ["body", /* @__PURE__ */ new Set([
3029
- "head",
3030
- "link",
3031
- "script"
3032
- ])],
3033
- ["a", /* @__PURE__ */ new Set(["a"])],
3034
- ["li", /* @__PURE__ */ new Set(["li"])],
3035
- ["p", pTag],
3036
- ["h1", headingTags],
3037
- ["h2", headingTags],
3038
- ["h3", headingTags],
3039
- ["h4", headingTags],
3040
- ["h5", headingTags],
3041
- ["h6", headingTags],
3042
- ["select", formTags],
3043
- ["input", formTags],
3044
- ["output", formTags],
3045
- ["button", formTags],
3046
- ["datalist", formTags],
3047
- ["textarea", formTags],
3048
- ["option", /* @__PURE__ */ new Set(["option"])],
3049
- ["optgroup", /* @__PURE__ */ new Set(["optgroup", "option"])],
3050
- ["dd", ddtTags],
3051
- ["dt", ddtTags],
3052
- ["address", pTag],
3053
- ["article", pTag],
3054
- ["aside", pTag],
3055
- ["blockquote", pTag],
3056
- ["details", pTag],
3057
- ["div", pTag],
3058
- ["dl", pTag],
3059
- ["fieldset", pTag],
3060
- ["figcaption", pTag],
3061
- ["figure", pTag],
3062
- ["footer", pTag],
3063
- ["form", pTag],
3064
- ["header", pTag],
3065
- ["hr", pTag],
3066
- ["main", pTag],
3067
- ["nav", pTag],
3068
- ["ol", pTag],
3069
- ["pre", pTag],
3070
- ["section", pTag],
3071
- ["table", pTag],
3072
- ["ul", pTag],
3073
- ["rt", rtpTags],
3074
- ["rp", rtpTags],
3075
- ["tbody", tableSectionTags],
3076
- ["tfoot", tableSectionTags]
3077
- ]);
3078
- const DOCUMENT_TYPE = "doctype";
3079
- const voidElements = /* @__PURE__ */ new Set([
3080
- "area",
3081
- "base",
3082
- "basefont",
3083
- "br",
3084
- "col",
3085
- "command",
3086
- "embed",
3087
- "frame",
3088
- "hr",
3089
- "img",
3090
- "input",
3091
- "isindex",
3092
- "keygen",
3093
- "link",
3094
- "meta",
3095
- "param",
3096
- "source",
3097
- "track",
3098
- "wbr"
3099
- ]);
3100
- const foreignContextElements = /* @__PURE__ */ new Set(["math", "svg"]);
3101
- /**
3102
- * Elements that can be used to integrate HTML content within foreign namespaces (e.g., SVG or MathML).
3103
- *
3104
- * Entries must use the SVG-adjusted casing (e.g. "foreignObject" not
3105
- * "foreignobject") since they are compared against adjusted tag names.
3106
- */
3107
- const htmlIntegrationElements = /* @__PURE__ */ new Set([
3108
- "mi",
3109
- "mo",
3110
- "mn",
3111
- "ms",
3112
- "mtext",
3113
- "annotation-xml",
3114
- "foreignObject",
3115
- "desc",
3116
- "title"
3117
- ]);
3118
- const svgTagNameAdjustments = /* @__PURE__ */ new Map([
3119
- ["altglyph", "altGlyph"],
3120
- ["altglyphdef", "altGlyphDef"],
3121
- ["altglyphitem", "altGlyphItem"],
3122
- ["animatecolor", "animateColor"],
3123
- ["animatemotion", "animateMotion"],
3124
- ["animatetransform", "animateTransform"],
3125
- ["clippath", "clipPath"],
3126
- ["feblend", "feBlend"],
3127
- ["fecolormatrix", "feColorMatrix"],
3128
- ["fecomponenttransfer", "feComponentTransfer"],
3129
- ["fecomposite", "feComposite"],
3130
- ["feconvolvematrix", "feConvolveMatrix"],
3131
- ["fediffuselighting", "feDiffuseLighting"],
3132
- ["fedisplacementmap", "feDisplacementMap"],
3133
- ["fedistantlight", "feDistantLight"],
3134
- ["fedropshadow", "feDropShadow"],
3135
- ["feflood", "feFlood"],
3136
- ["fefunca", "feFuncA"],
3137
- ["fefuncb", "feFuncB"],
3138
- ["fefuncg", "feFuncG"],
3139
- ["fefuncr", "feFuncR"],
3140
- ["fegaussianblur", "feGaussianBlur"],
3141
- ["feimage", "feImage"],
3142
- ["femerge", "feMerge"],
3143
- ["femergenode", "feMergeNode"],
3144
- ["femorphology", "feMorphology"],
3145
- ["feoffset", "feOffset"],
3146
- ["fepointlight", "fePointLight"],
3147
- ["fespecularlighting", "feSpecularLighting"],
3148
- ["fespotlight", "feSpotLight"],
3149
- ["fetile", "feTile"],
3150
- ["feturbulence", "feTurbulence"],
3151
- ["foreignobject", "foreignObject"],
3152
- ["glyphref", "glyphRef"],
3153
- ["lineargradient", "linearGradient"],
3154
- ["radialgradient", "radialGradient"],
3155
- ["textpath", "textPath"]
3156
- ]);
3157
- var ForeignContext;
3158
- (function(ForeignContext) {
3159
- ForeignContext[ForeignContext["None"] = 0] = "None";
3160
- ForeignContext[ForeignContext["Svg"] = 1] = "Svg";
3161
- ForeignContext[ForeignContext["MathML"] = 2] = "MathML";
3162
- })(ForeignContext || (ForeignContext = {}));
3163
- const reNameEnd = /\s|\//;
3164
- /**
3165
- * Incremental parser implementation.
3166
- */
3167
- var Parser = class {
3168
- constructor(cbs, options = {}) {
3169
- _defineProperty(this, "options", void 0);
3170
- _defineProperty(
3171
- this,
3172
- /** The start index of the last event. */
3173
- "startIndex",
3174
- 0
3175
- );
3176
- _defineProperty(
3177
- this,
3178
- /** The end index of the last event. */
3179
- "endIndex",
3180
- 0
3181
- );
3182
- _defineProperty(
3183
- this,
3184
- /**
3185
- * Store the start index of the current open tag,
3186
- * so we can update the start index for attributes.
3187
- */
3188
- "openTagStart",
3189
- 0
3190
- );
3191
- _defineProperty(this, "tagname", "");
3192
- _defineProperty(this, "attribname", "");
3193
- _defineProperty(this, "attribvalue", "");
3194
- _defineProperty(this, "attribs", null);
3195
- _defineProperty(this, "stack", []);
3196
- _defineProperty(this, "foreignContext", void 0);
3197
- _defineProperty(this, "cbs", void 0);
3198
- _defineProperty(this, "lowerCaseTagNames", void 0);
3199
- _defineProperty(this, "lowerCaseAttributeNames", void 0);
3200
- _defineProperty(this, "recognizeSelfClosing", void 0);
3201
- _defineProperty(
3202
- this,
3203
- /** We are parsing HTML. Inverse of the `xmlMode` option. */
3204
- "htmlMode",
3205
- void 0
3206
- );
3207
- _defineProperty(this, "tokenizer", void 0);
3208
- _defineProperty(this, "buffers", []);
3209
- _defineProperty(this, "bufferOffset", 0);
3210
- _defineProperty(
3211
- this,
3212
- /** The index of the last written buffer. Used when resuming after a `pause()`. */
3213
- "writeIndex",
3214
- 0
3215
- );
3216
- _defineProperty(
3217
- this,
3218
- /** Indicates whether the parser has finished running / `.end` has been called. */
3219
- "ended",
3220
- false
3221
- );
3222
- this.options = options;
3223
- this.cbs = cbs ?? {};
3224
- this.htmlMode = !this.options.xmlMode;
3225
- this.lowerCaseTagNames = options.lowerCaseTags ?? this.htmlMode;
3226
- this.lowerCaseAttributeNames = options.lowerCaseAttributeNames ?? this.htmlMode;
3227
- this.recognizeSelfClosing = options.recognizeSelfClosing ?? !this.htmlMode;
3228
- this.tokenizer = new (options.Tokenizer ?? Tokenizer$1)(this.options, this);
3229
- this.foreignContext = [ForeignContext.None];
3230
- this.cbs.onparserinit?.(this);
3231
- }
3232
- /**
3233
- * @param start Start index for the current parser event.
3234
- * @param endIndex End index for the current parser event.
3235
- * @internal
3236
- */
3237
- ontext(start, endIndex) {
3238
- const data = this.getSlice(start, endIndex);
3239
- this.endIndex = endIndex - 1;
3240
- this.cbs.ontext?.(data);
3241
- this.startIndex = endIndex;
3242
- }
3243
- /**
3244
- * @param cp Current Unicode code point.
3245
- * @param endIndex End index for the current parser event.
3246
- * @internal
3247
- */
3248
- ontextentity(cp, endIndex) {
3249
- this.endIndex = endIndex - 1;
3250
- this.cbs.ontext?.(fromCodePoint(cp));
3251
- this.startIndex = endIndex;
3252
- }
3253
- /** @internal */
3254
- isInForeignContext() {
3255
- return this.foreignContext[0] !== ForeignContext.None;
3256
- }
3257
- /**
3258
- * Checks if the current tag is a void element. Override this if you want
3259
- * to specify your own additional void elements.
3260
- * @param name Name of the pseudo selector.
3261
- */
3262
- isVoidElement(name) {
3263
- return this.htmlMode && voidElements.has(name);
3264
- }
3265
- /**
3266
- * Read a tag name from the buffer.
3267
- *
3268
- * When `lowerCaseTagNames` is enabled (the default in HTML mode), the name
3269
- * is lowercased and may be adjusted for SVG casing or the `image` → `img`
3270
- * alias.
3271
- * @param start Start index of the tag name in the buffer.
3272
- * @param endIndex End index of the tag name in the buffer.
3273
- */
3274
- readTagName(start, endIndex) {
3275
- const name = this.lowerCaseTagNames ? this.getSlice(start, endIndex).toLowerCase() : this.getSlice(start, endIndex);
3276
- if (!(this.lowerCaseTagNames && this.htmlMode)) return name;
3277
- if (this.foreignContext[0] === ForeignContext.Svg) return svgTagNameAdjustments.get(name) ?? name;
3278
- if (this.foreignContext.length > 1) {
3279
- const adjusted = svgTagNameAdjustments.get(name);
3280
- if (adjusted !== void 0 && this.stack.includes(adjusted)) return adjusted;
3281
- }
3282
- if (!this.isInForeignContext()) return name === "image" ? "img" : name;
3283
- return name;
3284
- }
3285
- /**
3286
- * @param start Start index for the current parser event.
3287
- * @param endIndex End index for the current parser event.
3288
- * @internal
3289
- */
3290
- onopentagname(start, endIndex) {
3291
- this.endIndex = endIndex;
3292
- this.emitOpenTag(this.readTagName(start, endIndex));
3293
- }
3294
- emitOpenTag(name) {
3295
- this.openTagStart = this.startIndex;
3296
- this.tagname = name;
3297
- if (this.htmlMode && name === "form" && this.stack.includes("form")) {
3298
- this.tagname = "";
3299
- return;
3300
- }
3301
- const impliesClose = this.htmlMode && openImpliesClose.get(name);
3302
- if (impliesClose) while (this.stack.length > 0 && impliesClose.has(this.stack[0])) this.popElement(true);
3303
- if (!this.isVoidElement(name)) {
3304
- this.stack.unshift(name);
3305
- if (this.htmlMode) {
3306
- if (name === "svg") this.foreignContext.unshift(ForeignContext.Svg);
3307
- else if (name === "math") this.foreignContext.unshift(ForeignContext.MathML);
3308
- else if (htmlIntegrationElements.has(name)) this.foreignContext.unshift(ForeignContext.None);
3309
- }
3310
- }
3311
- this.cbs.onopentagname?.(name);
3312
- if (this.cbs.onopentag) this.attribs = {};
3313
- }
3314
- endOpenTag(isImplied) {
3315
- this.startIndex = this.openTagStart;
3316
- if (this.attribs) {
3317
- this.cbs.onopentag?.(this.tagname, this.attribs, isImplied);
3318
- this.attribs = null;
3319
- }
3320
- if (this.cbs.onclosetag && this.isVoidElement(this.tagname)) this.cbs.onclosetag(this.tagname, true);
3321
- this.tagname = "";
3322
- }
3323
- /**
3324
- * @param endIndex End index for the current parser event.
3325
- * @internal
3326
- */
3327
- onopentagend(endIndex) {
3328
- this.endIndex = endIndex;
3329
- this.endOpenTag(false);
3330
- this.startIndex = endIndex + 1;
3331
- }
3332
- /**
3333
- * @param start Start index for the current parser event.
3334
- * @param endIndex End index for the current parser event.
3335
- * @internal
3336
- */
3337
- onclosetag(start, endIndex) {
3338
- this.endIndex = endIndex;
3339
- const name = this.readTagName(start, endIndex);
3340
- if (!this.isVoidElement(name)) {
3341
- const pos = this.stack.indexOf(name);
3342
- if (pos !== -1) {
3343
- for (let index = 0; index < pos; index++) this.popElement(true);
3344
- this.popElement(false);
3345
- } else if (this.htmlMode && name === "p") {
3346
- this.emitOpenTag("p");
3347
- this.closeCurrentTag(true);
3348
- }
3349
- } else if (this.htmlMode && name === "br") {
3350
- this.cbs.onopentagname?.("br");
3351
- this.cbs.onopentag?.("br", {}, true);
3352
- this.cbs.onclosetag?.("br", false);
3353
- }
3354
- this.startIndex = endIndex + 1;
3355
- }
3356
- /**
3357
- * @param endIndex End index for the current parser event.
3358
- * @internal
3359
- */
3360
- onselfclosingtag(endIndex) {
3361
- this.endIndex = endIndex;
3362
- if (this.recognizeSelfClosing || this.isInForeignContext()) {
3363
- this.closeCurrentTag(false);
3364
- this.startIndex = endIndex + 1;
3365
- } else this.onopentagend(endIndex);
3366
- }
3367
- /**
3368
- * Pop the top element off the stack, emit a close event, and maintain
3369
- * the foreign context stack.
3370
- * @param implied Whether this close is implied (not from an explicit end tag).
3371
- */
3372
- popElement(implied) {
3373
- const element = this.stack.shift();
3374
- if (this.htmlMode && (foreignContextElements.has(element) || htmlIntegrationElements.has(element))) this.foreignContext.shift();
3375
- this.cbs.onclosetag?.(element, implied);
3376
- }
3377
- closeCurrentTag(isOpenImplied) {
3378
- const name = this.tagname;
3379
- this.endOpenTag(isOpenImplied);
3380
- if (this.stack[0] === name) this.popElement(!isOpenImplied);
3381
- }
3382
- /**
3383
- * @param start Start index for the current parser event.
3384
- * @param endIndex End index for the current parser event.
3385
- * @internal
3386
- */
3387
- onattribname(start, endIndex) {
3388
- this.startIndex = start;
3389
- const name = this.getSlice(start, endIndex);
3390
- this.attribname = this.lowerCaseAttributeNames ? name.toLowerCase() : name;
3391
- }
3392
- /**
3393
- * @param start Start index for the current parser event.
3394
- * @param endIndex End index for the current parser event.
3395
- * @internal
3396
- */
3397
- onattribdata(start, endIndex) {
3398
- this.attribvalue += this.getSlice(start, endIndex);
3399
- }
3400
- /**
3401
- * @param cp Current Unicode code point.
3402
- * @internal
3403
- */
3404
- onattribentity(cp) {
3405
- this.attribvalue += fromCodePoint(cp);
3406
- }
3407
- /**
3408
- * @param quote Quote type used for the current attribute.
3409
- * @param endIndex End index for the current parser event.
3410
- * @internal
3411
- */
3412
- onattribend(quote, endIndex) {
3413
- this.endIndex = endIndex;
3414
- this.cbs.onattribute?.(this.attribname, this.attribvalue, quote === QuoteType.Double ? "\"" : quote === QuoteType.Single ? "'" : quote === QuoteType.NoValue ? void 0 : null);
3415
- if (this.attribs && !Object.hasOwn(this.attribs, this.attribname)) this.attribs[this.attribname] = this.attribvalue;
3416
- this.attribvalue = "";
3417
- }
3418
- getInstructionName(value) {
3419
- const index = value.search(reNameEnd);
3420
- let name = index < 0 ? value : value.substr(0, index);
3421
- if (this.lowerCaseTagNames) name = name.toLowerCase();
3422
- return name;
3423
- }
3424
- /**
3425
- * @param start Start index for the current parser event.
3426
- * @param endIndex End index for the current parser event.
3427
- * @internal
3428
- */
3429
- ondeclaration(start, endIndex) {
3430
- this.endIndex = endIndex;
3431
- const value = this.getSlice(start, endIndex);
3432
- if (this.cbs.onprocessinginstruction) {
3433
- const name = this.htmlMode ? this.lowerCaseTagNames ? DOCUMENT_TYPE : value.slice(0, 7) : this.getInstructionName(value);
3434
- this.cbs.onprocessinginstruction(`!${name}`, `!${value}`);
3435
- }
3436
- this.startIndex = endIndex + 1;
3437
- }
3438
- /**
3439
- * @param start Start index for the current parser event.
3440
- * @param endIndex End index for the current parser event.
3441
- * @internal
3442
- */
3443
- onprocessinginstruction(start, endIndex) {
3444
- this.endIndex = endIndex;
3445
- const value = this.getSlice(start, endIndex);
3446
- if (this.cbs.onprocessinginstruction) {
3447
- const name = this.getInstructionName(value);
3448
- this.cbs.onprocessinginstruction(`?${name}`, `?${value}`);
3449
- }
3450
- this.startIndex = endIndex + 1;
3451
- }
3452
- /**
3453
- * @param start Start index for the current parser event.
3454
- * @param endIndex End index for the current parser event.
3455
- * @param offset Offset applied when computing parser indices.
3456
- * @internal
3457
- */
3458
- oncomment(start, endIndex, offset) {
3459
- this.endIndex = endIndex;
3460
- this.cbs.oncomment?.(this.getSlice(start, endIndex - offset));
3461
- this.cbs.oncommentend?.();
3462
- this.startIndex = endIndex + 1;
3463
- }
3464
- /**
3465
- * @param start Start index for the current parser event.
3466
- * @param endIndex End index for the current parser event.
3467
- * @param offset Offset applied when computing parser indices.
3468
- * @internal
3469
- */
3470
- oncdata(start, endIndex, offset) {
3471
- this.endIndex = endIndex;
3472
- const value = this.getSlice(start, endIndex - offset);
3473
- if (!this.htmlMode || this.options.recognizeCDATA) {
3474
- this.cbs.oncdatastart?.();
3475
- this.cbs.ontext?.(value);
3476
- this.cbs.oncdataend?.();
3477
- } else if (this.isInForeignContext()) this.cbs.ontext?.(value);
3478
- else {
3479
- this.cbs.oncomment?.(`[CDATA[${value}]]`);
3480
- this.cbs.oncommentend?.();
3481
- }
3482
- this.startIndex = endIndex + 1;
3483
- }
3484
- /** @internal */
3485
- onend() {
3486
- if (this.cbs.onclosetag) {
3487
- this.endIndex = this.startIndex;
3488
- for (let index = 0; index < this.stack.length; index++) this.cbs.onclosetag(this.stack[index], true);
3489
- }
3490
- this.cbs.onend?.();
3491
- }
3492
- /**
3493
- * Resets the parser to a blank state, ready to parse a new HTML document
3494
- */
3495
- reset() {
3496
- this.cbs.onreset?.();
3497
- this.tokenizer.reset();
3498
- this.tagname = "";
3499
- this.attribname = "";
3500
- this.attribvalue = "";
3501
- this.attribs = null;
3502
- this.stack.length = 0;
3503
- this.startIndex = 0;
3504
- this.endIndex = 0;
3505
- this.cbs.onparserinit?.(this);
3506
- this.buffers.length = 0;
3507
- this.foreignContext.length = 0;
3508
- this.foreignContext.unshift(ForeignContext.None);
3509
- this.bufferOffset = 0;
3510
- this.writeIndex = 0;
3511
- this.ended = false;
3512
- }
3513
- /**
3514
- * Resets the parser, then parses a complete document and
3515
- * pushes it to the handler.
3516
- * @param data Document to parse.
3517
- */
3518
- parseComplete(data) {
3519
- this.reset();
3520
- this.end(data);
3521
- }
3522
- getSlice(start, end) {
3523
- if (start === end) return "";
3524
- while (start - this.bufferOffset >= this.buffers[0].length) this.shiftBuffer();
3525
- let slice = this.buffers[0].slice(start - this.bufferOffset, end - this.bufferOffset);
3526
- while (end - this.bufferOffset > this.buffers[0].length) {
3527
- this.shiftBuffer();
3528
- slice += this.buffers[0].slice(0, end - this.bufferOffset);
3529
- }
3530
- return slice;
3531
- }
3532
- shiftBuffer() {
3533
- this.bufferOffset += this.buffers[0].length;
3534
- this.writeIndex--;
3535
- this.buffers.shift();
3536
- }
3537
- /**
3538
- * Parses a chunk of data and calls the corresponding callbacks.
3539
- * @param chunk Chunk to parse.
3540
- */
3541
- write(chunk) {
3542
- if (this.ended) {
3543
- this.cbs.onerror?.(/* @__PURE__ */ new Error(".write() after done!"));
3544
- return;
3545
- }
3546
- this.buffers.push(chunk);
3547
- if (this.tokenizer.running) {
3548
- this.tokenizer.write(chunk);
3549
- this.writeIndex++;
3550
- }
3551
- }
3552
- /**
3553
- * Parses the end of the buffer and clears the stack, calls onend.
3554
- * @param chunk Optional final chunk to parse.
3555
- */
3556
- end(chunk) {
3557
- if (this.ended) {
3558
- this.cbs.onerror?.(/* @__PURE__ */ new Error(".end() after done!"));
3559
- return;
3560
- }
3561
- if (chunk) this.write(chunk);
3562
- this.ended = true;
3563
- this.tokenizer.end();
3564
- }
3565
- /**
3566
- * Pauses parsing. The parser won't emit events until `resume` is called.
3567
- */
3568
- pause() {
3569
- this.tokenizer.pause();
3570
- }
3571
- /**
3572
- * Resumes parsing after `pause` was called.
3573
- */
3574
- resume() {
3575
- this.tokenizer.resume();
3576
- while (this.tokenizer.running && this.writeIndex < this.buffers.length) this.tokenizer.write(this.buffers[this.writeIndex++]);
3577
- if (this.ended) this.tokenizer.end();
3578
- }
3579
- };
3580
- //#endregion
3581
- //#region src/wxml/whitespace.ts
3582
- const WHITESPACE_CODES = /* @__PURE__ */ new Set([
3583
- 9,
3584
- 10,
3585
- 11,
3586
- 12,
3587
- 13,
3588
- 32,
3589
- 160,
3590
- 65279
3591
- ]);
3592
- function isWhitespace(char) {
3593
- if (char.length === 0) return false;
3594
- return WHITESPACE_CODES.has(char.charCodeAt(0));
3595
- }
3596
- function isAllWhitespace(value) {
3597
- for (let i = 0; i < value.length; i++) if (!WHITESPACE_CODES.has(value.charCodeAt(i))) return false;
3598
- return true;
3599
- }
3600
- //#endregion
3601
- //#region src/wxml/Tokenizer.ts
3602
- var Tokenizer = class {
3603
- constructor() {
3604
- _defineProperty(this, "state", void 0);
3605
- _defineProperty(this, "buffer", void 0);
3606
- _defineProperty(this, "tokens", void 0);
3607
- _defineProperty(this, "bufferStartIndex", void 0);
3608
- _defineProperty(this, "expressionStartIndex", void 0);
3609
- _defineProperty(this, "expressionBuffer", void 0);
3610
- _defineProperty(this, "expressions", void 0);
3611
- this.reset();
3612
- }
3613
- processChar(char, index) {
3614
- switch (this.state) {
3615
- case 0:
3616
- if (isWhitespace(char)) {} else if (char === "{") {
3617
- this.state = 2;
3618
- this.bufferStartIndex = index;
3619
- this.buffer += char;
3620
- this.expressionBuffer = char;
3621
- this.expressionStartIndex = index;
3622
- } else {
3623
- this.state = 1;
3624
- this.bufferStartIndex = index;
3625
- this.buffer += char;
3626
- }
3627
- break;
3628
- case 1:
3629
- if (isWhitespace(char)) {
3630
- this.tokens.push({
3631
- start: this.bufferStartIndex,
3632
- end: index,
3633
- value: this.buffer,
3634
- expressions: this.expressions
3635
- });
3636
- this.buffer = "";
3637
- this.expressions = [];
3638
- this.state = 0;
3639
- } else if (char === "{") {
3640
- this.buffer += char;
3641
- this.expressionBuffer = char;
3642
- this.expressionStartIndex = index;
3643
- this.state = 2;
3644
- } else this.buffer += char;
3645
- break;
3646
- case 2:
3647
- if (char === "}") {
3648
- this.buffer += char;
3649
- this.expressionBuffer += char;
3650
- this.state = 3;
3651
- } else {
3652
- this.buffer += char;
3653
- this.expressionBuffer += char;
3654
- }
3655
- break;
3656
- case 3:
3657
- if (char === "}") {
3658
- this.buffer += char;
3659
- this.expressionBuffer += char;
3660
- this.expressions.push({
3661
- start: this.expressionStartIndex,
3662
- end: index + 1,
3663
- value: this.expressionBuffer
3664
- });
3665
- this.expressionBuffer = "";
3666
- this.state = 4;
3667
- } else {
3668
- this.buffer += char;
3669
- this.expressionBuffer += char;
3670
- this.state = 2;
3671
- }
3672
- break;
3673
- case 4:
3674
- if (isWhitespace(char)) {
3675
- this.tokens.push({
3676
- start: this.bufferStartIndex,
3677
- end: index,
3678
- value: this.buffer,
3679
- expressions: this.expressions
3680
- });
3681
- this.buffer = "";
3682
- this.expressions = [];
3683
- this.state = 0;
3684
- } else if (char === "{") {
3685
- this.expressionStartIndex = index;
3686
- this.expressionBuffer = char;
3687
- this.buffer += char;
3688
- this.state = 2;
3689
- } else {
3690
- this.buffer += char;
3691
- this.state = 1;
3692
- }
3693
- break;
3694
- default: throw new Error("Unexpected state");
3695
- }
3696
- }
3697
- run(input) {
3698
- this.reset();
3699
- for (let i = 0; i < input.length; i++) {
3700
- const char = input[i];
3701
- if (char === void 0) continue;
3702
- this.processChar(char, i);
3703
- }
3704
- if (this.buffer.length > 0) this.tokens.push({
3705
- start: this.bufferStartIndex,
3706
- end: input.length,
3707
- value: this.buffer,
3708
- expressions: this.expressions
3709
- });
3710
- const tokens = this.tokens;
3711
- this.reset();
3712
- return tokens;
3713
- }
3714
- reset() {
3715
- this.state = 0;
3716
- this.buffer = "";
3717
- this.tokens = [];
3718
- this.bufferStartIndex = 0;
3719
- this.expressionBuffer = "";
3720
- this.expressionStartIndex = 0;
3721
- this.expressions = [];
3722
- }
3723
- };
3724
- //#endregion
3725
- //#region src/wxml/utils/fragment-helpers.ts
3726
- function updateWhitespaceGap(ms, start, end, options) {
3727
- const gap = ms.slice(start, end);
3728
- if (isAllWhitespace(gap)) ms.update(start, end, replaceWxml(gap, {
3729
- keepEOL: false,
3730
- escapeMap: options.escapeMap,
3731
- ignoreHead: true
3732
- }));
3733
- }
3734
- function updateWxmlSegment(ms, start, end, options, keepEOL, ignoreHead) {
3735
- ms.update(start, end, replaceWxml(ms.slice(start, end), {
3736
- keepEOL,
3737
- escapeMap: options.escapeMap,
3738
- ignoreHead
3739
- }));
3740
- }
3741
- function updateExpressionSegment(ms, exp, options) {
3742
- const code = `{{${generateCode(exp.value.slice(2, -2), options)}}}`;
3743
- ms.update(exp.start, exp.end, code);
3744
- }
3745
- //#endregion
3746
- //#region src/wxml/utils/fragment-updater.ts
3747
- function handleEachClassFragment(ms, tokens, options = {}) {
3748
- let previousEnd = 0;
3749
- for (const token of tokens) {
3750
- if (token.start > previousEnd) updateWhitespaceGap(ms, previousEnd, token.start, options);
3751
- let p = token.start;
3752
- if (token.expressions.length > 0) {
3753
- for (const exp of token.expressions) {
3754
- if (exp.start > token.start && p < exp.start) updateWxmlSegment(ms, p, exp.start, options, true, p > 0);
3755
- updateExpressionSegment(ms, exp, options);
3756
- p = exp.end;
3757
- }
3758
- if (token.end > p) updateWxmlSegment(ms, p, token.end, options, false, true);
3759
- } else updateWxmlSegment(ms, token.start, token.end, options, false, false);
3760
- previousEnd = token.end;
3761
- }
3762
- if (tokens.length > 0) {
3763
- const lastToken = tokens[tokens.length - 1];
3764
- if (!lastToken) return;
3765
- if (lastToken.end < ms.original.length) updateWhitespaceGap(ms, lastToken.end, ms.original.length, options);
3766
- }
3767
- }
3768
- //#endregion
3769
- //#region src/wxml/utils/template-fragments.ts
3770
- /**
3771
- * 模块级共享 Tokenizer 实例,避免每次调用都重新创建。
3772
- * Tokenizer.run() 末尾已调用 reset(),天然支持复用。
3773
- */
3774
- const sharedTokenizer = new Tokenizer();
3775
- function templateReplacer(original, options = {}, tokenizer) {
3776
- const ms = new magic_string.default(original);
3777
- handleEachClassFragment(ms, (tokenizer ?? sharedTokenizer).run(ms.original), options);
3778
- return ms.toString();
3779
- }
3780
- //#endregion
3781
- //#region src/wxml/utils/custom-template.ts
3782
- async function customTemplateHandler(rawSource, options, cachedMatcher) {
3783
- const { customAttributesEntities = [], disabledDefaultTemplateHandler, inlineWxs, runtimeSet, jsHandler } = options ?? {};
3784
- const matchCustomAttribute = cachedMatcher ?? createAttributeMatcher(customAttributesEntities);
3785
- const defaultTemplateHandlerEnabled = !disabledDefaultTemplateHandler;
3786
- let replaceOptions;
3787
- let cachedQuote;
3788
- let s;
3789
- let tag = "";
3790
- let wxsArray;
3791
- function getMagicString() {
3792
- if (!s) s = new magic_string.default(rawSource);
3793
- return s;
3794
- }
3795
- function getReplaceOptions(quote) {
3796
- if (!replaceOptions) {
3797
- replaceOptions = {
3798
- ...options,
3799
- quote
3800
- };
3801
- cachedQuote = quote;
3802
- return replaceOptions;
3803
- }
3804
- if (cachedQuote !== quote) {
3805
- replaceOptions.quote = quote;
3806
- cachedQuote = quote;
3807
- }
3808
- return replaceOptions;
3809
- }
3810
- function isDefaultTemplateAttribute(name) {
3811
- if (name === "class" || name === "hover-class" || name === "virtualhostclass") return true;
3812
- const lowerName = name.toLowerCase();
3813
- return lowerName === "class" || lowerName === "hover-class" || lowerName === "virtualhostclass";
3814
- }
3815
- const parser = new Parser({
3816
- onopentagname(name) {
3817
- tag = name;
3818
- },
3819
- onattribute(name, value, quote) {
3820
- if (!value) return;
3821
- const shouldHandleDefault = defaultTemplateHandlerEnabled && isDefaultTemplateAttribute(name);
3822
- const shouldHandleCustom = matchCustomAttribute?.(tag, name) ?? false;
3823
- if (!shouldHandleDefault && !shouldHandleCustom) return;
3824
- getMagicString().update(parser.startIndex + name.length + 2, parser.endIndex - 1, templateReplacer(value, getReplaceOptions(quote)));
3825
- },
3826
- ontext(data) {
3827
- if (inlineWxs && tag === "wxs") (wxsArray ?? (wxsArray = [])).push({
3828
- data,
3829
- endIndex: parser.endIndex + 1,
3830
- startIndex: parser.startIndex
3831
- });
3832
- },
3833
- onclosetag() {
3834
- tag = "";
3835
- }
3836
- }, { xmlMode: true });
3837
- parser.write(rawSource);
3838
- parser.end();
3839
- if (jsHandler) for (const { data, endIndex, startIndex } of wxsArray ?? []) {
3840
- const { code } = await jsHandler(data, runtimeSet);
3841
- if (code !== data) getMagicString().update(startIndex, endIndex, code);
3842
- }
3843
- return s?.toString() ?? rawSource;
3844
- }
3845
- //#endregion
3846
- //#region src/wxml/utils.ts
3847
- function createTemplateHandler(options = {}) {
3848
- const cachedMatcher = createAttributeMatcher(options.customAttributesEntities);
3849
- const defaultOptions = options;
3850
- let cachedRuntimeSet;
3851
- let cachedOptionsWithRuntimeSet;
3852
- return (rawSource, opt) => {
3853
- const runtimeSet = opt?.runtimeSet;
3854
- if (runtimeSet === void 0) return customTemplateHandler(rawSource, defaultOptions, cachedMatcher);
3855
- if (cachedRuntimeSet !== runtimeSet || !cachedOptionsWithRuntimeSet) {
3856
- cachedRuntimeSet = runtimeSet;
3857
- cachedOptionsWithRuntimeSet = {
3858
- ...defaultOptions,
3859
- runtimeSet
3860
- };
3861
- }
3862
- return customTemplateHandler(rawSource, cachedOptionsWithRuntimeSet, cachedMatcher);
3863
- };
3864
- }
3865
- //#endregion
3866
- Object.defineProperty(exports, "JsTokenUpdater", {
3867
- enumerable: true,
3868
- get: function() {
3869
- return JsTokenUpdater;
3870
- }
3871
- });
3872
- Object.defineProperty(exports, "Parser", {
3873
- enumerable: true,
3874
- get: function() {
3875
- return Parser;
3876
- }
3877
- });
3878
- Object.defineProperty(exports, "_defineProperty", {
3879
- enumerable: true,
3880
- get: function() {
3881
- return _defineProperty;
3882
- }
3883
- });
3884
- Object.defineProperty(exports, "analyzeSource", {
3885
- enumerable: true,
3886
- get: function() {
3887
- return analyzeSource;
3888
- }
3889
- });
3890
- Object.defineProperty(exports, "babelParse", {
3891
- enumerable: true,
3892
- get: function() {
3893
- return babelParse;
3894
- }
3895
- });
3896
- Object.defineProperty(exports, "createAttributeMatcher", {
3897
- enumerable: true,
3898
- get: function() {
3899
- return createAttributeMatcher;
3900
- }
3901
- });
3902
- Object.defineProperty(exports, "createDebug", {
3903
- enumerable: true,
3904
- get: function() {
3905
- return createDebug;
3906
- }
3907
- });
3908
- Object.defineProperty(exports, "createTemplateHandler", {
3909
- enumerable: true,
3910
- get: function() {
3911
- return createTemplateHandler;
3912
- }
3913
- });
3914
- Object.defineProperty(exports, "decodeUnicode2", {
3915
- enumerable: true,
3916
- get: function() {
3917
- return decodeUnicode2;
3918
- }
3919
- });
3920
- Object.defineProperty(exports, "generateCode", {
3921
- enumerable: true,
3922
- get: function() {
3923
- return generateCode;
3924
- }
3925
- });
3926
- Object.defineProperty(exports, "getReplacement", {
3927
- enumerable: true,
3928
- get: function() {
3929
- return getReplacement;
3930
- }
3931
- });
3932
- Object.defineProperty(exports, "getReplacementCacheStore", {
3933
- enumerable: true,
3934
- get: function() {
3935
- return getReplacementCacheStore;
3936
- }
3937
- });
3938
- Object.defineProperty(exports, "isClassContextLiteralPath", {
3939
- enumerable: true,
3940
- get: function() {
3941
- return isClassContextLiteralPath;
3942
- }
3943
- });
3944
- Object.defineProperty(exports, "jsHandler", {
3945
- enumerable: true,
3946
- get: function() {
3947
- return jsHandler;
3948
- }
3949
- });
3950
- Object.defineProperty(exports, "jsStringEscape", {
3951
- enumerable: true,
3952
- get: function() {
3953
- return jsStringEscape;
3954
- }
3955
- });
3956
- Object.defineProperty(exports, "replaceWxml", {
3957
- enumerable: true,
3958
- get: function() {
3959
- return replaceWxml;
3960
- }
3961
- });
3962
- Object.defineProperty(exports, "resolveClassNameTransformWithResult", {
3963
- enumerable: true,
3964
- get: function() {
3965
- return resolveClassNameTransformWithResult;
3966
- }
3967
- });
3968
- Object.defineProperty(exports, "shouldEnableArbitraryValueFallback", {
3969
- enumerable: true,
3970
- get: function() {
3971
- return shouldEnableArbitraryValueFallback;
3972
- }
3973
- });
3974
- Object.defineProperty(exports, "traverse", {
3975
- enumerable: true,
3976
- get: function() {
3977
- return traverse;
3978
- }
3979
- });