ripple 0.2.45 → 0.2.47

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 (36) hide show
  1. package/package.json +1 -1
  2. package/src/compiler/phases/1-parse/index.js +8 -1
  3. package/src/compiler/phases/2-analyze/index.js +640 -650
  4. package/src/compiler/phases/3-transform/index.js +1877 -1813
  5. package/src/compiler/phases/3-transform/segments.js +2 -2
  6. package/src/compiler/utils.js +600 -523
  7. package/src/jsx-runtime.js +12 -12
  8. package/src/runtime/array.js +611 -609
  9. package/src/runtime/index.js +29 -17
  10. package/src/runtime/internal/client/array.js +128 -128
  11. package/src/runtime/internal/client/blocks.js +206 -207
  12. package/src/runtime/internal/client/constants.js +2 -2
  13. package/src/runtime/internal/client/context.js +40 -40
  14. package/src/runtime/internal/client/events.js +191 -191
  15. package/src/runtime/internal/client/for.js +355 -355
  16. package/src/runtime/internal/client/if.js +25 -25
  17. package/src/runtime/internal/client/index.js +57 -52
  18. package/src/runtime/internal/client/operations.js +32 -32
  19. package/src/runtime/internal/client/portal.js +20 -20
  20. package/src/runtime/internal/client/render.js +132 -132
  21. package/src/runtime/internal/client/runtime.js +858 -824
  22. package/src/runtime/internal/client/template.js +36 -36
  23. package/src/runtime/internal/client/try.js +113 -113
  24. package/src/runtime/internal/client/types.d.ts +10 -10
  25. package/src/runtime/internal/client/utils.js +5 -5
  26. package/src/runtime/map.js +139 -139
  27. package/src/runtime/set.js +130 -130
  28. package/src/utils/ast.js +189 -189
  29. package/src/utils/builders.js +244 -244
  30. package/src/utils/sanitize_template_string.js +1 -1
  31. package/tests/__snapshots__/composite.test.ripple.snap +1 -1
  32. package/tests/accessors-props.test.ripple +9 -9
  33. package/tests/basic.test.ripple +4 -4
  34. package/tests/boundaries.test.ripple +17 -17
  35. package/tests/composite.test.ripple +43 -72
  36. package/types/index.d.ts +6 -2
@@ -1,11 +1,11 @@
1
1
  import { is_passive_event } from '../../../compiler/utils';
2
2
  import {
3
- active_block,
4
- active_reaction,
5
- set_active_block,
6
- set_active_reaction,
7
- set_tracking,
8
- tracking,
3
+ active_block,
4
+ active_reaction,
5
+ set_active_block,
6
+ set_active_reaction,
7
+ set_tracking,
8
+ tracking,
9
9
  } from './runtime';
10
10
  import { array_from, define_property, is_array } from './utils';
11
11
 
@@ -21,136 +21,136 @@ var root_event_handles = new Set();
21
21
  * @returns {void}
22
22
  */
