@depup/svelte 5.53.3-depup.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 (386) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +41 -0
  3. package/action.d.ts +1 -0
  4. package/animate.d.ts +1 -0
  5. package/compiler/index.js +1 -0
  6. package/compiler/package.json +3 -0
  7. package/compiler.d.ts +1 -0
  8. package/easing.d.ts +1 -0
  9. package/elements.d.ts +2078 -0
  10. package/index.d.ts +1 -0
  11. package/legacy.d.ts +1 -0
  12. package/motion.d.ts +1 -0
  13. package/package.json +185 -0
  14. package/src/animate/index.js +78 -0
  15. package/src/attachments/index.js +113 -0
  16. package/src/compiler/errors.js +1719 -0
  17. package/src/compiler/index.js +198 -0
  18. package/src/compiler/legacy.js +637 -0
  19. package/src/compiler/migrate/index.js +1996 -0
  20. package/src/compiler/phases/1-parse/acorn.js +198 -0
  21. package/src/compiler/phases/1-parse/index.js +326 -0
  22. package/src/compiler/phases/1-parse/read/context.js +116 -0
  23. package/src/compiler/phases/1-parse/read/expression.js +93 -0
  24. package/src/compiler/phases/1-parse/read/options.js +263 -0
  25. package/src/compiler/phases/1-parse/read/script.js +97 -0
  26. package/src/compiler/phases/1-parse/read/style.js +637 -0
  27. package/src/compiler/phases/1-parse/remove_typescript_nodes.js +180 -0
  28. package/src/compiler/phases/1-parse/state/element.js +937 -0
  29. package/src/compiler/phases/1-parse/state/fragment.js +17 -0
  30. package/src/compiler/phases/1-parse/state/tag.js +751 -0
  31. package/src/compiler/phases/1-parse/state/text.js +23 -0
  32. package/src/compiler/phases/1-parse/utils/bracket.js +213 -0
  33. package/src/compiler/phases/1-parse/utils/create.js +16 -0
  34. package/src/compiler/phases/1-parse/utils/entities.js +2234 -0
  35. package/src/compiler/phases/1-parse/utils/fuzzymatch.js +281 -0
  36. package/src/compiler/phases/1-parse/utils/html.js +127 -0
  37. package/src/compiler/phases/2-analyze/css/css-analyze.js +331 -0
  38. package/src/compiler/phases/2-analyze/css/css-prune.js +1206 -0
  39. package/src/compiler/phases/2-analyze/css/css-warn.js +47 -0
  40. package/src/compiler/phases/2-analyze/css/utils.js +177 -0
  41. package/src/compiler/phases/2-analyze/index.js +1300 -0
  42. package/src/compiler/phases/2-analyze/utils/check_graph_for_cycles.js +47 -0
  43. package/src/compiler/phases/2-analyze/visitors/AnimateDirective.js +15 -0
  44. package/src/compiler/phases/2-analyze/visitors/ArrowFunctionExpression.js +11 -0
  45. package/src/compiler/phases/2-analyze/visitors/AssignmentExpression.js +31 -0
  46. package/src/compiler/phases/2-analyze/visitors/AttachTag.js +17 -0
  47. package/src/compiler/phases/2-analyze/visitors/Attribute.js +66 -0
  48. package/src/compiler/phases/2-analyze/visitors/AwaitBlock.js +48 -0
  49. package/src/compiler/phases/2-analyze/visitors/AwaitExpression.js +150 -0
  50. package/src/compiler/phases/2-analyze/visitors/BindDirective.js +280 -0
  51. package/src/compiler/phases/2-analyze/visitors/CallExpression.js +339 -0
  52. package/src/compiler/phases/2-analyze/visitors/ClassBody.js +156 -0
  53. package/src/compiler/phases/2-analyze/visitors/ClassDeclaration.js +25 -0
  54. package/src/compiler/phases/2-analyze/visitors/ClassDirective.js +13 -0
  55. package/src/compiler/phases/2-analyze/visitors/Component.js +26 -0
  56. package/src/compiler/phases/2-analyze/visitors/ConstTag.js +45 -0
  57. package/src/compiler/phases/2-analyze/visitors/DebugTag.js +15 -0
  58. package/src/compiler/phases/2-analyze/visitors/EachBlock.js +97 -0
  59. package/src/compiler/phases/2-analyze/visitors/ExportDefaultDeclaration.js +20 -0
  60. package/src/compiler/phases/2-analyze/visitors/ExportNamedDeclaration.js +70 -0
  61. package/src/compiler/phases/2-analyze/visitors/ExportSpecifier.js +30 -0
  62. package/src/compiler/phases/2-analyze/visitors/ExpressionStatement.js +38 -0
  63. package/src/compiler/phases/2-analyze/visitors/ExpressionTag.js +26 -0
  64. package/src/compiler/phases/2-analyze/visitors/Fragment.js +10 -0
  65. package/src/compiler/phases/2-analyze/visitors/FunctionDeclaration.js +16 -0
  66. package/src/compiler/phases/2-analyze/visitors/FunctionExpression.js +11 -0
  67. package/src/compiler/phases/2-analyze/visitors/HtmlTag.js +19 -0
  68. package/src/compiler/phases/2-analyze/visitors/Identifier.js +194 -0
  69. package/src/compiler/phases/2-analyze/visitors/IfBlock.js +46 -0
  70. package/src/compiler/phases/2-analyze/visitors/ImportDeclaration.js +31 -0
  71. package/src/compiler/phases/2-analyze/visitors/KeyBlock.js +21 -0
  72. package/src/compiler/phases/2-analyze/visitors/LabeledStatement.js +95 -0
  73. package/src/compiler/phases/2-analyze/visitors/LetDirective.js +24 -0
  74. package/src/compiler/phases/2-analyze/visitors/Literal.js +14 -0
  75. package/src/compiler/phases/2-analyze/visitors/MemberExpression.js +28 -0
  76. package/src/compiler/phases/2-analyze/visitors/NewExpression.js +17 -0
  77. package/src/compiler/phases/2-analyze/visitors/OnDirective.js +28 -0
  78. package/src/compiler/phases/2-analyze/visitors/PropertyDefinition.js +21 -0
  79. package/src/compiler/phases/2-analyze/visitors/RegularElement.js +240 -0
  80. package/src/compiler/phases/2-analyze/visitors/RenderTag.js +68 -0
  81. package/src/compiler/phases/2-analyze/visitors/SlotElement.js +42 -0
  82. package/src/compiler/phases/2-analyze/visitors/SnippetBlock.js +113 -0
  83. package/src/compiler/phases/2-analyze/visitors/SpreadAttribute.js +13 -0
  84. package/src/compiler/phases/2-analyze/visitors/SpreadElement.js +16 -0
  85. package/src/compiler/phases/2-analyze/visitors/StyleDirective.js +39 -0
  86. package/src/compiler/phases/2-analyze/visitors/SvelteBody.js +22 -0
  87. package/src/compiler/phases/2-analyze/visitors/SvelteBoundary.js +30 -0
  88. package/src/compiler/phases/2-analyze/visitors/SvelteComponent.js +18 -0
  89. package/src/compiler/phases/2-analyze/visitors/SvelteDocument.js +24 -0
  90. package/src/compiler/phases/2-analyze/visitors/SvelteElement.js +78 -0
  91. package/src/compiler/phases/2-analyze/visitors/SvelteFragment.js +27 -0
  92. package/src/compiler/phases/2-analyze/visitors/SvelteHead.js +18 -0
  93. package/src/compiler/phases/2-analyze/visitors/SvelteSelf.js +36 -0
  94. package/src/compiler/phases/2-analyze/visitors/SvelteWindow.js +24 -0
  95. package/src/compiler/phases/2-analyze/visitors/TaggedTemplateExpression.js +16 -0
  96. package/src/compiler/phases/2-analyze/visitors/TemplateElement.js +12 -0
  97. package/src/compiler/phases/2-analyze/visitors/Text.js +52 -0
  98. package/src/compiler/phases/2-analyze/visitors/TitleElement.js +21 -0
  99. package/src/compiler/phases/2-analyze/visitors/TransitionDirective.js +19 -0
  100. package/src/compiler/phases/2-analyze/visitors/UpdateExpression.js +29 -0
  101. package/src/compiler/phases/2-analyze/visitors/UseDirective.js +18 -0
  102. package/src/compiler/phases/2-analyze/visitors/VariableDeclarator.js +160 -0
  103. package/src/compiler/phases/2-analyze/visitors/shared/a11y/constants.js +334 -0
  104. package/src/compiler/phases/2-analyze/visitors/shared/a11y/index.js +981 -0
  105. package/src/compiler/phases/2-analyze/visitors/shared/attribute.js +125 -0
  106. package/src/compiler/phases/2-analyze/visitors/shared/component.js +177 -0
  107. package/src/compiler/phases/2-analyze/visitors/shared/element.js +160 -0
  108. package/src/compiler/phases/2-analyze/visitors/shared/fragment.js +15 -0
  109. package/src/compiler/phases/2-analyze/visitors/shared/function.js +24 -0
  110. package/src/compiler/phases/2-analyze/visitors/shared/snippets.js +17 -0
  111. package/src/compiler/phases/2-analyze/visitors/shared/special-element.js +16 -0
  112. package/src/compiler/phases/2-analyze/visitors/shared/utils.js +301 -0
  113. package/src/compiler/phases/3-transform/client/transform-client.js +719 -0
  114. package/src/compiler/phases/3-transform/client/transform-template/fix-attribute-casing.js +18 -0
  115. package/src/compiler/phases/3-transform/client/transform-template/index.js +67 -0
  116. package/src/compiler/phases/3-transform/client/transform-template/template.js +164 -0
  117. package/src/compiler/phases/3-transform/client/utils.js +181 -0
  118. package/src/compiler/phases/3-transform/client/visitors/AnimateDirective.js +38 -0
  119. package/src/compiler/phases/3-transform/client/visitors/ArrowFunctionExpression.js +11 -0
  120. package/src/compiler/phases/3-transform/client/visitors/AssignmentExpression.js +247 -0
  121. package/src/compiler/phases/3-transform/client/visitors/AttachTag.js +26 -0
  122. package/src/compiler/phases/3-transform/client/visitors/Attribute.js +14 -0
  123. package/src/compiler/phases/3-transform/client/visitors/AwaitBlock.js +124 -0
  124. package/src/compiler/phases/3-transform/client/visitors/AwaitExpression.js +25 -0
  125. package/src/compiler/phases/3-transform/client/visitors/BinaryExpression.js +34 -0
  126. package/src/compiler/phases/3-transform/client/visitors/BindDirective.js +290 -0
  127. package/src/compiler/phases/3-transform/client/visitors/BlockStatement.js +32 -0
  128. package/src/compiler/phases/3-transform/client/visitors/BreakStatement.js +20 -0
  129. package/src/compiler/phases/3-transform/client/visitors/CallExpression.js +136 -0
  130. package/src/compiler/phases/3-transform/client/visitors/ClassBody.js +111 -0
  131. package/src/compiler/phases/3-transform/client/visitors/Comment.js +11 -0
  132. package/src/compiler/phases/3-transform/client/visitors/Component.js +12 -0
  133. package/src/compiler/phases/3-transform/client/visitors/ConstTag.js +134 -0
  134. package/src/compiler/phases/3-transform/client/visitors/DebugTag.js +28 -0
  135. package/src/compiler/phases/3-transform/client/visitors/EachBlock.js +362 -0
  136. package/src/compiler/phases/3-transform/client/visitors/ExportNamedDeclaration.js +19 -0
  137. package/src/compiler/phases/3-transform/client/visitors/ExpressionStatement.js +20 -0
  138. package/src/compiler/phases/3-transform/client/visitors/ForOfStatement.js +25 -0
  139. package/src/compiler/phases/3-transform/client/visitors/Fragment.js +186 -0
  140. package/src/compiler/phases/3-transform/client/visitors/FunctionDeclaration.js +12 -0
  141. package/src/compiler/phases/3-transform/client/visitors/FunctionExpression.js +11 -0
  142. package/src/compiler/phases/3-transform/client/visitors/HtmlTag.js +53 -0
  143. package/src/compiler/phases/3-transform/client/visitors/Identifier.js +45 -0
  144. package/src/compiler/phases/3-transform/client/visitors/IfBlock.js +131 -0
  145. package/src/compiler/phases/3-transform/client/visitors/KeyBlock.js +45 -0
  146. package/src/compiler/phases/3-transform/client/visitors/LabeledStatement.js +64 -0
  147. package/src/compiler/phases/3-transform/client/visitors/LetDirective.js +55 -0
  148. package/src/compiler/phases/3-transform/client/visitors/MemberExpression.js +23 -0
  149. package/src/compiler/phases/3-transform/client/visitors/OnDirective.js +38 -0
  150. package/src/compiler/phases/3-transform/client/visitors/Program.js +153 -0
  151. package/src/compiler/phases/3-transform/client/visitors/RegularElement.js +725 -0
  152. package/src/compiler/phases/3-transform/client/visitors/RenderTag.js +95 -0
  153. package/src/compiler/phases/3-transform/client/visitors/SlotElement.js +94 -0
  154. package/src/compiler/phases/3-transform/client/visitors/SnippetBlock.js +94 -0
  155. package/src/compiler/phases/3-transform/client/visitors/SpreadAttribute.js +10 -0
  156. package/src/compiler/phases/3-transform/client/visitors/SvelteBody.js +11 -0
  157. package/src/compiler/phases/3-transform/client/visitors/SvelteBoundary.js +126 -0
  158. package/src/compiler/phases/3-transform/client/visitors/SvelteComponent.js +13 -0
  159. package/src/compiler/phases/3-transform/client/visitors/SvelteDocument.js +11 -0
  160. package/src/compiler/phases/3-transform/client/visitors/SvelteElement.js +161 -0
  161. package/src/compiler/phases/3-transform/client/visitors/SvelteFragment.js +17 -0
  162. package/src/compiler/phases/3-transform/client/visitors/SvelteHead.js +23 -0
  163. package/src/compiler/phases/3-transform/client/visitors/SvelteSelf.js +13 -0
  164. package/src/compiler/phases/3-transform/client/visitors/SvelteWindow.js +11 -0
  165. package/src/compiler/phases/3-transform/client/visitors/TitleElement.js +48 -0
  166. package/src/compiler/phases/3-transform/client/visitors/TransitionDirective.js +41 -0
  167. package/src/compiler/phases/3-transform/client/visitors/UpdateExpression.js +55 -0
  168. package/src/compiler/phases/3-transform/client/visitors/UseDirective.js +49 -0
  169. package/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js +422 -0
  170. package/src/compiler/phases/3-transform/client/visitors/shared/component.js +536 -0
  171. package/src/compiler/phases/3-transform/client/visitors/shared/declarations.js +53 -0
  172. package/src/compiler/phases/3-transform/client/visitors/shared/element.js +263 -0
  173. package/src/compiler/phases/3-transform/client/visitors/shared/events.js +180 -0
  174. package/src/compiler/phases/3-transform/client/visitors/shared/fragment.js +185 -0
  175. package/src/compiler/phases/3-transform/client/visitors/shared/function.js +17 -0
  176. package/src/compiler/phases/3-transform/client/visitors/shared/special_element.js +22 -0
  177. package/src/compiler/phases/3-transform/client/visitors/shared/utils.js +513 -0
  178. package/src/compiler/phases/3-transform/css/index.js +479 -0
  179. package/src/compiler/phases/3-transform/index.js +118 -0
  180. package/src/compiler/phases/3-transform/server/transform-server.js +428 -0
  181. package/src/compiler/phases/3-transform/server/visitors/AssignmentExpression.js +124 -0
  182. package/src/compiler/phases/3-transform/server/visitors/AwaitBlock.js +36 -0
  183. package/src/compiler/phases/3-transform/server/visitors/AwaitExpression.js +40 -0
  184. package/src/compiler/phases/3-transform/server/visitors/CallExpression.js +71 -0
  185. package/src/compiler/phases/3-transform/server/visitors/ClassBody.js +81 -0
  186. package/src/compiler/phases/3-transform/server/visitors/Component.js +13 -0
  187. package/src/compiler/phases/3-transform/server/visitors/ConstTag.js +49 -0
  188. package/src/compiler/phases/3-transform/server/visitors/DebugTag.js +24 -0
  189. package/src/compiler/phases/3-transform/server/visitors/EachBlock.js +76 -0
  190. package/src/compiler/phases/3-transform/server/visitors/ExpressionStatement.js +23 -0
  191. package/src/compiler/phases/3-transform/server/visitors/Fragment.js +53 -0
  192. package/src/compiler/phases/3-transform/server/visitors/HtmlTag.js +25 -0
  193. package/src/compiler/phases/3-transform/server/visitors/Identifier.js +24 -0
  194. package/src/compiler/phases/3-transform/server/visitors/IfBlock.js +48 -0
  195. package/src/compiler/phases/3-transform/server/visitors/KeyBlock.js +22 -0
  196. package/src/compiler/phases/3-transform/server/visitors/LabeledStatement.js +24 -0
  197. package/src/compiler/phases/3-transform/server/visitors/MemberExpression.js +19 -0
  198. package/src/compiler/phases/3-transform/server/visitors/Program.js +25 -0
  199. package/src/compiler/phases/3-transform/server/visitors/PropertyDefinition.js +37 -0
  200. package/src/compiler/phases/3-transform/server/visitors/RegularElement.js +216 -0
  201. package/src/compiler/phases/3-transform/server/visitors/RenderTag.js +45 -0
  202. package/src/compiler/phases/3-transform/server/visitors/SlotElement.js +68 -0
  203. package/src/compiler/phases/3-transform/server/visitors/SnippetBlock.js +29 -0
  204. package/src/compiler/phases/3-transform/server/visitors/SpreadAttribute.js +10 -0
  205. package/src/compiler/phases/3-transform/server/visitors/SvelteBoundary.js +139 -0
  206. package/src/compiler/phases/3-transform/server/visitors/SvelteComponent.js +12 -0
  207. package/src/compiler/phases/3-transform/server/visitors/SvelteElement.js +89 -0
  208. package/src/compiler/phases/3-transform/server/visitors/SvelteFragment.js +11 -0
  209. package/src/compiler/phases/3-transform/server/visitors/SvelteHead.js +25 -0
  210. package/src/compiler/phases/3-transform/server/visitors/SvelteSelf.js +12 -0
  211. package/src/compiler/phases/3-transform/server/visitors/TitleElement.js +21 -0
  212. package/src/compiler/phases/3-transform/server/visitors/UpdateExpression.js +35 -0
  213. package/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js +247 -0
  214. package/src/compiler/phases/3-transform/server/visitors/shared/component.js +359 -0
  215. package/src/compiler/phases/3-transform/server/visitors/shared/element.js +557 -0
  216. package/src/compiler/phases/3-transform/server/visitors/shared/utils.js +408 -0
  217. package/src/compiler/phases/3-transform/shared/assignments.js +92 -0
  218. package/src/compiler/phases/3-transform/shared/transform-async.js +114 -0
  219. package/src/compiler/phases/3-transform/utils.js +451 -0
  220. package/src/compiler/phases/bindings.js +227 -0
  221. package/src/compiler/phases/css.js +14 -0
  222. package/src/compiler/phases/nodes.js +258 -0
  223. package/src/compiler/phases/patterns.js +27 -0
  224. package/src/compiler/phases/scope.js +1432 -0
  225. package/src/compiler/preprocess/decode_sourcemap.js +96 -0
  226. package/src/compiler/preprocess/index.js +368 -0
  227. package/src/compiler/preprocess/replace_in_code.js +72 -0
  228. package/src/compiler/print/index.js +911 -0
  229. package/src/compiler/state.js +144 -0
  230. package/src/compiler/utils/assert.js +9 -0
  231. package/src/compiler/utils/ast.js +639 -0
  232. package/src/compiler/utils/builders.js +698 -0
  233. package/src/compiler/utils/compile_diagnostic.js +107 -0
  234. package/src/compiler/utils/extract_svelte_ignore.js +104 -0
  235. package/src/compiler/utils/mapped_code.js +454 -0
  236. package/src/compiler/utils/push_array.js +13 -0
  237. package/src/compiler/utils/sanitize_template_string.js +7 -0
  238. package/src/compiler/utils/slot.js +20 -0
  239. package/src/compiler/utils/string.js +9 -0
  240. package/src/compiler/validate-options.js +324 -0
  241. package/src/compiler/warnings.js +845 -0
  242. package/src/constants.js +66 -0
  243. package/src/easing/index.js +286 -0
  244. package/src/escaping.js +26 -0
  245. package/src/events/index.js +1 -0
  246. package/src/html-tree-validation.js +238 -0
  247. package/src/index-client.js +255 -0
  248. package/src/index-server.js +56 -0
  249. package/src/internal/client/constants.js +77 -0
  250. package/src/internal/client/context.js +258 -0
  251. package/src/internal/client/dev/assign.js +79 -0
  252. package/src/internal/client/dev/console-log.js +37 -0
  253. package/src/internal/client/dev/css.js +31 -0
  254. package/src/internal/client/dev/debug.js +500 -0
  255. package/src/internal/client/dev/elements.js +63 -0
  256. package/src/internal/client/dev/equality.js +101 -0
  257. package/src/internal/client/dev/hmr.js +89 -0
  258. package/src/internal/client/dev/inspect.js +72 -0
  259. package/src/internal/client/dev/legacy.js +25 -0
  260. package/src/internal/client/dev/ownership.js +81 -0
  261. package/src/internal/client/dev/tracing.js +162 -0
  262. package/src/internal/client/dev/validation.js +16 -0
  263. package/src/internal/client/dom/blocks/async.js +71 -0
  264. package/src/internal/client/dom/blocks/await.js +142 -0
  265. package/src/internal/client/dom/blocks/boundary.js +534 -0
  266. package/src/internal/client/dom/blocks/branches.js +227 -0
  267. package/src/internal/client/dom/blocks/css-props.js +28 -0
  268. package/src/internal/client/dom/blocks/each.js +723 -0
  269. package/src/internal/client/dom/blocks/html.js +128 -0
  270. package/src/internal/client/dom/blocks/if.js +82 -0
  271. package/src/internal/client/dom/blocks/key.js +40 -0
  272. package/src/internal/client/dom/blocks/slot.js +44 -0
  273. package/src/internal/client/dom/blocks/snippet.js +103 -0
  274. package/src/internal/client/dom/blocks/svelte-component.js +61 -0
  275. package/src/internal/client/dom/blocks/svelte-element.js +152 -0
  276. package/src/internal/client/dom/blocks/svelte-head.js +61 -0
  277. package/src/internal/client/dom/css.js +33 -0
  278. package/src/internal/client/dom/elements/actions.js +43 -0
  279. package/src/internal/client/dom/elements/attachments.js +33 -0
  280. package/src/internal/client/dom/elements/attributes.js +657 -0
  281. package/src/internal/client/dom/elements/bindings/document.js +17 -0
  282. package/src/internal/client/dom/elements/bindings/input.js +312 -0
  283. package/src/internal/client/dom/elements/bindings/media.js +233 -0
  284. package/src/internal/client/dom/elements/bindings/navigator.js +11 -0
  285. package/src/internal/client/dom/elements/bindings/props.js +22 -0
  286. package/src/internal/client/dom/elements/bindings/select.js +159 -0
  287. package/src/internal/client/dom/elements/bindings/shared.js +76 -0
  288. package/src/internal/client/dom/elements/bindings/size.js +107 -0
  289. package/src/internal/client/dom/elements/bindings/this.js +61 -0
  290. package/src/internal/client/dom/elements/bindings/universal.js +75 -0
  291. package/src/internal/client/dom/elements/bindings/window.js +66 -0
  292. package/src/internal/client/dom/elements/class.js +51 -0
  293. package/src/internal/client/dom/elements/custom-element.js +344 -0
  294. package/src/internal/client/dom/elements/customizable-select.js +99 -0
  295. package/src/internal/client/dom/elements/events.js +355 -0
  296. package/src/internal/client/dom/elements/misc.js +58 -0
  297. package/src/internal/client/dom/elements/style.js +57 -0
  298. package/src/internal/client/dom/elements/transitions.js +471 -0
  299. package/src/internal/client/dom/hydration.js +125 -0
  300. package/src/internal/client/dom/legacy/event-modifiers.js +127 -0
  301. package/src/internal/client/dom/legacy/lifecycle.js +82 -0
  302. package/src/internal/client/dom/legacy/misc.js +68 -0
  303. package/src/internal/client/dom/operations.js +293 -0
  304. package/src/internal/client/dom/reconciler.js +25 -0
  305. package/src/internal/client/dom/task.js +42 -0
  306. package/src/internal/client/dom/template.js +401 -0
  307. package/src/internal/client/error-handling.js +118 -0
  308. package/src/internal/client/errors.js +510 -0
  309. package/src/internal/client/hydratable.js +33 -0
  310. package/src/internal/client/index.js +183 -0
  311. package/src/internal/client/legacy.js +46 -0
  312. package/src/internal/client/loop.js +48 -0
  313. package/src/internal/client/proxy.js +432 -0
  314. package/src/internal/client/reactivity/async.js +306 -0
  315. package/src/internal/client/reactivity/batch.js +1057 -0
  316. package/src/internal/client/reactivity/deriveds.js +426 -0
  317. package/src/internal/client/reactivity/effects.js +718 -0
  318. package/src/internal/client/reactivity/equality.js +31 -0
  319. package/src/internal/client/reactivity/props.js +430 -0
  320. package/src/internal/client/reactivity/sources.js +370 -0
  321. package/src/internal/client/reactivity/status.js +25 -0
  322. package/src/internal/client/reactivity/store.js +203 -0
  323. package/src/internal/client/reactivity/utils.js +40 -0
  324. package/src/internal/client/render.js +335 -0
  325. package/src/internal/client/runtime.js +827 -0
  326. package/src/internal/client/timing.js +16 -0
  327. package/src/internal/client/validate.js +54 -0
  328. package/src/internal/client/warnings.js +271 -0
  329. package/src/internal/disclose-version.js +6 -0
  330. package/src/internal/flags/async.js +3 -0
  331. package/src/internal/flags/index.js +23 -0
  332. package/src/internal/flags/legacy.js +3 -0
  333. package/src/internal/flags/tracing.js +3 -0
  334. package/src/internal/index.js +5 -0
  335. package/src/internal/server/abort-signal.js +13 -0
  336. package/src/internal/server/blocks/html.js +11 -0
  337. package/src/internal/server/blocks/snippet.js +24 -0
  338. package/src/internal/server/context.js +132 -0
  339. package/src/internal/server/crypto.js +45 -0
  340. package/src/internal/server/dev.js +115 -0
  341. package/src/internal/server/errors.js +131 -0
  342. package/src/internal/server/hydratable.js +142 -0
  343. package/src/internal/server/hydration.js +6 -0
  344. package/src/internal/server/index.js +544 -0
  345. package/src/internal/server/render-context.js +86 -0
  346. package/src/internal/server/renderer.js +923 -0
  347. package/src/internal/server/warnings.js +29 -0
  348. package/src/internal/shared/attributes.js +225 -0
  349. package/src/internal/shared/clone.js +137 -0
  350. package/src/internal/shared/dev.js +65 -0
  351. package/src/internal/shared/errors.js +134 -0
  352. package/src/internal/shared/utils.js +144 -0
  353. package/src/internal/shared/validate.js +47 -0
  354. package/src/internal/shared/warnings.js +40 -0
  355. package/src/legacy/legacy-client.js +281 -0
  356. package/src/legacy/legacy-server.js +112 -0
  357. package/src/motion/index.js +32 -0
  358. package/src/motion/spring.js +369 -0
  359. package/src/motion/tweened.js +306 -0
  360. package/src/motion/utils.js +7 -0
  361. package/src/reactivity/create-subscriber.js +95 -0
  362. package/src/reactivity/date.js +118 -0
  363. package/src/reactivity/index-client.js +7 -0
  364. package/src/reactivity/index-server.js +23 -0
  365. package/src/reactivity/map.js +273 -0
  366. package/src/reactivity/media-query.js +55 -0
  367. package/src/reactivity/reactive-value.js +24 -0
  368. package/src/reactivity/set.js +213 -0
  369. package/src/reactivity/url-search-params.js +174 -0
  370. package/src/reactivity/url.js +205 -0
  371. package/src/reactivity/window/index.js +161 -0
  372. package/src/server/index.js +1 -0
  373. package/src/store/index-client.js +169 -0
  374. package/src/store/index-server.js +101 -0
  375. package/src/store/shared/index.js +209 -0
  376. package/src/store/utils.js +36 -0
  377. package/src/transition/index.js +300 -0
  378. package/src/utils.js +504 -0
  379. package/src/version.js +8 -0
  380. package/store.d.ts +1 -0
  381. package/svelte-html.d.ts +245 -0
  382. package/transition.d.ts +1 -0
  383. package/types/compiler/interfaces.d.ts +1 -0
  384. package/types/compiler/preprocess.d.ts +1 -0
  385. package/types/index.d.ts +3744 -0
  386. package/types/index.d.ts.map +280 -0
