sprae 11.5.2 → 11.5.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.
package/store.js CHANGED
@@ -16,17 +16,19 @@ export const _signals = Symbol('signals'),
16
16
  // non-objects: for array redirect to list
17
17
  if (values.constructor !== Object) return Array.isArray(values) ? list(values) : values
18
18
 
19
- let signals = { ...parent?.[_signals] },
20
- _len = signal(Object.keys(values).length),
21
- stash,
19
+ // we must inherit signals to allow dynamic extend of parent state
20
+ let signals = Object.create(parent?.[_signals] || {}),
21
+ _len = signal(Object.keys(values).length),
22
+ stash
22
23
 
23
24
  // proxy conducts prop access to signals
24
- state = new Proxy(signals, {
25
- get: (_, k) => k === _change ? _len : k === _signals ? signals : k === _stash ? stash : signals[k]?.valueOf(),
26
- set: (_, k, v, s) => (k === _stash ? stash = v : s = k in signals, set(signals, k, v), s || ++_len.value), // bump length for new signal
25
+ let state = new Proxy(signals, {
26
+ get: (_, k) => k === _change ? _len : k === _signals ? signals : k === _stash ? stash : k in signals ? signals[k]?.valueOf() : globalThis[k],
27
+ set: (_, k, v, s) => k === _stash ? (stash = v, 1) : (s = k in signals, set(signals, k, v), s || ++_len.value), // bump length for new signal
27
28
  deleteProperty: (_, k) => (signals[k] && (signals[k][Symbol.dispose]?.(), delete signals[k], _len.value--), 1),
28
29
  // subscribe to length when object is spread
29
30
  ownKeys: () => (_len.value, Reflect.ownKeys(signals)),
31
+ has: _ => true // sandbox prevents writing to global
30
32
  }),
31
33
 
32
34
  // init signals for values
@@ -134,6 +136,7 @@ export const setter = (expr, set = parse(`${expr}=${_stash}`)) => (
134
136
  )
135
137
 
136
138
  // make sure state contains first element of path, eg. `a` from `a.b[c]`
137
- export const ensure = (state, expr, name = expr.match(/^\w+(?=\s*(?:\.|\[|$))/)) => name && (state[_signals][name[0]] ??= null)
139
+ // NOTE: we don't need since we force proxy sandbox
140
+ // export const ensure = (state, expr, name = expr.match(/^\w+(?=\s*(?:\.|\[|$))/)) => name && (state[_signals][name[0]] ??= null)
138
141
 
139
142
  export default store