23
23
  export function handle_event_propagation(event) {
24
- var handler_element = this;
25
- var owner_document = /** @type {Node} */ (handler_element).ownerDocument;
26
- var event_name = event.type;
27
- var path = event.composedPath?.() || [];
28
- var current_target = /** @type {null | Element} */ (path[0] || event.target);
29
-
30
- // composedPath contains list of nodes the event has propagated through.
31
- // We check __root to skip all nodes below it in case this is a
32
- // parent of the __root node, which indicates that there's nested
33
- // mounted apps. In this case we don't want to trigger events multiple times.
34
- var path_idx = 0;
35
-
36
- // @ts-expect-error is added below
37
- var handled_at = event.__root;
38
-
39
- if (handled_at) {
40
- var at_idx = path.indexOf(handled_at);
41
- if (
42
- at_idx !== -1 &&
43
- (handler_element === document || handler_element === /** @type {any} */ (window))
44
- ) {
45
- // This is the fallback document listener or a window listener, but the event was already handled
46
- // -> ignore, but set handle_at to document/window so that we're resetting the event
47
- // chain in case someone manually dispatches the same event object again.
48
- // @ts-expect-error
49
- event.__root = handler_element;
50
- return;
51
- }
52
-
53
- // We're deliberately not skipping if the index is higher, because
54
- // someone could create an event programmatically and emit it multiple times,
55
- // in which case we want to handle the whole propagation chain properly each time.
56
- // (this will only be a false negative if the event is dispatched multiple times and
57
- // the fallback document listener isn't reached in between, but that's super rare)
58
- var handler_idx = path.indexOf(handler_element);
59
- if (handler_idx === -1) {
60
- // handle_idx can theoretically be -1 (happened in some JSDOM testing scenarios with an event listener on the window object)
61
- // so guard against that, too, and assume that everything was handled at this point.
62
- return;
63
- }
64
-
65
- if (at_idx <= handler_idx) {
66
- path_idx = at_idx;
67
- }
68
- }
69
-
70
- current_target = /** @type {Element} */ (path[path_idx] || event.target);
71
- // there can only be one delegated event per element, and we either already handled the current target,
72
- // or this is the very first target in the chain which has a non-delegated listener, in which case it's safe
73
- // to handle a possible delegated event on it later (through the root delegation listener for example).
74
- if (current_target === handler_element) return;
75
-
76
- // Proxy currentTarget to correct target
77
- define_property(event, 'currentTarget', {
78
- configurable: true,
79
- get() {
80
- return current_target || owner_document;
81
- },
82
- });
83
-
84
- var previous_block = active_block;
85
- var previous_reaction = active_reaction;
86
- var previous_tracking = tracking;
87
-
88
- set_active_block(null);
89
- set_active_reaction(null);
90
- set_tracking(false);
91
-
92
- try {
93
- /**
94
- * @type {unknown}
95
- */
96
- var throw_error;
97
- /**
98
- * @type {unknown[]}
99
- */
100
- var other_errors = [];
101
-
102
- while (current_target !== null) {
103
- /** @type {null | Element} */
104
- var parent_element =
105
- current_target.assignedSlot ||
106
- current_target.parentNode ||
107
- /** @type {any} */ (current_target).host ||
108
- null;
109
-
110
- try {
111
- // @ts-expect-error
112
- var delegated = current_target['__' + event_name];
113
-
114
- if (delegated !== undefined && !(/** @type {any} */ (current_target).disabled)) {
115
- if (is_array(delegated)) {
116
- var [fn, block, ...data] = delegated;
117
- fn.apply(current_target, [event, ...data, block]);
118
- } else {
119
- delegated.call(current_target, event);
120
- }
121
- }
122
- } catch (error) {
123
- if (throw_error) {
124
- other_errors.push(error);
125
- } else {
126
- throw_error = error;
127
- }
128
- }
129
- if (event.cancelBubble || parent_element === handler_element || parent_element === null) {
130
- break;
131
- }
132
- current_target = parent_element;
133
- }
134
-
135
- if (throw_error) {
136
- for (let error of other_errors) {
137
- // Throw the rest of the errors, one-by-one on a microtask
138
- queueMicrotask(() => {
139
- throw error;
140
- });
141
- }
142
- throw throw_error;
143
- }
144
- } finally {
145
- set_active_block(previous_block);
146
- // @ts-expect-error is used above
147
- event.__root = handler_element;
148
- // @ts-ignore remove proxy on currentTarget
149
- delete event.currentTarget;
150
- set_active_block(previous_block);
151
- set_active_reaction(previous_reaction);
152
- set_tracking(previous_tracking);
153
- }
24
+ var handler_element = this;
25
+ var owner_document = /** @type {Node} */ (handler_element).ownerDocument;
26
+ var event_name = event.type;
27
+ var path = event.composedPath?.() || [];
28
+ var current_target = /** @type {null | Element} */ (path[0] || event.target);
29
+
30
+ // composedPath contains list of nodes the event has propagated through.
31
+ // We check __root to skip all nodes below it in case this is a
32
+ // parent of the __root node, which indicates that there's nested
33
+ // mounted apps. In this case we don't want to trigger events multiple times.
34
+ var path_idx = 0;
35
+
36
+ // @ts-expect-error is added below
37
+ var handled_at = event.__root;
38
+
39
+ if (handled_at) {
40
+ var at_idx = path.indexOf(handled_at);
41
+ if (
42
+ at_idx !== -1 &&
43
+ (handler_element === document || handler_element === /** @type {any} */ (window))
44
+ ) {
45
+ // This is the fallback document listener or a window listener, but the event was already handled
46
+ // -> ignore, but set handle_at to document/window so that we're resetting the event
47
+ // chain in case someone manually dispatches the same event object again.
48
+ // @ts-expect-error
49
+ event.__root = handler_element;
50
+ return;
51
+ }
52
+
53
+ // We're deliberately not skipping if the index is higher, because
54
+ // someone could create an event programmatically and emit it multiple times,
55
+ // in which case we want to handle the whole propagation chain properly each time.
56
+ // (this will only be a false negative if the event is dispatched multiple times and
57
+ // the fallback document listener isn't reached in between, but that's super rare)
58
+ var handler_idx = path.indexOf(handler_element);
59
+ if (handler_idx === -1) {
60
+ // handle_idx can theoretically be -1 (happened in some JSDOM testing scenarios with an event listener on the window object)
61
+ // so guard against that, too, and assume that everything was handled at this point.
62
+ return;
63
+ }
64
+
65
+ if (at_idx <= handler_idx) {
66
+ path_idx = at_idx;
67
+ }
68
+ }
69
+
70
+ current_target = /** @type {Element} */ (path[path_idx] || event.target);
71
+ // there can only be one delegated event per element, and we either already handled the current target,
72
+ // or this is the very first target in the chain which has a non-delegated listener, in which case it's safe
73
+ // to handle a possible delegated event on it later (through the root delegation listener for example).
74
+ if (current_target === handler_element) return;
75
+
76
+ // Proxy currentTarget to correct target
77
+ define_property(event, 'currentTarget', {
78
+ configurable: true,
79
+ get() {
80
+ return current_target || owner_document;
81
+ },
82
+ });
83
+
84
+ var previous_block = active_block;
85
+ var previous_reaction = active_reaction;
86
+ var previous_tracking = tracking;
87
+
88
+ set_active_block(null);
89
+ set_active_reaction(null);
90
+ set_tracking(false);
91
+
92
+ try {
93
+ /**
94
+ * @type {unknown}
95
+ */
96
+ var throw_error;
97
+ /**
98
+ * @type {unknown[]}
99
+ */
100
+ var other_errors = [];
101
+
102
+ while (current_target !== null) {
103
+ /** @type {null | Element} */
104
+ var parent_element =
105
+ current_target.assignedSlot ||
106
+ current_target.parentNode ||
107
+ /** @type {any} */ (current_target).host ||
108
+ null;
109
+
110
+ try {
111
+ // @ts-expect-error
112
+ var delegated = current_target['__' + event_name];
113
+
114
+ if (delegated !== undefined && !(/** @type {any} */ (current_target).disabled)) {
115
+ if (is_array(delegated)) {
116
+ var [fn, block, ...data] = delegated;
117
+ fn.apply(current_target, [event, ...data, block]);
118
+ } else {
119
+ delegated.call(current_target, event);
120
+ }
121
+ }
122
+ } catch (error) {
123
+ if (throw_error) {
124
+ other_errors.push(error);
125
+ } else {
126
+ throw_error = error;
127
+ }
128
+ }
129
+ if (event.cancelBubble || parent_element === handler_element || parent_element === null) {
130
+ break;
131
+ }
132
+ current_target = parent_element;
133
+ }
134
+
135
+ if (throw_error) {
136
+ for (let error of other_errors) {
137
+ // Throw the rest of the errors, one-by-one on a microtask
138
+ queueMicrotask(() => {
139
+ throw error;
140
+ });
141
+ }
142
+ throw throw_error;
143
+ }
144
+ } finally {
145
+ set_active_block(previous_block);
146
+ // @ts-expect-error is used above
147
+ event.__root = handler_element;
148
+ // @ts-ignore remove proxy on currentTarget
149
+ delete event.currentTarget;
150
+ set_active_block(previous_block);
151
+ set_active_reaction(previous_reaction);
152
+ set_tracking(previous_tracking);
153
+ }
154
154
  }
