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
@@ -1,4 +1,6 @@
1
1
  import type { Context } from './context.js';
2
+ import type { OutputInterface } from './index.js';
3
+ import type { BlockFunction, CatchFunction, PendingFunction } from './blocks.js';
2
4
 
3
5
  export type Component = {
4
6
  c: null | Map<Context<any>, any>;
@@ -13,6 +15,7 @@ export type Dependency = {
13
15
 
14
16
  export type Derived = {
15
17
  a: { get?: Function; set?: Function };
18
+ b: Block;
16
19
  c: number;
17
20
  co: null | Component;
18
21
  d: null | Dependency;
@@ -31,9 +34,41 @@ export type Tracked = {
31
34
  c: number;
32
35
  f: number;
33
36
  v: any;
37
+ aa: AbortController | null;
38
+ ap: PromiseLike<any> | null;
34
39
  readonly [0]: any;
35
40
  [1]: Tracked;
36
41
  value: any;
37
42
  readonly length: 2;
38
43
  [Symbol.iterator](): Iterator<any | Tracked>;
39
44
  };
45
+
46
+ export type Block = {
47
+ co: Component | null;
48
+ f: number;
49
+ fn: BlockFunction;
50
+ o: OutputInterface;
51
+ p: Block | null;
52
+ s: any;
53
+ first: Block | null;
54
+ last: Block | null;
55
+ next: Block | null;
56
+ prev: Block | null;
57
+ };
58
+
59
+ export type TryBlockState = {
60
+ p?: PendingFunction | null;
61
+ c?: CatchFunction | null;
62
+ };
63
+
64
+ export type TryBlock = Block & {
65
+ s: TryBlockState;
66
+ };
67
+
68
+ export type TryBlockWithCatch = TryBlock & {
69
+ s: TryBlockState & { c: CatchFunction };
70
+ };
71
+
72
+ export type TryBlockWithPending = TryBlock & {
73
+ s: TryBlockState & { p: PendingFunction };
74
+ };
@@ -1,5 +1,5 @@
1
1
  // SSR helpers
2
- export { render, renderToStream } from '../runtime/internal/server/index.js';
2
+ export { create_ssr_stream, render } from '../runtime/internal/server/index.js';
3
3
  export { get_css_for_hashes } from '../runtime/internal/server/css-registry.js';
4
4
  export { executeServerFunction } from '../runtime/internal/server/rpc.js';
5
5
 
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @param {any} value
3
+ * @returns {value is PromiseLike<any>}
4
+ */
5
+ export function is_promise_like(value) {
6
+ return (
7
+ (typeof value === 'object' || typeof value === 'function') &&
8
+ value !== null &&
9
+ typeof value.then === 'function'
10
+ );
11
+ }
12
+
13
+ /**
14
+ * @param {any} value
15
+ * @param {'deferred'} [type]
16
+ * @returns {{ promise: PromiseLike<any>, abort_controller: AbortController | null, type?: 'deferred' } | null}
17
+ */
18
+ export function get_async_track_result(value, type) {
19
+ if (is_promise_like(value)) {
20
+ return { promise: value, abort_controller: null, type: type };
21
+ }
22
+
23
+ if (typeof value === 'object' && value !== null && is_promise_like(value.promise)) {
24
+ return {
25
+ promise: value.promise,
26
+ abort_controller:
27
+ typeof value.abortController === 'object' && value.abortController !== null
28
+ ? value.abortController
29
+ : null,
30
+ type: type,
31
+ };
32
+ }
33
+
34
+ return null;
35
+ }
@@ -1051,15 +1051,17 @@ export function try_builder(block, handler = null, finalizer = null, pending = n
1051
1051
 
1052
1052
  /**
1053
1053
  * @param {AST.Pattern | null} param
1054
+ * @param {AST.Pattern | null} reset_param
1054
1055
  * @param {AST.BlockStatement} body
1055
1056
  * @param {AST.NodeWithLocation} [loc_info]
1056
1057
  * @return {AST.CatchClause}
1057
1058
  */
1058
- export function catch_clause_builder(param, body, loc_info) {
1059
+ export function catch_clause_builder(param, reset_param, body, loc_info) {
1059
1060
  /** @type {AST.CatchClause} */
1060
1061
  const node = {
1061
1062
  type: 'CatchClause',
1062
1063
  param,
1064
+ resetParam: reset_param,
1063
1065
  body,
1064
1066
  metadata: { path: [] },
1065
1067
  };
@@ -0,0 +1,49 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`computed tracked properties > should update a property using assignment 1`] = `
4
+ <div>
5
+ <div>
6
+ 0
7
+ </div>
8
+ <button>
9
+ Increment
10
+ </button>
11
+
12
+ </div>
13
+ `;
14
+
15
+ exports[`computed tracked properties > should update a property using assignment 2`] = `
16
+ <div>
17
+ <div>
18
+ 1
19
+ </div>
20
+ <button>
21
+ Increment
22
+ </button>
23
+
24
+ </div>
25
+ `;
26
+
27
+ exports[`computed tracked properties > should update a property using update expressions 1`] = `
28
+ <div>
29
+ <div>
30
+ 0
31
+ </div>
32
+ <button>
33
+ Increment
34
+ </button>
35
+
36
+ </div>
37
+ `;
38
+
39
+ exports[`computed tracked properties > should update a property using update expressions 2`] = `
40
+ <div>
41
+ <div>
42
+ 1
43
+ </div>
44
+ <button>
45
+ Increment
46
+ </button>
47
+
48
+ </div>
49
+ `;
@@ -0,0 +1,319 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`for statements > correctly handles intermediate statements in for block 1`] = `
4
+ <div>
5
+ <div>
6
+ <div>
7
+ <div>
8
+ 1
9
+ </div>
10
+ <div>
11
+ 1
12
+ </div>
13
+ </div>
14
+ <div>
15
+ <div>
16
+ 2
17
+ </div>
18
+ <div>
19
+ 2
20
+ </div>
21
+ </div>
22
+ <div>
23
+ <div>
24
+ 3
25
+ </div>
26
+ <div>
27
+ 3
28
+ </div>
29
+ </div>
30
+
31
+ </div>
32
+ <button>
33
+ Add Item
34
+ </button>
35
+
36
+ </div>
37
+ `;
38
+
39
+ exports[`for statements > correctly handles intermediate statements in for block 2`] = `
40
+ <div>
41
+ <div>
42
+ <div>
43
+ <div>
44
+ 1
45
+ </div>
46
+ <div>
47
+ 1
48
+ </div>
49
+ </div>
50
+ <div>
51
+ <div>
52
+ 2
53
+ </div>
54
+ <div>
55
+ 2
56
+ </div>
57
+ </div>
58
+ <div>
59
+ <div>
60
+ 3
61
+ </div>
62
+ <div>
63
+ 3
64
+ </div>
65
+ </div>
66
+ <div>
67
+ <div>
68
+ 4
69
+ </div>
70
+ <div>
71
+ 4
72
+ </div>
73
+ </div>
74
+
75
+ </div>
76
+ <button>
77
+ Add Item
78
+ </button>
79
+
80
+ </div>
81
+ `;
82
+
83
+ exports[`for statements > correctly handles keyed for...of loops 1`] = `
84
+ <div>
85
+ <!---->
86
+ <div>
87
+ 0:Item 1
88
+ </div>
89
+ <div>
90
+ 1:Item 2
91
+ </div>
92
+ <div>
93
+ 2:Item 3
94
+ </div>
95
+ <!---->
96
+ <button>
97
+ Reverse
98
+ </button>
99
+
100
+ </div>
101
+ `;
102
+
103
+ exports[`for statements > correctly handles keyed for...of loops 2`] = `
104
+ <div>
105
+ <!---->
106
+ <div>
107
+ 0:Item 3
108
+ </div>
109
+ <div>
110
+ 1:Item 2
111
+ </div>
112
+ <div>
113
+ 2:Item 1
114
+ </div>
115
+ <!---->
116
+ <button>
117
+ Reverse
118
+ </button>
119
+
120
+ </div>
121
+ `;
122
+
123
+ exports[`for statements > correctly handles the index in a for...of loop 1`] = `
124
+ <div>
125
+ <div>
126
+ <div>
127
+ 0 : a
128
+ </div>
129
+ <div>
130
+ 1 : b
131
+ </div>
132
+ <div>
133
+ 2 : c
134
+ </div>
135
+
136
+ </div>
137
+ <button>
138
+ Add Item
139
+ </button>
140
+ <button>
141
+ Reverse
142
+ </button>
143
+
144
+ </div>
145
+ `;
146
+
147
+ exports[`for statements > correctly handles the index in a for...of loop 2`] = `
148
+ <div>
149
+ <div>
150
+ <div>
151
+ 0 : a
152
+ </div>
153
+ <div>
154
+ 1 : b
155
+ </div>
156
+ <div>
157
+ 2 : c
158
+ </div>
159
+ <div>
160
+ 3 : d
161
+ </div>
162
+
163
+ </div>
164
+ <button>
165
+ Add Item
166
+ </button>
167
+ <button>
168
+ Reverse
169
+ </button>
170
+
171
+ </div>
172
+ `;
173
+
174
+ exports[`for statements > correctly handles the index in a for...of loop 3`] = `
175
+ <div>
176
+ <div>
177
+ <div>
178
+ 0 : d
179
+ </div>
180
+ <div>
181
+ 1 : c
182
+ </div>
183
+ <div>
184
+ 2 : b
185
+ </div>
186
+ <div>
187
+ 3 : a
188
+ </div>
189
+
190
+ </div>
191
+ <button>
192
+ Add Item
193
+ </button>
194
+ <button>
195
+ Reverse
196
+ </button>
197
+
198
+ </div>
199
+ `;
200
+
201
+ exports[`for statements > handles updating with new objects with same key 1`] = `
202
+ <div>
203
+ <!---->
204
+ <div>
205
+ 0:Item 1
206
+ </div>
207
+ <div>
208
+ 1:Item 2
209
+ </div>
210
+ <div>
211
+ 2:Item 3
212
+ </div>
213
+ <!---->
214
+ <button>
215
+ Reverse
216
+ </button>
217
+
218
+ </div>
219
+ `;
220
+
221
+ exports[`for statements > handles updating with new objects with same key 2`] = `
222
+ <div>
223
+ <!---->
224
+ <div>
225
+ 0:Item 1!
226
+ </div>
227
+ <div>
228
+ 1:Item 2!
229
+ </div>
230
+ <div>
231
+ 2:Item 3!
232
+ </div>
233
+ <!---->
234
+ <button>
235
+ Reverse
236
+ </button>
237
+
238
+ </div>
239
+ `;
240
+
241
+ exports[`for statements > renders a simple dynamic array 1`] = `
242
+ <div>
243
+ <!---->
244
+ <div
245
+ class="Item 1"
246
+ >
247
+ Item 1
248
+ </div>
249
+ <div
250
+ class="Item 2"
251
+ >
252
+ Item 2
253
+ </div>
254
+ <div
255
+ class="Item 3"
256
+ >
257
+ Item 3
258
+ </div>
259
+ <!---->
260
+ <button>
261
+ Add Item
262
+ </button>
263
+
264
+ </div>
265
+ `;
266
+
267
+ exports[`for statements > renders a simple dynamic array 2`] = `
268
+ <div>
269
+ <!---->
270
+ <div
271
+ class="Item 1"
272
+ >
273
+ Item 1
274
+ </div>
275
+ <div
276
+ class="Item 2"
277
+ >
278
+ Item 2
279
+ </div>
280
+ <div
281
+ class="Item 3"
282
+ >
283
+ Item 3
284
+ </div>
285
+ <div
286
+ class="Item 4"
287
+ >
288
+ Item 4
289
+ </div>
290
+ <!---->
291
+ <button>
292
+ Add Item
293
+ </button>
294
+
295
+ </div>
296
+ `;
297
+
298
+ exports[`for statements > renders a simple static array 1`] = `
299
+ <div>
300
+ <!---->
301
+ <div
302
+ class="Item 1"
303
+ >
304
+ Item 1
305
+ </div>
306
+ <div
307
+ class="Item 2"
308
+ >
309
+ Item 2
310
+ </div>
311
+ <div
312
+ class="Item 3"
313
+ >
314
+ Item 3
315
+ </div>
316
+ <!---->
317
+
318
+ </div>
319
+ `;
@@ -0,0 +1,40 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`html directive > renders dynamic html 1`] = `
4
+ <div>
5
+ <!---->
6
+ <div>
7
+ Test
8
+ </div>
9
+ <!---->
10
+ <button>
11
+ Update
12
+ </button>
13
+
14
+ </div>
15
+ `;
16
+
17
+ exports[`html directive > renders dynamic html 2`] = `
18
+ <div>
19
+ <!---->
20
+ <div>
21
+ Updated
22
+ </div>
23
+ <!---->
24
+ <button>
25
+ Update
26
+ </button>
27
+
28
+ </div>
29
+ `;
30
+
31
+ exports[`html directive > renders static html 1`] = `
32
+ <div>
33
+ <!---->
34
+ <div>
35
+ Test
36
+ </div>
37
+ <!---->
38
+
39
+ </div>
40
+ `;
@@ -0,0 +1,7 @@
1
+ // This file is for tests that don't fit anywhere else
2
+
3
+ describe('etc', () => {
4
+ it('this is here so the empty test suite does not fail', () => {
5
+ expect(true).toBe(true);
6
+ });
7
+ });
@@ -1,4 +1,4 @@
1
- import { flushSync, RippleArray } from 'ripple';
1
+ import { flushSync, RippleArray, trackAsync } from 'ripple';
2
2
  import { MAX_ARRAY_LENGTH } from '../../../src/runtime/internal/client/constants.js';
3
3
 
4
4
  describe('RippleArray > static', () => {
@@ -46,11 +46,11 @@ describe('RippleArray > static', () => {
46
46
  }
47
47
 
48
48
  component ArrayTest() {
49
- let items = await RippleArray.fromAsync([1, 2, 3]);
49
+ let &[items] = trackAsync(() => RippleArray.fromAsync([1, 2, 3]));
50
50
 
51
51
  <button
52
52
  onClick={() => {
53
- if (items) items.push(4);
53
+ items.push(4);
54
54
  }}
55
55
  >
56
56
  {'add item'}
@@ -85,16 +85,16 @@ describe('RippleArray > static', () => {
85
85
  }
86
86
 
87
87
  component ArrayTest() {
88
- let items = await RippleArray.fromAsync([1, 2, 3], (x: number) => x * 2);
88
+ let &[items] = trackAsync(() => RippleArray.fromAsync([1, 2, 3], (x: number) => x * 2));
89
89
 
90
90
  <button
91
91
  onClick={() => {
92
- if (items) items.push(8);
92
+ items.push(8);
93
93
  }}
94
94
  >
95
95
  {'add item'}
96
96
  </button>
97
- <pre>{items ? JSON.stringify(items) : 'Loading...'}</pre>
97
+ <pre>{JSON.stringify(items)}</pre>
98
98
  }
99
99
 
100
100
  render(Parent);
@@ -125,26 +125,24 @@ describe('RippleArray > static', () => {
125
125
  }
126
126
 
127
127
  component ArrayTest() {
128
- let items: RippleArray<string> | null = null;
129
- let error: string | null = null;
130
-
131
128
  async function* throwingIterable() {
132
129
  throw new Error('Async error');
133
130
  }
134
131
 
135
132
  try {
136
- items = await RippleArray.fromAsync(throwingIterable());
137
- for (const item of items) {
138
- <li>{item}</li>
139
- }
133
+ let &[items] = trackAsync(() => RippleArray.fromAsync(throwingIterable()));
134
+
135
+ <ul>
136
+ for (const item of items) {
137
+ <li>{item}</li>
138
+ }
139
+ </ul>
140
140
  } pending {
141
141
  <div>{'Loading...'}</div>
142
142
  } catch (e) {
143
- error = (e as Error).message;
143
+ <pre>{'Error: ' + (e as Error).message}</pre>
144
+ <pre>{'No items'}</pre>
144
145
  }
145
-
146
- <pre>{error ? 'Error: ' + error : 'No error'}</pre>
147
- <pre>{items ? JSON.stringify(items) : 'No items'}</pre>
148
146
  }
149
147
 
150
148
  render(Parent);
@@ -228,10 +226,10 @@ describe('RippleArray > static', () => {
228
226
  }
229
227
 
230
228
  component ArrayTest() {
231
- const items = await RippleArray.fromAsync([6]);
229
+ let &[items] = trackAsync(() => RippleArray.fromAsync([6]));
232
230
 
233
- <pre>{items ? JSON.stringify(items) : 'Loading...'}</pre>
234
- <pre>{items ? items.length : ''}</pre>
231
+ <pre>{JSON.stringify(items)}</pre>
232
+ <pre>{items.length}</pre>
235
233
  }
236
234
 
237
235
  render(Parent);