@e7w/easy-model 0.0.8 → 0.0.10
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/helpers.d.ts +2 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.es.js +101 -80
- package/dist/index.umd.js +1 -1
- package/dist/provide.d.ts +1 -0
- package/package.json +2 -2
- package/src/helpers.ts +15 -5
- package/src/index.ts +1 -1
- package/src/observe.ts +10 -1
- package/src/provide.ts +35 -4
package/dist/helpers.d.ts
CHANGED
|
@@ -4,3 +4,5 @@ export declare function safeGet(target: Obj, p: string | symbol): any;
|
|
|
4
4
|
export declare function track(target: Obj, handler: (path: (string | symbol)[]) => void): void;
|
|
5
5
|
export declare function subscribe(target: Obj, handler: (path: (string | symbol)[]) => void): () => void;
|
|
6
6
|
export declare function trigger(target: Obj, path: (string | symbol)[]): void;
|
|
7
|
+
export declare function startTrigger(): symbol | null;
|
|
8
|
+
export declare function endTrigger(symbol: symbol | null): void;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { subscribe } from "./helpers";
|
|
2
|
-
export { provide, extend } from "./provide";
|
|
2
|
+
export { provide, extend, filterSymbol } from "./provide";
|
package/dist/index.es.js
CHANGED
|
@@ -1,87 +1,95 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
const d = /* @__PURE__ */ new WeakMap(),
|
|
1
|
+
var A = Object.defineProperty;
|
|
2
|
+
var C = (n, t, e) => t in n ? A(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
|
|
3
|
+
var f = (n, t, e) => (C(n, typeof t != "symbol" ? t + "" : t, e), e);
|
|
4
|
+
const d = /* @__PURE__ */ new WeakMap(), S = Symbol("origin");
|
|
5
5
|
function c(n) {
|
|
6
|
-
if (n =
|
|
6
|
+
if (n = o(n), d.has(n))
|
|
7
7
|
return d.get(n);
|
|
8
|
-
const t = new Proxy(n, new
|
|
8
|
+
const t = new Proxy(n, new H(n));
|
|
9
9
|
return d.set(n, t), t;
|
|
10
10
|
}
|
|
11
|
-
function
|
|
12
|
-
return n && (n[
|
|
11
|
+
function o(n) {
|
|
12
|
+
return n && (n[S] || n);
|
|
13
13
|
}
|
|
14
|
-
class
|
|
14
|
+
class H {
|
|
15
15
|
constructor(t) {
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
f(this, "triggers", {});
|
|
17
|
+
f(this, "cachedFns", {});
|
|
18
18
|
this.obj = t;
|
|
19
19
|
}
|
|
20
|
-
get(t, e,
|
|
21
|
-
if (e ===
|
|
20
|
+
get(t, e, r) {
|
|
21
|
+
if (e === S)
|
|
22
22
|
return this.obj;
|
|
23
|
-
let
|
|
24
|
-
return typeof
|
|
23
|
+
let s = j(t, e) || Reflect.get(t, e, r);
|
|
24
|
+
return typeof s == "function" ? this.cachedFns[e] || (this.cachedFns[e] = s.bind(c(t))) : (typeof s == "object" && (s = c(s), _(s, this.getTrigger(e))), s);
|
|
25
25
|
}
|
|
26
|
-
set(t, e,
|
|
27
|
-
if (
|
|
26
|
+
set(t, e, r, s) {
|
|
27
|
+
if (r && (r = o(r)), r === o(Reflect.get(t, e)))
|
|
28
28
|
return !0;
|
|
29
|
-
const
|
|
30
|
-
return g(this.obj, [e]),
|
|
29
|
+
const i = E(), u = Reflect.set(t, e, r, s);
|
|
30
|
+
return g(this.obj, [e]), R(i), u;
|
|
31
31
|
}
|
|
32
32
|
getTrigger(t) {
|
|
33
33
|
return t in this.triggers || (this.triggers[t] = (e) => g(this.obj, [t, ...e])), this.triggers[t];
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
-
const
|
|
37
|
-
|
|
36
|
+
const k = /* @__PURE__ */ new Set();
|
|
37
|
+
let y = null;
|
|
38
|
+
const l = ["push", "pop", "shift", "unshift", "splice", "sort"];
|
|
39
|
+
function j(n, t) {
|
|
38
40
|
return t === "hasOwnProperty" ? function(e) {
|
|
39
|
-
return
|
|
40
|
-
} : Array.isArray(n) && typeof
|
|
41
|
-
let
|
|
42
|
-
return
|
|
41
|
+
return o(this).hasOwnProperty(e);
|
|
42
|
+
} : Array.isArray(n) && typeof l[t] == "function" ? function(...e) {
|
|
43
|
+
let r;
|
|
44
|
+
return l.includes(t) ? (r = l[t].apply(o(this), e), g(this, [t])) : r = l[t].apply(this, e), r;
|
|
43
45
|
} : null;
|
|
44
46
|
}
|
|
45
47
|
const p = /* @__PURE__ */ new WeakMap();
|
|
46
|
-
function
|
|
47
|
-
return n =
|
|
48
|
+
function v(n) {
|
|
49
|
+
return n = o(n), p.has(n) || p.set(n, /* @__PURE__ */ new Set()), p.get(n);
|
|
48
50
|
}
|
|
49
|
-
function
|
|
50
|
-
|
|
51
|
+
function _(n, t) {
|
|
52
|
+
v(n).add(t);
|
|
51
53
|
}
|
|
52
|
-
function
|
|
53
|
-
const e = (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
k(n).delete(e);
|
|
54
|
+
function F(n, t) {
|
|
55
|
+
const e = (s) => {
|
|
56
|
+
const i = k.has(t);
|
|
57
|
+
k.add(t), i || T(() => t(s)), _(n, e);
|
|
58
|
+
}, r = () => {
|
|
59
|
+
v(n).delete(e);
|
|
59
60
|
};
|
|
60
|
-
return
|
|
61
|
+
return _(n, e), r;
|
|
61
62
|
}
|
|
62
63
|
function g(n, t) {
|
|
63
|
-
const e =
|
|
64
|
-
e.clear(),
|
|
64
|
+
const e = v(n), r = [...e];
|
|
65
|
+
e.clear(), r.forEach((s) => s(t));
|
|
65
66
|
}
|
|
66
|
-
const
|
|
67
|
-
function
|
|
68
|
-
const t = new EventTarget(), e = new Event(
|
|
69
|
-
t.addEventListener(
|
|
70
|
-
t.removeEventListener(
|
|
67
|
+
const b = "__easy_model_event__";
|
|
68
|
+
function T(n) {
|
|
69
|
+
const t = new EventTarget(), e = new Event(b);
|
|
70
|
+
t.addEventListener(b, () => {
|
|
71
|
+
t.removeEventListener(b, n), n();
|
|
71
72
|
}), t.dispatchEvent(e);
|
|
72
73
|
}
|
|
74
|
+
function E() {
|
|
75
|
+
return y ? null : y = Symbol();
|
|
76
|
+
}
|
|
77
|
+
function R(n) {
|
|
78
|
+
y === n && (y = null, k.clear());
|
|
79
|
+
}
|
|
73
80
|
let h = null;
|
|
74
|
-
|
|
81
|
+
const M = Symbol("filterSymbol");
|
|
82
|
+
function W(n) {
|
|
75
83
|
return new Proxy(n, new a(n));
|
|
76
84
|
}
|
|
77
|
-
function
|
|
78
|
-
const
|
|
79
|
-
return c(Object.assign(
|
|
85
|
+
function q(n, t, e) {
|
|
86
|
+
const r = e ? n(...e) : Object.create(n.prototype);
|
|
87
|
+
return c(Object.assign(r, t));
|
|
80
88
|
}
|
|
81
|
-
const
|
|
89
|
+
const O = class {
|
|
82
90
|
constructor(t) {
|
|
83
|
-
|
|
84
|
-
|
|
91
|
+
f(this, "fakeCtor");
|
|
92
|
+
f(this, "caches", /* @__PURE__ */ new Map());
|
|
85
93
|
this.Ctor = t;
|
|
86
94
|
const e = function() {
|
|
87
95
|
};
|
|
@@ -90,34 +98,43 @@ const _ = class {
|
|
|
90
98
|
constructor: t,
|
|
91
99
|
__proto__: t.prototype
|
|
92
100
|
},
|
|
93
|
-
|
|
101
|
+
O.prototypeHandlers
|
|
94
102
|
), this.fakeCtor = e;
|
|
95
103
|
}
|
|
96
|
-
apply(t, e,
|
|
97
|
-
const
|
|
104
|
+
apply(t, e, r) {
|
|
105
|
+
const s = h;
|
|
98
106
|
h = this.fakeCtor;
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
Reflect.construct(this.Ctor,
|
|
107
|
+
const i = this.getInstance(r) || this.register(
|
|
108
|
+
r,
|
|
109
|
+
Reflect.construct(this.Ctor, this.filterArgs(r), this.fakeCtor)
|
|
102
110
|
);
|
|
103
|
-
return h =
|
|
111
|
+
return h = s, i;
|
|
104
112
|
}
|
|
105
|
-
construct(t, e,
|
|
106
|
-
const
|
|
113
|
+
construct(t, e, r) {
|
|
114
|
+
const s = Reflect.construct(
|
|
107
115
|
t,
|
|
108
|
-
e,
|
|
109
|
-
|
|
116
|
+
this.filterArgs(e),
|
|
117
|
+
r === this.Ctor ? this.fakeCtor : r
|
|
110
118
|
);
|
|
111
|
-
return h !==
|
|
119
|
+
return h !== r ? c(s) : s;
|
|
120
|
+
}
|
|
121
|
+
set(t, e, r, s) {
|
|
122
|
+
if (r && (r = o(r)), r === o(Reflect.get(t, e)))
|
|
123
|
+
return !0;
|
|
124
|
+
const i = E(), u = Reflect.set(t, e, r, s);
|
|
125
|
+
return this.caches.forEach((w) => {
|
|
126
|
+
const m = w.deref();
|
|
127
|
+
m && g(m, []);
|
|
128
|
+
}), R(i), u;
|
|
112
129
|
}
|
|
113
130
|
getInstance(t) {
|
|
114
131
|
for (const e of this.caches.keys()) {
|
|
115
132
|
if (e.length !== t.length || !e.every(
|
|
116
|
-
(
|
|
133
|
+
(s, i) => s === t[i] ? !0 : typeof s == "object" && typeof t[i] == "object" ? this.isShallowEqualObj(s, t[i]) : !1
|
|
117
134
|
))
|
|
118
135
|
continue;
|
|
119
|
-
const
|
|
120
|
-
return
|
|
136
|
+
const r = this.caches.get(e);
|
|
137
|
+
return r.deref() ? c(r.deref()) : (this.caches.delete(e), null);
|
|
121
138
|
}
|
|
122
139
|
return null;
|
|
123
140
|
}
|
|
@@ -125,24 +142,28 @@ const _ = class {
|
|
|
125
142
|
return this.caches.set(t, new WeakRef(e)), c(e);
|
|
126
143
|
}
|
|
127
144
|
isShallowEqualObj(t, e) {
|
|
128
|
-
const
|
|
129
|
-
return
|
|
145
|
+
const r = Object.keys(t), s = e.keys(e);
|
|
146
|
+
return r.length === s.length && r.every((i) => t[i] === e[i]);
|
|
147
|
+
}
|
|
148
|
+
filterArgs(t) {
|
|
149
|
+
return t.filter((e) => e !== M);
|
|
130
150
|
}
|
|
131
151
|
};
|
|
132
|
-
let a =
|
|
133
|
-
|
|
134
|
-
get(t, e,
|
|
135
|
-
const
|
|
136
|
-
if (
|
|
137
|
-
return
|
|
138
|
-
const
|
|
139
|
-
return typeof e == "symbol" || ["constructor", "__proto__"].includes(e) || typeof
|
|
140
|
-
return
|
|
152
|
+
let a = O;
|
|
153
|
+
f(a, "prototypeHandlers", {
|
|
154
|
+
get(t, e, r) {
|
|
155
|
+
const s = j(t, e);
|
|
156
|
+
if (s)
|
|
157
|
+
return s;
|
|
158
|
+
const i = Reflect.get(t, e, r);
|
|
159
|
+
return typeof e == "symbol" || ["constructor", "__proto__"].includes(e) || typeof i != "function" ? i : function(...u) {
|
|
160
|
+
return i.apply(c(this), u);
|
|
141
161
|
};
|
|
142
162
|
}
|
|
143
163
|
});
|
|
144
164
|
export {
|
|
145
|
-
|
|
146
|
-
M as
|
|
147
|
-
|
|
165
|
+
q as extend,
|
|
166
|
+
M as filterSymbol,
|
|
167
|
+
W as provide,
|
|
168
|
+
F as subscribe
|
|
148
169
|
};
|
package/dist/index.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(o,c){typeof exports=="object"&&typeof module<"u"?c(exports):typeof define=="function"&&define.amd?define(["exports"],c):(o=typeof globalThis<"u"?globalThis:o||self,c(o["@e7w/easy-model"]={}))})(this,function(o){"use strict";var W=Object.defineProperty;var q=(o,c,f)=>c in o?W(o,c,{enumerable:!0,configurable:!0,writable:!0,value:f}):o[c]=f;var h=(o,c,f)=>(q(o,typeof c!="symbol"?c+"":c,f),f);const c=new WeakMap,f=Symbol("origin");function l(n){if(n=u(n),c.has(n))return c.get(n);const t=new Proxy(n,new A(n));return c.set(n,t),t}function u(n){return n&&(n[f]||n)}class A{constructor(t){h(this,"triggers",{});h(this,"cachedFns",{});this.obj=t}get(t,e,r){if(e===f)return this.obj;let s=j(t,e)||Reflect.get(t,e,r);return typeof s=="function"?this.cachedFns[e]||(this.cachedFns[e]=s.bind(l(t))):(typeof s=="object"&&(s=l(s),v(s,this.getTrigger(e))),s)}set(t,e,r,s){if(r&&(r=u(r)),r===u(Reflect.get(t,e)))return!0;const i=w(),a=Reflect.set(t,e,r,s);return g(this.obj,[e]),E(i),a}getTrigger(t){return t in this.triggers||(this.triggers[t]=e=>g(this.obj,[t,...e])),this.triggers[t]}}const k=new Set;let d=null;const y=["push","pop","shift","unshift","splice","sort"];function j(n,t){return t==="hasOwnProperty"?function(e){return u(this).hasOwnProperty(e)}:Array.isArray(n)&&typeof y[t]=="function"?function(...e){let r;return y.includes(t)?(r=y[t].apply(u(this),e),g(this,[t])):r=y[t].apply(this,e),r}:null}const m=new WeakMap;function _(n){return n=u(n),m.has(n)||m.set(n,new Set),m.get(n)}function v(n,t){_(n).add(t)}function C(n,t){const e=s=>{const i=k.has(t);k.add(t),i||H(()=>t(s)),v(n,e)},r=()=>{_(n).delete(e)};return v(n,e),r}function g(n,t){const e=_(n),r=[...e];e.clear(),r.forEach(s=>s(t))}const S="__easy_model_event__";function H(n){const t=new EventTarget,e=new Event(S);t.addEventListener(S,()=>{t.removeEventListener(S,n),n()}),t.dispatchEvent(e)}function w(){return d?null:d=Symbol()}function E(n){d===n&&(d=null,k.clear())}let p=null;const R=Symbol("filterSymbol");function M(n){return new Proxy(n,new b(n))}function F(n,t,e){const r=e?n(...e):Object.create(n.prototype);return l(Object.assign(r,t))}const O=class{constructor(t){h(this,"fakeCtor");h(this,"caches",new Map);this.Ctor=t;const e=function(){};e.prototype=new Proxy({constructor:t,__proto__:t.prototype},O.prototypeHandlers),this.fakeCtor=e}apply(t,e,r){const s=p;p=this.fakeCtor;const i=this.getInstance(r)||this.register(r,Reflect.construct(this.Ctor,this.filterArgs(r),this.fakeCtor));return p=s,i}construct(t,e,r){const s=Reflect.construct(t,this.filterArgs(e),r===this.Ctor?this.fakeCtor:r);return p!==r?l(s):s}set(t,e,r,s){if(r&&(r=u(r)),r===u(Reflect.get(t,e)))return!0;const i=w(),a=Reflect.set(t,e,r,s);return this.caches.forEach(P=>{const T=P.deref();T&&g(T,[])}),E(i),a}getInstance(t){for(const e of this.caches.keys()){if(e.length!==t.length||!e.every((s,i)=>s===t[i]?!0:typeof s=="object"&&typeof t[i]=="object"?this.isShallowEqualObj(s,t[i]):!1))continue;const r=this.caches.get(e);return r.deref()?l(r.deref()):(this.caches.delete(e),null)}return null}register(t,e){return this.caches.set(t,new WeakRef(e)),l(e)}isShallowEqualObj(t,e){const r=Object.keys(t),s=e.keys(e);return r.length===s.length&&r.every(i=>t[i]===e[i])}filterArgs(t){return t.filter(e=>e!==R)}};let b=O;h(b,"prototypeHandlers",{get(t,e,r){const s=j(t,e);if(s)return s;const i=Reflect.get(t,e,r);return typeof e=="symbol"||["constructor","__proto__"].includes(e)||typeof i!="function"?i:function(...a){return i.apply(l(this),a)}}}),o.extend=F,o.filterSymbol=R,o.provide=M,o.subscribe=C,Object.defineProperty(o,Symbol.toStringTag,{value:"Module"})});
|
package/dist/provide.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type Ctor } from "./helpers";
|
|
2
|
+
export declare const filterSymbol: unique symbol;
|
|
2
3
|
export declare function provide<T extends Ctor>(Ctor: T): T & ((...args: ConstructorParameters<T>) => InstanceType<T>);
|
|
3
4
|
export declare function extend<T extends ReturnType<typeof provide>, P extends Partial<InstanceType<T>>>(Provider: T, extendData: P): P & Partial<Omit<InstanceType<T>, keyof P>>;
|
|
4
5
|
export declare function extend<T extends ReturnType<typeof provide>, P extends Partial<InstanceType<T>>, M extends Parameters<T>>(Provider: T, extendData: P, args: M): InstanceType<T>;
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@e7w/easy-model",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.10",
|
|
4
4
|
"description": "一个简单的状态管理包, A simple state management lib for Typescript",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"module": "./dist/index.es.js",
|
|
7
|
-
"types": "./src/index.
|
|
7
|
+
"types": "./src/index.ts",
|
|
8
8
|
"typings": "./dist/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
"import": "./dist/index.es.js",
|
package/src/helpers.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getOrigin } from "./observe";
|
|
2
2
|
|
|
3
3
|
const triggered = new Set();
|
|
4
|
+
let triggerSymbol: Symbol | null = null;
|
|
4
5
|
|
|
5
6
|
export type Ctor = new (...args: any[]) => any;
|
|
6
7
|
export type Obj = Record<string | symbol | number, any>;
|
|
@@ -49,9 +50,9 @@ export function subscribe(
|
|
|
49
50
|
handler: (path: (string | symbol)[]) => void
|
|
50
51
|
): () => void {
|
|
51
52
|
const wrappedHandler: typeof handler = (path) => {
|
|
52
|
-
|
|
53
|
-
triggerTop(() => handler(path));
|
|
53
|
+
const isTriggered = triggered.has(handler);
|
|
54
54
|
triggered.add(handler);
|
|
55
|
+
if (!isTriggered) triggerTop(() => handler(path));
|
|
55
56
|
track(target, wrappedHandler);
|
|
56
57
|
};
|
|
57
58
|
const unsubscribe = () => {
|
|
@@ -63,11 +64,9 @@ export function subscribe(
|
|
|
63
64
|
|
|
64
65
|
export function trigger(target: Obj, path: (string | symbol)[]): void {
|
|
65
66
|
const handlers = getUpdateHandlers(target);
|
|
66
|
-
const cbs = [...handlers]
|
|
67
|
+
const cbs = [...handlers];
|
|
67
68
|
handlers.clear();
|
|
68
|
-
|
|
69
69
|
cbs.forEach((fn) => fn(path));
|
|
70
|
-
triggered.clear();
|
|
71
70
|
}
|
|
72
71
|
|
|
73
72
|
const eventName = "__easy_model_event__";
|
|
@@ -80,3 +79,14 @@ function triggerTop(cb: () => void): void {
|
|
|
80
79
|
});
|
|
81
80
|
target.dispatchEvent(e);
|
|
82
81
|
}
|
|
82
|
+
|
|
83
|
+
export function startTrigger() {
|
|
84
|
+
if (triggerSymbol) return null;
|
|
85
|
+
return (triggerSymbol = Symbol());
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function endTrigger(symbol: symbol | null) {
|
|
89
|
+
if (triggerSymbol !== symbol) return;
|
|
90
|
+
triggerSymbol = null;
|
|
91
|
+
triggered.clear();
|
|
92
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { subscribe } from "./helpers";
|
|
2
|
-
export { provide, extend } from "./provide";
|
|
2
|
+
export { provide, extend, filterSymbol } from "./provide";
|
package/src/observe.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
type Obj,
|
|
3
|
+
safeGet,
|
|
4
|
+
track,
|
|
5
|
+
trigger,
|
|
6
|
+
startTrigger,
|
|
7
|
+
endTrigger,
|
|
8
|
+
} from "./helpers";
|
|
2
9
|
|
|
3
10
|
const observedMap = new WeakMap();
|
|
4
11
|
const origin = Symbol("origin");
|
|
@@ -48,8 +55,10 @@ class ObserveHandler<T extends Obj> implements ProxyHandler<T> {
|
|
|
48
55
|
): boolean {
|
|
49
56
|
if (newValue) newValue = getOrigin(newValue);
|
|
50
57
|
if (newValue === getOrigin(Reflect.get(target, p))) return true;
|
|
58
|
+
const flag = startTrigger();
|
|
51
59
|
const ret = Reflect.set(target, p, newValue, receiver);
|
|
52
60
|
trigger(this.obj, [p]);
|
|
61
|
+
endTrigger(flag);
|
|
53
62
|
return ret;
|
|
54
63
|
}
|
|
55
64
|
|
package/src/provide.ts
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
type Ctor,
|
|
3
|
+
type Obj,
|
|
4
|
+
safeGet,
|
|
5
|
+
trigger,
|
|
6
|
+
startTrigger,
|
|
7
|
+
endTrigger,
|
|
8
|
+
} from "./helpers";
|
|
9
|
+
import { getOrigin, observe } from "./observe";
|
|
3
10
|
|
|
4
11
|
let creatingTarget: any = null;
|
|
5
12
|
|
|
13
|
+
export const filterSymbol = Symbol("filterSymbol");
|
|
14
|
+
|
|
6
15
|
export function provide<T extends Ctor>(
|
|
7
16
|
Ctor: T
|
|
8
17
|
): T & ((...args: ConstructorParameters<T>) => InstanceType<T>) {
|
|
@@ -84,7 +93,7 @@ class Provider<T extends Ctor> implements ProxyHandler<T> {
|
|
|
84
93
|
this.getInstance(argArray) ||
|
|
85
94
|
this.register(
|
|
86
95
|
argArray,
|
|
87
|
-
Reflect.construct(this.Ctor, argArray, this.fakeCtor)
|
|
96
|
+
Reflect.construct(this.Ctor, this.filterArgs(argArray), this.fakeCtor)
|
|
88
97
|
);
|
|
89
98
|
creatingTarget = last;
|
|
90
99
|
return instance;
|
|
@@ -97,13 +106,31 @@ class Provider<T extends Ctor> implements ProxyHandler<T> {
|
|
|
97
106
|
): InstanceType<T> {
|
|
98
107
|
const instance = Reflect.construct(
|
|
99
108
|
target,
|
|
100
|
-
argArray,
|
|
109
|
+
this.filterArgs(argArray),
|
|
101
110
|
newTarget === this.Ctor ? this.fakeCtor : newTarget
|
|
102
111
|
);
|
|
103
112
|
if (creatingTarget !== newTarget) return observe(instance);
|
|
104
113
|
return instance;
|
|
105
114
|
}
|
|
106
115
|
|
|
116
|
+
public set(
|
|
117
|
+
target: T,
|
|
118
|
+
p: string | symbol,
|
|
119
|
+
newValue: any,
|
|
120
|
+
receiver: any
|
|
121
|
+
): boolean {
|
|
122
|
+
if (newValue) newValue = getOrigin(newValue);
|
|
123
|
+
if (newValue === getOrigin(Reflect.get(target, p) as any)) return true;
|
|
124
|
+
const flag = startTrigger();
|
|
125
|
+
const ret = Reflect.set(target, p, newValue, receiver);
|
|
126
|
+
this.caches.forEach((ref) => {
|
|
127
|
+
const instance = ref.deref();
|
|
128
|
+
if (instance) trigger(instance, []);
|
|
129
|
+
});
|
|
130
|
+
endTrigger(flag);
|
|
131
|
+
return ret;
|
|
132
|
+
}
|
|
133
|
+
|
|
107
134
|
private getInstance(args: ConstructorParameters<T>): InstanceType<T> | null {
|
|
108
135
|
for (const cachedArgs of this.caches.keys()) {
|
|
109
136
|
if (
|
|
@@ -142,4 +169,8 @@ class Provider<T extends Ctor> implements ProxyHandler<T> {
|
|
|
142
169
|
kOfA.every((key) => objectA[key] === objectB[key])
|
|
143
170
|
);
|
|
144
171
|
}
|
|
172
|
+
|
|
173
|
+
private filterArgs(args: any[]): any[] {
|
|
174
|
+
return args.filter((arg) => arg !== filterSymbol);
|
|
175
|
+
}
|
|
145
176
|
}
|