ripple 0.3.2 → 0.3.4

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 (128) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/package.json +2 -2
  3. package/src/compiler/identifier-utils.js +0 -2
  4. package/src/compiler/phases/1-parse/index.js +101 -195
  5. package/src/compiler/phases/2-analyze/index.js +82 -174
  6. package/src/compiler/phases/2-analyze/prune.js +2 -2
  7. package/src/compiler/phases/3-transform/client/index.js +174 -264
  8. package/src/compiler/phases/3-transform/segments.js +0 -22
  9. package/src/compiler/phases/3-transform/server/index.js +185 -42
  10. package/src/compiler/types/index.d.ts +14 -33
  11. package/src/compiler/utils.js +32 -20
  12. package/src/runtime/index-client.js +0 -17
  13. package/src/runtime/internal/client/bindings.js +118 -7
  14. package/src/runtime/internal/client/render.js +5 -1
  15. package/src/runtime/internal/client/runtime.js +1 -1
  16. package/src/runtime/internal/client/types.d.ts +4 -0
  17. package/tests/client/array/array.copy-within.test.ripple +7 -7
  18. package/tests/client/array/array.derived.test.ripple +24 -24
  19. package/tests/client/array/array.iteration.test.ripple +7 -7
  20. package/tests/client/array/array.mutations.test.ripple +17 -17
  21. package/tests/client/array/array.to-methods.test.ripple +4 -4
  22. package/tests/client/async-suspend.test.ripple +3 -3
  23. package/tests/client/basic/basic.attributes.test.ripple +31 -31
  24. package/tests/client/basic/basic.collections.test.ripple +6 -6
  25. package/tests/client/basic/basic.components.test.ripple +8 -8
  26. package/tests/client/basic/basic.errors.test.ripple +31 -34
  27. package/tests/client/basic/basic.events.test.ripple +11 -11
  28. package/tests/client/basic/basic.get-set.test.ripple +18 -18
  29. package/tests/client/basic/basic.reactivity.test.ripple +36 -36
  30. package/tests/client/basic/basic.rendering.test.ripple +7 -7
  31. package/tests/client/basic/basic.utilities.test.ripple +4 -4
  32. package/tests/client/boundaries.test.ripple +7 -7
  33. package/tests/client/compiler/__snapshots__/compiler.typescript.test.ripple.snap +24 -0
  34. package/tests/client/compiler/compiler.assignments.test.ripple +12 -10
  35. package/tests/client/compiler/compiler.basic.test.ripple +58 -60
  36. package/tests/client/compiler/compiler.tracked-access.test.ripple +14 -8
  37. package/tests/client/compiler/compiler.typescript.test.ripple +31 -0
  38. package/tests/client/composite/composite.dynamic-components.test.ripple +6 -6
  39. package/tests/client/composite/composite.props.test.ripple +9 -9
  40. package/tests/client/composite/composite.reactivity.test.ripple +23 -23
  41. package/tests/client/composite/composite.render.test.ripple +52 -4
  42. package/tests/client/computed-properties.test.ripple +3 -3
  43. package/tests/client/context.test.ripple +3 -3
  44. package/tests/client/css/global-additional-cases.test.ripple +5 -2
  45. package/tests/client/css/style-identifier.test.ripple +40 -49
  46. package/tests/client/date.test.ripple +39 -39
  47. package/tests/client/dynamic-elements.test.ripple +37 -37
  48. package/tests/client/events.test.ripple +25 -25
  49. package/tests/client/for.test.ripple +8 -8
  50. package/tests/client/head.test.ripple +7 -7
  51. package/tests/client/html.test.ripple +2 -2
  52. package/tests/client/input-value.test.ripple +376 -177
  53. package/tests/client/lazy-destructuring.test.ripple +185 -0
  54. package/tests/client/map.test.ripple +20 -20
  55. package/tests/client/media-query.test.ripple +4 -4
  56. package/tests/client/object.test.ripple +5 -5
  57. package/tests/client/portal.test.ripple +4 -4
  58. package/tests/client/ref.test.ripple +3 -3
  59. package/tests/client/return.test.ripple +17 -17
  60. package/tests/client/set.test.ripple +10 -10
  61. package/tests/client/svg.test.ripple +6 -5
  62. package/tests/client/switch.test.ripple +10 -10
  63. package/tests/client/tracked-expression.test.ripple +3 -1
  64. package/tests/client/try.test.ripple +4 -4
  65. package/tests/client/url/url.derived.test.ripple +6 -7
  66. package/tests/client/url/url.parsing.test.ripple +9 -9
  67. package/tests/client/url/url.partial-removal.test.ripple +9 -9
  68. package/tests/client/url/url.reactivity.test.ripple +16 -16
  69. package/tests/client/url/url.serialization.test.ripple +3 -3
  70. package/tests/client/url-search-params/url-search-params.derived.test.ripple +7 -8
  71. package/tests/client/url-search-params/url-search-params.initialization.test.ripple +6 -4
  72. package/tests/client/url-search-params/url-search-params.iteration.test.ripple +12 -12
  73. package/tests/client/url-search-params/url-search-params.mutation.test.ripple +18 -18
  74. package/tests/client/url-search-params/url-search-params.retrieval.test.ripple +16 -16
  75. package/tests/client/url-search-params/url-search-params.serialization.test.ripple +4 -4
  76. package/tests/client/url-search-params/url-search-params.tracked-url.test.ripple +3 -3
  77. package/tests/hydration/build-components.js +4 -10
  78. package/tests/hydration/compiled/client/basic.js +4 -4
  79. package/tests/hydration/compiled/client/events.js +2 -0
  80. package/tests/hydration/compiled/client/for.js +2 -0
  81. package/tests/hydration/compiled/client/head.js +13 -11
  82. package/tests/hydration/compiled/client/hmr.js +4 -2
  83. package/tests/hydration/compiled/client/html.js +82 -95
  84. package/tests/hydration/compiled/client/if-children.js +8 -9
  85. package/tests/hydration/compiled/client/if.js +2 -0
  86. package/tests/hydration/compiled/client/mixed-control-flow.js +4 -2
  87. package/tests/hydration/compiled/client/portal.js +1 -1
  88. package/tests/hydration/compiled/client/reactivity.js +2 -0
  89. package/tests/hydration/compiled/client/return.js +2 -0
  90. package/tests/hydration/compiled/client/switch.js +2 -0
  91. package/tests/hydration/compiled/server/composite.js +2 -2
  92. package/tests/hydration/compiled/server/events.js +2 -0
  93. package/tests/hydration/compiled/server/for.js +2 -0
  94. package/tests/hydration/compiled/server/head.js +13 -11
  95. package/tests/hydration/compiled/server/hmr.js +2 -0
  96. package/tests/hydration/compiled/server/html.js +2 -0
  97. package/tests/hydration/compiled/server/if-children.js +2 -0
  98. package/tests/hydration/compiled/server/if.js +2 -0
  99. package/tests/hydration/compiled/server/mixed-control-flow.js +2 -0
  100. package/tests/hydration/compiled/server/portal.js +1 -1
  101. package/tests/hydration/compiled/server/reactivity.js +2 -0
  102. package/tests/hydration/compiled/server/return.js +2 -0
  103. package/tests/hydration/compiled/server/switch.js +2 -0
  104. package/tests/hydration/components/composite.ripple +1 -1
  105. package/tests/hydration/components/events.ripple +10 -8
  106. package/tests/hydration/components/for.ripple +22 -20
  107. package/tests/hydration/components/head.ripple +8 -6
  108. package/tests/hydration/components/hmr.ripple +3 -1
  109. package/tests/hydration/components/html.ripple +3 -1
  110. package/tests/hydration/components/if-children.ripple +9 -7
  111. package/tests/hydration/components/if.ripple +7 -5
  112. package/tests/hydration/components/mixed-control-flow.ripple +5 -3
  113. package/tests/hydration/components/portal.ripple +2 -2
  114. package/tests/hydration/components/reactivity.ripple +11 -9
  115. package/tests/hydration/components/return.ripple +13 -11
  116. package/tests/hydration/components/switch.ripple +6 -4
  117. package/tests/server/__snapshots__/compiler.test.ripple.snap +22 -0
  118. package/tests/server/await.test.ripple +2 -2
  119. package/tests/server/basic.attributes.test.ripple +21 -19
  120. package/tests/server/basic.components.test.ripple +5 -4
  121. package/tests/server/basic.test.ripple +21 -20
  122. package/tests/server/compiler.test.ripple +36 -5
  123. package/tests/server/composite.props.test.ripple +7 -6
  124. package/tests/server/context.test.ripple +3 -1
  125. package/tests/server/dynamic-elements.test.ripple +24 -24
  126. package/tests/server/head.test.ripple +7 -5
  127. package/tests/server/style-identifier.test.ripple +95 -16
  128. package/types/index.d.ts +4 -1
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { flushSync, type RippleArray } from 'ripple';
2
+ import { RippleArray, RippleObject, flushSync, track } from 'ripple';
3
3
 
