svelte 5.0.0-next.99 → 5.0.1

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 (336) hide show
  1. package/compiler/index.js +1 -1
  2. package/elements.d.ts +102 -33
  3. package/package.json +31 -34
  4. package/src/action/public.d.ts +0 -4
  5. package/src/ambient.d.ts +179 -12
  6. package/src/animate/index.js +40 -14
  7. package/src/compiler/errors.js +1461 -510
  8. package/src/compiler/index.js +107 -93
  9. package/src/compiler/legacy.js +110 -80
  10. package/src/compiler/migrate/index.js +1598 -0
  11. package/src/compiler/phases/1-parse/acorn.js +56 -9
  12. package/src/compiler/phases/1-parse/index.js +21 -38
  13. package/src/compiler/phases/1-parse/read/context.js +18 -23
  14. package/src/compiler/phases/1-parse/read/expression.js +11 -5
  15. package/src/compiler/phases/1-parse/read/options.js +95 -81
  16. package/src/compiler/phases/1-parse/read/script.js +53 -30
  17. package/src/compiler/phases/1-parse/read/style.js +52 -56
  18. package/src/compiler/phases/1-parse/remove_typescript_nodes.js +74 -1
  19. package/src/compiler/phases/1-parse/state/element.js +221 -255
  20. package/src/compiler/phases/1-parse/state/fragment.js +2 -1
  21. package/src/compiler/phases/1-parse/state/tag.js +88 -72
  22. package/src/compiler/phases/1-parse/state/text.js +4 -2
  23. package/src/compiler/phases/1-parse/utils/create.js +7 -2
  24. package/src/compiler/phases/1-parse/utils/html.js +0 -46
  25. package/src/compiler/phases/2-analyze/css/css-analyze.js +210 -87
  26. package/src/compiler/phases/2-analyze/css/css-prune.js +361 -122
  27. package/src/compiler/phases/2-analyze/css/css-warn.js +15 -7
  28. package/src/compiler/phases/2-analyze/css/utils.js +4 -2
  29. package/src/compiler/phases/2-analyze/index.js +460 -1083
  30. package/src/compiler/phases/2-analyze/types.d.ts +7 -11
  31. package/src/compiler/phases/2-analyze/visitors/ArrowFunctionExpression.js +11 -0
  32. package/src/compiler/phases/2-analyze/visitors/AssignmentExpression.js +28 -0
  33. package/src/compiler/phases/2-analyze/visitors/Attribute.js +219 -0
  34. package/src/compiler/phases/2-analyze/visitors/AwaitBlock.js +45 -0
  35. package/src/compiler/phases/2-analyze/visitors/BindDirective.js +222 -0
  36. package/src/compiler/phases/2-analyze/visitors/CallExpression.js +183 -0
  37. package/src/compiler/phases/2-analyze/visitors/ClassBody.js +27 -0
  38. package/src/compiler/phases/2-analyze/visitors/ClassDeclaration.js +25 -0
  39. package/src/compiler/phases/2-analyze/visitors/ClassDirective.js +13 -0
  40. package/src/compiler/phases/2-analyze/visitors/Component.js +20 -0
  41. package/src/compiler/phases/2-analyze/visitors/ConstTag.js +34 -0
  42. package/src/compiler/phases/2-analyze/visitors/DebugTag.js +15 -0
  43. package/src/compiler/phases/2-analyze/visitors/EachBlock.js +42 -0
  44. package/src/compiler/phases/2-analyze/visitors/ExportDefaultDeclaration.js +15 -0
  45. package/src/compiler/phases/2-analyze/visitors/ExportNamedDeclaration.js +61 -0
  46. package/src/compiler/phases/2-analyze/visitors/ExportSpecifier.js +44 -0
  47. package/src/compiler/phases/2-analyze/visitors/ExpressionStatement.js +38 -0
  48. package/src/compiler/phases/2-analyze/visitors/ExpressionTag.js +23 -0
  49. package/src/compiler/phases/2-analyze/visitors/FunctionDeclaration.js +16 -0
  50. package/src/compiler/phases/2-analyze/visitors/FunctionExpression.js +11 -0
  51. package/src/compiler/phases/2-analyze/visitors/HtmlTag.js +19 -0
  52. package/src/compiler/phases/2-analyze/visitors/Identifier.js +125 -0
  53. package/src/compiler/phases/2-analyze/visitors/IfBlock.js +21 -0
  54. package/src/compiler/phases/2-analyze/visitors/ImportDeclaration.js +30 -0
  55. package/src/compiler/phases/2-analyze/visitors/KeyBlock.js +20 -0
  56. package/src/compiler/phases/2-analyze/visitors/LabeledStatement.js +95 -0
  57. package/src/compiler/phases/2-analyze/visitors/LetDirective.js +24 -0
  58. package/src/compiler/phases/2-analyze/visitors/MemberExpression.js +54 -0
  59. package/src/compiler/phases/2-analyze/visitors/NewExpression.js +15 -0
  60. package/src/compiler/phases/2-analyze/visitors/OnDirective.js +28 -0
  61. package/src/compiler/phases/2-analyze/visitors/RegularElement.js +175 -0
  62. package/src/compiler/phases/2-analyze/visitors/RenderTag.js +42 -0
  63. package/src/compiler/phases/2-analyze/visitors/SlotElement.js +42 -0
  64. package/src/compiler/phases/2-analyze/visitors/SnippetBlock.js +55 -0
  65. package/src/compiler/phases/2-analyze/visitors/SpreadAttribute.js +13 -0
  66. package/src/compiler/phases/2-analyze/visitors/StyleDirective.js +37 -0
  67. package/src/compiler/phases/2-analyze/visitors/SvelteBody.js +22 -0
  68. package/src/compiler/phases/2-analyze/visitors/SvelteComponent.js +18 -0
  69. package/src/compiler/phases/2-analyze/visitors/SvelteDocument.js +12 -0
  70. package/src/compiler/phases/2-analyze/visitors/SvelteElement.js +65 -0
  71. package/src/compiler/phases/2-analyze/visitors/SvelteFragment.js +27 -0
  72. package/src/compiler/phases/2-analyze/visitors/SvelteHead.js +18 -0
  73. package/src/compiler/phases/2-analyze/visitors/SvelteSelf.js +36 -0
  74. package/src/compiler/phases/2-analyze/visitors/SvelteWindow.js +12 -0
  75. package/src/compiler/phases/2-analyze/visitors/TaggedTemplateExpression.js +23 -0
  76. package/src/compiler/phases/2-analyze/visitors/Text.js +17 -0
  77. package/src/compiler/phases/2-analyze/visitors/TitleElement.js +21 -0
  78. package/src/compiler/phases/2-analyze/visitors/UpdateExpression.js +25 -0
  79. package/src/compiler/phases/2-analyze/visitors/UseDirective.js +12 -0
  80. package/src/compiler/phases/2-analyze/visitors/VariableDeclarator.js +120 -0
  81. package/src/compiler/phases/2-analyze/{a11y.js → visitors/shared/a11y.js} +191 -184
  82. package/src/compiler/phases/2-analyze/visitors/shared/attribute.js +123 -0
  83. package/src/compiler/phases/2-analyze/visitors/shared/component.js +108 -0
  84. package/src/compiler/phases/2-analyze/visitors/shared/element.js +160 -0
  85. package/src/compiler/phases/2-analyze/visitors/shared/fragment.js +15 -0
  86. package/src/compiler/phases/2-analyze/visitors/shared/function.js +20 -0
  87. package/src/compiler/phases/2-analyze/visitors/shared/special-element.js +16 -0
  88. package/src/compiler/phases/2-analyze/visitors/shared/utils.js +227 -0
  89. package/src/compiler/phases/3-transform/client/transform-client.js +365 -311
  90. package/src/compiler/phases/3-transform/client/types.d.ts +32 -9
  91. package/src/compiler/phases/3-transform/client/utils.js +173 -571
  92. package/src/compiler/phases/3-transform/client/visitors/AnimateDirective.js +28 -0
  93. package/src/compiler/phases/3-transform/client/visitors/ArrowFunctionExpression.js +11 -0
  94. package/src/compiler/phases/3-transform/client/visitors/AssignmentExpression.js +117 -0
  95. package/src/compiler/phases/3-transform/client/visitors/Attribute.js +14 -0
  96. package/src/compiler/phases/3-transform/client/visitors/AwaitBlock.js +67 -0
  97. package/src/compiler/phases/3-transform/client/visitors/BinaryExpression.js +34 -0
  98. package/src/compiler/phases/3-transform/client/visitors/BindDirective.js +252 -0
  99. package/src/compiler/phases/3-transform/client/visitors/BlockStatement.js +12 -0
  100. package/src/compiler/phases/3-transform/client/visitors/BreakStatement.js +20 -0
  101. package/src/compiler/phases/3-transform/client/visitors/CallExpression.js +62 -0
  102. package/src/compiler/phases/3-transform/client/visitors/ClassBody.js +215 -0
  103. package/src/compiler/phases/3-transform/client/visitors/Comment.js +11 -0
  104. package/src/compiler/phases/3-transform/client/visitors/Component.js +32 -0
  105. package/src/compiler/phases/3-transform/client/visitors/ConstTag.js +76 -0
  106. package/src/compiler/phases/3-transform/client/visitors/DebugTag.js +22 -0
  107. package/src/compiler/phases/3-transform/client/visitors/EachBlock.js +346 -0
  108. package/src/compiler/phases/3-transform/client/visitors/ExportNamedDeclaration.js +19 -0
  109. package/src/compiler/phases/3-transform/client/visitors/ExpressionStatement.js +26 -0
  110. package/src/compiler/phases/3-transform/client/visitors/Fragment.js +267 -0
  111. package/src/compiler/phases/3-transform/client/visitors/FunctionDeclaration.js +23 -0
  112. package/src/compiler/phases/3-transform/client/visitors/FunctionExpression.js +11 -0
  113. package/src/compiler/phases/3-transform/client/visitors/HtmlTag.js +27 -0
  114. package/src/compiler/phases/3-transform/client/visitors/Identifier.js +41 -0
  115. package/src/compiler/phases/3-transform/client/visitors/IfBlock.js +55 -0
  116. package/src/compiler/phases/3-transform/client/visitors/ImportDeclaration.js +16 -0
  117. package/src/compiler/phases/3-transform/client/visitors/KeyBlock.js +19 -0
  118. package/src/compiler/phases/3-transform/client/visitors/LabeledStatement.js +64 -0
  119. package/src/compiler/phases/3-transform/client/visitors/LetDirective.js +54 -0
  120. package/src/compiler/phases/3-transform/client/visitors/MemberExpression.js +19 -0
  121. package/src/compiler/phases/3-transform/client/visitors/OnDirective.js +38 -0
  122. package/src/compiler/phases/3-transform/client/visitors/Program.js +139 -0
  123. package/src/compiler/phases/3-transform/client/visitors/RegularElement.js +717 -0
  124. package/src/compiler/phases/3-transform/client/visitors/RenderTag.js +52 -0
  125. package/src/compiler/phases/3-transform/client/visitors/SlotElement.js +70 -0
  126. package/src/compiler/phases/3-transform/client/visitors/SnippetBlock.js +90 -0
  127. package/src/compiler/phases/3-transform/client/visitors/SpreadAttribute.js +10 -0
  128. package/src/compiler/phases/3-transform/client/visitors/SvelteBody.js +11 -0
  129. package/src/compiler/phases/3-transform/client/visitors/SvelteComponent.js +12 -0
  130. package/src/compiler/phases/3-transform/client/visitors/SvelteDocument.js +11 -0
  131. package/src/compiler/phases/3-transform/client/visitors/SvelteElement.js +155 -0
  132. package/src/compiler/phases/3-transform/client/visitors/SvelteFragment.js +17 -0
  133. package/src/compiler/phases/3-transform/client/visitors/SvelteHead.js +20 -0
  134. package/src/compiler/phases/3-transform/client/visitors/SvelteSelf.js +12 -0
  135. package/src/compiler/phases/3-transform/client/visitors/SvelteWindow.js +11 -0
  136. package/src/compiler/phases/3-transform/client/visitors/TitleElement.js +24 -0
  137. package/src/compiler/phases/3-transform/client/visitors/TransitionDirective.js +29 -0
  138. package/src/compiler/phases/3-transform/client/visitors/UpdateExpression.js +69 -0
  139. package/src/compiler/phases/3-transform/client/visitors/UseDirective.js +34 -0
  140. package/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js +317 -0
  141. package/src/compiler/phases/3-transform/client/visitors/shared/component.js +379 -0
  142. package/src/compiler/phases/3-transform/client/visitors/shared/declarations.js +53 -0
  143. package/src/compiler/phases/3-transform/client/visitors/shared/element.js +220 -0
  144. package/src/compiler/phases/3-transform/client/visitors/shared/events.js +185 -0
  145. package/src/compiler/phases/3-transform/client/visitors/shared/fragment.js +159 -0
  146. package/src/compiler/phases/3-transform/client/visitors/shared/function.js +30 -0
  147. package/src/compiler/phases/3-transform/client/visitors/shared/special_element.js +22 -0
  148. package/src/compiler/phases/3-transform/client/visitors/shared/utils.js +266 -0
  149. package/src/compiler/phases/3-transform/css/index.js +80 -44
  150. package/src/compiler/phases/3-transform/index.js +30 -67
  151. package/src/compiler/phases/3-transform/server/transform-server.js +155 -2178
  152. package/src/compiler/phases/3-transform/server/types.d.ts +5 -35
  153. package/src/compiler/phases/3-transform/server/visitors/AssignmentExpression.js +68 -0
  154. package/src/compiler/phases/3-transform/server/visitors/AwaitBlock.js +33 -0
  155. package/src/compiler/phases/3-transform/server/visitors/CallExpression.js +41 -0
  156. package/src/compiler/phases/3-transform/server/visitors/ClassBody.js +121 -0
  157. package/src/compiler/phases/3-transform/server/visitors/Component.js +12 -0
  158. package/src/compiler/phases/3-transform/server/visitors/ConstTag.js +16 -0
  159. package/src/compiler/phases/3-transform/server/visitors/DebugTag.js +24 -0
  160. package/src/compiler/phases/3-transform/server/visitors/EachBlock.js +62 -0
  161. package/src/compiler/phases/3-transform/server/visitors/ExpressionStatement.js +18 -0
  162. package/src/compiler/phases/3-transform/server/visitors/Fragment.js +46 -0
  163. package/src/compiler/phases/3-transform/server/visitors/HtmlTag.js +13 -0
  164. package/src/compiler/phases/3-transform/server/visitors/Identifier.js +19 -0
  165. package/src/compiler/phases/3-transform/server/visitors/IfBlock.js +28 -0
  166. package/src/compiler/phases/3-transform/server/visitors/KeyBlock.js +16 -0
  167. package/src/compiler/phases/3-transform/server/visitors/LabeledStatement.js +24 -0
  168. package/src/compiler/phases/3-transform/server/visitors/MemberExpression.js +23 -0
  169. package/src/compiler/phases/3-transform/server/visitors/PropertyDefinition.js +36 -0
  170. package/src/compiler/phases/3-transform/server/visitors/RegularElement.js +104 -0
  171. package/src/compiler/phases/3-transform/server/visitors/RenderTag.js +35 -0
  172. package/src/compiler/phases/3-transform/server/visitors/SlotElement.js +54 -0
  173. package/src/compiler/phases/3-transform/server/visitors/SnippetBlock.js +22 -0
  174. package/src/compiler/phases/3-transform/server/visitors/SpreadAttribute.js +10 -0
  175. package/src/compiler/phases/3-transform/server/visitors/SvelteComponent.js +12 -0
  176. package/src/compiler/phases/3-transform/server/visitors/SvelteElement.js +72 -0
  177. package/src/compiler/phases/3-transform/server/visitors/SvelteFragment.js +11 -0
  178. package/src/compiler/phases/3-transform/server/visitors/SvelteHead.js +16 -0
  179. package/src/compiler/phases/3-transform/server/visitors/SvelteSelf.js +12 -0
  180. package/src/compiler/phases/3-transform/server/visitors/TitleElement.js +17 -0
  181. package/src/compiler/phases/3-transform/server/visitors/UpdateExpression.js +26 -0
  182. package/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js +185 -0
  183. package/src/compiler/phases/3-transform/server/visitors/shared/component.js +275 -0
  184. package/src/compiler/phases/3-transform/server/visitors/shared/element.js +430 -0
  185. package/src/compiler/phases/3-transform/server/visitors/shared/utils.js +243 -0
  186. package/src/compiler/phases/3-transform/shared/assignments.js +74 -0
  187. package/src/compiler/phases/3-transform/utils.js +283 -177
  188. package/src/compiler/phases/bindings.js +64 -25
  189. package/src/compiler/phases/css.js +2 -1
  190. package/src/compiler/phases/nodes.js +20 -8
  191. package/src/compiler/phases/patterns.js +2 -0
  192. package/src/compiler/phases/scope.js +171 -186
  193. package/src/compiler/phases/types.d.ts +25 -27
  194. package/src/compiler/preprocess/decode_sourcemap.js +2 -1
  195. package/src/compiler/preprocess/index.js +22 -20
  196. package/src/compiler/preprocess/public.d.ts +1 -1
  197. package/src/compiler/preprocess/replace_in_code.js +7 -6
  198. package/src/compiler/public.d.ts +14 -4
  199. package/src/compiler/state.js +97 -0
  200. package/src/compiler/types/css.d.ts +39 -4
  201. package/src/compiler/types/index.d.ts +57 -43
  202. package/src/compiler/types/legacy-nodes.d.ts +22 -3
  203. package/src/compiler/types/template.d.ts +443 -398
  204. package/src/compiler/utils/assert.js +1 -12
  205. package/src/compiler/utils/ast.js +264 -59
  206. package/src/compiler/utils/builders.js +196 -175
  207. package/src/compiler/utils/compile_diagnostic.js +106 -0
  208. package/src/compiler/utils/extract_svelte_ignore.js +87 -38
  209. package/src/compiler/utils/mapped_code.js +23 -19
  210. package/src/compiler/utils/slot.js +20 -0
  211. package/src/compiler/utils/string.js +9 -0
  212. package/src/compiler/validate-options.js +56 -40
  213. package/src/compiler/warnings.js +812 -311
  214. package/src/constants.js +32 -240
  215. package/src/easing/index.js +0 -31
  216. package/src/escaping.js +26 -0
  217. package/src/events/index.js +1 -0
  218. package/src/events/public.d.ts +57 -0
  219. package/src/html-tree-validation.js +215 -0
  220. package/src/index-client.js +36 -35
  221. package/src/index-server.js +8 -14
  222. package/src/index.d.ts +153 -70
  223. package/src/internal/client/constants.js +15 -6
  224. package/src/internal/client/dev/console-log.js +35 -0
  225. package/src/internal/client/dev/css.js +31 -0
  226. package/src/internal/client/dev/elements.js +60 -0
  227. package/src/internal/client/dev/equality.js +104 -0
  228. package/src/internal/client/dev/hmr.js +62 -39
  229. package/src/internal/client/dev/inspect.js +36 -0
  230. package/src/internal/client/dev/legacy.js +28 -0
  231. package/src/internal/client/dev/ownership.js +139 -102
  232. package/src/internal/client/dom/blocks/await.js +119 -63
  233. package/src/internal/client/dom/blocks/css-props.js +19 -52
  234. package/src/internal/client/dom/blocks/each.js +220 -157
  235. package/src/internal/client/dom/blocks/html.js +106 -48
  236. package/src/internal/client/dom/blocks/if.js +37 -26
  237. package/src/internal/client/dom/blocks/key.js +18 -6
  238. package/src/internal/client/dom/blocks/slot.js +44 -0
  239. package/src/internal/client/dom/blocks/snippet.js +102 -9
  240. package/src/internal/client/dom/blocks/svelte-component.js +21 -10
  241. package/src/internal/client/dom/blocks/svelte-element.js +132 -123
  242. package/src/internal/client/dom/blocks/svelte-head.js +27 -16
  243. package/src/internal/client/dom/css.js +32 -0
  244. package/src/internal/client/dom/elements/actions.js +7 -2
  245. package/src/internal/client/dom/elements/attributes.js +247 -127
  246. package/src/internal/client/dom/elements/bindings/document.js +17 -0
  247. package/src/internal/client/dom/elements/bindings/input.js +104 -54
  248. package/src/internal/client/dom/elements/bindings/media.js +78 -116
  249. package/src/internal/client/dom/elements/bindings/props.js +3 -3
  250. package/src/internal/client/dom/elements/bindings/select.js +11 -8
  251. package/src/internal/client/dom/elements/bindings/shared.js +9 -31
  252. package/src/internal/client/dom/elements/bindings/size.js +10 -9
  253. package/src/internal/client/dom/elements/bindings/this.js +10 -6
  254. package/src/internal/client/dom/elements/bindings/universal.js +33 -27
  255. package/src/internal/client/dom/elements/bindings/window.js +19 -15
  256. package/src/internal/client/dom/elements/class.js +32 -2
  257. package/src/internal/client/dom/elements/custom-element.js +37 -23
  258. package/src/internal/client/dom/elements/events.js +201 -55
  259. package/src/internal/client/dom/elements/misc.js +30 -4
  260. package/src/internal/client/dom/elements/style.js +15 -7
  261. package/src/internal/client/dom/elements/transitions.js +202 -138
  262. package/src/internal/client/dom/hydration.js +72 -37
  263. package/src/internal/client/dom/legacy/event-modifiers.js +51 -6
  264. package/src/internal/client/dom/legacy/lifecycle.js +38 -26
  265. package/src/internal/client/dom/legacy/misc.js +3 -3
  266. package/src/internal/client/dom/operations.js +90 -130
  267. package/src/internal/client/dom/reconciler.js +0 -18
  268. package/src/internal/client/dom/task.js +44 -16
  269. package/src/internal/client/dom/template.js +140 -80
  270. package/src/internal/client/errors.js +359 -0
  271. package/src/internal/client/index.js +49 -29
  272. package/src/internal/client/loop.js +4 -3
  273. package/src/internal/client/proxy.js +280 -288
  274. package/src/internal/client/reactivity/deriveds.js +105 -64
  275. package/src/internal/client/reactivity/effects.js +326 -107
  276. package/src/internal/client/reactivity/equality.js +3 -2
  277. package/src/internal/client/reactivity/props.js +192 -50
  278. package/src/internal/client/reactivity/sources.js +175 -74
  279. package/src/internal/client/reactivity/store.js +53 -64
  280. package/src/internal/client/reactivity/types.d.ts +24 -19
  281. package/src/internal/client/render.js +159 -196
  282. package/src/internal/client/runtime.js +541 -673
  283. package/src/internal/client/timing.js +5 -4
  284. package/src/internal/client/types.d.ts +62 -46
  285. package/src/internal/client/validate.js +82 -73
  286. package/src/internal/client/warnings.js +166 -0
  287. package/src/internal/server/blocks/html.js +11 -0
  288. package/src/internal/server/blocks/snippet.js +22 -0
  289. package/src/internal/server/context.js +26 -14
  290. package/src/internal/server/dev.js +97 -0
  291. package/src/internal/server/errors.js +13 -0
  292. package/src/internal/server/hydration.js +3 -2
  293. package/src/internal/server/index.js +188 -292
  294. package/src/internal/server/types.d.ts +22 -0
  295. package/src/internal/shared/clone.js +114 -0
  296. package/src/internal/shared/errors.js +69 -0
  297. package/src/internal/shared/types.d.ts +10 -0
  298. package/src/internal/shared/utils.js +35 -0
  299. package/src/internal/shared/validate.js +18 -38
  300. package/src/internal/shared/warnings.js +38 -0
  301. package/src/legacy/legacy-client.js +154 -19
  302. package/src/legacy/legacy-server.js +31 -3
  303. package/src/motion/spring.js +12 -10
  304. package/src/motion/tweened.js +9 -7
  305. package/src/reactivity/date.js +48 -79
  306. package/src/reactivity/index-client.js +5 -3
  307. package/src/reactivity/index-server.js +5 -3
  308. package/src/reactivity/map.js +78 -55
  309. package/src/reactivity/set.js +47 -42
  310. package/src/reactivity/url-search-params.js +146 -0
  311. package/src/reactivity/url.js +165 -0
  312. package/src/reactivity/utils.js +5 -22
  313. package/src/server/index.d.ts +21 -0
  314. package/src/store/index-client.js +165 -0
  315. package/src/store/index-server.js +101 -0
  316. package/src/store/private.d.ts +5 -9
  317. package/src/store/public.d.ts +2 -4
  318. package/src/store/{index.js → shared/index.js} +30 -44
  319. package/src/store/utils.js +2 -1
  320. package/src/transition/index.js +19 -26
  321. package/src/utils.js +426 -0
  322. package/src/version.js +1 -1
  323. package/svelte-html.d.ts +1 -1
  324. package/types/index.d.ts +1161 -1219
  325. package/types/index.d.ts.map +60 -97
  326. package/src/compiler/phases/1-parse/utils/names.js +0 -74
  327. package/src/compiler/phases/2-analyze/utils.js +0 -14
  328. package/src/compiler/phases/2-analyze/validation.js +0 -1161
  329. package/src/compiler/phases/3-transform/client/visitors/global.js +0 -125
  330. package/src/compiler/phases/3-transform/client/visitors/javascript-legacy.js +0 -201
  331. package/src/compiler/phases/3-transform/client/visitors/javascript-runes.js +0 -404
  332. package/src/compiler/phases/3-transform/client/visitors/javascript.js +0 -40
  333. package/src/compiler/phases/3-transform/client/visitors/template.js +0 -3012
  334. package/src/compiler/phases/constants.js +0 -201
  335. package/src/compiler/phases/visitors.js +0 -72
  336. package/src/internal/client/utils.js +0 -49