@@ -0,0 +1,186 @@
1
+ /** @import { Expression, Statement } from 'estree' */
2
+ /** @import { AST } from '#compiler' */
3
+ /** @import { ComponentClientTransformState, ComponentContext } from '../types' */
4
+ import * as b from '#compiler/builders';
5
+ import { TEMPLATE_FRAGMENT, TEMPLATE_USE_IMPORT_NODE } from '../../../../../constants.js';
6
+ import { clean_nodes, infer_namespace } from '../../utils.js';
7
+ import { transform_template } from '../transform-template/index.js';
8
+ import { Template } from '../transform-template/template.js';
9
+ import { process_children } from './shared/fragment.js';
10
+ import { build_render_statement, Memoizer } from './shared/utils.js';
11
+
12
+ /**
13
+ * @param {AST.Fragment} node
14
+ * @param {ComponentContext} context
15
+ */
16
+ export function Fragment(node, context) {
17
+ // Creates a new block which looks roughly like this:
18
+ // ```js
19
+ // // hoisted:
20
+ // const block_name = $.from_html(`...`);
21
+ //
22
+ // // for the main block:
23
+ // const id = block_name();
24
+ // // init stuff and possibly render effect
25
+ // $.append($$anchor, id);
26
+ // ```
27
+ // Adds the hoisted parts to `context.state.hoisted` and returns the statements of the main block.
28
+
29
+ const parent = context.path.at(-1) ?? node;
30
+
31
+ const namespace = infer_namespace(context.state.metadata.namespace, parent, node.nodes);
32
+
33
+ const { hoisted, trimmed, is_standalone, is_text_first } = clean_nodes(
34
+ parent,
35
+ node.nodes,
36
+ context.path,
37
+ namespace,
38
+ context.state,
39
+ context.state.preserve_whitespace,
40
+ context.state.options.preserveComments
41
+ );
42
+
43
+ if (hoisted.length === 0 && trimmed.length === 0) {
44
+ return b.block([]);
45
+ }
46
+
47
+ const is_single_element = trimmed.length === 1 && trimmed[0].type === 'RegularElement';
48
+ const is_single_child_not_needing_template =
49
+ trimmed.length === 1 &&
50
+ (trimmed[0].type === 'SvelteFragment' ||
51
+ trimmed[0].type === 'TitleElement' ||
52
+ (trimmed[0].type === 'IfBlock' &&
53
+ trimmed[0].elseif &&
54
+ /** @type {AST.IfBlock} */ (parent).metadata.flattened?.includes(trimmed[0])));
55
+ const template_name = context.state.scope.root.unique('root'); // TODO infer name from parent
56
+
57
+ /** @type {Statement[]} */
58
+ const body = [];
59
+
60
+ /** @type {Statement | undefined} */
61
+ let close = undefined;
62
+
63
+ /** @type {ComponentClientTransformState} */
64
+ const state = {
65
+ ...context.state,
66
+ init: [],
67
+ snippets: [],
68
+ consts: [],
69
+ let_directives: [],
70
+ update: [],
71
+ after_update: [],
72
+ memoizer: new Memoizer(),
73
+ template: new Template(),
74
+ transform: { ...context.state.transform },
75
+ metadata: {
76
+ namespace,
77
+ bound_contenteditable: context.state.metadata.bound_contenteditable
78
+ },
79
+ async_consts: undefined
80
+ };
81
+
82
+ for (const node of hoisted) {
83
+ context.visit(node, state);
84
+ }
85
+
86
+ if (is_single_element) {
87
+ const element = /** @type {AST.RegularElement} */ (trimmed[0]);
88
+
89
+ const id = b.id(context.state.scope.generate(element.name), element.name_loc);
90
+
91
+ context.visit(element, {
92
+ ...state,
93
+ node: id
94
+ });
95
+
96
+ let flags = state.template.needs_import_node ? TEMPLATE_USE_IMPORT_NODE : undefined;
97
+
98
+ const template = transform_template(state, namespace, flags);
99
+ state.hoisted.push(b.var(template_name, template));
100
+
101
+ state.init.unshift(b.var(id, b.call(template_name)));
102
+ close = b.stmt(b.call('$.append', b.id('$$anchor'), id));
103
+ } else if (is_single_child_not_needing_template) {
104
+ context.visit(trimmed[0], state);
105
+ } else if (trimmed.length === 1 && trimmed[0].type === 'Text') {
106
+ const id = b.id(context.state.scope.generate('text'));
107
+ state.init.unshift(b.var(id, b.call('$.text', b.literal(trimmed[0].data))));
108
+ close = b.stmt(b.call('$.append', b.id('$$anchor'), id));
109
+ } else if (trimmed.length > 0) {
110
+ const id = b.id(context.state.scope.generate('fragment'));
111
+
112
+ const use_space_template =
113
+ trimmed.some((node) => node.type === 'ExpressionTag') &&
114
+ trimmed.every((node) => node.type === 'Text' || node.type === 'ExpressionTag');
115
+
116
+ if (use_space_template) {
117
+ // special case — we can use `$.text` instead of creating a unique template
118
+ const id = b.id(context.state.scope.generate('text'));
119
+
120
+ process_children(trimmed, () => id, false, {
121
+ ...context,
122
+ state
123
+ });
124
+
125
+ state.init.unshift(b.var(id, b.call('$.text')));
126
+ close = b.stmt(b.call('$.append', b.id('$$anchor'), id));
127
+ } else if (is_standalone) {
128
+ // no need to create a template, we can just use the existing block's anchor
129
+ process_children(trimmed, () => b.id('$$anchor'), false, {
130
+ ...context,
131
+ state: { ...state, is_standalone }
132
+ });
133
+ } else {
134
+ /** @type {(is_text: boolean) => Expression} */
135
+ const expression = (is_text) => b.call('$.first_child', id, is_text && b.true);
136
+
137
+ process_children(trimmed, expression, false, { ...context, state });
138
+
139
+ let flags = TEMPLATE_FRAGMENT;
140
+
141
+ if (state.template.needs_import_node) {
142
+ flags |= TEMPLATE_USE_IMPORT_NODE;
143
+ }
144
+
145
+ if (state.template.nodes.length === 1 && state.template.nodes[0].type === 'comment') {
146
+ // special case — we can use `$.comment` instead of creating a unique template
147
+ state.init.unshift(b.var(id, b.call('$.comment')));
148
+ } else {
149
+ const template = transform_template(state, namespace, flags);
150
+ state.hoisted.push(b.var(template_name, template));
151
+
152
+ state.init.unshift(b.var(id, b.call(template_name)));
153
+ }
154
+
155
+ close = b.stmt(b.call('$.append', b.id('$$anchor'), id));
156
+ }
157
+ }
158
+
159
+ body.push(...state.snippets, ...state.let_directives, ...state.consts);
160
+
161
+ if (state.async_consts && state.async_consts.thunks.length > 0) {
162
+ body.push(b.var(state.async_consts.id, b.call('$.run', b.array(state.async_consts.thunks))));
163
+ }
164
+
165
+ if (is_text_first) {
166
+ // skip over inserted comment
167
+ body.push(b.stmt(b.call('$.next')));
168
+ }
169
+
170
+ body.push(...state.init);
171
+
172
+ if (state.update.length > 0) {
173
+ body.push(build_render_statement(state));
174
+ }
175
+
176
+ body.push(...state.after_update);
177
+
178
+ if (close !== undefined) {
179
+ // It's important that close is the last statement in the block, as any previous statements
180
+ // could contain element insertions into the template, which the close statement needs to
181
+ // know of when constructing the list of current inner elements.
182
+ body.push(close);
183
+ }
184
+
185
+ return b.block(body);
186
+ }
@@ -0,0 +1,12 @@
1
+ /** @import { FunctionDeclaration } from 'estree' */
2
+ /** @import { ComponentContext } from '../types' */
3
+
4
+ /**
5
+ * @param {FunctionDeclaration} node
6
+ * @param {ComponentContext} context
7
+ */
8
+ export function FunctionDeclaration(node, context) {
9
+ const state = { ...context.state, in_constructor: false, in_derived: false };
10
+
11
+ context.next(state);
12
+ }
@@ -0,0 +1,11 @@
1
+ /** @import { FunctionExpression } from 'estree' */
2
+ /** @import { ComponentContext } from '../types' */
3
+ import { visit_function } from './shared/function.js';
4
+
5
+ /**
6
+ * @param {FunctionExpression} node
7
+ * @param {ComponentContext} context
8
+ */
9
+ export function FunctionExpression(node, context) {
10
+ return visit_function(node, context);
11
+ }
@@ -0,0 +1,53 @@
1
+ /** @import { AST } from '#compiler' */
2
+ /** @import { ComponentContext } from '../types' */
3
+ import { is_ignored } from '../../../../state.js';
4
+ import * as b from '#compiler/builders';
5
+ import { build_expression } from './shared/utils.js';
6
+
7
+ /**
8
+ * @param {AST.HtmlTag} node
9
+ * @param {ComponentContext} context
10
+ */
11
+ export function HtmlTag(node, context) {
12
+ context.state.template.push_comment();
13
+
14
+ const has_await = node.metadata.expression.has_await;
15
+ const has_blockers = node.metadata.expression.has_blockers();
16
+
17
+ const expression = build_expression(context, node.expression, node.metadata.expression);
18
+ const html = has_await ? b.call('$.get', b.id('$$html')) : expression;
19
+
20
+ const is_svg = context.state.metadata.namespace === 'svg';
21
+ const is_mathml = context.state.metadata.namespace === 'mathml';
22
+
23
+ const statement = b.stmt(
24
+ b.call(
25
+ '$.html',
26
+ context.state.node,
27
+ b.thunk(html),
28
+ is_svg && b.true,
29
+ is_mathml && b.true,
30
+ is_ignored(node, 'hydration_html_changed') && b.true
31
+ )
32
+ );
33
+
34
+ // push into init, so that bindings run afterwards, which might trigger another run and override hydration
35
+ if (has_await || has_blockers) {
36
+ context.state.init.push(
37
+ b.stmt(
38
+ b.call(
39
+ '$.async',
40
+ context.state.node,
41
+ node.metadata.expression.blockers(),
42
+ has_await ? b.array([b.thunk(expression, true)]) : b.void0,
43
+ b.arrow(
44
+ has_await ? [context.state.node, b.id('$$html')] : [context.state.node],
45
+ b.block([statement])
46
+ )
47
+ )
48
+ )
49
+ );
50
+ } else {
51
+ context.state.init.push(statement);
52
+ }
53
+ }
@@ -0,0 +1,45 @@
1
+ /** @import { Identifier, Node } from 'estree' */
2
+ /** @import { Context } from '../types' */
3
+ import is_reference from 'is-reference';
4
+ import * as b from '#compiler/builders';
5
+ import { build_getter } from '../utils.js';
6
+
7
+ /**
8
+ * @param {Identifier} node
9
+ * @param {Context} context
10
+ */
11
+ export function Identifier(node, context) {
12
+ const parent = /** @type {Node} */ (context.path.at(-1));
13
+
14
+ if (is_reference(node, parent)) {
15
+ if (node.name === '$$props') {
16
+ return b.id('$$sanitized_props');
17
+ }
18
+
19
+ // Optimize prop access: If it's a member read access, we can use the $$props object directly
20
+ const binding = context.state.scope.get(node.name);
21
+ if (
22
+ context.state.analysis.runes && // can't do this in legacy mode because the proxy does more than just read/write
23
+ binding !== null &&
24
+ node !== binding.node &&
25
+ binding.kind === 'rest_prop'
26
+ ) {
27
+ const grand_parent = context.path.at(-2);
28
+
29
+ if (
30
+ parent?.type === 'MemberExpression' &&
31
+ !parent.computed &&
32
+ grand_parent?.type !== 'AssignmentExpression' &&
33
+ grand_parent?.type !== 'UpdateExpression'
34
+ ) {
35
+ const key = /** @type {Identifier} */ (parent.property);
36
+
37
+ if (!binding.metadata?.exclude_props?.includes(key.name)) {
38
+ return b.id('$$props');
39
+ }
40
+ }
41
+ }
42
+
43
+ return build_getter(node, context.state);
44
+ }
45
+ }
@@ -0,0 +1,131 @@
1
+ /** @import { BlockStatement, Expression, IfStatement, Statement } from 'estree' */
2
+ /** @import { AST } from '#compiler' */
3
+ /** @import { ComponentContext } from '../types' */
4
+ import * as b from '#compiler/builders';
5
+ import { build_expression, add_svelte_meta } from './shared/utils.js';
6
+
7
+ /**
8
+ * @param {AST.IfBlock} node
9
+ * @param {ComponentContext} context
10
+ */
11
+ export function IfBlock(node, context) {
12
+ context.state.template.push_comment();
13
+
14
+ /** @type {Statement[]} */
15
+ const statements = [];
16
+
17
+ const has_await = node.metadata.expression.has_await;
18
+ const has_blockers = node.metadata.expression.has_blockers();
19
+ const expression = build_expression(context, node.test, node.metadata.expression);
20
+
21
+ // Build the if/else-if/else chain
22
+ let index = 0;
23
+ /** @type {IfStatement | undefined} */
24
+ let first_if;
25
+ /** @type {IfStatement | undefined} */
26
+ let last_if;
27
+ /** @type {AST.IfBlock | undefined} */
28
+ let last_alt;
29
+
30
+ for (const branch of [node, ...(node.metadata.flattened ?? [])]) {
31
+ const consequent = /** @type {BlockStatement} */ (context.visit(branch.consequent));
32
+ const consequent_id = b.id(context.state.scope.generate('consequent'));
33
+ statements.push(b.var(consequent_id, b.arrow([b.id('$$anchor')], consequent)));
34
+
35
+ // Build the test expression for this branch
36
+ /** @type {Expression} */
37
+ let test;
38
+
39
+ if (branch.metadata.expression.has_await) {
40
+ // Top-level condition with await: already resolved by $.async wrapper
41
+ test = b.call('$.get', b.id('$$condition'));
42
+ } else {
43
+ const expression = build_expression(context, branch.test, branch.metadata.expression);
44
+
45
+ if (branch.metadata.expression.has_call) {
46
+ const derived_id = b.id(context.state.scope.generate('d'));
47
+ statements.push(b.var(derived_id, b.call('$.derived', b.arrow([], expression))));
48
+ test = b.call('$.get', derived_id);
49
+ } else {
50
+ test = expression;
51
+ }
52
+ }
53
+
54
+ const render_call = b.stmt(b.call('$$render', consequent_id, index > 0 && b.literal(index)));
55
+ const new_if = b.if(test, render_call);
56
+
57
+ if (last_if) {
58
+ last_if.alternate = new_if;
59
+ } else {
60
+ first_if = new_if;
61
+ }
62
+
63
+ last_alt = branch;
64
+ last_if = new_if;
65
+ index++;
66
+ }
67
+
68
+ // Handle final alternate (else branch, remaining async chain, or nothing)
69
+ if (last_if && last_alt?.alternate) {
70
+ const alternate = /** @type {BlockStatement} */ (context.visit(last_alt.alternate));
71
+ const alternate_id = b.id(context.state.scope.generate('alternate'));
72
+ statements.push(b.var(alternate_id, b.arrow([b.id('$$anchor')], alternate)));
73
+
74
+ last_if.alternate = b.stmt(b.call('$$render', alternate_id, b.literal(false)));
75
+ }
76
+
77
+ // Build $.if() arguments
78
+ /** @type {Expression[]} */
79
+ const args = [
80
+ context.state.node,
81
+ b.arrow([b.id('$$render')], first_if ? b.block([first_if]) : b.block([]))
82
+ ];
83
+
84
+ if (node.elseif) {
85
+ // We treat this...
86
+ //
87
+ // {#if x}
88
+ // ...
89
+ // {:else}
90
+ // {#if y}
91
+ // <div transition:foo>...</div>
92
+ // {/if}
93
+ // {/if}
94
+ //
95
+ // ...slightly differently to this...
96
+ //
97
+ // {#if x}
98
+ // ...
99
+ // {:else if y}
100
+ // <div transition:foo>...</div>
101
+ // {/if}
102
+ //
103
+ // ...even though they're logically equivalent. In the first case, the
104
+ // transition will only play when `y` changes, but in the second it
105
+ // should play when `x` or `y` change — both are considered 'local'.
106
+ // This could also be a non-flattened elseif (because it has an async expression).
107
+ // In both cases mark as elseif so the runtime uses EFFECT_TRANSPARENT for transitions.
108
+ args.push(b.true);
109
+ }
110
+
111
+ statements.push(add_svelte_meta(b.call('$.if', ...args), node, 'if'));
112
+
113
+ if (has_await || has_blockers) {
114
+ context.state.init.push(
115
+ b.stmt(
116
+ b.call(
117
+ '$.async',
118
+ context.state.node,
119
+ node.metadata.expression.blockers(),
120
+ has_await ? b.array([b.thunk(expression, true)]) : b.void0,
121
+ b.arrow(
122
+ has_await ? [context.state.node, b.id('$$condition')] : [context.state.node],
123
+ b.block(statements)
124
+ )
125
+ )
126
+ )
127
+ );
128
+ } else {
129
+ context.state.init.push(b.block(statements));
130
+ }
131
+ }
@@ -0,0 +1,45 @@
1
+ /** @import { Expression } from 'estree' */
2
+ /** @import { AST } from '#compiler' */
3
+ /** @import { ComponentContext } from '../types' */
4
+ import * as b from '#compiler/builders';
5
+ import { build_expression, add_svelte_meta } from './shared/utils.js';
6
+
7
+ /**
8
+ * @param {AST.KeyBlock} node
9
+ * @param {ComponentContext} context
10
+ */
11
+ export function KeyBlock(node, context) {
12
+ context.state.template.push_comment();
13
+
14
+ const has_await = node.metadata.expression.has_await;
15
+ const has_blockers = node.metadata.expression.has_blockers();
16
+
17
+ const expression = build_expression(context, node.expression, node.metadata.expression);
18
+ const key = b.thunk(has_await ? b.call('$.get', b.id('$$key')) : expression);
19
+ const body = /** @type {Expression} */ (context.visit(node.fragment));
20
+
21
+ const statement = add_svelte_meta(
22
+ b.call('$.key', context.state.node, key, b.arrow([b.id('$$anchor')], body)),
23
+ node,
24
+ 'key'
25
+ );
26
+
27
+ if (has_await || has_blockers) {
28
+ context.state.init.push(
29
+ b.stmt(
30
+ b.call(
31
+ '$.async',
32
+ context.state.node,
33
+ node.metadata.expression.blockers(),
34
+ has_await ? b.array([b.thunk(expression, true)]) : b.void0,
35
+ b.arrow(
36
+ has_await ? [context.state.node, b.id('$$key')] : [context.state.node],
37
+ b.block([statement])
38
+ )
39
+ )
40
+ )
41
+ );
42
+ } else {
43
+ context.state.init.push(statement);
44
+ }
45
+ }
@@ -0,0 +1,64 @@
1
+ /** @import { Expression, LabeledStatement, Statement } from 'estree' */
2
+ /** @import { ReactiveStatement } from '#compiler' */
3
+ /** @import { ComponentContext } from '../types' */
4
+ import * as b from '#compiler/builders';
5
+ import { build_getter } from '../utils.js';
6
+
7
+ /**
8
+ * @param {LabeledStatement} node
9
+ * @param {ComponentContext} context
10
+ */
11
+ export function LabeledStatement(node, context) {
12
+ if (context.state.analysis.runes || context.path.length > 1 || node.label.name !== '$') {
13
+ context.next();
14
+ return;
15
+ }
16
+
17
+ // To recreate Svelte 4 behaviour, we track the dependencies
18
+ // the compiler can 'see', but we untrack the effect itself
19
+ const reactive_statement = /** @type {ReactiveStatement} */ (
20
+ context.state.analysis.reactive_statements.get(node)
21
+ );
22
+
23
+ if (!reactive_statement) return; // not the instance context
24
+
25
+ let serialized_body = /** @type {Statement} */ (context.visit(node.body));
26
+
27
+ if (serialized_body.type !== 'BlockStatement') {
28
+ serialized_body = b.block([serialized_body]);
29
+ }
30
+
31
+ const body = serialized_body.body;
32
+
33
+ /** @type {Expression[]} */
34
+ const sequence = [];
35
+
36
+ for (const binding of reactive_statement.dependencies) {
37
+ if (binding.kind === 'normal' && binding.declaration_kind !== 'import') continue;
38
+
39
+ const name = binding.node.name;
40
+ let serialized = build_getter(b.id(name), context.state);
41
+
42
+ // If the binding is a prop, we need to deep read it because it could be fine-grained $state
43
+ // from a runes-component, where mutations don't trigger an update on the prop as a whole.
44
+ if (name === '$$props' || name === '$$restProps' || binding.kind === 'bindable_prop') {
45
+ serialized = b.call('$.deep_read_state', serialized);
46
+ }
47
+
48
+ sequence.push(serialized);
49
+ }
50
+
51
+ // these statements will be topologically ordered later
52
+ context.state.legacy_reactive_statements.set(
53
+ node,
54
+ b.stmt(
55
+ b.call(
56
+ '$.legacy_pre_effect',
57
+ sequence.length > 0 ? b.thunk(b.sequence(sequence)) : b.thunk(b.block([])),
58
+ b.thunk(b.block(body))
59
+ )
60
+ )
61
+ );
62
+
63
+ return b.empty;
64
+ }
@@ -0,0 +1,55 @@
1
+ /** @import { Expression } from 'estree' */
2
+ /** @import { AST } from '#compiler' */
3
+ /** @import { ComponentContext } from '../types' */
4
+ import * as b from '#compiler/builders';
5
+ import { create_derived } from '../utils.js';
6
+
7
+ /**
8
+ * @param {AST.LetDirective} node
9
+ * @param {ComponentContext} context
10
+ */
11
+ export function LetDirective(node, context) {
12
+ // let:x --> const x = $.derived(() => $$slotProps.x);
13
+ // let:x={{y, z}} --> const derived_x = $.derived(() => { const { y, z } = $$slotProps.x; return { y, z }));
14
+ if (node.expression && node.expression.type !== 'Identifier') {
15
+ const name = context.state.scope.generate(node.name);
16
+ const bindings = context.state.scope.get_bindings(node);
17
+
18
+ for (const binding of bindings) {
19
+ context.state.transform[binding.node.name] = {
20
+ read: (node) => b.member(b.call('$.get', b.id(name)), node)
21
+ };
22
+ }
23
+
24
+ context.state.let_directives.push(
25
+ b.const(
26
+ name,
27
+ b.call(
28
+ '$.derived',
29
+ b.thunk(
30
+ b.block([
31
+ b.let(
32
+ /** @type {Expression} */ (node.expression).type === 'ObjectExpression'
33
+ ? // @ts-expect-error types don't match, but it can't contain spread elements and the structure is otherwise fine
34
+ b.object_pattern(node.expression.properties)
35
+ : // @ts-expect-error types don't match, but it can't contain spread elements and the structure is otherwise fine
36
+ b.array_pattern(node.expression.elements),
37
+ b.member(b.id('$$slotProps'), node.name)
38
+ ),
39
+ b.return(b.object(bindings.map((binding) => b.init(binding.node.name, binding.node))))
40
+ ])
41
+ )
42
+ )
43
+ )
44
+ );
45
+ } else {
46
+ const name = node.expression === null ? node.name : node.expression.name;
47
+ context.state.transform[name] = {
48
+ read: (node) => b.call('$.get', node)
49
+ };
50
+
51
+ context.state.let_directives.push(
52
+ b.const(name, create_derived(context.state, b.member(b.id('$$slotProps'), node.name)))
53
+ );
54
+ }
55
+ }
@@ -0,0 +1,23 @@
1
+ /** @import { MemberExpression } from 'estree' */
2
+ /** @import { Context } from '../types' */
3
+ import * as b from '#compiler/builders';
4
+
5
+ /**
6
+ * @param {MemberExpression} node
7
+ * @param {Context} context
8
+ */
9
+ export function MemberExpression(node, context) {
10
+ // rewrite `this.#foo` as `this.#foo.v` inside a constructor
11
+ if (node.property.type === 'PrivateIdentifier') {
12
+ const field = context.state.state_fields.get('#' + node.property.name);
13
+
14
+ if (field) {
15
+ return context.state.in_constructor &&
16
+ (field.type === '$state.raw' || field.type === '$state')
17
+ ? b.member(node, 'v')
18
+ : b.call('$.get', node);
19
+ }
20
+ }
21
+
22
+ context.next();
23
+ }
@@ -0,0 +1,38 @@
1
+ /** @import { AST } from '#compiler' */
2
+ /** @import { ComponentContext } from '../types' */
3
+ import * as b from '#compiler/builders';
4
+ import { build_event, build_event_handler } from './shared/events.js';
5
+
6
+ const modifiers = /** @type {const} */ ([
7
+ 'stopPropagation',
8
+ 'stopImmediatePropagation',
9
+ 'preventDefault',
10
+ 'self',
11
+ 'trusted',
12
+ 'once'
13
+ ]);
14
+
15
+ /**
16
+ * @param {AST.OnDirective} node
17
+ * @param {ComponentContext} context
18
+ */
19
+ export function OnDirective(node, context) {
20
+ if (!node.expression) {
21
+ context.state.analysis.needs_props = true;
22
+ }
23
+
24
+ let handler = build_event_handler(node.expression, node.metadata.expression, context);
25
+
26
+ for (const modifier of modifiers) {
27
+ if (node.modifiers.includes(modifier)) {
28
+ handler = b.call('$.' + modifier, handler);
29
+ }
30
+ }
31
+
32
+ const capture = node.modifiers.includes('capture');
33
+ const passive =
34
+ node.modifiers.includes('passive') ||
35
+ (node.modifiers.includes('nonpassive') ? false : undefined);
36
+
37
+ return build_event(context, node.name, handler, capture, passive, false);
38
+ }