@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,1057 @@
1
+ /** @import { Fork } from 'svelte' */
2
+ /** @import { Derived, Effect, Reaction, Source, Value } from '#client' */
3
+ /** @import { Boundary } from '../dom/blocks/boundary' */
4
+ import {
5
+ BLOCK_EFFECT,
6
+ BRANCH_EFFECT,
7
+ CLEAN,
8
+ DESTROYED,
9
+ DIRTY,
10
+ EFFECT,
11
+ ASYNC,
12
+ INERT,
13
+ RENDER_EFFECT,
14
+ ROOT_EFFECT,
15
+ MAYBE_DIRTY,
16
+ DERIVED,
17
+ BOUNDARY_EFFECT,
18
+ EAGER_EFFECT,
19
+ HEAD_EFFECT,
20
+ ERROR_VALUE,
21
+ MANAGED_EFFECT,
22
+ REACTION_RAN
23
+ } from '#client/constants';
24
+ import { async_mode_flag } from '../../flags/index.js';
25
+ import { deferred, define_property, includes } from '../../shared/utils.js';
26
+ import {
27
+ active_effect,
28
+ get,
29
+ increment_write_version,
30
+ is_dirty,
31
+ update_effect
32
+ } from '../runtime.js';
33
+ import * as e from '../errors.js';
34
+ import { flush_tasks, queue_micro_task } from '../dom/task.js';
35
+ import { DEV } from 'esm-env';
36
+ import { invoke_error_boundary } from '../error-handling.js';
37
+ import { flush_eager_effects, old_values, set_eager_effects, source, update } from './sources.js';
38
+ import { eager_effect, unlink_effect } from './effects.js';
39
+ import { defer_effect } from './utils.js';
40
+ import { UNINITIALIZED } from '../../../constants.js';
41
+ import { set_signal_status } from './status.js';
42
+
43
+ /** @type {Set<Batch>} */
44
+ const batches = new Set();
45
+
46
+ /** @type {Batch | null} */
47
+ export let current_batch = null;
48
+
49
+ /**
50
+ * This is needed to avoid overwriting inputs in non-async mode
51
+ * TODO 6.0 remove this, as non-async mode will go away
52
+ * @type {Batch | null}
53
+ */
54
+ export let previous_batch = null;
55
+
56
+ /**
57
+ * When time travelling (i.e. working in one batch, while other batches
58
+ * still have ongoing work), we ignore the real values of affected
59
+ * signals in favour of their values within the batch
60
+ * @type {Map<Value, any> | null}
61
+ */
62
+ export let batch_values = null;
63
+
64
+ // TODO this should really be a property of `batch`
65
+ /** @type {Effect[]} */
66
+ let queued_root_effects = [];
67
+
68
+ /** @type {Effect | null} */
69
+ let last_scheduled_effect = null;
70
+
71
+ let is_flushing = false;
72
+ export let is_flushing_sync = false;
73
+
74
+ export class Batch {
75
+ /**
76
+ * The current values of any sources that are updated in this batch
77
+ * They keys of this map are identical to `this.#previous`
78
+ * @type {Map<Source, any>}
79
+ */
80
+ current = new Map();
81
+
82
+ /**
83
+ * The values of any sources that are updated in this batch _before_ those updates took place.
84
+ * They keys of this map are identical to `this.#current`
85
+ * @type {Map<Source, any>}
86
+ */
87
+ previous = new Map();
88
+
89
+ /**
90
+ * When the batch is committed (and the DOM is updated), we need to remove old branches
91
+ * and append new ones by calling the functions added inside (if/each/key/etc) blocks
92
+ * @type {Set<() => void>}
93
+ */
94
+ #commit_callbacks = new Set();
95
+
96
+ /**
97
+ * If a fork is discarded, we need to destroy any effects that are no longer needed
98
+ * @type {Set<(batch: Batch) => void>}
99
+ */
100
+ #discard_callbacks = new Set();
101
+
102
+ /**
103
+ * The number of async effects that are currently in flight
104
+ */
105
+ #pending = 0;
106
+
107
+ /**
108
+ * The number of async effects that are currently in flight, _not_ inside a pending boundary
109
+ */
110
+ #blocking_pending = 0;
111
+
112
+ /**
113
+ * A deferred that resolves when the batch is committed, used with `settled()`
114
+ * TODO replace with Promise.withResolvers once supported widely enough
115
+ * @type {{ promise: Promise<void>, resolve: (value?: any) => void, reject: (reason: unknown) => void } | null}
116
+ */
117
+ #deferred = null;
118
+
119
+ /**
120
+ * Deferred effects (which run after async work has completed) that are DIRTY
121
+ * @type {Set<Effect>}
122
+ */
123
+ #dirty_effects = new Set();
124
+
125
+ /**
126
+ * Deferred effects that are MAYBE_DIRTY
127
+ * @type {Set<Effect>}
128
+ */
129
+ #maybe_dirty_effects = new Set();
130
+
131
+ /**
132
+ * A map of branches that still exist, but will be destroyed when this batch
133
+ * is committed — we skip over these during `process`.
134
+ * The value contains child effects that were dirty/maybe_dirty before being reset,
135
+ * so they can be rescheduled if the branch survives.
136
+ * @type {Map<Effect, { d: Effect[], m: Effect[] }>}
137
+ */
138
+ #skipped_branches = new Map();
139
+
140
+ is_fork = false;
141
+
142
+ #decrement_queued = false;
143
+
144
+ #is_deferred() {
145
+ return this.is_fork || this.#blocking_pending > 0;
146
+ }
147
+
148
+ /**
149
+ * Add an effect to the #skipped_branches map and reset its children
150
+ * @param {Effect} effect
151
+ */
152
+ skip_effect(effect) {
153
+ if (!this.#skipped_branches.has(effect)) {
154
+ this.#skipped_branches.set(effect, { d: [], m: [] });
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Remove an effect from the #skipped_branches map and reschedule
160
+ * any tracked dirty/maybe_dirty child effects
161
+ * @param {Effect} effect
162
+ */
163
+ unskip_effect(effect) {
164
+ var tracked = this.#skipped_branches.get(effect);
165
+ if (tracked) {
166
+ this.#skipped_branches.delete(effect);
167
+
168
+ for (var e of tracked.d) {
169
+ set_signal_status(e, DIRTY);
170
+ schedule_effect(e);
171
+ }
172
+
173
+ for (e of tracked.m) {
174
+ set_signal_status(e, MAYBE_DIRTY);
175
+ schedule_effect(e);
176
+ }
177
+ }
178
+ }
179
+
180
+ /**
181
+ *
182
+ * @param {Effect[]} root_effects
183
+ */
184
+ process(root_effects) {
185
+ queued_root_effects = [];
186
+
187
+ this.apply();
188
+
189
+ /** @type {Effect[]} */
190
+ var effects = [];
191
+
192
+ /** @type {Effect[]} */
193
+ var render_effects = [];
194
+
195
+ for (const root of root_effects) {
196
+ this.#traverse_effect_tree(root, effects, render_effects);
197
+ // Note: #traverse_effect_tree runs block effects eagerly, which can schedule effects,
198
+ // which means queued_root_effects now may be filled again.
199
+
200
+ // Helpful for debugging reactivity loss that has to do with branches being skipped:
201
+ // log_inconsistent_branches(root);
202
+ }
203
+
204
+ if (this.#is_deferred()) {
205
+ this.#defer_effects(render_effects);
206
+ this.#defer_effects(effects);
207
+
208
+ for (const [e, t] of this.#skipped_branches) {
209
+ reset_branch(e, t);
210
+ }
211
+ } else {
212
+ // append/remove branches
213
+ for (const fn of this.#commit_callbacks) fn();
214
+ this.#commit_callbacks.clear();
215
+
216
+ if (this.#pending === 0) {
217
+ this.#commit();
218
+ }
219
+
220
+ // If sources are written to, then work needs to happen in a separate batch, else prior sources would be mixed with
221
+ // newly updated sources, which could lead to infinite loops when effects run over and over again.
222
+ previous_batch = this;
223
+ current_batch = null;
224
+
225
+ flush_queued_effects(render_effects);
226
+ flush_queued_effects(effects);
227
+
228
+ previous_batch = null;
229
+
230
+ this.#deferred?.resolve();
231
+ }
232
+
233
+ batch_values = null;
234
+ }
235
+
236
+ /**
237
+ * Traverse the effect tree, executing effects or stashing
238
+ * them for later execution as appropriate
239
+ * @param {Effect} root
240
+ * @param {Effect[]} effects
241
+ * @param {Effect[]} render_effects
242
+ */
243
+ #traverse_effect_tree(root, effects, render_effects) {
244
+ root.f ^= CLEAN;
245
+
246
+ var effect = root.first;
247
+
248
+ while (effect !== null) {
249
+ var flags = effect.f;
250
+ var is_branch = (flags & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0;
251
+ var is_skippable_branch = is_branch && (flags & CLEAN) !== 0;
252
+
253
+ var skip = is_skippable_branch || (flags & INERT) !== 0 || this.#skipped_branches.has(effect);
254
+
255
+ if (!skip && effect.fn !== null) {
256
+ if (is_branch) {
257
+ effect.f ^= CLEAN;
258
+ } else if ((flags & EFFECT) !== 0) {
259
+ effects.push(effect);
260
+ } else if (async_mode_flag && (flags & (RENDER_EFFECT | MANAGED_EFFECT)) !== 0) {
261
+ render_effects.push(effect);
262
+ } else if (is_dirty(effect)) {
263
+ if ((flags & BLOCK_EFFECT) !== 0) this.#maybe_dirty_effects.add(effect);
264
+ update_effect(effect);
265
+ }
266
+
267
+ var child = effect.first;
268
+
269
+ if (child !== null) {
270
+ effect = child;
271
+ continue;
272
+ }
273
+ }
274
+
275
+ while (effect !== null) {
276
+ var next = effect.next;
277
+
278
+ if (next !== null) {
279
+ effect = next;
280
+ break;
281
+ }
282
+
283
+ effect = effect.parent;
284
+ }
285
+ }
286
+ }
287
+
288
+ /**
289
+ * @param {Effect[]} effects
290
+ */
291
+ #defer_effects(effects) {
292
+ for (var i = 0; i < effects.length; i += 1) {
293
+ defer_effect(effects[i], this.#dirty_effects, this.#maybe_dirty_effects);
294
+ }
295
+ }
296
+
297
+ /**
298
+ * Associate a change to a given source with the current
299
+ * batch, noting its previous and current values
300
+ * @param {Source} source
301
+ * @param {any} value
302
+ */
303
+ capture(source, value) {
304
+ if (value !== UNINITIALIZED && !this.previous.has(source)) {
305
+ this.previous.set(source, value);
306
+ }
307
+
308
+ // Don't save errors in `batch_values`, or they won't be thrown in `runtime.js#get`
309
+ if ((source.f & ERROR_VALUE) === 0) {
310
+ this.current.set(source, source.v);
311
+ batch_values?.set(source, source.v);
312
+ }
313
+ }
314
+
315
+ activate() {
316
+ current_batch = this;
317
+ this.apply();
318
+ }
319
+
320
+ deactivate() {
321
+ // If we're not the current batch, don't deactivate,
322
+ // else we could create zombie batches that are never flushed
323
+ if (current_batch !== this) return;
324
+
325
+ current_batch = null;
326
+ batch_values = null;
327
+ }
328
+
329
+ flush() {
330
+ this.activate();
331
+
332
+ if (queued_root_effects.length > 0) {
333
+ flush_effects();
334
+
335
+ if (current_batch !== null && current_batch !== this) {
336
+ // this can happen if a new batch was created during `flush_effects()`
337
+ return;
338
+ }
339
+ } else if (this.#pending === 0) {
340
+ this.process([]); // TODO this feels awkward
341
+ }
342
+
343
+ this.deactivate();
344
+ }
345
+
346
+ discard() {
347
+ for (const fn of this.#discard_callbacks) fn(this);
348
+ this.#discard_callbacks.clear();
349
+ }
350
+
351
+ #commit() {
352
+ // If there are other pending batches, they now need to be 'rebased' —
353
+ // in other words, we re-run block/async effects with the newly
354
+ // committed state, unless the batch in question has a more
355
+ // recent value for a given source
356
+ if (batches.size > 1) {
357
+ this.previous.clear();
358
+
359
+ var previous_batch_values = batch_values;
360
+ var is_earlier = true;
361
+
362
+ for (const batch of batches) {
363
+ if (batch === this) {
364
+ is_earlier = false;
365
+ continue;
366
+ }
367
+
368
+ /** @type {Source[]} */
369
+ const sources = [];
370
+
371
+ for (const [source, value] of this.current) {
372
+ if (batch.current.has(source)) {
373
+ if (is_earlier && value !== batch.current.get(source)) {
374
+ // bring the value up to date
375
+ batch.current.set(source, value);
376
+ } else {
377
+ // same value or later batch has more recent value,
378
+ // no need to re-run these effects
379
+ continue;
380
+ }
381
+ }
382
+
383
+ sources.push(source);
384
+ }
385
+
386
+ if (sources.length === 0) {
387
+ continue;
388
+ }
389
+
390
+ // Re-run async/block effects that depend on distinct values changed in both batches
391
+ const others = [...batch.current.keys()].filter((s) => !this.current.has(s));
392
+ if (others.length > 0) {
393
+ // Avoid running queued root effects on the wrong branch
394
+ var prev_queued_root_effects = queued_root_effects;
395
+ queued_root_effects = [];
396
+
397
+ /** @type {Set<Value>} */
398
+ const marked = new Set();
399
+ /** @type {Map<Reaction, boolean>} */
400
+ const checked = new Map();
401
+ for (const source of sources) {
402
+ mark_effects(source, others, marked, checked);
403
+ }
404
+
405
+ if (queued_root_effects.length > 0) {
406
+ current_batch = batch;
407
+ batch.apply();
408
+
409
+ for (const root of queued_root_effects) {
410
+ batch.#traverse_effect_tree(root, [], []);
411
+ }
412
+
413
+ // TODO do we need to do anything with the dummy effect arrays?
414
+
415
+ batch.deactivate();
416
+ }
417
+
418
+ queued_root_effects = prev_queued_root_effects;
419
+ }
420
+ }
421
+
422
+ current_batch = null;
423
+ batch_values = previous_batch_values;
424
+ }
425
+
426
+ batches.delete(this);
427
+ }
428
+
429
+ /**
430
+ *
431
+ * @param {boolean} blocking
432
+ */
433
+ increment(blocking) {
434
+ this.#pending += 1;
435
+ if (blocking) this.#blocking_pending += 1;
436
+ }
437
+
438
+ /**
439
+ *
440
+ * @param {boolean} blocking
441
+ */
442
+ decrement(blocking) {
443
+ this.#pending -= 1;
444
+ if (blocking) this.#blocking_pending -= 1;
445
+
446
+ if (this.#decrement_queued) return;
447
+ this.#decrement_queued = true;
448
+
449
+ queue_micro_task(() => {
450
+ this.#decrement_queued = false;
451
+
452
+ if (!this.#is_deferred()) {
453
+ // we only reschedule previously-deferred effects if we expect
454
+ // to be able to run them after processing the batch
455
+ this.revive();
456
+ } else if (queued_root_effects.length > 0) {
457
+ // if other effects are scheduled, process the batch _without_
458
+ // rescheduling the previously-deferred effects
459
+ this.flush();
460
+ }
461
+ });
462
+ }
463
+
464
+ revive() {
465
+ for (const e of this.#dirty_effects) {
466
+ this.#maybe_dirty_effects.delete(e);
467
+ set_signal_status(e, DIRTY);
468
+ schedule_effect(e);
469
+ }
470
+
471
+ for (const e of this.#maybe_dirty_effects) {
472
+ set_signal_status(e, MAYBE_DIRTY);
473
+ schedule_effect(e);
474
+ }
475
+
476
+ this.flush();
477
+ }
478
+
479
+ /** @param {() => void} fn */
480
+ oncommit(fn) {
481
+ this.#commit_callbacks.add(fn);
482
+ }
483
+
484
+ /** @param {(batch: Batch) => void} fn */
485
+ ondiscard(fn) {
486
+ this.#discard_callbacks.add(fn);
487
+ }
488
+
489
+ settled() {
490
+ return (this.#deferred ??= deferred()).promise;
491
+ }
492
+
493
+ static ensure() {
494
+ if (current_batch === null) {
495
+ const batch = (current_batch = new Batch());
496
+ batches.add(current_batch);
497
+
498
+ if (!is_flushing_sync) {
499
+ queue_micro_task(() => {
500
+ if (current_batch !== batch) {
501
+ // a flushSync happened in the meantime
502
+ return;
503
+ }
504
+
505
+ batch.flush();
506
+ });
507
+ }
508
+ }
509
+
510
+ return current_batch;
511
+ }
512
+
513
+ apply() {
514
+ if (!async_mode_flag || (!this.is_fork && batches.size === 1)) return;
515
+
516
+ // if there are multiple batches, we are 'time travelling' —
517
+ // we need to override values with the ones in this batch...
518
+ batch_values = new Map(this.current);
519
+
520
+ // ...and undo changes belonging to other batches
521
+ for (const batch of batches) {
522
+ if (batch === this) continue;
523
+
524
+ for (const [source, previous] of batch.previous) {
525
+ if (!batch_values.has(source)) {
526
+ batch_values.set(source, previous);
527
+ }
528
+ }
529
+ }
530
+ }
531
+ }
532
+
533
+ /**
534
+ * Synchronously flush any pending updates.
535
+ * Returns void if no callback is provided, otherwise returns the result of calling the callback.
536
+ * @template [T=void]
537
+ * @param {(() => T) | undefined} [fn]
538
+ * @returns {T}
539
+ */
540
+ export function flushSync(fn) {
541
+ var was_flushing_sync = is_flushing_sync;
542
+ is_flushing_sync = true;
543
+
544
+ try {
545
+ var result;
546
+
547
+ if (fn) {
548
+ if (current_batch !== null) {
549
+ flush_effects();
550
+ }
551
+
552
+ result = fn();
553
+ }
554
+
555
+ while (true) {
556
+ flush_tasks();
557
+
558
+ if (queued_root_effects.length === 0) {
559
+ current_batch?.flush();
560
+
561
+ // we need to check again, in case we just updated an `$effect.pending()`
562
+ if (queued_root_effects.length === 0) {
563
+ // this would be reset in `flush_effects()` but since we are early returning here,
564
+ // we need to reset it here as well in case the first time there's 0 queued root effects
565
+ last_scheduled_effect = null;
566
+
567
+ return /** @type {T} */ (result);
568
+ }
569
+ }
570
+
571
+ flush_effects();
572
+ }
573
+ } finally {
574
+ is_flushing_sync = was_flushing_sync;
575
+ }
576
+ }
577
+
578
+ function flush_effects() {
579
+ is_flushing = true;
580
+
581
+ var source_stacks = DEV ? new Set() : null;
582
+
583
+ try {
584
+ var flush_count = 0;
585
+
586
+ while (queued_root_effects.length > 0) {
587
+ var batch = Batch.ensure();
588
+
589
+ if (flush_count++ > 1000) {
590
+ if (DEV) {
591
+ var updates = new Map();
592
+
593
+ for (const source of batch.current.keys()) {
594
+ for (const [stack, update] of source.updated ?? []) {
595
+ var entry = updates.get(stack);
596
+
597
+ if (!entry) {
598
+ entry = { error: update.error, count: 0 };
599
+ updates.set(stack, entry);
600
+ }
601
+
602
+ entry.count += update.count;
603
+ }
604
+ }
605
+
606
+ for (const update of updates.values()) {
607
+ if (update.error) {
608
+ // eslint-disable-next-line no-console
609
+ console.error(update.error);
610
+ }
611
+ }
612
+ }
613
+
614
+ infinite_loop_guard();
615
+ }
616
+
617
+ batch.process(queued_root_effects);
618
+ old_values.clear();
619
+
620
+ if (DEV) {
621
+ for (const source of batch.current.keys()) {
622
+ /** @type {Set<Source>} */ (source_stacks).add(source);
623
+ }
624
+ }
625
+ }
626
+ } finally {
627
+ queued_root_effects = [];
628
+
629
+ is_flushing = false;
630
+ last_scheduled_effect = null;
631
+
632
+ if (DEV) {
633
+ for (const source of /** @type {Set<Source>} */ (source_stacks)) {
634
+ source.updated = null;
635
+ }
636
+ }
637
+ }
638
+ }
639
+
640
+ function infinite_loop_guard() {
641
+ try {
642
+ e.effect_update_depth_exceeded();
643
+ } catch (error) {
644
+ if (DEV) {
645
+ // stack contains no useful information, replace it
646
+ define_property(error, 'stack', { value: '' });
647
+ }
648
+
649
+ // Best effort: invoke the boundary nearest the most recent
650
+ // effect and hope that it's relevant to the infinite loop
651
+ invoke_error_boundary(error, last_scheduled_effect);
652
+ }
653
+ }
654
+
655
+ /** @type {Set<Effect> | null} */
656
+ export let eager_block_effects = null;
657
+
658
+ /**
659
+ * @param {Array<Effect>} effects
660
+ * @returns {void}
661
+ */
662
+ function flush_queued_effects(effects) {
663
+ var length = effects.length;
664
+ if (length === 0) return;
665
+
666
+ var i = 0;
667
+
668
+ while (i < length) {
669
+ var effect = effects[i++];
670
+
671
+ if ((effect.f & (DESTROYED | INERT)) === 0 && is_dirty(effect)) {
672
+ eager_block_effects = new Set();
673
+
674
+ update_effect(effect);
675
+
676
+ // Effects with no dependencies or teardown do not get added to the effect tree.
677
+ // Deferred effects (e.g. `$effect(...)`) _are_ added to the tree because we
678
+ // don't know if we need to keep them until they are executed. Doing the check
679
+ // here (rather than in `update_effect`) allows us to skip the work for
680
+ // immediate effects.
681
+ if (
682
+ effect.deps === null &&
683
+ effect.first === null &&
684
+ effect.nodes === null &&
685
+ effect.teardown === null &&
686
+ effect.ac === null
687
+ ) {
688
+ // remove this effect from the graph
689
+ unlink_effect(effect);
690
+ }
691
+
692
+ // If update_effect() has a flushSync() in it, we may have flushed another flush_queued_effects(),
693
+ // which already handled this logic and did set eager_block_effects to null.
694
+ if (eager_block_effects?.size > 0) {
695
+ old_values.clear();
696
+
697
+ for (const e of eager_block_effects) {
698
+ // Skip eager effects that have already been unmounted
699
+ if ((e.f & (DESTROYED | INERT)) !== 0) continue;
700
+
701
+ // Run effects in order from ancestor to descendant, else we could run into nullpointers
702
+ /** @type {Effect[]} */
703
+ const ordered_effects = [e];
704
+ let ancestor = e.parent;
705
+ while (ancestor !== null) {
706
+ if (eager_block_effects.has(ancestor)) {
707
+ eager_block_effects.delete(ancestor);
708
+ ordered_effects.push(ancestor);
709
+ }
710
+ ancestor = ancestor.parent;
711
+ }
712
+
713
+ for (let j = ordered_effects.length - 1; j >= 0; j--) {
714
+ const e = ordered_effects[j];
715
+ // Skip eager effects that have already been unmounted
716
+ if ((e.f & (DESTROYED | INERT)) !== 0) continue;
717
+ update_effect(e);
718
+ }
719
+ }
720
+
721
+ eager_block_effects.clear();
722
+ }
723
+ }
724
+ }
725
+
726
+ eager_block_effects = null;
727
+ }
728
+
729
+ /**
730
+ * This is similar to `mark_reactions`, but it only marks async/block effects
731
+ * depending on `value` and at least one of the other `sources`, so that
732
+ * these effects can re-run after another batch has been committed
733
+ * @param {Value} value
734
+ * @param {Source[]} sources
735
+ * @param {Set<Value>} marked
736
+ * @param {Map<Reaction, boolean>} checked
737
+ */
738
+ function mark_effects(value, sources, marked, checked) {
739
+ if (marked.has(value)) return;
740
+ marked.add(value);
741
+
742
+ if (value.reactions !== null) {
743
+ for (const reaction of value.reactions) {
744
+ const flags = reaction.f;
745
+
746
+ if ((flags & DERIVED) !== 0) {
747
+ mark_effects(/** @type {Derived} */ (reaction), sources, marked, checked);
748
+ } else if (
749
+ (flags & (ASYNC | BLOCK_EFFECT)) !== 0 &&
750
+ (flags & DIRTY) === 0 &&
751
+ depends_on(reaction, sources, checked)
752
+ ) {
753
+ set_signal_status(reaction, DIRTY);
754
+ schedule_effect(/** @type {Effect} */ (reaction));
755
+ }
756
+ }
757
+ }
758
+ }
759
+
760
+ /**
761
+ * When committing a fork, we need to trigger eager effects so that
762
+ * any `$state.eager(...)` expressions update immediately. This
763
+ * function allows us to discover them
764
+ * @param {Value} value
765
+ * @param {Set<Effect>} effects
766
+ */
767
+ function mark_eager_effects(value, effects) {
768
+ if (value.reactions === null) return;
769
+
770
+ for (const reaction of value.reactions) {
771
+ const flags = reaction.f;
772
+
773
+ if ((flags & DERIVED) !== 0) {
774
+ mark_eager_effects(/** @type {Derived} */ (reaction), effects);
775
+ } else if ((flags & EAGER_EFFECT) !== 0) {
776
+ set_signal_status(reaction, DIRTY);
777
+ effects.add(/** @type {Effect} */ (reaction));
778
+ }
779
+ }
780
+ }
781
+
782
+ /**
783
+ * @param {Reaction} reaction
784
+ * @param {Source[]} sources
785
+ * @param {Map<Reaction, boolean>} checked
786
+ */
787
+ function depends_on(reaction, sources, checked) {
788
+ const depends = checked.get(reaction);
789
+ if (depends !== undefined) return depends;
790
+
791
+ if (reaction.deps !== null) {
792
+ for (const dep of reaction.deps) {
793
+ if (includes.call(sources, dep)) {
794
+ return true;
795
+ }
796
+
797
+ if ((dep.f & DERIVED) !== 0 && depends_on(/** @type {Derived} */ (dep), sources, checked)) {
798
+ checked.set(/** @type {Derived} */ (dep), true);
799
+ return true;
800
+ }
801
+ }
802
+ }
803
+
804
+ checked.set(reaction, false);
805
+
806
+ return false;
807
+ }
808
+
809
+ /**
810
+ * @param {Effect} signal
811
+ * @returns {void}
812
+ */
813
+ export function schedule_effect(signal) {
814
+ var effect = (last_scheduled_effect = signal);
815
+
816
+ var boundary = effect.b;
817
+
818
+ // defer render effects inside a pending boundary
819
+ // TODO the `REACTION_RAN` check is only necessary because of legacy `$:` effects AFAICT — we can remove later
820
+ if (
821
+ boundary?.is_pending &&
822
+ (signal.f & (EFFECT | RENDER_EFFECT | MANAGED_EFFECT)) !== 0 &&
823
+ (signal.f & REACTION_RAN) === 0
824
+ ) {
825
+ boundary.defer_effect(signal);
826
+ return;
827
+ }
828
+
829
+ while (effect.parent !== null) {
830
+ effect = effect.parent;
831
+ var flags = effect.f;
832
+
833
+ // if the effect is being scheduled because a parent (each/await/etc) block
834
+ // updated an internal source, or because a branch is being unskipped,
835
+ // bail out or we'll cause a second flush
836
+ if (
837
+ is_flushing &&
838
+ effect === active_effect &&
839
+ (flags & BLOCK_EFFECT) !== 0 &&
840
+ (flags & HEAD_EFFECT) === 0 &&
841
+ (flags & REACTION_RAN) !== 0
842
+ ) {
843
+ return;
844
+ }
845
+
846
+ if ((flags & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) {
847
+ if ((flags & CLEAN) === 0) {
848
+ // branch is already dirty, bail
849
+ return;
850
+ }
851
+
852
+ effect.f ^= CLEAN;
853
+ }
854
+ }
855
+
856
+ queued_root_effects.push(effect);
857
+ }
858
+
859
+ /** @type {Source<number>[]} */
860
+ let eager_versions = [];
861
+
862
+ function eager_flush() {
863
+ try {
864
+ flushSync(() => {
865
+ for (const version of eager_versions) {
866
+ update(version);
867
+ }
868
+ });
869
+ } finally {
870
+ eager_versions = [];
871
+ }
872
+ }
873
+
874
+ /**
875
+ * Implementation of `$state.eager(fn())`
876
+ * @template T
877
+ * @param {() => T} fn
878
+ * @returns {T}
879
+ */
880
+ export function eager(fn) {
881
+ var version = source(0);
882
+ var initial = true;
883
+ var value = /** @type {T} */ (undefined);
884
+
885
+ get(version);
886
+
887
+ eager_effect(() => {
888
+ if (initial) {
889
+ // the first time this runs, we create an eager effect
890
+ // that will run eagerly whenever the expression changes
891
+ var previous_batch_values = batch_values;
892
+
893
+ try {
894
+ batch_values = null;
895
+ value = fn();
896
+ } finally {
897
+ batch_values = previous_batch_values;
898
+ }
899
+
900
+ return;
901
+ }
902
+
903
+ // the second time this effect runs, it's to schedule a
904
+ // `version` update. since this will recreate the effect,
905
+ // we don't need to evaluate the expression here
906
+ if (eager_versions.length === 0) {
907
+ queue_micro_task(eager_flush);
908
+ }
909
+
910
+ eager_versions.push(version);
911
+ });
912
+
913
+ initial = false;
914
+
915
+ return value;
916
+ }
917
+
918
+ /**
919
+ * Mark all the effects inside a skipped branch CLEAN, so that
920
+ * they can be correctly rescheduled later. Tracks dirty and maybe_dirty
921
+ * effects so they can be rescheduled if the branch survives.
922
+ * @param {Effect} effect
923
+ * @param {{ d: Effect[], m: Effect[] }} tracked
924
+ */
925
+ function reset_branch(effect, tracked) {
926
+ // clean branch = nothing dirty inside, no need to traverse further
927
+ if ((effect.f & BRANCH_EFFECT) !== 0 && (effect.f & CLEAN) !== 0) {
928
+ return;
929
+ }
930
+
931
+ if ((effect.f & DIRTY) !== 0) {
932
+ tracked.d.push(effect);
933
+ } else if ((effect.f & MAYBE_DIRTY) !== 0) {
934
+ tracked.m.push(effect);
935
+ }
936
+
937
+ set_signal_status(effect, CLEAN);
938
+
939
+ var e = effect.first;
940
+ while (e !== null) {
941
+ reset_branch(e, tracked);
942
+ e = e.next;
943
+ }
944
+ }
945
+
946
+ /**
947
+ * Creates a 'fork', in which state changes are evaluated but not applied to the DOM.
948
+ * This is useful for speculatively loading data (for example) when you suspect that
949
+ * the user is about to take some action.
950
+ *
951
+ * Frameworks like SvelteKit can use this to preload data when the user touches or
952
+ * hovers over a link, making any subsequent navigation feel instantaneous.
953
+ *
954
+ * The `fn` parameter is a synchronous function that modifies some state. The
955
+ * state changes will be reverted after the fork is initialised, then reapplied
956
+ * if and when the fork is eventually committed.
957
+ *
958
+ * When it becomes clear that a fork will _not_ be committed (e.g. because the
959
+ * user navigated elsewhere), it must be discarded to avoid leaking memory.
960
+ *
961
+ * @param {() => void} fn
962
+ * @returns {Fork}
963
+ * @since 5.42
964
+ */
965
+ export function fork(fn) {
966
+ if (!async_mode_flag) {
967
+ e.experimental_async_required('fork');
968
+ }
969
+
970
+ if (current_batch !== null) {
971
+ e.fork_timing();
972
+ }
973
+
974
+ var batch = Batch.ensure();
975
+ batch.is_fork = true;
976
+ batch_values = new Map();
977
+
978
+ var committed = false;
979
+ var settled = batch.settled();
980
+
981
+ flushSync(fn);
982
+
983
+ // revert state changes
984
+ for (var [source, value] of batch.previous) {
985
+ source.v = value;
986
+ }
987
+
988
+ // make writable deriveds dirty, so they recalculate correctly
989
+ for (source of batch.current.keys()) {
990
+ if ((source.f & DERIVED) !== 0) {
991
+ set_signal_status(source, DIRTY);
992
+ }
993
+ }
994
+
995
+ return {
996
+ commit: async () => {
997
+ if (committed) {
998
+ await settled;
999
+ return;
1000
+ }
1001
+
1002
+ if (!batches.has(batch)) {
1003
+ e.fork_discarded();
1004
+ }
1005
+
1006
+ committed = true;
1007
+
1008
+ batch.is_fork = false;
1009
+
1010
+ // apply changes and update write versions so deriveds see the change
1011
+ for (var [source, value] of batch.current) {
1012
+ source.v = value;
1013
+ source.wv = increment_write_version();
1014
+ }
1015
+
1016
+ // trigger any `$state.eager(...)` expressions with the new state.
1017
+ // eager effects don't get scheduled like other effects, so we
1018
+ // can't just encounter them during traversal, we need to
1019
+ // proactively flush them
1020
+ // TODO maybe there's a better implementation?
1021
+ flushSync(() => {
1022
+ /** @type {Set<Effect>} */
1023
+ var eager_effects = new Set();
1024
+
1025
+ for (var source of batch.current.keys()) {
1026
+ mark_eager_effects(source, eager_effects);
1027
+ }
1028
+
1029
+ set_eager_effects(eager_effects);
1030
+ flush_eager_effects();
1031
+ });
1032
+
1033
+ batch.revive();
1034
+ await settled;
1035
+ },
1036
+ discard: () => {
1037
+ // cause any MAYBE_DIRTY deriveds to update
1038
+ // if they depend on things thath changed
1039
+ // inside the discarded fork
1040
+ for (var source of batch.current.keys()) {
1041
+ source.wv = increment_write_version();
1042
+ }
1043
+
1044
+ if (!committed && batches.has(batch)) {
1045
+ batches.delete(batch);
1046
+ batch.discard();
1047
+ }
1048
+ }
1049
+ };
1050
+ }
1051
+
1052
+ /**
1053
+ * Forcibly remove all current batches, to prevent cross-talk between tests
1054
+ */
1055
+ export function clear() {
1056
+ batches.clear();
1057
+ }