@@ -1,73 +1,129 @@
1
+ /** @import { Context } from 'zimmerframe' */
2
+ /** @import { TransformState } from './types.js' */
3
+ /** @import { AST, Binding, Namespace, SvelteNode, ValidatedCompileOptions } from '#compiler' */
4
+ /** @import { Node, Expression, CallExpression } from 'estree' */
1
5
  import {
2
6
  regex_ends_with_whitespaces,
3
7
  regex_not_whitespace,
4
8
  regex_starts_with_whitespaces
5
9
  } from '../patterns.js';
6
10
  import * as b from '../../utils/builders.js';
11
+ import * as e from '../../errors.js';
7
12
  import { walk } from 'zimmerframe';
13
+ import { extract_identifiers } from '../../utils/ast.js';
14
+ import check_graph_for_cycles from '../2-analyze/utils/check_graph_for_cycles.js';
15
+ import is_reference from 'is-reference';
16
+ import { set_scope } from '../scope.js';
17
+ import { dev } from '../../state.js';
8
18
 
9
19
  /**
10
- * @param {string} s
11
- * @param {boolean} [attr]
20
+ * @param {Node} node
21
+ * @returns {boolean}
22
+ */
23
+ export function is_hoisted_function(node) {
24
+ if (
25
+ node.type === 'ArrowFunctionExpression' ||
26
+ node.type === 'FunctionExpression' ||
27
+ node.type === 'FunctionDeclaration'
28
+ ) {
29
+ return node.metadata?.hoisted === true;
30
+ }
31
+ return false;
32
+ }
33
+
34
+ /**
35
+ * Match Svelte 4 behaviour by sorting ConstTag nodes in topological order
36
+ * @param {SvelteNode[]} nodes
37
+ * @param {TransformState} state
12
38
  */
