ripple 0.3.11 → 0.3.13

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 (190) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/package.json +8 -2
  3. package/src/compiler/phases/1-parse/index.js +73 -30
  4. package/src/compiler/phases/2-analyze/index.js +28 -58
  5. package/src/compiler/phases/3-transform/client/index.js +127 -164
  6. package/src/compiler/phases/3-transform/segments.js +4 -8
  7. package/src/compiler/phases/3-transform/server/index.js +210 -360
  8. package/src/compiler/types/import.d.ts +0 -12
  9. package/src/compiler/types/index.d.ts +12 -5
  10. package/src/compiler/types/parse.d.ts +2 -0
  11. package/src/compiler/utils.js +39 -44
  12. package/src/helpers.d.ts +2 -0
  13. package/src/runtime/index-client.js +15 -13
  14. package/src/runtime/index-server.js +18 -11
  15. package/src/runtime/internal/client/blocks.js +19 -23
  16. package/src/runtime/internal/client/constants.js +20 -9
  17. package/src/runtime/internal/client/index.js +14 -4
  18. package/src/runtime/internal/client/runtime.js +435 -173
  19. package/src/runtime/internal/client/try.js +334 -156
  20. package/src/runtime/internal/client/types.d.ts +26 -0
  21. package/src/runtime/internal/server/blocks.js +183 -0
  22. package/src/runtime/internal/server/constants.js +7 -0
  23. package/src/runtime/internal/server/index.js +780 -148
  24. package/src/runtime/internal/server/types.d.ts +35 -0
  25. package/src/server/index.js +1 -1
  26. package/src/utils/async.js +35 -0
  27. package/src/utils/builders.js +3 -1
  28. package/tests/client/__snapshots__/computed-properties.test.rsrx.snap +49 -0
  29. package/tests/client/__snapshots__/for.test.rsrx.snap +319 -0
  30. package/tests/client/__snapshots__/html.test.rsrx.snap +40 -0
  31. package/tests/client/_etc.test.rsrx +7 -0
  32. package/tests/client/array/{array.static.test.ripple → array.static.test.rsrx} +18 -20
  33. package/tests/client/async-suspend.test.rsrx +662 -0
  34. package/tests/client/basic/__snapshots__/basic.attributes.test.rsrx.snap +60 -0
  35. package/tests/client/basic/__snapshots__/basic.rendering.test.rsrx.snap +59 -0
  36. package/tests/client/basic/{basic.errors.test.ripple → basic.errors.test.rsrx} +2 -2
  37. package/tests/client/compiler/__snapshots__/compiler.assignments.test.rsrx.snap +12 -0
  38. package/tests/client/compiler/__snapshots__/compiler.typescript.test.rsrx.snap +46 -0
  39. package/tests/client/compiler/{compiler.try-in-function.test.ripple → compiler.try-in-function.test.rsrx} +8 -6
  40. package/tests/client/composite/__snapshots__/composite.render.test.rsrx.snap +37 -0
  41. package/tests/client/{function-overload.test.ripple → function-overload.test.rsrx} +1 -1
  42. package/tests/client/try.test.rsrx +1702 -0
  43. package/tests/hydration/build-components.js +5 -3
  44. package/tests/hydration/compiled/client/head.js +11 -11
  45. package/tests/hydration/compiled/client/mixed-control-flow.js +55 -70
  46. package/tests/hydration/compiled/client/nested-control-flow.js +72 -88
  47. package/tests/hydration/compiled/client/try.js +42 -54
  48. package/tests/hydration/compiled/server/basic.js +491 -369
  49. package/tests/hydration/compiled/server/composite.js +153 -128
  50. package/tests/hydration/compiled/server/events.js +166 -145
  51. package/tests/hydration/compiled/server/for.js +821 -677
  52. package/tests/hydration/compiled/server/head.js +200 -165
  53. package/tests/hydration/compiled/server/hmr.js +62 -54
  54. package/tests/hydration/compiled/server/html-in-template.js +64 -55
  55. package/tests/hydration/compiled/server/html.js +1477 -1360
  56. package/tests/hydration/compiled/server/if-children.js +448 -408
  57. package/tests/hydration/compiled/server/if.js +204 -171
  58. package/tests/hydration/compiled/server/mixed-control-flow.js +237 -195
  59. package/tests/hydration/compiled/server/nested-control-flow.js +533 -467
  60. package/tests/hydration/compiled/server/portal.js +94 -107
  61. package/tests/hydration/compiled/server/reactivity.js +87 -64
  62. package/tests/hydration/compiled/server/return.js +1424 -1174
  63. package/tests/hydration/compiled/server/switch.js +268 -238
  64. package/tests/hydration/compiled/server/try.js +98 -87
  65. package/tests/hydration/components/{mixed-control-flow.ripple → mixed-control-flow.rsrx} +2 -2
  66. package/tests/hydration/components/{try.ripple → try.rsrx} +4 -2
  67. package/tests/hydration/mixed-control-flow.test.js +14 -0
  68. package/tests/hydration/nested-control-flow.test.js +50 -48
  69. package/tests/hydration/try.test.js +25 -0
  70. package/tests/server/__snapshots__/compiler.test.ripple.snap +0 -32
  71. package/tests/server/__snapshots__/compiler.test.rsrx.snap +95 -0
  72. package/tests/server/{compiler.test.ripple → compiler.test.rsrx} +0 -17
  73. package/tests/server/{html-nesting-validation.test.ripple → html-nesting-validation.test.rsrx} +3 -3
  74. package/tests/server/streaming-ssr.test.rsrx +115 -0
  75. package/tests/server/try.test.rsrx +503 -0
  76. package/tests/utils/compiler-compat-config.test.js +3 -3
  77. package/tests/utils/vite-plugin-config.test.js +1 -1
  78. package/tests/utils/vite-plugin-hmr.test.js +5 -5
  79. package/tsconfig.json +4 -0
  80. package/types/index.d.ts +13 -23
  81. package/types/server.d.ts +43 -16
  82. package/tests/client/_etc.test.ripple +0 -5
  83. package/tests/client/async-suspend.test.ripple +0 -94
  84. package/tests/client/try.test.ripple +0 -196
  85. package/tests/server/streaming-ssr.test.ripple +0 -68
  86. package/tests/server/try.test.ripple +0 -82
  87. /package/tests/client/array/{array.copy-within.test.ripple → array.copy-within.test.rsrx} +0 -0
  88. /package/tests/client/array/{array.derived.test.ripple → array.derived.test.rsrx} +0 -0
  89. /package/tests/client/array/{array.iteration.test.ripple → array.iteration.test.rsrx} +0 -0
  90. /package/tests/client/array/{array.mutations.test.ripple → array.mutations.test.rsrx} +0 -0
  91. /package/tests/client/array/{array.to-methods.test.ripple → array.to-methods.test.rsrx} +0 -0
  92. /package/tests/client/basic/{basic.attributes.test.ripple → basic.attributes.test.rsrx} +0 -0
  93. /package/tests/client/basic/{basic.collections.test.ripple → basic.collections.test.rsrx} +0 -0
  94. /package/tests/client/basic/{basic.components.test.ripple → basic.components.test.rsrx} +0 -0
  95. /package/tests/client/basic/{basic.events.test.ripple → basic.events.test.rsrx} +0 -0
  96. /package/tests/client/basic/{basic.get-set.test.ripple → basic.get-set.test.rsrx} +0 -0
  97. /package/tests/client/basic/{basic.hmr.test.ripple → basic.hmr.test.rsrx} +0 -0
  98. /package/tests/client/basic/{basic.reactivity.test.ripple → basic.reactivity.test.rsrx} +0 -0
  99. /package/tests/client/basic/{basic.rendering.test.ripple → basic.rendering.test.rsrx} +0 -0
  100. /package/tests/client/basic/{basic.styling.test.ripple → basic.styling.test.rsrx} +0 -0
  101. /package/tests/client/basic/{basic.utilities.test.ripple → basic.utilities.test.rsrx} +0 -0
  102. /package/tests/client/{boundaries.test.ripple → boundaries.test.rsrx} +0 -0
  103. /package/tests/client/compiler/{compiler.assignments.test.ripple → compiler.assignments.test.rsrx} +0 -0
  104. /package/tests/client/compiler/{compiler.attributes.test.ripple → compiler.attributes.test.rsrx} +0 -0
  105. /package/tests/client/compiler/{compiler.basic.test.ripple → compiler.basic.test.rsrx} +0 -0
  106. /package/tests/client/compiler/{compiler.regex.test.ripple → compiler.regex.test.rsrx} +0 -0
  107. /package/tests/client/compiler/{compiler.tracked-access.test.ripple → compiler.tracked-access.test.rsrx} +0 -0
  108. /package/tests/client/compiler/{compiler.typescript.test.ripple → compiler.typescript.test.rsrx} +0 -0
  109. /package/tests/client/composite/{composite.dynamic-components.test.ripple → composite.dynamic-components.test.rsrx} +0 -0
  110. /package/tests/client/composite/{composite.generics.test.ripple → composite.generics.test.rsrx} +0 -0
  111. /package/tests/client/composite/{composite.props.test.ripple → composite.props.test.rsrx} +0 -0
  112. /package/tests/client/composite/{composite.reactivity.test.ripple → composite.reactivity.test.rsrx} +0 -0
  113. /package/tests/client/composite/{composite.render.test.ripple → composite.render.test.rsrx} +0 -0
  114. /package/tests/client/{computed-properties.test.ripple → computed-properties.test.rsrx} +0 -0
  115. /package/tests/client/{context.test.ripple → context.test.rsrx} +0 -0
  116. /package/tests/client/css/{global-additional-cases.test.ripple → global-additional-cases.test.rsrx} +0 -0
  117. /package/tests/client/css/{global-advanced-selectors.test.ripple → global-advanced-selectors.test.rsrx} +0 -0
  118. /package/tests/client/css/{global-at-rules.test.ripple → global-at-rules.test.rsrx} +0 -0
  119. /package/tests/client/css/{global-basic.test.ripple → global-basic.test.rsrx} +0 -0
  120. /package/tests/client/css/{global-classes-ids.test.ripple → global-classes-ids.test.rsrx} +0 -0
  121. /package/tests/client/css/{global-combinators.test.ripple → global-combinators.test.rsrx} +0 -0
  122. /package/tests/client/css/{global-complex-nesting.test.ripple → global-complex-nesting.test.rsrx} +0 -0
  123. /package/tests/client/css/{global-edge-cases.test.ripple → global-edge-cases.test.rsrx} +0 -0
  124. /package/tests/client/css/{global-keyframes.test.ripple → global-keyframes.test.rsrx} +0 -0
  125. /package/tests/client/css/{global-nested.test.ripple → global-nested.test.rsrx} +0 -0
  126. /package/tests/client/css/{global-pseudo.test.ripple → global-pseudo.test.rsrx} +0 -0
  127. /package/tests/client/css/{global-scoping.test.ripple → global-scoping.test.rsrx} +0 -0
  128. /package/tests/client/css/{style-identifier.test.ripple → style-identifier.test.rsrx} +0 -0
  129. /package/tests/client/{date.test.ripple → date.test.rsrx} +0 -0
  130. /package/tests/client/{dynamic-elements.test.ripple → dynamic-elements.test.rsrx} +0 -0
  131. /package/tests/client/{events.test.ripple → events.test.rsrx} +0 -0
  132. /package/tests/client/{for.test.ripple → for.test.rsrx} +0 -0
  133. /package/tests/client/{function-overload-import.ripple → function-overload-import.rsrx} +0 -0
  134. /package/tests/client/{head.test.ripple → head.test.rsrx} +0 -0
  135. /package/tests/client/{html.test.ripple → html.test.rsrx} +0 -0
  136. /package/tests/client/{input-value.test.ripple → input-value.test.rsrx} +0 -0
  137. /package/tests/client/{lazy-destructuring.test.ripple → lazy-destructuring.test.rsrx} +0 -0
  138. /package/tests/client/{map.test.ripple → map.test.rsrx} +0 -0
  139. /package/tests/client/{media-query.test.ripple → media-query.test.rsrx} +0 -0
  140. /package/tests/client/{object.test.ripple → object.test.rsrx} +0 -0
  141. /package/tests/client/{portal.test.ripple → portal.test.rsrx} +0 -0
  142. /package/tests/client/{ref.test.ripple → ref.test.rsrx} +0 -0
  143. /package/tests/client/{return.test.ripple → return.test.rsrx} +0 -0
  144. /package/tests/client/{set.test.ripple → set.test.rsrx} +0 -0
  145. /package/tests/client/{svg.test.ripple → svg.test.rsrx} +0 -0
  146. /package/tests/client/{switch.test.ripple → switch.test.rsrx} +0 -0
  147. /package/tests/client/{tsx.test.ripple → tsx.test.rsrx} +0 -0
  148. /package/tests/client/{typescript-generics.test.ripple → typescript-generics.test.rsrx} +0 -0
  149. /package/tests/client/url/{url.derived.test.ripple → url.derived.test.rsrx} +0 -0
  150. /package/tests/client/url/{url.parsing.test.ripple → url.parsing.test.rsrx} +0 -0
  151. /package/tests/client/url/{url.partial-removal.test.ripple → url.partial-removal.test.rsrx} +0 -0
  152. /package/tests/client/url/{url.reactivity.test.ripple → url.reactivity.test.rsrx} +0 -0
  153. /package/tests/client/url/{url.serialization.test.ripple → url.serialization.test.rsrx} +0 -0
  154. /package/tests/client/url-search-params/{url-search-params.derived.test.ripple → url-search-params.derived.test.rsrx} +0 -0
  155. /package/tests/client/url-search-params/{url-search-params.initialization.test.ripple → url-search-params.initialization.test.rsrx} +0 -0
  156. /package/tests/client/url-search-params/{url-search-params.iteration.test.ripple → url-search-params.iteration.test.rsrx} +0 -0
  157. /package/tests/client/url-search-params/{url-search-params.mutation.test.ripple → url-search-params.mutation.test.rsrx} +0 -0
  158. /package/tests/client/url-search-params/{url-search-params.retrieval.test.ripple → url-search-params.retrieval.test.rsrx} +0 -0
  159. /package/tests/client/url-search-params/{url-search-params.serialization.test.ripple → url-search-params.serialization.test.rsrx} +0 -0
  160. /package/tests/client/url-search-params/{url-search-params.tracked-url.test.ripple → url-search-params.tracked-url.test.rsrx} +0 -0
  161. /package/tests/hydration/components/{basic.ripple → basic.rsrx} +0 -0
  162. /package/tests/hydration/components/{composite.ripple → composite.rsrx} +0 -0
  163. /package/tests/hydration/components/{events.ripple → events.rsrx} +0 -0
  164. /package/tests/hydration/components/{for.ripple → for.rsrx} +0 -0
  165. /package/tests/hydration/components/{head.ripple → head.rsrx} +0 -0
  166. /package/tests/hydration/components/{hmr.ripple → hmr.rsrx} +0 -0
  167. /package/tests/hydration/components/{html-in-template.ripple → html-in-template.rsrx} +0 -0
  168. /package/tests/hydration/components/{html.ripple → html.rsrx} +0 -0
  169. /package/tests/hydration/components/{if-children.ripple → if-children.rsrx} +0 -0
  170. /package/tests/hydration/components/{if.ripple → if.rsrx} +0 -0
  171. /package/tests/hydration/components/{nested-control-flow.ripple → nested-control-flow.rsrx} +0 -0
  172. /package/tests/hydration/components/{portal.ripple → portal.rsrx} +0 -0
  173. /package/tests/hydration/components/{reactivity.ripple → reactivity.rsrx} +0 -0
  174. /package/tests/hydration/components/{return.ripple → return.rsrx} +0 -0
  175. /package/tests/hydration/components/{switch.ripple → switch.rsrx} +0 -0
  176. /package/tests/server/{await.test.ripple → await.test.rsrx} +0 -0
  177. /package/tests/server/{basic.attributes.test.ripple → basic.attributes.test.rsrx} +0 -0
  178. /package/tests/server/{basic.components.test.ripple → basic.components.test.rsrx} +0 -0
  179. /package/tests/server/{basic.test.ripple → basic.test.rsrx} +0 -0
  180. /package/tests/server/{composite.props.test.ripple → composite.props.test.rsrx} +0 -0
  181. /package/tests/server/{composite.test.ripple → composite.test.rsrx} +0 -0
  182. /package/tests/server/{context.test.ripple → context.test.rsrx} +0 -0
  183. /package/tests/server/{dynamic-elements.test.ripple → dynamic-elements.test.rsrx} +0 -0
  184. /package/tests/server/{for.test.ripple → for.test.rsrx} +0 -0
  185. /package/tests/server/{head.test.ripple → head.test.rsrx} +0 -0
  186. /package/tests/server/{if.test.ripple → if.test.rsrx} +0 -0
  187. /package/tests/server/{lazy-destructuring.test.ripple → lazy-destructuring.test.rsrx} +0 -0
  188. /package/tests/server/{return.test.ripple → return.test.rsrx} +0 -0
  189. /package/tests/server/{style-identifier.test.ripple → style-identifier.test.rsrx} +0 -0
  190. /package/tests/server/{switch.test.ripple → switch.test.rsrx} +0 -0