155
155
 
156
156
  /**
@@ -160,75 +160,75 @@ export function handle_event_propagation(event) {
160
160
  * @param {AddEventListenerOptions} [options]
161
161
  */
162
162
  function create_event(event_name, dom, handler, options = {}) {
163
- var block = active_block;
164
-
165
- function target_handler(/** @type {Event} */ event) {
166
- var previous_block = active_block;
167
- var previous_reaction = active_reaction;
168
- var previous_tracking = tracking;
169
-
170
- try {
171
- set_active_block(null);
172
- set_active_reaction(null);
173
- set_tracking(false);
174
-
175
- if (!options.capture) {
176
- // Only call in the bubble phase, else delegated events would be called before the capturing events
177
- handle_event_propagation.call(dom, event);
178
- }
179
- if (!event.cancelBubble) {
180
- return handler?.call(this, event);
181
- }
182
- } finally {
183
- set_active_block(previous_block);
184
- set_active_reaction(previous_reaction);
185
- set_tracking(previous_tracking);
186
- }
187
- }
188
-
189
- dom.addEventListener(event_name, target_handler, options);
190
-
191
- return target_handler;
163
+ var block = active_block;
164
+
165
+ function target_handler(/** @type {Event} */ event) {
166
+ var previous_block = active_block;
167
+ var previous_reaction = active_reaction;
168
+ var previous_tracking = tracking;
169
+
170
+ try {
171
+ set_active_block(null);
172
+ set_active_reaction(null);
173
+ set_tracking(false);
174
+
175
+ if (!options.capture) {
176
+ // Only call in the bubble phase, else delegated events would be called before the capturing events
177
+ handle_event_propagation.call(dom, event);
178
+ }
179
+ if (!event.cancelBubble) {
180
+ return handler?.call(this, event);
181
+ }
182
+ } finally {
183
+ set_active_block(previous_block);
184
+ set_active_reaction(previous_reaction);
185
+ set_tracking(previous_tracking);
186
+ }
187
+ }
188
+
189
+ dom.addEventListener(event_name, target_handler, options);
190
+
191
+ return target_handler;
192
192
  }
