UNPKG

1.32 kBJavaScriptView Raw
1import { getValueAtPath, isPrimitive } from "./helpers.js"
2
3const handler = ({ path, identifier, key, index, i, k }) => ({
4 get(target, property) {
5 let x = getValueAtPath(path, target)
6
7 // x === the collection
8
9 if (property === identifier) {
10 for (let n in x) {
11 let v = x[n]
12 if (key) {
13 if (v[key] === k) return v
14 } else {
15 if (n == i) return v
16 }
17 }
18 }
19
20 if (property === index) {
21 for (let n in x) {
22 let v = x[n]
23 if (key) {
24 if (v[key] === k) return n
25 } else {
26 if (n == i) return n
27 }
28 }
29 }
30
31 let t = key ? x.find((v) => v[key] === k) : x[i]
32 if (t?.hasOwnProperty?.(property)) return t[property]
33
34 return Reflect.get(...arguments)
35 },
36 set(target, property, value) {
37 let x = getValueAtPath(path, target)
38 let t = key ? x.find((v) => v[key] === k) : x[i]
39 if (t && !isPrimitive(t)) {
40 t[property] = value
41 return true
42 }
43
44 return Reflect.set(...arguments)
45 },
46})
47
48export const createContext = (v = []) => {
49 let context = v
50 return {
51 get: () => context,
52 push: (v) => context.push(v),
53 wrap: (state) => {
54 return context.reduce(
55 (target, ctx) => new Proxy(target, handler(ctx)),
56 state
57 )
58 },
59 }
60}