@e7w/easy-model 0.0.4 → 0.0.6
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/dist/index.es.js +55 -46
- package/dist/index.umd.js +1 -1
- package/package.json +1 -1
- package/src/helpers.ts +19 -3
- package/src/observe.ts +2 -0
- package/src/provide.ts +2 -1
package/dist/index.es.js
CHANGED
|
@@ -1,74 +1,82 @@
|
|
|
1
1
|
var j = Object.defineProperty;
|
|
2
|
-
var
|
|
3
|
-
var i = (n, t, e) => (
|
|
4
|
-
const
|
|
2
|
+
var E = (n, t, e) => t in n ? j(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
|
|
3
|
+
var i = (n, t, e) => (E(n, typeof t != "symbol" ? t + "" : t, e), e);
|
|
4
|
+
const l = /* @__PURE__ */ new WeakMap(), v = Symbol("origin");
|
|
5
5
|
function o(n) {
|
|
6
|
-
if (n = u(n),
|
|
7
|
-
return
|
|
8
|
-
const t = new Proxy(n, new
|
|
9
|
-
return
|
|
6
|
+
if (n = u(n), l.has(n))
|
|
7
|
+
return l.get(n);
|
|
8
|
+
const t = new Proxy(n, new R(n));
|
|
9
|
+
return l.set(n, t), t;
|
|
10
10
|
}
|
|
11
11
|
function u(n) {
|
|
12
|
-
return n[
|
|
12
|
+
return n && (n[v] || n);
|
|
13
13
|
}
|
|
14
|
-
class
|
|
14
|
+
class R {
|
|
15
15
|
constructor(t) {
|
|
16
16
|
i(this, "triggers", {});
|
|
17
17
|
i(this, "cachedFns", {});
|
|
18
18
|
this.obj = t;
|
|
19
19
|
}
|
|
20
20
|
get(t, e, s) {
|
|
21
|
-
if (e ===
|
|
21
|
+
if (e === v)
|
|
22
22
|
return this.obj;
|
|
23
|
-
let r =
|
|
24
|
-
return typeof r == "function" ? this.cachedFns[e] || (this.cachedFns[e] = r.bind(o(t))) : (typeof r == "object" && (r = o(r),
|
|
23
|
+
let r = w(t, e) || Reflect.get(t, e, s);
|
|
24
|
+
return typeof r == "function" ? this.cachedFns[e] || (this.cachedFns[e] = r.bind(o(t))) : (typeof r == "object" && (r = o(r), g(r, this.getTrigger(e))), r);
|
|
25
25
|
}
|
|
26
26
|
set(t, e, s, r) {
|
|
27
|
-
s && (s = u(s))
|
|
27
|
+
if (s && (s = u(s)), s === u(Reflect.get(t, e)))
|
|
28
|
+
return !0;
|
|
28
29
|
const c = Reflect.set(t, e, s, r);
|
|
29
|
-
return
|
|
30
|
+
return b(this.obj, [e]), c;
|
|
30
31
|
}
|
|
31
32
|
getTrigger(t) {
|
|
32
|
-
return t in this.triggers || (this.triggers[t] = (e) =>
|
|
33
|
+
return t in this.triggers || (this.triggers[t] = (e) => b(this.obj, [t, ...e])), this.triggers[t];
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
|
-
const
|
|
36
|
-
function
|
|
36
|
+
const y = /* @__PURE__ */ new Set(), a = ["push", "pop", "shift", "unshift", "splice"];
|
|
37
|
+
function w(n, t) {
|
|
37
38
|
return t === "hasOwnProperty" ? function(e) {
|
|
38
39
|
return u(this).hasOwnProperty(e);
|
|
39
|
-
} : Array.isArray(n) && typeof
|
|
40
|
-
const s =
|
|
41
|
-
return
|
|
40
|
+
} : Array.isArray(n) && typeof a[t] == "function" ? function(...e) {
|
|
41
|
+
const s = a[t].apply(u(this), e);
|
|
42
|
+
return a.includes(t) && b(this, [t]), s;
|
|
42
43
|
} : null;
|
|
43
44
|
}
|
|
44
|
-
const
|
|
45
|
-
function
|
|
46
|
-
return n = u(n),
|
|
45
|
+
const d = /* @__PURE__ */ new WeakMap();
|
|
46
|
+
function k(n) {
|
|
47
|
+
return n = u(n), d.has(n) || d.set(n, /* @__PURE__ */ new Set()), d.get(n);
|
|
47
48
|
}
|
|
48
|
-
function
|
|
49
|
-
|
|
49
|
+
function g(n, t) {
|
|
50
|
+
k(n).add(t);
|
|
50
51
|
}
|
|
51
|
-
function
|
|
52
|
+
function m(n, t) {
|
|
52
53
|
const e = (r) => {
|
|
53
|
-
t(r), y(n, e);
|
|
54
|
+
y.has(t) || (C(() => t(r)), y.add(t), g(n, e));
|
|
54
55
|
}, s = () => {
|
|
55
|
-
|
|
56
|
+
k(n).delete(e);
|
|
56
57
|
};
|
|
57
|
-
return
|
|
58
|
+
return g(n, e), s;
|
|
58
59
|
}
|
|
59
|
-
function
|
|
60
|
-
const e =
|
|
61
|
-
|
|
60
|
+
function b(n, t) {
|
|
61
|
+
const e = k(n), s = [...e].reverse();
|
|
62
|
+
e.clear(), s.forEach((r) => r(t)), y.clear();
|
|
62
63
|
}
|
|
63
|
-
|
|
64
|
+
const p = "__easy_model_event__";
|
|
65
|
+
function C(n) {
|
|
66
|
+
const t = new EventTarget(), e = new Event(p);
|
|
67
|
+
t.addEventListener(p, () => {
|
|
68
|
+
t.removeEventListener(p, n), n();
|
|
69
|
+
}), t.dispatchEvent(e);
|
|
70
|
+
}
|
|
71
|
+
let f = null;
|
|
64
72
|
function M(n) {
|
|
65
|
-
return new Proxy(n, new
|
|
73
|
+
return new Proxy(n, new h(n));
|
|
66
74
|
}
|
|
67
75
|
function S(n, t, e) {
|
|
68
76
|
const s = e ? n(...e) : Object.create(n.prototype);
|
|
69
77
|
return o(Object.assign(s, t));
|
|
70
78
|
}
|
|
71
|
-
const
|
|
79
|
+
const _ = class {
|
|
72
80
|
constructor(t) {
|
|
73
81
|
i(this, "fakeCtor");
|
|
74
82
|
i(this, "caches", /* @__PURE__ */ new Map());
|
|
@@ -80,16 +88,17 @@ const g = class {
|
|
|
80
88
|
constructor: t,
|
|
81
89
|
__proto__: t.prototype
|
|
82
90
|
},
|
|
83
|
-
|
|
91
|
+
_.prototypeHandlers
|
|
84
92
|
), this.fakeCtor = e;
|
|
85
93
|
}
|
|
86
94
|
apply(t, e, s) {
|
|
87
|
-
|
|
88
|
-
|
|
95
|
+
const r = f;
|
|
96
|
+
f = this.fakeCtor;
|
|
97
|
+
const c = this.getInstance(s) || this.register(
|
|
89
98
|
s,
|
|
90
99
|
Reflect.construct(this.Ctor, s, this.fakeCtor)
|
|
91
100
|
);
|
|
92
|
-
return
|
|
101
|
+
return f = r, c;
|
|
93
102
|
}
|
|
94
103
|
construct(t, e, s) {
|
|
95
104
|
const r = Reflect.construct(
|
|
@@ -97,7 +106,7 @@ const g = class {
|
|
|
97
106
|
e,
|
|
98
107
|
s === this.Ctor ? this.fakeCtor : s
|
|
99
108
|
);
|
|
100
|
-
return
|
|
109
|
+
return f !== s ? o(r) : r;
|
|
101
110
|
}
|
|
102
111
|
getInstance(t) {
|
|
103
112
|
for (const e of this.caches.keys()) {
|
|
@@ -118,20 +127,20 @@ const g = class {
|
|
|
118
127
|
return s.length === r.length && s.every((c) => t[c] === e[c]);
|
|
119
128
|
}
|
|
120
129
|
};
|
|
121
|
-
let
|
|
122
|
-
i(
|
|
130
|
+
let h = _;
|
|
131
|
+
i(h, "prototypeHandlers", {
|
|
123
132
|
get(t, e, s) {
|
|
124
|
-
const r =
|
|
133
|
+
const r = w(t, e);
|
|
125
134
|
if (r)
|
|
126
135
|
return r;
|
|
127
136
|
const c = Reflect.get(t, e, s);
|
|
128
|
-
return typeof e == "symbol" || ["constructor", "__proto__"].includes(e) || typeof c != "function" ? c : function(...
|
|
129
|
-
return c.apply(o(this),
|
|
137
|
+
return typeof e == "symbol" || ["constructor", "__proto__"].includes(e) || typeof c != "function" ? c : function(...O) {
|
|
138
|
+
return c.apply(o(this), O);
|
|
130
139
|
};
|
|
131
140
|
}
|
|
132
141
|
});
|
|
133
142
|
export {
|
|
134
143
|
S as extend,
|
|
135
144
|
M as provide,
|
|
136
|
-
|
|
145
|
+
m as subscribe
|
|
137
146
|
};
|
package/dist/index.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(i,o){typeof exports=="object"&&typeof module<"u"?o(exports):typeof define=="function"&&define.amd?define(["exports"],o):(i=typeof globalThis<"u"?globalThis:i||self,o(i["@e7w/easy-model"]={}))})(this,function(i){"use strict";var
|
|
1
|
+
(function(i,o){typeof exports=="object"&&typeof module<"u"?o(exports):typeof define=="function"&&define.amd?define(["exports"],o):(i=typeof globalThis<"u"?globalThis:i||self,o(i["@e7w/easy-model"]={}))})(this,function(i){"use strict";var H=Object.defineProperty;var M=(i,o,f)=>o in i?H(i,o,{enumerable:!0,configurable:!0,writable:!0,value:f}):i[o]=f;var l=(i,o,f)=>(M(i,typeof o!="symbol"?o+"":o,f),f);const o=new WeakMap,f=Symbol("origin");function u(n){if(n=h(n),o.has(n))return o.get(n);const e=new Proxy(n,new j(n));return o.set(n,e),e}function h(n){return n&&(n[f]||n)}class j{constructor(e){l(this,"triggers",{});l(this,"cachedFns",{});this.obj=e}get(e,t,s){if(t===f)return this.obj;let r=O(e,t)||Reflect.get(e,t,s);return typeof r=="function"?this.cachedFns[t]||(this.cachedFns[t]=r.bind(u(e))):(typeof r=="object"&&(r=u(r),k(r,this.getTrigger(t))),r)}set(e,t,s,r){if(s&&(s=h(s)),s===h(Reflect.get(e,t)))return!0;const c=Reflect.set(e,t,s,r);return _(this.obj,[t]),c}getTrigger(e){return e in this.triggers||(this.triggers[e]=t=>_(this.obj,[e,...t])),this.triggers[e]}}const p=new Set,y=["push","pop","shift","unshift","splice"];function O(n,e){return e==="hasOwnProperty"?function(t){return h(this).hasOwnProperty(t)}:Array.isArray(n)&&typeof y[e]=="function"?function(...t){const s=y[e].apply(h(this),t);return y.includes(e)&&_(this,[e]),s}:null}const b=new WeakMap;function g(n){return n=h(n),b.has(n)||b.set(n,new Set),b.get(n)}function k(n,e){g(n).add(e)}function m(n,e){const t=r=>{p.has(e)||(E(()=>e(r)),p.add(e),k(n,t))},s=()=>{g(n).delete(t)};return k(n,t),s}function _(n,e){const t=g(n),s=[...t].reverse();t.clear(),s.forEach(r=>r(e)),p.clear()}const v="__easy_model_event__";function E(n){const e=new EventTarget,t=new Event(v);e.addEventListener(v,()=>{e.removeEventListener(v,n),n()}),e.dispatchEvent(t)}let a=null;function R(n){return new Proxy(n,new d(n))}function S(n,e,t){const s=t?n(...t):Object.create(n.prototype);return u(Object.assign(s,e))}const w=class{constructor(e){l(this,"fakeCtor");l(this,"caches",new Map);this.Ctor=e;const t=function(){};t.prototype=new Proxy({constructor:e,__proto__:e.prototype},w.prototypeHandlers),this.fakeCtor=t}apply(e,t,s){const r=a;a=this.fakeCtor;const c=this.getInstance(s)||this.register(s,Reflect.construct(this.Ctor,s,this.fakeCtor));return a=r,c}construct(e,t,s){const r=Reflect.construct(e,t,s===this.Ctor?this.fakeCtor:s);return a!==s?u(r):r}getInstance(e){for(const t of this.caches.keys()){if(t.length!==e.length||!t.every((r,c)=>r===e[c]?!0:typeof r=="object"&&typeof e[c]=="object"?this.isShallowEqualObj(r,e[c]):!1))continue;const s=this.caches.get(t);return s.deref()?u(s.deref()):(this.caches.delete(t),null)}return null}register(e,t){return this.caches.set(e,new WeakRef(t)),u(t)}isShallowEqualObj(e,t){const s=Object.keys(e),r=t.keys(t);return s.length===r.length&&s.every(c=>e[c]===t[c])}};let d=w;l(d,"prototypeHandlers",{get(e,t,s){const r=O(e,t);if(r)return r;const c=Reflect.get(e,t,s);return typeof t=="symbol"||["constructor","__proto__"].includes(t)||typeof c!="function"?c:function(...C){return c.apply(u(this),C)}}}),i.extend=S,i.provide=R,i.subscribe=m,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})});
|
package/package.json
CHANGED
package/src/helpers.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { getOrigin } from "./observe";
|
|
2
2
|
|
|
3
|
+
const triggered = new Set();
|
|
4
|
+
|
|
3
5
|
export type Ctor = new (...args: any[]) => any;
|
|
4
6
|
export type Obj = Record<string | symbol | number, any>;
|
|
5
7
|
const fakeArr: any = ["push", "pop", "shift", "unshift", "splice"];
|
|
@@ -42,7 +44,9 @@ export function subscribe(
|
|
|
42
44
|
handler: (path: (string | symbol)[]) => void
|
|
43
45
|
): () => void {
|
|
44
46
|
const wrappedHandler: typeof handler = (path) => {
|
|
45
|
-
handler
|
|
47
|
+
if (triggered.has(handler)) return;
|
|
48
|
+
triggerTop(() => handler(path));
|
|
49
|
+
triggered.add(handler);
|
|
46
50
|
track(target, wrappedHandler);
|
|
47
51
|
};
|
|
48
52
|
const unsubscribe = () => {
|
|
@@ -54,8 +58,20 @@ export function subscribe(
|
|
|
54
58
|
|
|
55
59
|
export function trigger(target: Obj, path: (string | symbol)[]): void {
|
|
56
60
|
const handlers = getUpdateHandlers(target);
|
|
57
|
-
const cbs = [...handlers];
|
|
61
|
+
const cbs = [...handlers].reverse();
|
|
58
62
|
handlers.clear();
|
|
59
63
|
|
|
60
|
-
|
|
64
|
+
cbs.forEach((fn) => fn(path));
|
|
65
|
+
triggered.clear();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const eventName = "__easy_model_event__";
|
|
69
|
+
function triggerTop(cb: () => void): void {
|
|
70
|
+
const target = new EventTarget();
|
|
71
|
+
const e = new Event(eventName);
|
|
72
|
+
target.addEventListener(eventName, () => {
|
|
73
|
+
target.removeEventListener(eventName, cb);
|
|
74
|
+
cb();
|
|
75
|
+
});
|
|
76
|
+
target.dispatchEvent(e);
|
|
61
77
|
}
|
package/src/observe.ts
CHANGED
|
@@ -11,6 +11,7 @@ export function observe<T extends Obj>(target: T): T {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export function getOrigin<T extends Obj>(target: T): T {
|
|
14
|
+
if (!target) return target;
|
|
14
15
|
return target[origin] || target;
|
|
15
16
|
}
|
|
16
17
|
|
|
@@ -46,6 +47,7 @@ class ObserveHandler<T extends Obj> implements ProxyHandler<T> {
|
|
|
46
47
|
receiver: any
|
|
47
48
|
): boolean {
|
|
48
49
|
if (newValue) newValue = getOrigin(newValue);
|
|
50
|
+
if (newValue === getOrigin(Reflect.get(target, p))) return true;
|
|
49
51
|
const ret = Reflect.set(target, p, newValue, receiver);
|
|
50
52
|
trigger(this.obj, [p]);
|
|
51
53
|
return ret;
|
package/src/provide.ts
CHANGED
|
@@ -78,6 +78,7 @@ class Provider<T extends Ctor> implements ProxyHandler<T> {
|
|
|
78
78
|
argArray: ConstructorParameters<T>
|
|
79
79
|
): InstanceType<T> {
|
|
80
80
|
// todo: 循环引用创建时抛出错误
|
|
81
|
+
const last = creatingTarget;
|
|
81
82
|
creatingTarget = this.fakeCtor;
|
|
82
83
|
const instance =
|
|
83
84
|
this.getInstance(argArray) ||
|
|
@@ -85,7 +86,7 @@ class Provider<T extends Ctor> implements ProxyHandler<T> {
|
|
|
85
86
|
argArray,
|
|
86
87
|
Reflect.construct(this.Ctor, argArray, this.fakeCtor)
|
|
87
88
|
);
|
|
88
|
-
creatingTarget =
|
|
89
|
+
creatingTarget = last;
|
|
89
90
|
return instance;
|
|
90
91
|
}
|
|
91
92
|
|