@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,725 @@
1
+ /** @import { ArrayExpression, Expression, ExpressionStatement, Identifier, MemberExpression, ObjectExpression } from 'estree' */
2
+ /** @import { AST } from '#compiler' */
3
+ /** @import { ComponentClientTransformState, ComponentContext } from '../types' */
4
+ /** @import { Scope } from '../../../scope' */
5
+ import {
6
+ cannot_be_set_statically,
7
+ is_boolean_attribute,
8
+ is_dom_property,
9
+ is_load_error_element
10
+ } from '../../../../../utils.js';
11
+ import { is_ignored } from '../../../../state.js';
12
+ import { is_event_attribute, is_text_attribute } from '../../../../utils/ast.js';
13
+ import * as b from '#compiler/builders';
14
+ import {
15
+ create_attribute,
16
+ ExpressionMetadata,
17
+ is_custom_element_node,
18
+ is_customizable_select_element
19
+ } from '../../../nodes.js';
20
+ import { clean_nodes, determine_namespace_for_children } from '../../utils.js';
21
+ import { build_getter } from '../utils.js';
22
+ import {
23
+ get_attribute_name,
24
+ build_attribute_value,
25
+ build_attribute_effect,
26
+ build_set_class,
27
+ build_set_style
28
+ } from './shared/element.js';
29
+ import { process_children, is_static_element } from './shared/fragment.js';
30
+ import { build_render_statement, build_template_chunk, Memoizer } from './shared/utils.js';
31
+ import { visit_event_attribute } from './shared/events.js';
32
+ import { Template } from '../transform-template/template.js';
33
+ import { transform_template } from '../transform-template/index.js';
34
+ import { TEMPLATE_FRAGMENT } from '../../../../../constants.js';
35
+
36
+ /**
37
+ * @param {AST.RegularElement} node
38
+ * @param {ComponentContext} context
39
+ */
40
+ export function RegularElement(node, context) {
41
+ const is_html = context.state.metadata.namespace === 'html' && node.name !== 'svg';
42
+ const name = is_html ? node.name.toLowerCase() : node.name;
43
+ context.state.template.push_element(name, node.start, is_html);
44
+
45
+ if (name === 'noscript') {
46
+ context.state.template.pop_element();
47
+ return;
48
+ }
49
+
50
+ const is_custom_element = is_custom_element_node(node);
51
+
52
+ // cloneNode is faster, but it does not instantiate the underlying class of the
53
+ // custom element until the template is connected to the dom, which would
54
+ // cause problems when setting properties on the custom element.
55
+ // Therefore we need to use importNode instead, which doesn't have this caveat.
56
+ // Additionally, Webkit browsers need importNode for video elements for autoplay
57
+ // to work correctly.
58
+ context.state.template.needs_import_node ||= name === 'video' || is_custom_element;
59
+
60
+ context.state.template.contains_script_tag ||= name === 'script';
61
+
62
+ /** @type {Array<AST.Attribute | AST.SpreadAttribute>} */
63
+ const attributes = [];
64
+
65
+ /** @type {AST.ClassDirective[]} */
66
+ const class_directives = [];
67
+
68
+ /** @type {AST.StyleDirective[]} */
69
+ const style_directives = [];
70
+
71
+ /** @type {Array<AST.AnimateDirective | AST.BindDirective | AST.OnDirective | AST.TransitionDirective | AST.UseDirective | AST.AttachTag>} */
72
+ const other_directives = [];
73
+
74
+ /** @type {ExpressionStatement[]} */
75
+ const lets = [];
76
+
77
+ /** @type {Map<string, AST.Attribute>} */
78
+ const lookup = new Map();
79
+
80
+ /** @type {Map<string, AST.BindDirective>} */
81
+ const bindings = new Map();
82
+
83
+ let has_spread = node.metadata.has_spread;
84
+ let has_use = false;
85
+ let should_remove_defaults = false;
86
+
87
+ for (const attribute of node.attributes) {
88
+ switch (attribute.type) {
89
+ case 'AnimateDirective':
90
+ other_directives.push(attribute);
91
+ break;
92
+
93
+ case 'Attribute':
94
+ // `is` attributes need to be part of the template, otherwise they break
95
+ if (attribute.name === 'is' && context.state.metadata.namespace === 'html') {
96
+ const { value } = build_attribute_value(attribute.value, context);
97
+
98
+ if (value.type === 'Literal' && typeof value.value === 'string') {
99
+ context.state.template.set_prop('is', value.value);
100
+ continue;
101
+ }
102
+ }
103
+
104
+ attributes.push(attribute);
105
+ lookup.set(attribute.name, attribute);
106
+ break;
107
+
108
+ case 'BindDirective':
109
+ bindings.set(attribute.name, attribute);
110
+ other_directives.push(attribute);
111
+ break;
112
+
113
+ case 'ClassDirective':
114
+ class_directives.push(attribute);
115
+ break;
116
+
117
+ case 'LetDirective':
118
+ // visit let directives before everything else, to set state
119
+ context.visit(attribute, { ...context.state, let_directives: lets });
120
+ break;
121
+
122
+ case 'OnDirective':
123
+ other_directives.push(attribute);
124
+ break;
125
+
126
+ case 'SpreadAttribute':
127
+ attributes.push(attribute);
128
+ break;
129
+
130
+ case 'StyleDirective':
131
+ style_directives.push(attribute);
132
+ break;
133
+
134
+ case 'TransitionDirective':
135
+ other_directives.push(attribute);
136
+ break;
137
+
138
+ case 'UseDirective':
139
+ has_use = true;
140
+ other_directives.push(attribute);
141
+ break;
142
+
143
+ case 'AttachTag':
144
+ other_directives.push(attribute);
145
+ break;
146
+ }
147
+ }
148
+
149
+ /** @type {typeof state} */
150
+ const element_state = { ...context.state, init: [], after_update: [] };
151
+
152
+ for (const attribute of other_directives) {
153
+ if (attribute.type === 'OnDirective') {
154
+ const handler = /** @type {Expression} */ (context.visit(attribute));
155
+
156
+ if (has_use) {
157
+ element_state.init.push(b.stmt(b.call('$.effect', b.thunk(handler))));
158
+ } else {
159
+ element_state.after_update.push(b.stmt(handler));
160
+ }
161
+ } else {
162
+ context.visit(attribute, element_state);
163
+ }
164
+ }
165
+
166
+ if (name === 'input') {
167
+ const has_value_attribute = attributes.some(
168
+ (attribute) =>
169
+ attribute.type === 'Attribute' &&
170
+ (attribute.name === 'value' || attribute.name === 'checked') &&
171
+ !is_text_attribute(attribute)
172
+ );
173
+ const has_default_value_attribute = attributes.some(
174
+ (attribute) =>
175
+ attribute.type === 'Attribute' &&
176
+ (attribute.name === 'defaultValue' || attribute.name === 'defaultChecked')
177
+ );
178
+ if (
179
+ !has_default_value_attribute &&
180
+ (has_spread ||
181
+ bindings.has('value') ||
182
+ bindings.has('checked') ||
183
+ bindings.has('group') ||
184
+ (!bindings.has('group') && has_value_attribute))
185
+ ) {
186
+ if (has_spread) {
187
+ // remove_input_defaults will be called inside set_attributes
188
+ should_remove_defaults = true;
189
+ } else {
190
+ context.state.init.push(b.stmt(b.call('$.remove_input_defaults', context.state.node)));
191
+ }
192
+ }
193
+ }
194
+
195
+ if (name === 'textarea') {
196
+ const attribute = lookup.get('value') ?? lookup.get('checked');
197
+ const needs_content_reset = attribute && !is_text_attribute(attribute);
198
+
199
+ if (has_spread || bindings.has('value') || needs_content_reset) {
200
+ context.state.init.push(b.stmt(b.call('$.remove_textarea_child', context.state.node)));
201
+ }
202
+ }
203
+
204
+ // Let bindings first, they can be used on attributes
205
+ context.state.init.push(...lets);
206
+
207
+ const node_id = context.state.node;
208
+
209
+ /** If true, needs `__value` for inputs */
210
+ const needs_special_value_handling =
211
+ name === 'option' || name === 'select' || bindings.has('group') || bindings.has('checked');
212
+
213
+ if (has_spread) {
214
+ build_attribute_effect(
215
+ attributes,
216
+ class_directives,
217
+ style_directives,
218
+ context,
219
+ node,
220
+ node_id,
221
+ should_remove_defaults
222
+ );
223
+ } else {
224
+ for (const attribute of /** @type {AST.Attribute[]} */ (attributes)) {
225
+ if (is_event_attribute(attribute)) {
226
+ visit_event_attribute(attribute, context);
227
+ continue;
228
+ }
229
+
230
+ if (needs_special_value_handling && attribute.name === 'value') {
231
+ continue;
232
+ }
233
+
234
+ const name = get_attribute_name(node, attribute);
235
+
236
+ if (
237
+ !is_custom_element &&
238
+ !cannot_be_set_statically(attribute.name) &&
239
+ (attribute.value === true || is_text_attribute(attribute)) &&
240
+ (name !== 'class' || class_directives.length === 0) &&
241
+ (name !== 'style' || style_directives.length === 0)
242
+ ) {
243
+ let value = is_text_attribute(attribute) ? attribute.value[0].data : true;
244
+
245
+ if (name === 'class' && node.metadata.scoped && context.state.analysis.css.hash) {
246
+ if (value === true || value === '') {
247
+ value = context.state.analysis.css.hash;
248
+ } else {
249
+ value += ' ' + context.state.analysis.css.hash;
250
+ }
251
+ }
252
+
253
+ if (name !== 'class' || value) {
254
+ context.state.template.set_prop(attribute.name, value === true ? '' : value);
255
+ }
256
+ } else if (name === 'autofocus') {
257
+ let { value } = build_attribute_value(attribute.value, context);
258
+ context.state.init.push(b.stmt(b.call('$.autofocus', node_id, value)));
259
+ } else if (name === 'class') {
260
+ build_set_class(node, node_id, attribute, class_directives, context, is_html);
261
+ } else if (name === 'style') {
262
+ build_set_style(node_id, attribute, style_directives, context);
263
+ } else if (is_custom_element) {
264
+ build_custom_element_attribute_update_assignment(node_id, attribute, context);
265
+ } else {
266
+ const { value, has_state } = build_attribute_value(
267
+ attribute.value,
268
+ context,
269
+ (value, metadata) => context.state.memoizer.add(value, metadata)
270
+ );
271
+
272
+ const update = build_element_attribute_update(node, node_id, name, value, attributes);
273
+
274
+ (has_state ? context.state.update : context.state.init).push(b.stmt(update));
275
+ }
276
+ }
277
+ }
278
+
279
+ if (
280
+ is_load_error_element(name) &&
281
+ (has_spread || has_use || lookup.has('onload') || lookup.has('onerror'))
282
+ ) {
283
+ context.state.after_update.push(b.stmt(b.call('$.replay_events', node_id)));
284
+ }
285
+
286
+ const metadata = {
287
+ ...context.state.metadata,
288
+ namespace: determine_namespace_for_children(node, context.state.metadata.namespace)
289
+ };
290
+
291
+ if (bindings.has('innerHTML') || bindings.has('innerText') || bindings.has('textContent')) {
292
+ const contenteditable = lookup.get('contenteditable');
293
+
294
+ if (
295
+ contenteditable &&
296
+ (contenteditable.value === true ||
297
+ (is_text_attribute(contenteditable) && contenteditable.value[0].data === 'true'))
298
+ ) {
299
+ metadata.bound_contenteditable = true;
300
+ }
301
+ }
302
+
303
+ /** @type {ComponentClientTransformState} */
304
+ const state = {
305
+ ...context.state,
306
+ metadata,
307
+ scope: /** @type {Scope} */ (context.state.scopes.get(node.fragment)),
308
+ preserve_whitespace: context.state.preserve_whitespace || name === 'pre' || name === 'textarea'
309
+ };
310
+
311
+ const { hoisted, trimmed } = clean_nodes(
312
+ node,
313
+ node.fragment.nodes,
314
+ context.path,
315
+ state.metadata.namespace,
316
+ state,
317
+ name === 'script' || state.preserve_whitespace,
318
+ state.options.preserveComments
319
+ );
320
+
321
+ /** @type {typeof state} */
322
+ const child_state = { ...state, init: [], update: [], after_update: [], snippets: [] };
323
+
324
+ for (const node of hoisted) {
325
+ context.visit(node, child_state);
326
+ }
327
+
328
+ // special case — if an element that only contains text, we don't need
329
+ // to descend into it if the text is non-reactive
330
+ // in the rare case that we have static text that can't be inlined
331
+ // (e.g. `<span>{location}</span>`), set `textContent` programmatically
332
+ const use_text_content =
333
+ trimmed.every((node) => node.type === 'Text' || node.type === 'ExpressionTag') &&
334
+ trimmed.every(
335
+ (node) =>
336
+ node.type === 'Text' ||
337
+ (!node.metadata.expression.has_state &&
338
+ !node.metadata.expression.has_await &&
339
+ !node.metadata.expression.has_blockers())
340
+ ) &&
341
+ trimmed.some((node) => node.type === 'ExpressionTag');
342
+
343
+ if (use_text_content) {
344
+ const { value } = build_template_chunk(trimmed, context, child_state);
345
+ const empty_string = value.type === 'Literal' && value.value === '';
346
+
347
+ if (!empty_string) {
348
+ child_state.init.push(
349
+ b.stmt(b.assignment('=', b.member(context.state.node, 'textContent'), value))
350
+ );
351
+ }
352
+ } else if (is_customizable_select_element(node)) {
353
+ // For <option>, <optgroup>, or <select> elements with rich content, we need to branch based on browser support.
354
+ // Modern browsers preserve rich HTML in options, older browsers strip it to text only.
355
+ // We create a separate template for the rich content and append it to the element.
356
+
357
+ const element_node = context.state.node;
358
+
359
+ // Add a hydration marker inside the option element so $.child() has an anchor to find
360
+ context.state.template.push_comment();
361
+
362
+ // Create a separate template for the rich content
363
+ const template_name = context.state.scope.root.unique(`${name}_content`);
364
+ const fragment_id = b.id(context.state.scope.generate('fragment'));
365
+ const anchor_id = b.id(context.state.scope.generate('anchor'));
366
+
367
+ // Create state with a new template for the rich content
368
+ /** @type {typeof state} */
369
+ const select_state = {
370
+ ...state,
371
+ init: [],
372
+ update: [],
373
+ after_update: [],
374
+ template: new Template()
375
+ };
376
+
377
+ process_children(
378
+ trimmed,
379
+ (is_text) => b.call('$.first_child', fragment_id, is_text && b.true),
380
+ false,
381
+ {
382
+ ...context,
383
+ state: select_state
384
+ }
385
+ );
386
+
387
+ // Transform the template to $.from_html(...) and hoist it
388
+ const template = transform_template(select_state, metadata.namespace, TEMPLATE_FRAGMENT);
389
+ context.state.hoisted.push(b.var(template_name, template));
390
+
391
+ // Build the rich content function body
392
+ // The anchor is the child of the element (a hydration marker during hydration)
393
+ const body = b.block([
394
+ b.var(anchor_id, b.call('$.child', element_node)),
395
+ b.var(fragment_id, b.call(template_name)),
396
+ ...select_state.init,
397
+ ...(select_state.update.length > 0 ? [build_render_statement(select_state)] : []),
398
+ ...select_state.after_update,
399
+ b.stmt(b.call('$.append', anchor_id, fragment_id))
400
+ ]);
401
+
402
+ child_state.init.push(b.stmt(b.call('$.customizable_select', element_node, b.arrow([], body))));
403
+ } else {
404
+ /** @type {Expression} */
405
+ let arg = context.state.node;
406
+
407
+ // If `hydrate_node` is set inside the element, we need to reset it
408
+ // after the element has been hydrated. We need to check if any child
409
+ // would actually advance the hydrate_node cursor - static elements don't.
410
+ let needs_reset = trimmed.some((node) => node.type !== 'Text' && !is_static_element(node));
411
+
412
+ // The same applies if it's a `<template>` element, since we need to
413
+ // set the value of `hydrate_node` to `node.content`
414
+ if (name === 'template') {
415
+ needs_reset = true;
416
+ child_state.init.push(b.stmt(b.call('$.hydrate_template', arg)));
417
+ arg = b.member(arg, 'content');
418
+ }
419
+
420
+ process_children(trimmed, (is_text) => b.call('$.child', arg, is_text && b.true), true, {
421
+ ...context,
422
+ state: child_state
423
+ });
424
+
425
+ if (needs_reset) {
426
+ child_state.init.push(b.stmt(b.call('$.reset', context.state.node)));
427
+ }
428
+ }
429
+
430
+ if (node.fragment.nodes.some((node) => node.type === 'SnippetBlock')) {
431
+ // Wrap children in `{...}` to avoid declaration conflicts
432
+ context.state.init.push(
433
+ b.block([
434
+ ...child_state.snippets,
435
+ ...child_state.init,
436
+ ...element_state.init,
437
+ child_state.update.length > 0 ? build_render_statement(child_state) : b.empty,
438
+ ...child_state.after_update,
439
+ ...element_state.after_update
440
+ ])
441
+ );
442
+ } else if (node.fragment.metadata.dynamic) {
443
+ context.state.init.push(...child_state.init, ...element_state.init);
444
+ context.state.update.push(...child_state.update);
445
+ context.state.after_update.push(...child_state.after_update, ...element_state.after_update);
446
+ } else {
447
+ context.state.init.push(...element_state.init);
448
+ context.state.after_update.push(...element_state.after_update);
449
+ }
450
+
451
+ if (name === 'selectedcontent') {
452
+ context.state.init.push(
453
+ b.stmt(
454
+ b.call(
455
+ '$.selectedcontent',
456
+ context.state.node,
457
+ b.arrow([b.id('$$element')], b.assignment('=', context.state.node, b.id('$$element')))
458
+ )
459
+ )
460
+ );
461
+ }
462
+
463
+ if (lookup.has('dir')) {
464
+ // This fixes an issue with Chromium where updates to text content within an element
465
+ // does not update the direction when set to auto. If we just re-assign the dir, this fixes it.
466
+ const dir = b.member(node_id, 'dir');
467
+ context.state.update.push(b.stmt(b.assignment('=', dir, dir)));
468
+ }
469
+
470
+ if (!has_spread && needs_special_value_handling) {
471
+ if (node.metadata.synthetic_value_node) {
472
+ const synthetic_node = node.metadata.synthetic_value_node;
473
+ const synthetic_attribute = create_attribute(
474
+ 'value',
475
+ null,
476
+ synthetic_node.start,
477
+ synthetic_node.end,
478
+ [synthetic_node]
479
+ );
480
+ // this node is an `option` that didn't have a `value` attribute, but had
481
+ // a single-expression child, so we treat the value of that expression as
482
+ // the value of the option
483
+ build_element_special_value_attribute(name, node_id, synthetic_attribute, context, true);
484
+ } else {
485
+ for (const attribute of /** @type {AST.Attribute[]} */ (attributes)) {
486
+ if (attribute.name === 'value') {
487
+ build_element_special_value_attribute(name, node_id, attribute, context);
488
+ break;
489
+ }
490
+ }
491
+ }
492
+ }
493
+
494
+ context.state.template.pop_element();
495
+ }
496
+
497
+ /**
498
+ * @param {AST.ClassDirective[]} class_directives
499
+ * @param {ComponentContext} context
500
+ * @param {Memoizer} memoizer
501
+ */
502
+ export function build_class_directives_object(
503
+ class_directives,
504
+ context,
505
+ memoizer = context.state.memoizer
506
+ ) {
507
+ let properties = [];
508
+
509
+ const metadata = new ExpressionMetadata();
510
+
511
+ for (const d of class_directives) {
512
+ metadata.merge(d.metadata.expression);
513
+
514
+ const expression = /** @type Expression */ (context.visit(d.expression));
515
+ properties.push(b.init(d.name, expression));
516
+ }
517
+
518
+ const directives = b.object(properties);
519
+
520
+ return memoizer.add(directives, metadata);
521
+ }
522
+
523
+ /**
524
+ * @param {AST.StyleDirective[]} style_directives
525
+ * @param {ComponentContext} context
526
+ * @param {Memoizer} memoizer
527
+ */
528
+ export function build_style_directives_object(
529
+ style_directives,
530
+ context,
531
+ memoizer = context.state.memoizer
532
+ ) {
533
+ const normal = b.object([]);
534
+ const important = b.object([]);
535
+
536
+ const metadata = new ExpressionMetadata();
537
+
538
+ for (const d of style_directives) {
539
+ metadata.merge(d.metadata.expression);
540
+
541
+ const expression =
542
+ d.value === true
543
+ ? build_getter(b.id(d.name), context.state)
544
+ : build_attribute_value(d.value, context).value;
545
+
546
+ const object = d.modifiers.includes('important') ? important : normal;
547
+ object.properties.push(b.init(d.name, expression));
548
+ }
549
+
550
+ const directives = important.properties.length ? b.array([normal, important]) : normal;
551
+
552
+ return memoizer.add(directives, metadata);
553
+ }
554
+
555
+ /**
556
+ * Serializes an assignment to an element property by adding relevant statements to either only
557
+ * the init or the init and update arrays, depending on whether or not the value is dynamic.
558
+ * Resulting code for static looks something like this:
559
+ * ```js
560
+ * element.property = value;
561
+ * // or
562
+ * $.set_attribute(element, property, value);
563
+ * });
564
+ * ```
565
+ * Resulting code for dynamic looks something like this:
566
+ * ```js
567
+ * let value;
568
+ * $.template_effect(() => {
569
+ * if (value !== (value = 'new value')) {
570
+ * element.property = value;
571
+ * // or
572
+ * $.set_attribute(element, property, value);
573
+ * }
574
+ * });
575
+ * ```
576
+ * Returns true if attribute is deemed reactive, false otherwise.
577
+ * @param {AST.RegularElement} element
578
+ * @param {Identifier} node_id
579
+ * @param {string} name
580
+ * @param {Expression} value
581
+ * @param {Array<AST.Attribute | AST.SpreadAttribute>} attributes
582
+ */
583
+ function build_element_attribute_update(element, node_id, name, value, attributes) {
584
+ if (name === 'muted') {
585
+ // Special case for Firefox who needs it set as a property in order to work
586
+ return b.assignment('=', b.member(node_id, b.id('muted')), value);
587
+ }
588
+
589
+ if (name === 'value') {
590
+ return b.call('$.set_value', node_id, value);
591
+ }
592
+
593
+ if (name === 'checked') {
594
+ return b.call('$.set_checked', node_id, value);
595
+ }
596
+
597
+ if (name === 'selected') {
598
+ return b.call('$.set_selected', node_id, value);
599
+ }
600
+
601
+ if (
602
+ // If we would just set the defaultValue property, it would override the value property,
603
+ // because it is set in the template which implicitly means it's also setting the default value,
604
+ // and if one updates the default value while the input is pristine it will also update the
605
+ // current value, which is not what we want, which is why we need to do some extra work.
606
+ name === 'defaultValue' &&
607
+ (attributes.some(
608
+ (attr) => attr.type === 'Attribute' && attr.name === 'value' && is_text_attribute(attr)
609
+ ) ||
610
+ (element.name === 'textarea' && element.fragment.nodes.length > 0))
611
+ ) {
612
+ return b.call('$.set_default_value', node_id, value);
613
+ }
614
+
615
+ if (
616
+ // See defaultValue comment
617
+ name === 'defaultChecked' &&
618
+ attributes.some(
619
+ (attr) => attr.type === 'Attribute' && attr.name === 'checked' && attr.value === true
620
+ )
621
+ ) {
622
+ return b.call('$.set_default_checked', node_id, value);
623
+ }
624
+
625
+ if (is_dom_property(name)) {
626
+ return b.assignment('=', b.member(node_id, name), value);
627
+ }
628
+
629
+ return b.call(
630
+ name.startsWith('xlink') ? '$.set_xlink_attribute' : '$.set_attribute',
631
+ node_id,
632
+ b.literal(name),
633
+ value,
634
+ is_ignored(element, 'hydration_attribute_changed') && b.true
635
+ );
636
+ }
637
+
638
+ /**
639
+ * Like `build_element_attribute_update` but without any special attribute treatment.
640
+ * @param {Identifier} node_id
641
+ * @param {AST.Attribute} attribute
642
+ * @param {ComponentContext} context
643
+ */
644
+ function build_custom_element_attribute_update_assignment(node_id, attribute, context) {
645
+ const { value, has_state } = build_attribute_value(attribute.value, context);
646
+
647
+ // don't lowercase name, as we set the element's property, which might be case sensitive
648
+ const call = b.call('$.set_custom_element_data', node_id, b.literal(attribute.name), value);
649
+
650
+ // this is different from other updates — it doesn't get grouped,
651
+ // because set_custom_element_data may not be idempotent
652
+ const update = has_state ? b.call('$.template_effect', b.thunk(call)) : call;
653
+
654
+ context.state.init.push(b.stmt(update));
655
+ }
656
+
657
+ /**
658
+ * Serializes an assignment to the value property of a `<select>`, `<option>` or `<input>` element
659
+ * that needs the hidden `__value` property.
660
+ * Returns true if attribute is deemed reactive, false otherwise.
661
+ * @param {string} element
662
+ * @param {Identifier} node_id
663
+ * @param {AST.Attribute} attribute
664
+ * @param {ComponentContext} context
665
+ * @param {boolean} [synthetic] - true if this should not sync to the DOM
666
+ */
667
+ function build_element_special_value_attribute(
668
+ element,
669
+ node_id,
670
+ attribute,
671
+ context,
672
+ synthetic = false
673
+ ) {
674
+ const state = context.state;
675
+ const is_select_with_value =
676
+ // attribute.metadata.dynamic would give false negatives because even if the value does not change,
677
+ // the inner options could still change, so we need to always treat it as reactive
678
+ element === 'select' && attribute.value !== true && !is_text_attribute(attribute);
679
+
680
+ const { value, has_state } = build_attribute_value(attribute.value, context, (value, metadata) =>
681
+ state.memoizer.add(value, metadata)
682
+ );
683
+
684
+ const evaluated = context.state.scope.evaluate(value);
685
+ const assignment = b.assignment('=', b.member(node_id, '__value'), value);
686
+
687
+ const set_value_assignment = b.assignment(
688
+ '=',
689
+ b.member(node_id, 'value'),
690
+ evaluated.is_defined ? assignment : b.logical('??', assignment, b.literal(''))
691
+ );
692
+
693
+ const update = b.stmt(
694
+ is_select_with_value
695
+ ? b.sequence([
696
+ set_value_assignment,
697
+ // This ensures a one-way street to the DOM in case it's <select {value}>
698
+ // and not <select bind:value>. We need it in addition to $.init_select
699
+ // because the select value is not reflected as an attribute, so the
700
+ // mutation observer wouldn't notice.
701
+ b.call('$.select_option', node_id, value)
702
+ ])
703
+ : synthetic
704
+ ? assignment
705
+ : set_value_assignment
706
+ );
707
+
708
+ if (has_state) {
709
+ const id = b.id(state.scope.generate(`${node_id.name}_value`));
710
+
711
+ // `<option>` is a special case: The value property reflects to the DOM. If the value is set to undefined,
712
+ // that means the value should be set to the empty string. To be able to do that when the value is
713
+ // initially undefined, we need to set a value that is guaranteed to be different.
714
+ const init = element === 'option' ? b.object([]) : undefined;
715
+
716
+ state.init.push(b.var(id, init));
717
+ state.update.push(b.if(b.binary('!==', id, b.assignment('=', id, value)), b.block([update])));
718
+ } else {
719
+ state.init.push(update);
720
+ }
721
+
722
+ if (is_select_with_value) {
723
+ state.init.push(b.stmt(b.call('$.init_select', node_id)));
724
+ }
725
+ }