193
193
 
194
194
  export function event(event_name, dom, handler, capture, passive) {
195
- var options = { capture, passive };
196
- create_event(event_name, dom, handler, options);
195
+ var options = { capture, passive };
196
+ create_event(event_name, dom, handler, options);
197
197
  }
198
198
 
199
199
  export function delegate(events) {
200
- for (var i = 0; i < events.length; i++) {
201
- all_registered_events.add(events[i]);
202
- }
200
+ for (var i = 0; i < events.length; i++) {
201
+ all_registered_events.add(events[i]);
202
+ }
203
203
 
204
- for (var fn of root_event_handles) {
205
- fn(events);
206
- }
204
+ for (var fn of root_event_handles) {
205
+ fn(events);
206
+ }
207
207
  }
208
208
 
209
209
  export function handle_root_events(target) {
210
- var registered_events = new Set();
210
+ var registered_events = new Set();
211
211
 
212
- var event_handle = (events) => {
213
- for (var i = 0; i < events.length; i++) {
214
- var event_name = events[i];
212
+ var event_handle = (events) => {
213
+ for (var i = 0; i < events.length; i++) {
214
+ var event_name = events[i];
215
215
 
216
- if (registered_events.has(event_name)) continue;
217
- registered_events.add(event_name);
216
+ if (registered_events.has(event_name)) continue;
217
+ registered_events.add(event_name);
218
218
 
219
- var passive = is_passive_event(event_name);
219
+ var passive = is_passive_event(event_name);
220
220
 
221
- target.addEventListener(event_name, handle_event_propagation, { passive });
222
- }
223
- };
221
+ target.addEventListener(event_name, handle_event_propagation, { passive });
222
+ }
223
+ };
224
224
 
225
- event_handle(array_from(all_registered_events));
226
- root_event_handles.add(event_handle);
225
+ event_handle(array_from(all_registered_events));
226
+ root_event_handles.add(event_handle);
227
227
 
228
- return () => {
229
- for (var event_name of registered_events) {
230
- target.removeEventListener(event_name, handle_event_propagation);
231
- }
232
- root_event_handles.delete(event_handle);
233
- };
228
+ return () => {
229
+ for (var event_name of registered_events) {
230
+ target.removeEventListener(event_name, handle_event_propagation);
231
+ }
232
+ root_event_handles.delete(event_handle);
233
+ };
234
234
  }