ripple 0.2.139 → 0.2.141

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.
@@ -201,7 +201,9 @@ export function get_delegated_event(event_name, handler, state) {
201
201
  if (binding != null) {
202
202
  for (const { path } of binding.references) {
203
203
  const parent = path.at(-1);
204
- if (parent === undefined) return unhoisted;
204
+ if (parent === undefined) {
205
+ return unhoisted;
206
+ }
205
207
 
206
208
  const grandparent = path.at(-2);
207
209
 
@@ -227,7 +229,11 @@ export function get_delegated_event(event_name, handler, state) {
227
229
  ) {
228
230
  return unhoisted;
229
231
  }
230
- } else if (parent.type !== 'FunctionDeclaration' && parent.type !== 'VariableDeclarator') {
232
+ } else if (
233
+ parent.type !== 'FunctionDeclaration' &&
234
+ parent.type !== 'VariableDeclarator' &&
235
+ parent.type !== 'Attribute'
236
+ ) {
231
237
  return unhoisted;
232
238
  }
233
239
  }
@@ -262,24 +268,29 @@ export function get_delegated_event(event_name, handler, state) {
262
268
 
263
269
  const visited_references = new Set();
264
270
  const scope = target_function.metadata.scope;
265
- for (const [reference] of scope.references) {
271
+ for (const [reference, ref_nodes] of scope.references) {
266
272
  // Bail out if the arguments keyword is used or $host is referenced
267
273
  if (reference === 'arguments') return unhoisted;
268
274
 
269
275
  const binding = scope.get(reference);
270
276
  const local_binding = state.scope.get(reference);
271
277
 
278
+ if (local_binding === null || binding == null) {
279
+ return unhoisted;
280
+ }
281
+
272
282
  // If we are referencing a binding that is shadowed in another scope then bail out.
273
- if (local_binding !== null && binding !== null && local_binding.node !== binding.node) {
283
+ if (local_binding.node !== binding.node) {
274
284
  return unhoisted;
275
285
  }
286
+ const is_tracked = ref_nodes.some(({ node }) => node.tracked);
276
287
 
277
288
  if (
278
289
  binding !== null &&
279
290
  // Bail out if the the binding is a rest param
280
291
  (binding.declaration_kind === 'rest_param' || // or any normal not reactive bindings that are mutated.
281
292
  // Bail out if we reference anything from the EachBlock (for now) that mutates in non-runes mode,
282
- (binding.kind === 'normal' && binding.updated))
293
+ (binding.kind === 'normal' && !is_tracked && binding.updated))
283
294
  ) {
284
295
  return unhoisted;
285
296
  }
@@ -352,7 +363,7 @@ export function build_hoisted_params(node, context) {
352
363
  }
353
364
  } else {
354
365
  for (const param of node.params) {
355
- params.push(/** @type {Pattern} */(context.visit(param)));
366
+ params.push(/** @type {Pattern} */ (context.visit(param)));
356
367
  }
357
368
  }
358
369
 
@@ -554,7 +565,7 @@ export function is_ripple_import(callee, context) {
554
565
  * @returns {boolean}
555
566
  */
556
567
  export function is_declared_function_within_component(node, context) {
557
- const component = context.path?.find(/** @param {RippleNode} n */(n) => n.type === 'Component');
568
+ const component = context.path?.find(/** @param {RippleNode} n */ (n) => n.type === 'Component');
558
569
 
559
570
  if (node.type === 'Identifier' && component) {
560
571
  const binding = context.state.scope.get(node.name);
@@ -611,8 +622,8 @@ export function visit_assignment_expression(node, context, build_assignment) {
611
622
  assignment ??
612
623
  b.assignment(
613
624
  '=',
614
- /** @type {Pattern} */(context.visit(path.node)),
615
- /** @type {Expression} */(context.visit(value)),
625
+ /** @type {Pattern} */ (context.visit(path.node)),
626
+ /** @type {Expression} */ (context.visit(value)),
616
627
  )
617
628
  );
618
629
  });
@@ -702,8 +713,8 @@ export function build_assignment(operator, left, right, context) {
702
713
  object,
703
714
  b.assignment(
704
715
  operator,
705
- /** @type {Pattern} */(context.visit(left)),
706
- /** @type {Expression} */(context.visit(right)),
716
+ /** @type {Pattern} */ (context.visit(left)),
717
+ /** @type {Expression} */ (context.visit(right)),
707
718
  ),
708
719
  );
709
720
  }
@@ -64,7 +64,7 @@ export class TrackedDate extends Date {
64
64
  proto[method] = function (...args) {
65
65
  // @ts-ignore
66
66
  var result = date_proto[method].apply(this, args);
67
- set(this.#time, date_proto.getTime.call(this), this.#block);
67
+ set(this.#time, date_proto.getTime.call(this));
68
68
  return result;
69
69
  };
70
70
  }
@@ -175,7 +175,7 @@ export function bindValue(maybe_tracked) {
175
175
  value = selected_option && get_option_value(selected_option);
176
176
  }
177
177
 
178
- set(tracked, value, block);
178
+ set(tracked, value);
179
179
  });
180
180
 
181
181
  effect(() => {
@@ -189,7 +189,7 @@ export function bindValue(maybe_tracked) {
189
189
  var selected_option = select.querySelector(':checked');
190
190
  if (selected_option !== null) {
191
191
  value = get_option_value(selected_option);
192
- set(tracked, value, block);
192
+ set(tracked, value);
193
193
  }
194
194
  }
195
195
 
@@ -202,7 +202,7 @@ export function bindValue(maybe_tracked) {
202
202
  /** @type {any} */
203
203
  var value = input.value;
204
204
  value = is_numberlike_input(input) ? to_number(value) : value;
205
- set(tracked, value, block);
205
+ set(tracked, value);
206
206
 
207
207
  await tick();
208
208
 
@@ -254,7 +254,7 @@ export function bindChecked(maybe_tracked) {
254
254
 
255
255
  return (input) => {
256
256
  const clear_event = on(input, 'change', () => {
257
- set(tracked, input.checked, block);
257
+ set(tracked, input.checked);
258
258
  });
259
259
 
260
260
  return clear_event;
@@ -277,11 +277,11 @@ function bind_element_size(maybe_tracked, type) {
277
277
 
278
278
  return (/** @type {HTMLElement} */ element) => {
279
279
  var unsubscribe = resize_observer_border_box.observe(element, () =>
280
- set(tracked, element[type], block),
280
+ set(tracked, element[type]),
281
281
  );
282
282
 
283
283
  effect(() => {
284
- untrack(() => set(tracked, element[type], block));
284
+ untrack(() => set(tracked, element[type]));
285
285
  return unsubscribe;
286
286
  });
287
287
  };
@@ -342,7 +342,7 @@ function bind_element_rect(maybe_tracked, type) {
342
342
  return (/** @type {HTMLElement} */ element) => {
343
343
  var unsubscribe = observer.observe(
344
344
  element,
345
- /** @param {any} entry */ (entry) => set(tracked, entry[type], block),
345
+ /** @param {any} entry */ (entry) => set(tracked, entry[type]),
346
346
  );
347
347
 
348
348
  effect(() => unsubscribe);
@@ -398,7 +398,7 @@ export function bind_content_editable(maybe_tracked, property) {
398
398
 
399
399
  return (element) => {
400
400
  const clear_event = on(element, 'input', () => {
401
- set(tracked, element[property], block);
401
+ set(tracked, element[property]);
402
402
  });
403
403
 
404
404
  render(() => {
@@ -408,7 +408,7 @@ export function bind_content_editable(maybe_tracked, property) {
408
408
  if (value == null) {
409
409
  // @ts-ignore
410
410
  var non_null_value = element[property];
411
- set(tracked, non_null_value, block);
411
+ set(tracked, non_null_value);
412
412
  } else {
413
413
  // @ts-ignore
414
414
  element[property] = value + '';
@@ -186,7 +186,7 @@ function reconcile_fast_clear(anchor, block, array) {
186
186
  * @returns {void}
187
187
  */
188
188
  function update_index(block, index) {
189
- set(block.s.i, index, block);
189
+ set(block.s.i, index);
190
190
  }
191
191
 
192
192
  /**
@@ -195,7 +195,7 @@ function update_index(block, index) {
195
195
  * @returns {void}
196
196
  */
197
197
  function update_value(block, value) {
198
- set(block.s.v, value, block);
198
+ set(block.s.v, value);
199
199
  }
200
200
 
201
201
  /**
@@ -14,7 +14,7 @@ export {
14
14
  set_selected,
15
15
  } from './render.js';
16
16
 
17
- export { render, render_spread, async, ref } from './blocks.js';
17
+ export { render, render_spread, async, ref, branch } from './blocks.js';
18
18
 
19
19
  export { event, delegate } from './events.js';
20
20
 
@@ -47,6 +47,8 @@ export {
47
47
  derived,
48
48
  maybe_tracked,
49
49
  tick,
50
+ proxy_tracked,
51
+ with_block,
50
52
  } from './runtime.js';
51
53
 
52
54
  export { composite } from './composite.js';
@@ -163,29 +163,29 @@ export function set_attributes(element, attributes) {
163
163
  * @param {Element} element
164
164
  * @param {string} key
165
165
  * @param {any} value
166
- */
166
+ */
167
167
  function set_attribute_helper(element, key, value) {
168
- if (key === 'class') {
169
- const is_html = element.namespaceURI === 'http://www.w3.org/1999/xhtml';
170
- set_class(/** @type {HTMLElement} */ (element), value, undefined, is_html);
171
- } else if (key === '#class') {
172
- // Special case for static class when spreading props
173
- element.classList.add(value);
174
- } else if (typeof key === 'string' && is_event_attribute(key)) {
175
- // Handle event handlers in spread props
176
- const event_name = get_attribute_event_name(key);
177
-
178
- if (is_delegated(event_name)) {
179
- // Use delegation for delegated events
180
- /** @type {any} */ (element)['__' + event_name] = value;
181
- delegate([event_name]);
182
- } else {
183
- // Use addEventListener for non-delegated events
184
- event(event_name, element, value);
185
- }
186
- } else {
187
- set_attribute(element, key, value);
188
- }
168
+ if (key === 'class') {
169
+ const is_html = element.namespaceURI === 'http://www.w3.org/1999/xhtml';
170
+ set_class(/** @type {HTMLElement} */ (element), value, undefined, is_html);
171
+ } else if (key === '#class') {
172
+ // Special case for static class when spreading props
173
+ element.classList.add(value);
174
+ } else if (typeof key === 'string' && is_event_attribute(key)) {
175
+ // Handle event handlers in spread props
176
+ const event_name = get_attribute_event_name(key);
177
+
178
+ if (is_delegated(event_name)) {
179
+ // Use delegation for delegated events
180
+ /** @type {any} */ (element)['__' + event_name] = value;
181
+ delegate([event_name]);
182
+ } else {
183
+ // Use addEventListener for non-delegated events
184
+ event(event_name, element, value);
185
+ }
186
+ } else {
187
+ set_attribute(element, key, value);
188
+ }
189
189
  }
190
190
 
191
191
  /**
@@ -312,7 +312,7 @@ export function apply_element_spread(element, fn) {
312
312
  for (const symbol of get_own_property_symbols(next)) {
313
313
  // Ensure we are not trying to write to a proxied object
314
314
  if (TRACKED_OBJECT in next) {
315
- next = {...next};
315
+ next = { ...next };
316
316
  }
317
317
  var ref_fn = next[symbol];
318
318
 
@@ -30,7 +30,7 @@ import {
30
30
  import { capture, suspend } from './try.js';
31
31
  import {
32
32
  define_property,
33
- get_descriptors,
33
+ get_descriptor,
34
34
  get_own_property_symbols,
35
35
  is_array,
36
36
  is_tracked_object,
@@ -135,6 +135,20 @@ export function run_teardown(block) {
135
135
  }
136
136
  }
137
137
 
138
+ /**
139
+ * @param {Block} block
140
+ * @param {() => void} fn
141
+ */
142
+ export function with_block(block, fn) {
143
+ var prev_block = active_block;
144
+ active_block = block;
145
+ try {
146
+ return fn();
147
+ } finally {
148
+ active_block = prev_block;
149
+ }
150
+ }
151
+
138
152
  /**
139
153
  * @param {Derived} computed
140
154
  */
@@ -345,6 +359,9 @@ export function track(v, get, set, b) {
345
359
  if (is_tracked_object(v)) {
346
360
  return v;
347
361
  }
362
+ if (b === null) {
363
+ throw new TypeError('track() requires a valid component context');
364
+ }
348
365
 
349
366
  if (typeof v === 'function') {
350
367
  return derived(v, b, get, set);
@@ -369,35 +386,34 @@ export function track_split(v, l, b) {
369
386
  var out = [];
370
387
  /** @type {Record<string|symbol, any>} */
371
388
  var rest = {};
372
- /** @type {Record<PropertyKey, any | null>} */
373
- var descriptors = get_descriptors(v);
389
+ /** @type {Record<PropertyKey, 1>} */
390
+ var done = {};
391
+ var props = Reflect.ownKeys(v);
374
392
 
375
- for (let i = 0, key, t, exists = true; i < l.length; i++) {
393
+ for (let i = 0, key, t; i < l.length; i++) {
376
394
  key = l[i];
377
395
 
378
- if (is_tracked_object(v[key])) {
379
- t = v[key];
396
+ if (props.includes(key)) {
397
+ if (is_tracked_object(v[key])) {
398
+ t = v[key];
399
+ } else {
400
+ t = tracked(undefined, b);
401
+ t = define_property(t, '__v', /** @type {PropertyDescriptor} */ (get_descriptor(v, key)));
402
+ }
380
403
  } else {
381
404
  t = tracked(undefined, b);
382
- exists = !!descriptors[key];
383
- if (exists) {
384
- t = define_property(t, '__v', descriptors[key]);
385
- }
386
405
  }
387
406
 
388
407
  out[i] = t;
389
- if (exists) {
390
- descriptors[key] = null;
391
- }
408
+ done[key] = 1;
392
409
  }
393
410
 
394
- var props = Reflect.ownKeys(descriptors);
395
411
  for (let i = 0, key; i < props.length; i++) {
396
412
  key = props[i];
397
- if (descriptors[key] === null) {
413
+ if (done[key]) {
398
414
  continue;
399
415
  }
400
- define_property(rest, key, descriptors[key]);
416
+ define_property(rest, key, /** @type {PropertyDescriptor} */ (get_descriptor(v, key)));
401
417
  }
402
418
 
403
419
  out.push(tracked(rest, b));
@@ -440,7 +456,7 @@ function is_tracking_dirty(tracking) {
440
456
  var tracked = tracking.t;
441
457
 
442
458
  if ((tracked.f & DERIVED) !== 0) {
443
- update_derived(/** @type {Derived} **/(tracked));
459
+ update_derived(/** @type {Derived} **/ (tracked));
444
460
  }
445
461
 
446
462
  if (tracked.c > tracking.c) {
@@ -500,7 +516,7 @@ export function async_computed(fn, block) {
500
516
  }
501
517
 
502
518
  promise.then((v) => {
503
- if (parent && is_destroyed(/** @type {Block} */(parent))) {
519
+ if (parent && is_destroyed(/** @type {Block} */ (parent))) {
504
520
  return;
505
521
  }
506
522
  if (promise === current && t.__v !== v) {
@@ -509,7 +525,7 @@ export function async_computed(fn, block) {
509
525
  if (t.__v === UNINITIALIZED) {
510
526
  t.__v = v;
511
527
  } else {
512
- set(t, v, block);
528
+ set(t, v);
513
529
  }
514
530
  }
515
531
 
@@ -774,7 +790,7 @@ export function get(tracked) {
774
790
  }
775
791
 
776
792
  return (tracked.f & DERIVED) !== 0
777
- ? get_derived(/** @type {Derived} */(tracked))
793
+ ? get_derived(/** @type {Derived} */ (tracked))
778
794
  : get_tracked(tracked);
779
795
  }
780
796
 
@@ -803,15 +819,14 @@ export function get_tracked(tracked) {
803
819
  * @param {any} value
804
820
  */
805
821
  export function public_set(tracked, value) {
806
- set(tracked, value, safe_scope());
822
+ set(tracked, value);
807
823
  }
808
824
 
809
825
  /**
810
826
  * @param {Derived | Tracked} tracked
811
827
  * @param {any} value
812
- * @param {Block} block
813
828
  */
814
- export function set(tracked, value, block) {
829
+ export function set(tracked, value) {
815
830
  if (!is_mutating_allowed) {
816
831
  throw new Error(
817
832
  'Assignments or updates to tracked values are not allowed during computed "track(() => ...)" evaluation',
@@ -823,7 +838,7 @@ export function set(tracked, value, block) {
823
838
  if (value !== old_value) {
824
839
  var tracked_block = tracked.b;
825
840
 
826
- if ((block.f & CONTAINS_TEARDOWN) !== 0) {
841
+ if ((tracked_block.f & CONTAINS_TEARDOWN) !== 0) {
827
842
  if (teardown) {
828
843
  old_values.set(tracked, value);
829
844
  } else {
@@ -901,34 +916,37 @@ export function flush_sync(fn) {
901
916
  */
902
917
  export function spread_props(fn, block) {
903
918
  var computed = derived(fn, block);
919
+ return proxy_tracked(computed);
920
+ }
904
921
 
922
+ /**
923
+ * @param {Tracked | Derived} tracked
924
+ * @returns {Object}
925
+ */
926
+ export function proxy_tracked(tracked) {
905
927
  return new Proxy(
906
928
  {},
907
929
  {
908
- get(target, property) {
909
- const obj = get_derived(computed);
930
+ get(_, property) {
931
+ const obj = get(tracked);
910
932
  return obj[property];
911
933
  },
912
- has(target, property) {
934
+ has(_, property) {
913
935
  if (property === TRACKED_OBJECT) {
914
936
  return true;
915
937
  }
916
- const obj = get_derived(computed);
938
+ const obj = get(tracked);
917
939
  return property in obj;
918
940
  },
919
- getOwnPropertyDescriptor(target, key) {
920
- const obj = get_derived(computed);
941
+ getOwnPropertyDescriptor(_, key) {
942
+ const obj = get(tracked);
921
943
 
922
944
  if (key in obj) {
923
- return {
924
- enumerable: true,
925
- configurable: true,
926
- value: obj[key],
927
- };
945
+ return get_descriptor(obj, key);
928
946
  }
929
947
  },
930
948
  ownKeys() {
931
- const obj = get_derived(computed);
949
+ const obj = get(tracked);
932
950
  return Reflect.ownKeys(obj);
933
951
  },
934
952
  },
@@ -991,85 +1009,78 @@ export function get_property(obj, property, chain = false) {
991
1009
  * @param {any} obj
992
1010
  * @param {string | number | symbol} property
993
1011
  * @param {any} value
994
- * @param {Block} block
995
1012
  * @returns {void}
996
1013
  */
997
- export function set_property(obj, property, value, block) {
1014
+ export function set_property(obj, property, value) {
998
1015
  var tracked = obj[property];
999
- set(tracked, value, block);
1016
+ set(tracked, value);
1000
1017
  }
1001
1018
 
1002
1019
  /**
1003
1020
  * @param {Tracked} tracked
1004
- * @param {Block} block
1005
1021
  * @param {number} [d]
1006
1022
  * @returns {number}
1007
1023
  */
1008
- export function update(tracked, block, d = 1) {
1024
+ export function update(tracked, d = 1) {
1009
1025
  var value = get(tracked);
1010
1026
  var result = d === 1 ? value++ : value--;
1011
- set(tracked, value, block);
1027
+ set(tracked, value);
1012
1028
  return result;
1013
1029
  }
1014
1030
 
1015
1031
  /**
1016
1032
  * @param {Tracked} tracked
1017
- * @param {Block} block
1018
1033
  * @returns {void}
1019
1034
  */
1020
- export function increment(tracked, block) {
1021
- set(tracked, tracked.__v + 1, block);
1035
+ export function increment(tracked) {
1036
+ set(tracked, tracked.__v + 1);
1022
1037
  }
1023
1038
 
1024
1039
  /**
1025
1040
  * @param {Tracked} tracked
1026
- * @param {Block} block
1027
1041
  * @returns {void}
1028
1042
  */
1029
- export function decrement(tracked, block) {
1030
- set(tracked, tracked.__v - 1, block);
1043
+ export function decrement(tracked) {
1044
+ set(tracked, tracked.__v - 1);
1031
1045
  }
1032
1046
 
1033
1047
  /**
1034
1048
  * @param {Tracked} tracked
1035
- * @param {Block} block
1036
1049
  * @param {number} [d]
1037
1050
  * @returns {number}
1038
1051
  */
1039
- export function update_pre(tracked, block, d = 1) {
1052
+ export function update_pre(tracked, d = 1) {
1040
1053
  var value = get(tracked);
1041
1054
  var new_value = d === 1 ? ++value : --value;
1042
- set(tracked, new_value, block);
1055
+ set(tracked, new_value);
1043
1056
  return new_value;
1044
1057
  }
1045
1058
 
1046
1059
  /**
1047
1060
  * @param {any} obj
1048
1061
  * @param {string | number | symbol} property
1049
- * @param {Block} block
1050
1062
  * @param {number} [d=1]
1051
1063
  * @returns {number}
1052
1064
  */
1053
- export function update_property(obj, property, block, d = 1) {
1065
+ export function update_property(obj, property, d = 1) {
1054
1066
  var tracked = obj[property];
1055
1067
  var value = get(tracked);
1056
1068
  var new_value = d === 1 ? value++ : value--;
1057
- set(tracked, value, block);
1069
+ set(tracked, value);
1058
1070
  return new_value;
1059
1071
  }
1060
1072
 
1061
1073
  /**
1062
1074
  * @param {any} obj
1063
1075
  * @param {string | number | symbol} property
1064
- * @param {Block} block
1065
1076
  * @param {number} [d=1]
1066
1077
  * @returns {number}
1067
1078
  */
1068
- export function update_pre_property(obj, property, block, d = 1) {
1079
+ export function update_pre_property(obj, property, d = 1) {
1069
1080
  var tracked = obj[property];
1070
1081
  var value = get(tracked);
1071
1082
  var new_value = d === 1 ? ++value : --value;
1072
- set(tracked, new_value, block);
1083
+ set(tracked, new_value);
1073
1084
  return new_value;
1074
1085
  }
1075
1086
 
@@ -1093,7 +1104,7 @@ export function with_scope(block, fn) {
1093
1104
  * @returns {Block | null}
1094
1105
  */
1095
1106
  export function scope() {
1096
- return active_scope;
1107
+ return active_scope || active_block;
1097
1108
  }
1098
1109
 
1099
1110
  /**
@@ -1206,7 +1217,7 @@ export async function maybe_tracked(v) {
1206
1217
  } else {
1207
1218
  value = await async_computed(async () => {
1208
1219
  return await get_tracked(v);
1209
- }, /** @type {Block} */(active_block));
1220
+ }, /** @type {Block} */ (active_block));
1210
1221
  }
1211
1222
  } else {
1212
1223
  value = await v;