1 | import { getValueAtPath, isPrimitive } from "./helpers.js"
|
2 |
|
3 | const handler = ({ path, identifier, key, index, i, k }) => ({
|
4 | get(target, property) {
|
5 | let x = getValueAtPath(path, target)
|
6 |
|
7 |
|
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 |
|
48 | export 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 | }
|