4
4
  describe('basic client > attribute rendering', () => {
5
5
  it('render static attributes', () => {
@@ -14,7 +14,7 @@ describe('basic client > attribute rendering', () => {
14
14
 
15
15
  it('render dynamic class attribute', () => {
16
16
  component Basic() {
17
- let active = #ripple.track(false);
17
+ let active = track(false);
18
18
 
19
19
  <button
20
20
  onClick={() => {
@@ -98,7 +98,7 @@ describe('basic client > attribute rendering', () => {
98
98
 
99
99
  it('render dynamic class object', () => {
100
100
  component Basic() {
101
- let active = #ripple.track(false);
101
+ let active = track(false);
102
102
 
103
103
  <button
104
104
  onClick={() => {
@@ -141,7 +141,7 @@ describe('basic client > attribute rendering', () => {
141
141
 
142
142
  it('applies scoped ripple class to multiple elements with dynamic class expressions', () => {
143
143
  component Basic() {
144
- let selected = #ripple.track(1);
144
+ let selected = track(1);
145
145
 
146
146
  <div class={@selected === 0 ? 'selected' : ''}>{`div 1`}</div>
147
147
  <div class={@selected === 0 ? 'selected' : ''}>{`div 2`}</div>
@@ -170,7 +170,7 @@ describe('basic client > attribute rendering', () => {
170
170
 
171
171
  it('render dynamic id attribute', () => {
172
172
  component Basic() {
173
- let count = #ripple.track(0);
173
+ let count = track(0);
174
174
 
175
175
  <button
176
176
  onClick={() => {
@@ -202,7 +202,7 @@ describe('basic client > attribute rendering', () => {
202
202
 
203
203
  it('render dynamic style attribute', () => {
204
204
  component Basic() {
205
- let color = #ripple.track('red');
205
+ let color = track('red');
206
206
 
207
207
  <button
208
208
  onClick={() => {
@@ -231,7 +231,7 @@ describe('basic client > attribute rendering', () => {
231
231
 
232
232
  it('render style attribute as dynamic object', () => {
233
233
  component Basic() {
234
- let color = #ripple.track('red');
234
+ let color = track('red');
235
235
 
236
236
  <button
237
237
  onClick={() => {
@@ -260,7 +260,7 @@ describe('basic client > attribute rendering', () => {
260
260
 
261
261
  it('render tracked variable as style attribute', () => {
262
262
  component Basic() {
263
- let style = #ripple.track({ color: 'red', fontWeight: 'bold' });
263
+ let style = track({ color: 'red', fontWeight: 'bold' });
264
264
 
265
265
  function toggleColor() {
266
266
  @style = { ...@style, color: @style.color === 'red' ? 'blue' : 'red' };
@@ -287,7 +287,7 @@ describe('basic client > attribute rendering', () => {
287
287
 
288
288
  it('render tracked object as style attribute', () => {
289
289
  component Basic() {
290
- let style = #ripple{ color: 'red', fontWeight: 'bold' };
290
+ let style = new RippleObject({ color: 'red', fontWeight: 'bold' });
291
291
 
292
292
  function toggleColor() {
293
293
  style.color = style.color === 'red' ? 'blue' : 'red';
@@ -360,8 +360,8 @@ describe('basic client > attribute rendering', () => {
360
360
 
361
361
  it('render dynamic boolean attributes', () => {
362
362
  component Basic() {
363
- let disabled = #ripple.track(false);
364
- let checked = #ripple.track(false);
363
+ let disabled = track(false);
364
+ let checked = track(false);
365
365
 
366
366
  <button
367
367
  onClick={() => {
@@ -391,8 +391,8 @@ describe('basic client > attribute rendering', () => {
391
391
 
392
392
  it('render multiple dynamic attributes', () => {
393
393
  component Basic() {
394
- let theme = #ripple.track('light');
395
- let size = #ripple.track('medium');
394
+ let theme = track('light');
395
+ let size = track('medium');
396
396
 
397
397
  <button
398
398
  onClick={() => {
@@ -426,8 +426,8 @@ describe('basic client > attribute rendering', () => {
426
426
 
427
427
  it('render conditional attributes', () => {
428
428
  component Basic() {
429
- let showTitle = #ripple.track(false);
430
- let showAria = #ripple.track(false);
429
+ let showTitle = track(false);
430
+ let showAria = track(false);
431
431
 
432
432
  <button
433
433
  onClick={() => {
@@ -468,7 +468,7 @@ describe('basic client > attribute rendering', () => {
468
468
 
469
469
  it('render spread attributes', () => {
470
470
  component Basic() {
471
- let attrs = #ripple.track<TestAttributes>(
471
+ let attrs = track<TestAttributes>(
472
472
  {
473
473
  class: 'initial',
474
474
  id: 'test-1',
@@ -508,12 +508,12 @@ describe('basic client > attribute rendering', () => {
508
508
 
509
509
  it('renders with reactive attributes with nested reactive attributes', () => {
510
510
  component App() {
511
- let value = #ripple.track('parent-class');
511
+ let value = track('parent-class');
512
512
 
513
513
  <p class={@value}>{'Colored parent value'}</p>
514
514
 
515
515
  <div>
516
- let nested = #ripple.track('nested-class');
516
+ let nested = track('nested-class');
517
517
 
518
518
  <p class={@nested}>{'Colored nested value'}</p>
519
519
  </div>
@@ -556,8 +556,8 @@ describe('basic client > attribute rendering', () => {
556
556
 
557
557
  it('handles reactive event handler changes', () => {
558
558
  component Basic() {
559
- let count = #ripple.track(0);
560
- let mode = #ripple.track<'increment' | 'decrement'>('increment');
559
+ let count = track(0);
560
+ let mode = track<'increment' | 'decrement'>('increment');
561
561
 
562
562
  const incrementHandler = () => {
563
563
  @count++;
@@ -613,7 +613,7 @@ describe('basic client > attribute rendering', () => {
613
613
 
614
614
  it('handles events with capture option', () => {
615
615
  component Basic() {
616
- let captureOrder: RippleArray<string> = #ripple[];
616
+ let captureOrder: RippleArray<string> = new RippleArray();
617
617
 
618
618
  const handleCaptureClick = {
619
619
  handleEvent() {
@@ -647,7 +647,7 @@ describe('basic client > attribute rendering', () => {
647
647
 
648
648
  it('handles events with Capture suffix in the name', () => {
649
649
  component Basic() {
650
- let captureOrder: RippleArray<string> = #ripple[];
650
+ let captureOrder: RippleArray<string> = new RippleArray();
651
651
 
652
652
  const handleCaptureClick = () => {
653
653
  captureOrder.push('capture');
@@ -678,7 +678,7 @@ describe('basic client > attribute rendering', () => {
678
678
 
679
679
  it('handles custom events with customName option', () => {
680
680
  component Basic() {
681
- let customEventCount = #ripple.track(0);
681
+ let customEventCount = track(0);
682
682
 
683
683
  const handleCustom = {
684
684
  handleEvent(event: CustomEvent) {
@@ -713,8 +713,8 @@ describe('basic client > attribute rendering', () => {
713
713
 
714
714
  it('handles events with delegated: false option to bypass delegation', () => {
715
715
  component Basic() {
716
- let delegatedCount = #ripple.track(0);
717
- let nonDelegatedCount = #ripple.track(0);
716
+ let delegatedCount = track(0);
717
+ let nonDelegatedCount = track(0);
718
718
 
719
719
  const delegatedHandler = () => {
720
720
  @delegatedCount++;
@@ -827,8 +827,8 @@ describe('basic client > attribute rendering', () => {
827
827
 
828
828
  it('handles events defined as function directly vs as object', () => {
829
829
  component Basic() {
830
- let functionCount = #ripple.track(0);
831
- let objectCount = #ripple.track(0);
830
+ let functionCount = track(0);
831
+ let objectCount = track(0);
832
832
 
833
833
  const functionHandler = () => {
834
834
  @functionCount++;
@@ -880,8 +880,8 @@ describe('basic client > attribute rendering', () => {
880
880
 
881
881
  it('handles passive event option', () => {
882
882
  component Basic() {
883
- let passiveDefaultPrevented = #ripple.track<boolean | null>(null);
884
- let nonPassiveDefaultPrevented = #ripple.track<boolean | null>(null);
883
+ let passiveDefaultPrevented = track<boolean | null>(null);
884
+ let nonPassiveDefaultPrevented = track<boolean | null>(null);
885
885
 
886
886
  const passiveHandler = {
887
887
  handleEvent(event: Event) {
@@ -945,8 +945,8 @@ describe('basic client > attribute rendering', () => {
945
945
 
946
946
  it('handles once option to fire event only once', () => {
947
947
  component Basic() {
948
- let onceCount = #ripple.track(0);
949
- let regularCount = #ripple.track(0);
948
+ let onceCount = track(0);
949
+ let regularCount = track(0);
950
950
 
951
951
  const onceHandler = {
952
952
  handleEvent() {
@@ -1,10 +1,10 @@
1
- import { flushSync } from 'ripple';
1
+ import { RippleArray, flushSync, track } from 'ripple';
2
2
  import { TRACKED_ARRAY } from '../../../src/runtime/internal/client/constants.js';
3
3
 
4
4
  describe('basic client > collections', () => {
5
5
  it('renders with simple reactive objects', () => {
6
6
  component Basic() {
7
- let user = #ripple.track(
7
+ let user = track(
8
8
  {
9
9
  name: 'John',
10
10
  age: 25,
@@ -40,10 +40,10 @@ describe('basic client > collections', () => {
40
40
 
41
41
  it('renders with nested reactive objects', () => {
42
42
  component Basic() {
43
- let user = #ripple.track(
43
+ let user = track(
44
44
  {
45
- name: #ripple.track('John'),
46
- age: #ripple.track(25),
45
+ name: track('John'),
46
+ age: track(25),
47
47
  },
48
48
  );
49
49
 
@@ -77,7 +77,7 @@ describe('basic client > collections', () => {
77
77
 
78
78
  it('works as a reactive RippleArray when constructed using # syntactic sugar', () => {
79
79
  component App() {
80
- const array = #ripple[1, 2, 3];
80
+ const array = new RippleArray(1, 2, 3);
81
81
 
82
82
  <pre>{String(array[3])}</pre>
83
83
  <pre>{array[0]}</pre>
@@ -6,7 +6,7 @@ import type {
6
6
  Component,
7
7
  PropsWithChildrenOptional,
8
8
  } from 'ripple';
9
- import { flushSync } from 'ripple';
9
+ import { flushSync, track } from 'ripple';
10
10
 
11
11
  describe('basic client > components & composition', () => {
12
12
  it('renders with component composition and children', () => {
@@ -69,7 +69,7 @@ describe('basic client > components & composition', () => {
69
69
  }
70
70
 
71
71
  component Basic() {
72
- let test = #ripple.track(false);
72
+ let test = track(false);
73
73
  <Card>
74
74
  component test() {
75
75
  <p>{'Card content here'}</p>
@@ -134,7 +134,7 @@ describe('basic client > components & composition', () => {
134
134
  }
135
135
 
136
136
  component Basic() {
137
- let clicked = #ripple.track(false);
137
+ let clicked = track(false);
138
138
 
139
139
  <Card
140
140
  title="Test Card"
@@ -175,8 +175,8 @@ describe('basic client > components & composition', () => {
175
175
  }
176
176
 
177
177
  component Basic() {
178
- let message = #ripple.track('Hello');
179
- let number = #ripple.track(1);
178
+ let message = track('Hello');
179
+ let number = track(1);
180
180
 
181
181
  <ChildComponent text={message} count={number} />
182
182
  <button
@@ -214,14 +214,14 @@ describe('basic client > components & composition', () => {
214
214
  it('it retains this context with bracketed prop functions and keeps original chaining', () => {
215
215
  component App() {
216
216
  const SYMBOL_PROP = Symbol();
217
- let hasError = #ripple.track(false);
217
+ let hasError = track(false);
218
218
  const obj: {
219
219
  count: Tracked<number>;
220
220
  increment: () => void;
221
221
  [key: symbol]: () => void;
222
222
  arr: Array<() => void>;
223
223
  } = {
224
- count: #ripple.track(0),
224
+ count: track(0),
225
225
  increment() {
226
226
  this.@count++;
227
227
  },
@@ -402,7 +402,7 @@ describe('basic client > components & composition', () => {
402
402
  }
403
403
 
404
404
  component App() {
405
- let Content = #ripple.track(() => Noop);
405
+ let Content = track(() => Noop);
406
406
  <@Content />
407
407
 
408
408
  <button onClick={() => (@Content = Op)}>{'Show Op'}</button>
@@ -1,11 +1,11 @@
1
- import { flushSync } from 'ripple';
1
+ import { flushSync, track, untrack } from 'ripple';
2
2
  import { compile } from 'ripple/compiler';
3
3
 
4
4
  describe('basic client > errors', () => {
5
5
  it('renders with error handling simulation', () => {
6
6
  component Basic() {
7
- let hasError = #ripple.track(false);
8
- let errorMessage = #ripple.track('');
7
+ let hasError = track(false);
8
+ let errorMessage = track('');
9
9
 
10
10
  const triggerError = () => {
11
11
  try {
@@ -89,11 +89,11 @@ describe('basic client > errors', () => {
89
89
  );
90
90
  });
91
91
 
92
- it('errors on mutating tracked value inside computed #ripple.track() evaluation', () => {
92
+ it('errors on mutating tracked value inside computed track() evaluation', () => {
93
93
  component Basic() {
94
- let count = #ripple.track(0);
94
+ let count = track(0);
95
95
 
96
- const doubled = #ripple.track(() => {
96
+ const doubled = track(() => {
97
97
  try {
98
98
  @count *= 2;
99
99
  } catch (e) {
@@ -107,42 +107,39 @@ describe('basic client > errors', () => {
107
107
  render(Basic);
108
108
 
109
109
  expect(error).toBe(
110
- 'Assignments or updates to tracked values are not allowed during computed "#ripple.track(() => ...)" evaluation',
110
+ 'Assignments or updates to tracked values are not allowed during computed "track(() => ...)" evaluation',
111
111
  );
112
112
  });
113
113
 
114
- it(
115
- 'errors on mutating tracked value inside #ripple.untrack() in computed #ripple.track() evaluation',
116
- () => {
117
- component Basic() {
118
- let count = #ripple.track(0);
119
-
120
- const doubled = #ripple.track(() => {
121
- try {
122
- #ripple.untrack(() => {
123
- @count *= 2;
124
- });
125
- } catch (e) {
126
- error = (e as Error).message;
127
- }
128
- });
114
+ it('errors on mutating tracked value inside untrack() in computed track() evaluation', () => {
115
+ component Basic() {
116
+ let count = track(0);
129
117
 
130
- <p>{@doubled}</p>
131
- }
118
+ const doubled = track(() => {
119
+ try {
120
+ untrack(() => {
121
+ @count *= 2;
122
+ });
123
+ } catch (e) {
124
+ error = (e as Error).message;
125
+ }
126
+ });
132
127
 
133
- render(Basic);
128
+ <p>{@doubled}</p>
129
+ }
130
+
131
+ render(Basic);
134
132
 
135
- expect(error).toBe(
136
- 'Assignments or updates to tracked values are not allowed during computed "#ripple.track(() => ...)" evaluation',
137
- );
138
- },
139
- );
133
+ expect(error).toBe(
134
+ 'Assignments or updates to tracked values are not allowed during computed "track(() => ...)" evaluation',
135
+ );
136
+ });
140
137
 
141
- it('errors on mutating a tracked variable in #ripple.track() getter', () => {
138
+ it('errors on mutating a tracked variable in track() getter', () => {
142
139
  component Basic() {
143
- let count = #ripple.track(0);
140
+ let count = track(0);
144
141
 
145
- const doubled = #ripple.track(0, (value) => {
142
+ const doubled = track(0, (value) => {
146
143
  try {
147
144
  @count += 1;
148
145
  } catch (e) {
@@ -157,7 +154,7 @@ describe('basic client > errors', () => {
157
154
  render(Basic);
158
155
 
159
156
  expect(error).toBe(
160
- 'Assignments or updates to tracked values are not allowed during computed "#ripple.track(() => ...)" evaluation',
157
+ 'Assignments or updates to tracked values are not allowed during computed "track(() => ...)" evaluation',
161
158
  );
162
159
  });
163
160
 
@@ -1,11 +1,11 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { flushSync } from 'ripple';
2
+ import { flushSync, track } from 'ripple';
3
3
 
4
4
  describe('basic client > events', () => {
5
5
  it('renders with different event types', () => {
6
6
  component Basic() {
7
- let focusCount = #ripple.track(0);
8
- let clickCount = #ripple.track(0);
7
+ let focusCount = track(0);
8
+ let clickCount = track(0);
9
9
 
10
10
  <button
11
11
  onFocus={() => {
@@ -38,8 +38,8 @@ describe('basic client > events', () => {
38
38
 
39
39
  it('renders with capture events', () => {
40
40
  component Basic() {
41
- let captureClicks = #ripple.track(0);
42
- let bubbleClicks = #ripple.track(0);
41
+ let captureClicks = track(0);
42
+ let bubbleClicks = track(0);
43
43
 
44
44
  <div
45
45
  onClick={{
@@ -76,7 +76,7 @@ describe('basic client > events', () => {
76
76
 
77
77
  it('renders with event listeners in spread props', () => {
78
78
  component Basic() {
79
- let count = #ripple.track(0);
79
+ let count = track(0);
80
80
 
81
81
  const minus = {
82
82
  onClick() {
@@ -125,8 +125,8 @@ describe('basic client > events', () => {
125
125
 
126
126
  it('handles both delegated and non-delegated events in spread props', () => {
127
127
  component Basic() {
128
- let clickCount = #ripple.track(0);
129
- let focusCount = #ripple.track(0);
128
+ let clickCount = track(0);
129
+ let focusCount = track(0);
130
130
 
131
131
  const mixedHandler = {
132
132
  onClick() {
@@ -168,9 +168,9 @@ describe('basic client > events', () => {
168
168
 
169
169
  it('renders with complex event handling and state updates', () => {
170
170
  component Basic() {
171
- let counter = #ripple.track(0);
172
- let history = #ripple.track<string[]>([]);
173
- let isEven = #ripple.track(true);
171
+ let counter = track(0);
172
+ let history = track<string[]>([]);
173
+ let isEven = track(true);
174
174
 
175
175
  const handleIncrement = () => {
176
176
  @counter++;
@@ -1,9 +1,9 @@
1
- import { flushSync, get, set } from 'ripple';
1
+ import { effect, flushSync, get, set, track, untrack } from 'ripple';
2
2
 
3
3
  describe('basic client > get/set functions', () => {
4
4
  it('gets tracked value', () => {
5
5
  component Test() {
6
- let count = #ripple.track(0);
6
+ let count = track(0);
7
7
 
8
8
  <div>{get(count)}</div>
9
9
  }
@@ -16,7 +16,7 @@ describe('basic client > get/set functions', () => {
16
16
 
17
17
  it('gets tracked value after mutation', () => {
18
18
  component Test() {
19
- let count = #ripple.track(0);
19
+ let count = track(0);
20
20
 
21
21
  <p>{get(count)}</p>
22
22
  <button onClick={() => @count++}>{'increment'}</button>
@@ -36,7 +36,7 @@ describe('basic client > get/set functions', () => {
36
36
 
37
37
  it('gets tracked value after multiple mutations', () => {
38
38
  component Test() {
39
- let count = #ripple.track(0);
39
+ let count = track(0);
40
40
 
41
41
  <p>{get(count)}</p>
42
42
  <button
@@ -64,7 +64,7 @@ describe('basic client > get/set functions', () => {
64
64
 
65
65
  it('sets tracked value', () => {
66
66
  component Test() {
67
- let count = #ripple.track(0);
67
+ let count = track(0);
68
68
 
69
69
  <p>{get(count)}</p>
70
70
  <button onClick={() => set(count, 10)}>{'set to 10'}</button>
@@ -84,7 +84,7 @@ describe('basic client > get/set functions', () => {
84
84
 
85
85
  it('sets tracked value multiple times', () => {
86
86
  component Test() {
87
- let count = #ripple.track(0);
87
+ let count = track(0);
88
88
 
89
89
  <p>{get(count)}</p>
90
90
  <button
@@ -112,7 +112,7 @@ describe('basic client > get/set functions', () => {
112
112
 
113
113
  it('sets tracked value based on previous value', () => {
114
114
  component Test() {
115
- let count = #ripple.track(0);
115
+ let count = track(0);
116
116
 
117
117
  <p>{get(count)}</p>
118
118
  <button onClick={() => set(count, get(count) + 10)}>{'add 10'}</button>
@@ -138,7 +138,7 @@ describe('basic client > get/set functions', () => {
138
138
 
139
139
  it('sets tracked value multiple times based on previous value', () => {
140
140
  component Test() {
141
- let count = #ripple.track(0);
141
+ let count = track(0);
142
142
 
143
143
  <p>{get(count)}</p>
144
144
  <button
@@ -172,7 +172,7 @@ describe('basic client > get/set functions', () => {
172
172
 
173
173
  it('gets value declared outside Ripple component', () => {
174
174
  function store() {
175
- return #ripple.track(0);
175
+ return track(0);
176
176
  }
177
177
 
178
178
  component Test() {
@@ -188,7 +188,7 @@ describe('basic client > get/set functions', () => {
188
188
 
189
189
  it('sets value declared outside Ripple component', () => {
190
190
  function store() {
191
- return #ripple.track(0);
191
+ return track(0);
192
192
  }
193
193
 
194
194
  component Test() {
@@ -212,10 +212,10 @@ describe('basic client > get/set functions', () => {
212
212
 
213
213
  it('works with effects', () => {
214
214
  component Test() {
215
- let count = #ripple.track(0);
216
- let double = #ripple.track(0);
215
+ let count = track(0);
216
+ let double = track(0);
217
217
 
218
- #ripple.effect(() => {
218
+ effect(() => {
219
219
  set(double, get(count) * 2);
220
220
  });
221
221
 
@@ -242,11 +242,11 @@ describe('basic client > get/set functions', () => {
242
242
 
243
243
  it('works with effects and untrack', () => {
244
244
  component Test() {
245
- let count = #ripple.track(0);
246
- let double = #ripple.track(0);
245
+ let count = track(0);
246
+ let double = track(0);
247
247
 
248
- #ripple.effect(() => {
249
- #ripple.untrack(() => {
248
+ effect(() => {
249
+ untrack(() => {
250
250
  set(double, get(count) * 2);
251
251
  });
252
252
  });
@@ -274,6 +274,6 @@ describe('basic client > get/set functions', () => {
274
274
  });
275
275
 
276
276
  it('throws on trying to create tracked Ripple component', () => {
277
- expect(() => #ripple.track(0)).toThrow();
277
+ expect(() => track(0)).toThrow();
278
278
  });
279
279
  });