nested magic

proxied-state-each-blocks
Rich Harris 11 months ago committed by Dominic Gannaway
parent b6fb020526
commit f61370ef8a

@ -1,5 +1,7 @@
import { effect_active, get, set, increment, source } from './runtime.js'; import { effect_active, get, set, increment, source } from './runtime.js';
const symbol = Symbol('magic');
/** /**
* @template T * @template T
* @param {T} value * @param {T} value
@ -7,10 +9,6 @@ import { effect_active, get, set, increment, source } from './runtime.js';
*/ */
export function magic(value) { export function magic(value) {
if (value && typeof value === 'object') { if (value && typeof value === 'object') {
if (Array.isArray(value)) {
// TODO
}
return object(value); return object(value);
} }
@ -23,6 +21,8 @@ export function magic(value) {
* @returns {T} * @returns {T}
*/ */
function object(value) { function object(value) {
if (symbol in value) return value;
/** @type {Map<string | symbol, any>} */ /** @type {Map<string | symbol, any>} */
const sources = new Map(); const sources = new Map();
let version = source(0); let version = source(0);
@ -36,7 +36,7 @@ function object(value) {
sources.set(prop, s); sources.set(prop, s);
} }
let value = s ? get(s) : target[prop]; const value = s ? get(s) : target[prop];
if (typeof value === 'function') { if (typeof value === 'function') {
return (...args) => { return (...args) => {
@ -64,6 +64,8 @@ function object(value) {
return delete target[prop]; return delete target[prop];
}, },
has(target, prop) { has(target, prop) {
if (prop === symbol) return true;
get(version); get(version);
return Reflect.has(target, prop); return Reflect.has(target, prop);
}, },

Loading…
Cancel
Save