deno.land / x / solid@v1.5.6 / store / src / mutable.ts

نووسراو ببینە
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { batch, getListener, DEV, $PROXY, $TRACK } from "solid-js";import { unwrap, isWrappable, getDataNodes, trackSelf, getDataNode, $RAW, $NODE, $NAME, StoreNode, setProperty, proxyDescriptor, ownKeys} from "./store.js";
const proxyTraps: ProxyHandler<StoreNode> = { get(target, property, receiver) { if (property === $RAW) return target; if (property === $PROXY) return receiver; if (property === $TRACK) { trackSelf(target); return receiver; } const nodes = getDataNodes(target); const tracked = nodes.hasOwnProperty(property); let value = tracked ? nodes[property]() : target[property]; if (property === $NODE || property === "__proto__") return value;
if (!tracked) { const desc = Object.getOwnPropertyDescriptor(target, property); const isFunction = typeof value === "function"; if (getListener() && (!isFunction || target.hasOwnProperty(property)) && !(desc && desc.get)) value = getDataNode(nodes, property, value)(); else if (value != null && isFunction && value === Array.prototype[property as any]) { return (...args: unknown[]) => batch(() => Array.prototype[property as any].apply(receiver, args)); } } return isWrappable(value) ? wrap(value, "_SOLID_DEV_" && target[$NAME] && `${target[$NAME]}:${property.toString()}`) : value; },
has(target, property) { if (property === $RAW || property === $PROXY || property === $TRACK || property === $NODE || property === "__proto__") return true; const tracked = getDataNodes(target)[property]; tracked && tracked(); return property in target; },
set(target, property, value) { batch(() => setProperty(target, property, unwrap(value))); return true; },
deleteProperty(target, property) { batch(() => setProperty(target, property, undefined, true)); return true; },
ownKeys: ownKeys,
getOwnPropertyDescriptor: proxyDescriptor};
function wrap<T extends StoreNode>(value: T, name?: string): T { let p = value[$PROXY]; if (!p) { Object.defineProperty(value, $PROXY, { value: (p = new Proxy(value, proxyTraps)) }); const keys = Object.keys(value), desc = Object.getOwnPropertyDescriptors(value); for (let i = 0, l = keys.length; i < l; i++) { const prop = keys[i]; if (desc[prop].get) { const get = desc[prop].get!.bind(p); Object.defineProperty(value, prop, { get }); } if (desc[prop].set) { const og = desc[prop].set!, set = (v: T[keyof T]) => batch(() => og.call(p, v)); Object.defineProperty(value, prop, { set }); } } if ("_SOLID_DEV_" && name) Object.defineProperty(value, $NAME, { value: name }); } return p;}
export function createMutable<T extends StoreNode>(state: T, options?: { name?: string }): T { const unwrappedStore = unwrap(state || {}); if ("_SOLID_DEV_" && typeof unwrappedStore !== "object" && typeof unwrappedStore !== "function") throw new Error( `Unexpected type ${typeof unwrappedStore} received when initializing 'createMutable'. Expected an object.` ); const wrappedStore = wrap( unwrappedStore, "_SOLID_DEV_" && ((options && options.name) || DEV.hashValue(unwrappedStore)) ); if ("_SOLID_DEV_") { const name = (options && options.name) || DEV.hashValue(unwrappedStore); DEV.registerGraph(name, { value: unwrappedStore }); } return wrappedStore;}
export function modifyMutable<T>(state: T, modifier: (state: T) => T) { batch(() => modifier(unwrap(state)));}
solid

Version Info

Tagged at
a year ago