@@ -34,16 +34,10 @@ import {
34
34
  RippleSet as _$_Set__Ripple,
35
35
  RippleArray as _$_Array__Ripple,
36
36
  RippleObject as _$_Object__Ripple,
37
- Context as _$_Context__Ripple,
38
37
  RippleURL as _$_URL__Ripple,
39
38
  RippleURLSearchParams as _$_URLSearchParams__Ripple,
40
39
  RippleDate as _$_Date__Ripple,
41
- MediaQuery as _$_MediaQuery__,
42
40
  createRefKey as _$_RefKey__create,
43
- track as _$_track__,
44
- effect as _$_effect__,
45
- untrack as _$_untrack__,
46
- ripple_namespace as _$__u0023_ripple,
47
41
  } from 'ripple';
48
42
 
49
43
  export {
@@ -51,14 +45,8 @@ export {
51
45
  _$_Set__Ripple,
52
46
  _$_Array__Ripple,
53
47
  _$_Object__Ripple,
54
- _$_Context__Ripple,
55
48
  _$_URL__Ripple,
56
49
  _$_URLSearchParams__Ripple,
57
50
  _$_Date__Ripple,
58
- _$_MediaQuery__,
59
51
  _$_RefKey__create,
60
- _$_track__,
61
- _$_effect__,
62
- _$_untrack__,
63
- _$__u0023_ripple,
64
52
  };
@@ -15,11 +15,9 @@ interface BaseNodeMetaData {
15
15
  has_template?: boolean;
16
16
  source_name?: string | '#server' | '#style';
17
17
  is_capitalized?: boolean;
18
- has_await?: boolean;
19
18
  commentContainerId?: number;
20
19
  parenthesized?: boolean;
21
20
  elementLeadingComments?: AST.Comment[];
22
- inside_component_top_level?: boolean;
23
21
  returns?: AST.ReturnStatement[];
24
22
  has_return?: boolean;
25
23
  has_throw?: boolean;
@@ -57,6 +55,10 @@ interface FunctionLikeTS {
57
55
 
58
56
  // Ripple augmentation for ESTree function nodes
59
57
  declare module 'estree' {
58
+ interface Program {
59
+ innerComments?: Comment[] | undefined;
60
+ }
61
+
60
62
  interface FunctionDeclaration extends FunctionLikeTS {
61
63
  metadata: FunctionMetaData;
62
64
  }
@@ -193,6 +195,10 @@ declare module 'estree' {
193
195
  pending?: AST.BlockStatement | null;
194
196
  }
195
197
 
198
+ interface CatchClause {
199
+ resetParam?: AST.Pattern | null;
200
+ }
201
+
196
202
  interface ForOfStatement {
197
203
  index?: AST.Identifier | null;
198
204
  key?: AST.Expression | null;
@@ -1086,7 +1092,7 @@ export interface AnalysisResult {
1086
1092
  ast: AST.Program;
1087
1093
  scopes: Map<AST.Node, ScopeInterface>;
1088
1094
  scope: ScopeInterface;
1089
- component_metadata: Array<{ id: string; async: boolean }>;
1095
+ component_metadata: Array<{ id: string }>;
1090
1096
  metadata: {
1091
1097
  serverIdentifierPresent: boolean;
1092
1098
  };
@@ -1255,7 +1261,6 @@ export interface ScopeInterface {
1255
1261
 
1256
1262
  interface BaseStateMetaData {
1257
1263
  tracking?: boolean | null;
1258
- await?: boolean;
1259
1264
  }
1260
1265
 
1261
1266
  export interface BaseState {
@@ -1306,6 +1311,8 @@ export interface TransformServerState extends BaseState {
1306
1311
  dev?: boolean;
1307
1312
  return_flags?: Map<AST.ReturnStatement, { name: string; tracked: boolean }>;
1308
1313
  template_child?: boolean;
1314
+ skip_regular_blocks?: boolean;
1315
+ in_regular_block?: boolean;
1309
1316
  }
1310
1317
 
1311
1318
  type UpdateList = Array<
@@ -1319,7 +1326,7 @@ type UpdateList = Array<
1319
1326
  },
1320
1327
  'initial' | 'identity' | 'expression'
1321
1328
  >
1322
- > & { async?: boolean };
1329
+ >;
1323
1330
 
1324
1331
  export interface TransformClientState extends BaseState {
1325
1332
  events: Set<string>;
@@ -1112,6 +1112,8 @@ export namespace Parse {
1112
1112
 
1113
1113
  tsParseTypeArguments(): AST.Node;
1114
1114
 
1115
+ tsTryParseTypeAnnotation(): AST.TSTypeAnnotation;
1116
+
1115
1117
  /**
1116
1118
  * Get property kind from name
1117
1119
  * @param prop Property node
@@ -163,19 +163,22 @@ const DOM_PROPERTIES = [
163
163
  'disableRemotePlayback',
164
164
  ];
165
165
 
166
- /** @type {Record<string, string>} */
166
+ // Omits track, trackSplit and trackAsync are they're handled separately
167
+ /** @type {Record<string, {name: string, requiresBlock?: boolean}>} */
167
168
  const RIPPLE_IMPORT_CALL_NAME = {
168
- RippleURL: 'ripple_url',
169
- RippleURLSearchParams: 'ripple_url_search_params',
170
- RippleDate: 'ripple_date',
171
- RippleMap: 'ripple_map',
172
- RippleSet: 'ripple_set',
173
- MediaQuery: 'media_query',
174
- Context: 'context',
175
- effect: 'effect',
176
- untrack: 'untrack',
177
- RippleArray: 'ripple_array',
178
- RippleObject: 'ripple_object',
169
+ RippleArray: { name: 'ripple_array', requiresBlock: true },
170
+ RippleObject: { name: 'ripple_object', requiresBlock: true },
171
+ RippleURL: { name: 'ripple_url', requiresBlock: true },
172
+ RippleURLSearchParams: { name: 'ripple_url_search_params', requiresBlock: true },
173
+ RippleDate: { name: 'ripple_date', requiresBlock: true },
174
+ RippleMap: { name: 'ripple_map', requiresBlock: true },
175
+ RippleSet: { name: 'ripple_set', requiresBlock: true },
176
+ MediaQuery: { name: 'media_query', requiresBlock: true },
177
+ Context: { name: 'context' },
178
+ effect: { name: 'effect' },
179
+ untrack: { name: 'untrack' },
180
+ trackPending: { name: 'is_tracked_pending' },
181
+ peek: { name: 'peek_tracked' },
179
182
  };
180
183
 
181
184
  /**
@@ -209,31 +212,6 @@ export function is_delegated_event(event_name, handler, context) {
209
212
  return true;
210
213
  }
211
214
 
212
- /**
213
- * Returns true if context is inside a top-level await: inside component or module
214
- * @param {CommonContext} context
215
- * @returns {boolean}
216
- */
217
- export function is_top_level_await(context) {
218
- for (let i = context.path.length - 1; i >= 0; i -= 1) {
219
- const context_node = context.path[i];
220
- const type = context_node.type;
221
-
222
- if (context_node.type === 'Component') {
223
- return true;
224
- }
225
-
226
- if (
227
- type === 'FunctionExpression' ||
228
- type === 'ArrowFunctionExpression' ||
229
- type === 'FunctionDeclaration'
230
- ) {
231
- return false;
232
- }
233
- }
234
- return true;
235
- }
236
-
237
215
  /**
238
216
  * Returns true if context is inside a Component node
239
217
  * @param {CommonContext} context
@@ -292,25 +270,25 @@ export function is_component_level_function(context) {
292
270
  * Returns the matched Ripple tracking call name
293
271
  * @param {AST.Expression | AST.Super} callee
294
272
  * @param {CommonContext} context
295
- * @returns {'track' | null}
273
+ * @returns {'track' | 'trackAsync' | null}
296
274
  */
297
275
  export function is_ripple_track_call(callee, context) {
298
276
  // Super expressions cannot be Ripple track calls
299
277
  if (callee.type === 'Super') return null;
300
278
 
301
- if (callee.type === 'Identifier' && callee.name === 'track') {
302
- return is_ripple_import(callee, context) ? 'track' : null;
279
+ if (callee.type === 'Identifier' && (callee.name === 'track' || callee.name === 'trackAsync')) {
280
+ return is_ripple_import(callee, context) ? callee.name : null;
303
281
  }
304
282
 
305
283
  if (
306
284
  callee.type === 'MemberExpression' &&
307
285
  callee.object.type === 'Identifier' &&
308
286
  callee.property.type === 'Identifier' &&
309
- callee.property.name === 'track' &&
287
+ (callee.property.name === 'track' || callee.property.name === 'trackAsync') &&
310
288
  !callee.computed &&
311
289
  is_ripple_import(callee, context)
312
290
  ) {
313
- return 'track';
291
+ return callee.property.name;
314
292
  }
315
293
 
316
294
  return null;
@@ -1076,7 +1054,7 @@ export function flatten_switch_consequent(consequent) {
1076
1054
  * @returns {string | null}
1077
1055
  */
1078
1056
  export function get_ripple_namespace_call_name(name) {
1079
- return name == null ? null : (RIPPLE_IMPORT_CALL_NAME[name] ?? null);
1057
+ return name == null ? null : (RIPPLE_IMPORT_CALL_NAME[name]?.name ?? null);
1080
1058
  }
1081
1059
 
1082
1060
  /**
@@ -1085,7 +1063,24 @@ export function get_ripple_namespace_call_name(name) {
1085
1063
  * @returns {boolean}
1086
1064
  */
1087
1065
  export function ripple_import_requires_block(name) {
1088
- return name !== 'effect' && name !== 'untrack' && name !== 'Context';
1066
+ return name == null ? false : (RIPPLE_IMPORT_CALL_NAME[name]?.requiresBlock ?? false);
1067
+ }
1068
+
1069
+ /**
1070
+ * @param {AST.ClassDeclaration | AST.ClassExpression} node
1071
+ * @param {CommonContext} context
1072
+ * @returns {void}
1073
+ */
1074
+ export function strip_class_typescript_syntax(node, context) {
1075
+ delete node.typeParameters;
1076
+ delete node.superTypeParameters;
1077
+ delete node.implements;
1078
+
1079
+ if (node.superClass?.type === 'TSInstantiationExpression') {
1080
+ node.superClass = /** @type {AST.Expression} */ (context.visit(node.superClass.expression));
1081
+ } else if (node.superClass && 'typeArguments' in node.superClass) {
1082
+ delete node.superClass.typeArguments;
1083
+ }
1089
1084
  }
1090
1085
 
1091
1086
  /**
package/src/helpers.d.ts CHANGED
@@ -7,3 +7,5 @@ export type RequiredPresent<T, K extends keyof T> = Omit<T, K> & Required<Pick<T
7
7
  export type Nullable<T> = T | null;
8
8
 
9
9
  export type Nullish<T> = T | null | undefined;
10
+
11
+ export type NestedArray<T> = (T | NestedArray<T>)[];
@@ -21,6 +21,12 @@ import { COMMENT_NODE, HYDRATION_START } from '../constants.js';
21
21
 
22
22
  // Re-export JSX runtime functions for jsxImportSource: "ripple"
23
23
  export { jsx, jsxs, Fragment } from '../jsx-runtime.js';
24
+ export {
25
+ UNINITIALIZED,
26
+ DERIVED_UPDATED,
27
+ SUSPENSE_PENDING,
28
+ SUSPENSE_REJECTED,
29
+ } from './internal/client/constants.js';
24
30
 
25
31
  /**
26
32
  * @returns {CompatOptions | undefined}
@@ -112,7 +118,15 @@ export function hydrate(component, options) {
112
118
 
113
119
  export { Context } from './internal/client/context.js';
114
120
 
115
- export { flush_sync as flushSync, track, untrack, tick } from './internal/client/runtime.js';
121
+ export {
122
+ flush_sync as flushSync,
123
+ track,
124
+ track_async as trackAsync,
125
+ untrack,
126
+ tick,
127
+ is_tracked_pending as trackPending,
128
+ peek_tracked as peek,
129
+ } from './internal/client/runtime.js';
116
130
 
117
131
  export { RippleArray } from './array.js';
118
132
 
@@ -159,15 +173,3 @@ export {
159
173
  bindOffsetWidth,
160
174
  bindOffsetHeight,
161
175
  } from './internal/client/bindings.js';
162
-
163
- import { RippleMap } from './map.js';
164
- import { RippleSet } from './set.js';
165
- import { RippleArray } from './array.js';
166
- import { RippleObject } from './object.js';
167
- import { Context } from './internal/client/context.js';
168
- import { RippleURL } from './url.js';
169
- import { RippleURLSearchParams } from './url-search-params.js';
170
- import { RippleDate } from './date.js';
171
- import { MediaQuery } from './media-query.js';
172
- import { track, untrack, ref_prop as createRefKey } from './internal/client/runtime.js';
173
- import { user_effect as effect } from './internal/client/blocks.js';
@@ -1,10 +1,21 @@
1
- import { get, set, untrack, track } from './internal/server/index.js';
1
+ import { output_push, noop } from './internal/server/index.js';
2
2
 
3
3
  export { Context } from './internal/server/context.js';
4
-
5
- export { get, set, untrack, track };
6
-
7
- function noop() {}
4
+ export {
5
+ get,
6
+ set,
7
+ untrack,
8
+ track,
9
+ track_async as trackAsync,
10
+ is_tracked_pending as trackPending,
11
+ peek_tracked as peek,
12
+ } from './internal/server/index.js';
13
+ export {
14
+ UNINITIALIZED,
15
+ DERIVED_UPDATED,
16
+ SUSPENSE_PENDING,
17
+ SUSPENSE_REJECTED,
18
+ } from './internal/client/constants.js';
8
19
 
9
20
  export const effect = noop;
10
21
  export const createRefKey = noop;
@@ -61,13 +72,9 @@ export const bindOffsetHeight = noop;
61
72
  * Portal component noop for server-side rendering.
62
73
  * Portals are client-only and do not render on the server.
63
74
  * However, we need to output a marker comment so hydration can work correctly.
64
- * @param {any} output
65
- * @param {any} __
66
75
  */
67
- export function Portal(output, __) {
76
+ export function Portal() {
68
77
  // Portals are client-only, but we need to output a marker for hydration
69
78
  // Output an empty HTML comment as a placeholder
70
- if (output && typeof output.push === 'function') {
71
- output.push('<!--portal-->');
72
- }
79
+ output_push('<!--portal-->');
73
80
  }
@@ -8,10 +8,12 @@ import {
8
8
  DESTROYED,
9
9
  EFFECT_BLOCK,
10
10
  PAUSED,
11
+ PRE_EFFECT_BLOCK,
11
12
  RENDER_BLOCK,
12
13
  ROOT_BLOCK,
13
14
  TRY_BLOCK,
14
15
  HEAD_BLOCK,
16
+ DIRECT_CHILD_BLOCK,
15
17
  } from './constants.js';
16
18
  import { next_sibling } from './operations.js';
17
19
  import { apply_element_spread } from './render.js';
@@ -20,13 +22,11 @@ import {
20
22
  active_component,
21
23
  active_reaction,
22
24
  create_component_ctx,
23
- handle_error,
24
25
  is_block_dirty,
25
26
  run_block,
26
27
  run_teardown,
27
28
  schedule_update,
28
29
  } from './runtime.js';
29
- import { suspend } from './try.js';
30
30
 
31
31
  /**
32
32
  * @param {Function} fn
@@ -60,6 +60,14 @@ export function effect(fn) {
60
60
  return block(EFFECT_BLOCK, fn);
61
61
  }
62
62
 
63
+ /**
64
+ * Creates a pre-effect block that runs eagerly before render blocks in the flush cycle.
65
+ * @param {Function} fn
66
+ */
67
+ export function pre_effect(fn) {
68
+ return block(PRE_EFFECT_BLOCK, fn);
69
+ }
70
+
63
71
  /**
64
72
  * @param {Function} fn
65
73
  * @param {any} [state]
@@ -87,27 +95,6 @@ export function branch(fn, flags = 0, state = null) {
87
95
  return block(BRANCH_BLOCK | flags, fn, state);
88
96
  }
89
97
 
90
- /**
91
- * @param {() => any} fn
92
- */
93
- export function async(fn) {
94
- return block(BRANCH_BLOCK, async () => {
95
- var current_block = active_block;
96
- const unsuspend = suspend();
97
- try {
98
- await fn();
99
- // An extra microtask tick ensures `suspend()` → `pending` is visible for at
100
- // least one full microtask cycle. This matters during SSR hydration: the
101
- // test (or any awaiter) gets to observe the pending state before `unsuspend`
102
- // swaps back to the resolved content.
103
- await Promise.resolve();
104
- unsuspend();
105
- } catch (error) {
106
- handle_error(error, /** @type {Block} */ (current_block));
107
- }
108
- });
109
- }
110
-
111
98
  /**
112
99
  * @param {Element} element
113
100
  * @param {() => (element: Element) => (void | (() => void))} get_fn
@@ -176,6 +163,15 @@ export function create_try_block(fn, state) {
176
163
  return block(TRY_BLOCK, fn, state);
177
164
  }
178
165
 
166
+ /**
167
+ * @param {() => void} fn
168
+ * @param {number} [flags]
169
+ * @param {any} [state]
170
+ */
171
+ export function boundary_fn_running_block(fn, flags = 0, state = null) {
172
+ return branch(fn, DIRECT_CHILD_BLOCK | flags, state);
173
+ }
174
+
179
175
  /**
180
176
  * @param {Block} block
181
177
  * @param {Block} parent_block
@@ -9,18 +9,21 @@ export var SWITCH_BLOCK = 1 << 8;
9
9
  export var COMPOSITE_BLOCK = 1 << 9;
10
10
  export var ASYNC_BLOCK = 1 << 10;
11
11
  export var HEAD_BLOCK = 1 << 11;
12
- export var CONTAINS_UPDATE = 1 << 12;
13
- export var CONTAINS_TEARDOWN = 1 << 13;
14
- export var BLOCK_HAS_RUN = 1 << 14;
15
- export var TRACKED = 1 << 15;
16
- export var DERIVED = 1 << 16;
17
- export var DEFERRED = 1 << 17;
18
- export var PAUSED = 1 << 18;
19
- export var DESTROYED = 1 << 19;
12
+ export var PRE_EFFECT_BLOCK = 1 << 12;
13
+ export var DIRECT_CHILD_BLOCK = 1 << 13;
14
+ export var CONTAINS_UPDATE = 1 << 14;
15
+ export var CONTAINS_TEARDOWN = 1 << 15;
16
+ export var BLOCK_HAS_RUN = 1 << 16;
17
+ export var TRACKED = 1 << 17;
18
+ export var DERIVED = 1 << 18;
19
+ export var DEFERRED = 1 << 19;
20
+ export var PAUSED = 1 << 20;
21
+ export var DESTROYED = 1 << 21;
20
22
 
21
23
  export var CONTROL_FLOW_BLOCK = FOR_BLOCK | IF_BLOCK | SWITCH_BLOCK | TRY_BLOCK | COMPOSITE_BLOCK;
22
24
 
23
- export var UNINITIALIZED = Symbol();
25
+ /** @type {unique symbol} */
26
+ export const UNINITIALIZED = Symbol('uninitialized');
24
27
  /** @type {unique symbol} */
25
28
  export const TRACKED_ARRAY = Symbol();
26
29
  /** @type {unique symbol} */
@@ -38,3 +41,11 @@ export const NAMESPACE_URI = {
38
41
  svg: 'http://www.w3.org/2000/svg',
39
42
  mathml: 'http://www.w3.org/1998/Math/MathML',
40
43
  };
44
+ /** @type {unique symbol} */
45
+ export const DERIVED_UPDATED = Symbol('derived_updated');
46
+ /** @type {unique symbol} */
47
+ export const SUSPENSE_PENDING = Symbol('suspense_pending');
48
+ /** @type {unique symbol} */
49
+ export const SUSPENSE_REJECTED = Symbol('suspense_rejected');
50
+ /** @type {unique symbol} */
51
+ export const ASYNC_DERIVED_READ_THROWN = Symbol('async_derived_read_thrown');
@@ -20,15 +20,22 @@ export {
20
20
  export {
21
21
  render,
22
22
  render_spread,
23
- async,
24
23
  ref,
25
24
  branch,
26
25
  destroy_block,
27
26
  move_block,
28
27
  root,
29
28
  user_effect as effect,
29
+ resume_block,
30
+ is_destroyed,
30
31
  } from './blocks.js';
31
32
 
33
+ export {
34
+ UNINITIALIZED,
35
+ DERIVED_UPDATED,
36
+ SUSPENSE_PENDING,
37
+ SUSPENSE_REJECTED,
38
+ } from './constants.js';
32
39
  export { event, render_event, delegate } from './events.js';
33
40
 
34
41
  export {
@@ -40,7 +47,6 @@ export {
40
47
  get_tracked,
41
48
  get_derived,
42
49
  set,
43
- async_computed,
44
50
  tracked,
45
51
  spread_props,
46
52
  computed_property,
@@ -52,6 +58,9 @@ export {
52
58
  update_property,
53
59
  update_pre_property,
54
60
  track,
61
+ track_async,
62
+ is_tracked_pending,
63
+ peek_tracked,
55
64
  push_component,
56
65
  pop_component,
57
66
  untrack,
@@ -59,12 +68,13 @@ export {
59
68
  fallback,
60
69
  exclude_from_object,
61
70
  derived,
62
- maybe_tracked,
63
71
  tick,
64
72
  proxy_props,
65
73
  with_block,
66
74
  with_ns,
67
75
  handle_error,
76
+ queue_post_block_flush_callback,
77
+ schedule_update,
68
78
  } from './runtime.js';
69
79
 
70
80
  export { composite } from './composite.js';
@@ -73,7 +83,7 @@ export { for_block as for, for_block_keyed as for_keyed } from './for.js';
73
83
 
74
84
  export { if_block as if } from './if.js';
75
85
 
76
- export { try_block as try, aborted, suspend } from './try.js';
86
+ export { try_block as try, get_pending_boundary } from './try.js';
77
87
 
78
88
  export { switch_block as switch } from './switch.js';
79
89