13
- export function escape_html(s, attr) {
14
- if (typeof s !== 'string') return s;
15
- const delimiter = attr ? '"' : '<';
16
- const escaped_delimiter = attr ? '&quot;' : '&lt;';
17
- let i_delimiter = s.indexOf(delimiter);
18
- let i_ampersand = s.indexOf('&');
19
-
20
- if (i_delimiter < 0 && i_ampersand < 0) return s;
21
-
22
- let left = 0,
23
- out = '';
24
-
25
- while (i_delimiter >= 0 && i_ampersand >= 0) {
26
- if (i_delimiter < i_ampersand) {
27
- if (left < i_delimiter) out += s.substring(left, i_delimiter);
28
- out += escaped_delimiter;
29
- left = i_delimiter + 1;
30
- i_delimiter = s.indexOf(delimiter, left);
39
+ function sort_const_tags(nodes, state) {
40
+ /**
41
+ * @typedef {{
42
+ * node: AST.ConstTag;
43
+ * deps: Set<Binding>;
44
+ * }} Tag
45
+ */
46
+
47
+ const other = [];
48
+
49
+ /** @type {Map<Binding, Tag>} */
50
+ const tags = new Map();
51
+
52
+ for (const node of nodes) {
53
+ if (node.type === 'ConstTag') {
54
+ const declaration = node.declaration.declarations[0];
55
+
56
+ const bindings = extract_identifiers(declaration.id).map((id) => {
57
+ return /** @type {Binding} */ (state.scope.get(id.name));
58
+ });
59
+
60
+ /** @type {Set<Binding>} */
61
+ const deps = new Set();
62
+
63
+ walk(declaration.init, state, {
64
+ // @ts-expect-error don't know, don't care
65
+ _: set_scope,
66
+ Identifier(node, context) {
67
+ const parent = /** @type {Expression} */ (context.path.at(-1));
68
+
69
+ if (is_reference(node, parent)) {
70
+ const binding = context.state.scope.get(node.name);
71
+ if (binding) deps.add(binding);
72
+ }
73
+ }
74
+ });
75
+
76
+ for (const binding of bindings) {
77
+ tags.set(binding, { node, deps });
78
+ }
31
79
  } else {
32
- if (left < i_ampersand) out += s.substring(left, i_ampersand);
33
- out += '&amp;';
34
- left = i_ampersand + 1;
35
- i_ampersand = s.indexOf('&', left);
80
+ other.push(node);
36
81
  }
37
82
  }
38
83
 
39
- if (i_delimiter >= 0) {
40
- do {
41
- if (left < i_delimiter) out += s.substring(left, i_delimiter);
42
- out += escaped_delimiter;
43
- left = i_delimiter + 1;
44
- i_delimiter = s.indexOf(delimiter, left);
45
- } while (i_delimiter >= 0);
46
- } else if (!attr) {
47
- while (i_ampersand >= 0) {
48
- if (left < i_ampersand) out += s.substring(left, i_ampersand);
49
- out += '&amp;';
50
- left = i_ampersand + 1;
51
- i_ampersand = s.indexOf('&', left);
84
+ if (tags.size === 0) {
85
+ return nodes;
86
+ }
87
+
88
+ /** @type {Array<[Binding, Binding]>} */
89
+ const edges = [];
90
+
91
+ for (const [id, tag] of tags) {
92
+ for (const dep of tag.deps) {
93
+ if (tags.has(dep)) {
94
+ edges.push([id, dep]);
95
+ }
52
96
  }
53
97
  }
54
98
 
55
- return left < s.length ? out + s.substring(left) : out;
56
- }
99
+ const cycle = check_graph_for_cycles(edges);
100
+ if (cycle?.length) {
101
+ const tag = /** @type {Tag} */ (tags.get(cycle[0]));
102
+ e.const_tag_cycle(tag.node, cycle.map((binding) => binding.node.name).join(' → '));
103
+ }
57
104
 
58
- /**
59
- * @param {import('estree').Node} node
60
- * @returns {boolean}
61
- */
62
- export function is_hoistable_function(node) {
63
- if (
64
- node.type === 'ArrowFunctionExpression' ||
65
- node.type === 'FunctionExpression' ||
66
- node.type === 'FunctionDeclaration'
67
- ) {
68
- return node.metadata?.hoistable === true;
105
+ /** @type {AST.ConstTag[]} */
106
+ const sorted = [];
107
+
108
+ /** @param {Tag} tag */
109
+ function add(tag) {
110
+ if (sorted.includes(tag.node)) {
111
+ return;
112
+ }
113
+
114
+ for (const dep of tag.deps) {
115
+ const dep_tag = tags.get(dep);
116
+ if (dep_tag) add(dep_tag);
117
+ }
118
+
119
+ sorted.push(tag.node);
69
120
  }
70
- return false;
121
+
122
+ for (const tag of tags.values()) {
123
+ add(tag);
124
+ }
125
+
126
+ return [...sorted, ...other];
71
127
  }
72
128
 
73
129
  /**
@@ -77,10 +133,11 @@ export function is_hoistable_function(node) {
77
133
  * unless it's whitespace-only, in which case collapse to a single whitespace for all cases
78
134
  * except when it's children of certain elements where we know ignore whitespace (like td/option/head),
79
135
  * in which case we remove it entirely
80
- * @param {import('#compiler').SvelteNode} parent
81
- * @param {import('#compiler').SvelteNode[]} nodes
82
- * @param {import('#compiler').SvelteNode[]} path
83
- * @param {import('#compiler').Namespace} namespace
136
+ * @param {SvelteNode} parent
137
+ * @param {SvelteNode[]} nodes
138
+ * @param {SvelteNode[]} path
139
+ * @param {Namespace} namespace
140
+ * @param {TransformState & { options: ValidatedCompileOptions }} state
84
141
  * @param {boolean} preserve_whitespace
85
142
  * @param {boolean} preserve_comments
86
143
  */
@@ -89,13 +146,21 @@ export function clean_nodes(
89
146
  nodes,
90
147
  path,
91
148
  namespace = 'html',
149
+ state,
150
+ // TODO give these defaults (state.options.preserveWhitespace and state.options.preserveComments).
151
+ // first, we need to make `Component(Client|Server)TransformState` inherit from a new `ComponentTransformState`
152
+ // rather than from `ClientTransformState` and `ServerTransformState`
92
153
  preserve_whitespace,
93
154
  preserve_comments
94
155
  ) {
95
- /** @type {import('#compiler').SvelteNode[]} */
156
+ if (!state.analysis.runes) {
157
+ nodes = sort_const_tags(nodes, state);
158
+ }
159
+
160
+ /** @type {SvelteNode[]} */
96
161
  const hoisted = [];
97
162
 
98
- /** @type {import('#compiler').SvelteNode[]} */
163
+ /** @type {SvelteNode[]} */
99
164
  const regular = [];
100
165
 
101
166
  for (const node of nodes) {
@@ -120,121 +185,165 @@ export function clean_nodes(
120
185
  }
121
186
  }
122
187
 
123
- if (preserve_whitespace) {
124
- return { hoisted, trimmed: regular };
125
- }
188
+ let trimmed = regular;
126
189
 
127
- let first, last;
190
+ if (!preserve_whitespace) {
191
+ trimmed = [];
128
192
 
129
- while ((first = regular[0]) && first.type === 'Text' && !regex_not_whitespace.test(first.data)) {
130
- regular.shift();
131
- }
193
+ let first, last;
132
194
 
133
- if (first?.type === 'Text') {
134
- first.raw = first.raw.replace(regex_starts_with_whitespaces, '');
135
- first.data = first.data.replace(regex_starts_with_whitespaces, '');
136
- }
195
+ while (
196
+ (first = regular[0]) &&
197
+ first.type === 'Text' &&
198
+ !regex_not_whitespace.test(first.data)
199
+ ) {
200
+ regular.shift();
201
+ }
137
202
 
138
- while ((last = regular.at(-1)) && last.type === 'Text' && !regex_not_whitespace.test(last.data)) {
139
- regular.pop();
140
- }
203
+ if (first?.type === 'Text') {
204
+ first.raw = first.raw.replace(regex_starts_with_whitespaces, '');
205
+ first.data = first.data.replace(regex_starts_with_whitespaces, '');
206
+ }
141
207
 
142
- if (last?.type === 'Text') {
143
- last.raw = last.raw.replace(regex_ends_with_whitespaces, '');
144
- last.data = last.data.replace(regex_ends_with_whitespaces, '');
145
- }
208
+ while (
209
+ (last = regular.at(-1)) &&
210
+ last.type === 'Text' &&
211
+ !regex_not_whitespace.test(last.data)
212
+ ) {
213
+ regular.pop();
214
+ }
146
215
 
147
- const can_remove_entirely =
148
- (namespace === 'svg' &&
149
- (parent.type !== 'RegularElement' || parent.name !== 'text') &&
150
- !path.some((n) => n.type === 'RegularElement' && n.name === 'text')) ||
151
- (parent.type === 'RegularElement' &&
152
- // TODO others?
153
- (parent.name === 'select' ||
154
- parent.name === 'tr' ||
155
- parent.name === 'table' ||
156
- parent.name === 'tbody' ||
157
- parent.name === 'thead' ||
158
- parent.name === 'tfoot' ||
159
- parent.name === 'colgroup' ||
160
- parent.name === 'datalist'));
161
-
162
- /** @type {import('#compiler').SvelteNode[]} */
163
- const trimmed = [];
164
-
165
- // Replace any whitespace between a text and non-text node with a single spaceand keep whitespace
166
- // as-is within text nodes, or between text nodes and expression tags (because in the end they count
167
- // as one text). This way whitespace is mostly preserved when using CSS with `white-space: pre-line`
168
- // and default slot content going into a pre tag (which we can't see).
169
- for (let i = 0; i < regular.length; i++) {
170
- const prev = regular[i - 1];
171
- const node = regular[i];
172
- const next = regular[i + 1];
173
-
174
- if (node.type === 'Text') {
175
- if (prev?.type !== 'ExpressionTag') {
176
- const prev_is_text_ending_with_whitespace =
177
- prev?.type === 'Text' && regex_ends_with_whitespaces.test(prev.data);
178
- node.data = node.data.replace(
179
- regex_starts_with_whitespaces,
180
- prev_is_text_ending_with_whitespace ? '' : ' '
181
- );
182
- node.raw = node.raw.replace(
183
- regex_starts_with_whitespaces,
184
- prev_is_text_ending_with_whitespace ? '' : ' '
185
- );
186
- }
187
- if (next?.type !== 'ExpressionTag') {
188
- node.data = node.data.replace(regex_ends_with_whitespaces, ' ');
189
- node.raw = node.raw.replace(regex_ends_with_whitespaces, ' ');
190
- }
191
- if (node.data && (node.data !== ' ' || !can_remove_entirely)) {
216
+ if (last?.type === 'Text') {
217
+ last.raw = last.raw.replace(regex_ends_with_whitespaces, '');
218
+ last.data = last.data.replace(regex_ends_with_whitespaces, '');
219
+ }
220
+
221
+ const can_remove_entirely =
222
+ (namespace === 'svg' &&
223
+ (parent.type !== 'RegularElement' || parent.name !== 'text') &&
224
+ !path.some((n) => n.type === 'RegularElement' && n.name === 'text')) ||
225
+ (parent.type === 'RegularElement' &&
226
+ // TODO others?
227
+ (parent.name === 'select' ||
228
+ parent.name === 'tr' ||
229
+ parent.name === 'table' ||
230
+ parent.name === 'tbody' ||
231
+ parent.name === 'thead' ||
232
+ parent.name === 'tfoot' ||
233
+ parent.name === 'colgroup' ||
234
+ parent.name === 'datalist'));
235
+
236
+ // Replace any whitespace between a text and non-text node with a single spaceand keep whitespace
237
+ // as-is within text nodes, or between text nodes and expression tags (because in the end they count
238
+ // as one text). This way whitespace is mostly preserved when using CSS with `white-space: pre-line`
239
+ // and default slot content going into a pre tag (which we can't see).
240
+ for (let i = 0; i < regular.length; i++) {
241
+ const prev = regular[i - 1];
242
+ const node = regular[i];
243
+ const next = regular[i + 1];
244
+
245
+ if (node.type === 'Text') {
246
+ if (prev?.type !== 'ExpressionTag') {
247
+ const prev_is_text_ending_with_whitespace =
248
+ prev?.type === 'Text' && regex_ends_with_whitespaces.test(prev.data);
249
+ node.data = node.data.replace(
250
+ regex_starts_with_whitespaces,
251
+ prev_is_text_ending_with_whitespace ? '' : ' '
252
+ );
253
+ node.raw = node.raw.replace(
254
+ regex_starts_with_whitespaces,
255
+ prev_is_text_ending_with_whitespace ? '' : ' '
256
+ );
257
+ }
258
+ if (next?.type !== 'ExpressionTag') {
259
+ node.data = node.data.replace(regex_ends_with_whitespaces, ' ');
260
+ node.raw = node.raw.replace(regex_ends_with_whitespaces, ' ');
261
+ }
262
+ if (node.data && (node.data !== ' ' || !can_remove_entirely)) {
263
+ trimmed.push(node);
264
+ }
265
+ } else {
192
266
  trimmed.push(node);
193
267
  }
194
- } else {
195
- trimmed.push(node);
196
268
  }
197
269
  }
198
270
 
199
- return { hoisted, trimmed };
271
+ var first = trimmed[0];
272
+
273
+ // Special case: Add a comment if this is a lone script tag. This ensures that our run_scripts logic in template.js
274
+ // will always be able to call node.replaceWith() on the script tag in order to make it run. If we don't add this
275
+ // and would still call node.replaceWith() on the script tag, it would be a no-op because the script tag has no parent.
276
+ if (trimmed.length === 1 && first.type === 'RegularElement' && first.name === 'script') {
277
+ trimmed.push({
278
+ type: 'Comment',
279
+ data: '',
280
+ parent: first.parent,
281
+ start: -1,
282
+ end: -1
283
+ });
284
+ }
285
+
286
+ return {
287
+ hoisted,
288
+ trimmed,
289
+ /**
290
+ * In a case like `{#if x}<Foo />{/if}`, we don't need to wrap the child in
291
+ * comments — we can just use the parent block's anchor for the component.
292
+ * TODO extend this optimisation to other cases
293
+ */
294
+ is_standalone:
295
+ trimmed.length === 1 &&
296
+ ((first.type === 'RenderTag' && !first.metadata.dynamic) ||
297
+ (first.type === 'Component' &&
298
+ !state.options.hmr &&
299
+ !first.metadata.dynamic &&
300
+ !first.attributes.some(
301
+ (attribute) => attribute.type === 'Attribute' && attribute.name.startsWith('--')
302
+ ))),
303
+ /** if a component/snippet/each block starts with text, we need to add an anchor comment so that its text node doesn't get fused with its surroundings */
304
+ is_text_first:
305
+ (parent.type === 'Fragment' ||
306
+ parent.type === 'SnippetBlock' ||
307
+ parent.type === 'EachBlock' ||
308
+ parent.type === 'SvelteComponent' ||
309
+ parent.type === 'Component' ||
310
+ parent.type === 'SvelteSelf') &&
311
+ first &&
312
+ (first?.type === 'Text' || first?.type === 'ExpressionTag')
313
+ };
200
314
  }
201
315
 
202
316
  /**
203
317
  * Infers the namespace for the children of a node that should be used when creating the `$.template(...)`.
204
- * @param {import('#compiler').Namespace} namespace
205
- * @param {import('#compiler').SvelteNode} parent
206
- * @param {import('#compiler').SvelteNode[]} nodes
207
- * @param {import('#compiler').SvelteNode[]} path
318
+ * @param {Namespace} namespace
319
+ * @param {SvelteNode} parent
320
+ * @param {SvelteNode[]} nodes
208
321
  */
209
- export function infer_namespace(namespace, parent, nodes, path) {
210
- const parent_node =
211
- parent.type === 'Fragment'
212
- ? // Messy: We know that Fragment calls create_block directly, so we can do this here
213
- path.at(-1)
214
- : parent;
215
-
216
- if (namespace !== 'foreign') {
217
- if (parent_node?.type === 'RegularElement' && parent_node.name === 'foreignObject') {
218
- return 'html';
219
- }
322
+ export function infer_namespace(namespace, parent, nodes) {
323
+ if (parent.type === 'RegularElement' && parent.name === 'foreignObject') {
324
+ return 'html';
325
+ }
220
326
 
221
- if (parent_node?.type === 'RegularElement' || parent_node?.type === 'SvelteElement') {
222
- return parent_node.metadata.svg ? 'svg' : 'html';
327
+ if (parent.type === 'RegularElement' || parent.type === 'SvelteElement') {
328
+ if (parent.metadata.svg) {
329
+ return 'svg';
223
330
  }
331
+ return parent.metadata.mathml ? 'mathml' : 'html';
332
+ }
224
333
 
225
- // Re-evaluate the namespace inside slot nodes that reset the namespace
226
- if (
227
- parent_node === undefined ||
228
- parent_node.type === 'Root' ||
229
- parent_node.type === 'Component' ||
230
- parent_node.type === 'SvelteComponent' ||
231
- parent_node.type === 'SvelteFragment' ||
232
- parent_node.type === 'SnippetBlock'
233
- ) {
234
- const new_namespace = check_nodes_for_namespace(nodes, 'keep');
235
- if (new_namespace !== 'keep' && new_namespace !== 'maybe_html') {
236
- return new_namespace;
237
- }
334
+ // Re-evaluate the namespace inside slot nodes that reset the namespace
335
+ if (
336
+ parent.type === 'Fragment' ||
337
+ parent.type === 'Root' ||
338
+ parent.type === 'Component' ||
339
+ parent.type === 'SvelteComponent' ||
340
+ parent.type === 'SvelteFragment' ||
341
+ parent.type === 'SnippetBlock' ||
342
+ parent.type === 'SlotElement'
343
+ ) {
344
+ const new_namespace = check_nodes_for_namespace(nodes, 'keep');
345
+ if (new_namespace !== 'keep' && new_namespace !== 'maybe_html') {
346
+ return new_namespace;
238
347
  }
239
348
  }
240
349
 
@@ -245,20 +354,20 @@ export function infer_namespace(namespace, parent, nodes, path) {
245
354
  * Heuristic: Keep current namespace, unless we find a regular element,
246
355
  * in which case we always want html, or we only find svg nodes,
247
356
  * in which case we assume svg.
248
- * @param {import('#compiler').SvelteNode[]} nodes
249
- * @param {import('#compiler').Namespace | 'keep' | 'maybe_html'} namespace
357
+ * @param {SvelteNode[]} nodes
358
+ * @param {Namespace | 'keep' | 'maybe_html'} namespace
250
359
  */
251
360
  function check_nodes_for_namespace(nodes, namespace) {
252
361
  /**
253
- * @param {import('#compiler').SvelteElement | import('#compiler').RegularElement} node}
362
+ * @param {AST.SvelteElement | AST.RegularElement} node}
254
363
  * @param {{stop: () => void}} context
255
364
  */
256
365
  const RegularElement = (node, { stop }) => {
257
- if (!node.metadata.svg) {
366
+ if (!node.metadata.svg && !node.metadata.mathml) {
258
367
  namespace = 'html';
259
368
  stop();
260
369
  } else if (namespace === 'keep') {
261
- namespace = 'svg';
370
+ namespace = node.metadata.svg ? 'svg' : 'mathml';
262
371
  }
263
372
  };
264
373
 
@@ -299,40 +408,39 @@ function check_nodes_for_namespace(nodes, namespace) {
299
408
 
300
409
  /**
301
410
  * Determines the namespace the children of this node are in.
302
- * @param {import('#compiler').RegularElement | import('#compiler').SvelteElement} node
303
- * @param {import('#compiler').Namespace} namespace
304
- * @returns {import('#compiler').Namespace}
411
+ * @param {AST.RegularElement | AST.SvelteElement} node
412
+ * @param {Namespace} namespace
413
+ * @returns {Namespace}
305
414
  */
306
415
  export function determine_namespace_for_children(node, namespace) {
307
- if (namespace === 'foreign') {
308
- return namespace;
309
- }
310
-
311
416
  if (node.name === 'foreignObject') {
312
417
  return 'html';
313
418
  }
314
419
 
315
- return node.metadata.svg ? 'svg' : 'html';
420
+ if (node.metadata.svg) {
421
+ return 'svg';
422
+ }
423
+
424
+ return node.metadata.mathml ? 'mathml' : 'html';
316
425
  }
317
426
 
318
427
  /**
319
- * @template {import('./types.js').TransformState} T
320
- * @param {import('estree').CallExpression} node
321
- * @param {import('zimmerframe').Context<any, T>} context
428
+ * @template {TransformState} T
429
+ * @param {CallExpression} node
430
+ * @param {Context<any, T>} context
322
431
  */
323
432
  export function transform_inspect_rune(node, context) {
324
433
  const { state, visit } = context;
325
434
  const as_fn = state.options.generate === 'client';
326
435
 
327
- if (!state.options.dev) return b.unary('void', b.literal(0));
436
+ if (!dev) return b.empty;
328
437
 
329
438
  if (node.callee.type === 'MemberExpression') {
330
- const raw_inspect_args = /** @type {import('estree').CallExpression} */ (node.callee.object)
331
- .arguments;
439
+ const raw_inspect_args = /** @type {CallExpression} */ (node.callee.object).arguments;
332
440
  const inspect_args =
333
- /** @type {Array<import('estree').Expression>} */
441
+ /** @type {Array<Expression>} */
334
442
  (raw_inspect_args.map((arg) => visit(arg)));
335
- const with_arg = /** @type {import('estree').Expression} */ (visit(node.arguments[0]));
443
+ const with_arg = /** @type {Expression} */ (visit(node.arguments[0]));
336
444
 
337
445
  return b.call(
338
446
  '$.inspect',
@@ -340,9 +448,7 @@ export function transform_inspect_rune(node, context) {
340
448
  with_arg
341
449
  );
342
450
  } else {
343
- const arg = node.arguments.map(
344
- (arg) => /** @type {import('estree').Expression} */ (visit(arg))
345
- );
451
+ const arg = node.arguments.map((arg) => /** @type {Expression} */ (visit(arg)));
346
452
  return b.call('$.inspect', as_fn ? b.thunk(b.array(arg)) : b.array(arg));
347
453
  }
348
454
  }