@e7w/easy-model 0.0.5 → 0.0.7

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 CHANGED
@@ -1,74 +1,82 @@
1
1
  var j = Object.defineProperty;
2
- var _ = (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) => (_(n, typeof t != "symbol" ? t + "" : t, e), e);
4
- const h = /* @__PURE__ */ new WeakMap(), k = Symbol("origin");
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), h.has(n))
7
- return h.get(n);
8
- const t = new Proxy(n, new C(n));
9
- return h.set(n, t), t;
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[k] || n;
12
+ return n && (n[v] || n);
13
13
  }
14
- class C {
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 === k)
21
+ if (e === v)
22
22
  return this.obj;
23
- let r = O(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), y(r, this.getTrigger(e))), 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 d(this.obj, [e]), c;
30
+ return b(this.obj, [e]), c;
30
31
  }
31
32
  getTrigger(t) {
32
- return t in this.triggers || (this.triggers[t] = (e) => d(this.obj, [t, ...e])), this.triggers[t];
33
+ return t in this.triggers || (this.triggers[t] = (e) => b(this.obj, [t, ...e])), this.triggers[t];
33
34
  }
34
35
  }
35
- const l = ["push", "pop", "shift", "unshift", "splice"];
36
- function O(n, t) {
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 l[t] == "function" ? function(...e) {
40
- const s = l[t].apply(u(this), e);
41
- return l.includes(t) && d(this, [t]), s;
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 a = /* @__PURE__ */ new WeakMap();
45
- function b(n) {
46
- return n = u(n), a.has(n) || a.set(n, /* @__PURE__ */ new Set()), a.get(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 y(n, t) {
49
- b(n).add(t);
49
+ function g(n, t) {
50
+ k(n).add(t);
50
51
  }
51
- function R(n, t) {
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
- b(n).delete(e);
56
+ k(n).delete(e);
56
57
  };
57
- return y(n, e), s;
58
+ return g(n, e), s;
58
59
  }
59
- function d(n, t) {
60
- const e = b(n), s = [...e];
61
- return e.clear(), s.forEach((r) => r(t));
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
- let p = null;
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 f(n));
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 g = class {
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
- g.prototypeHandlers
91
+ _.prototypeHandlers
84
92
  ), this.fakeCtor = e;
85
93
  }
86
94
  apply(t, e, s) {
87
- p = this.fakeCtor;
88
- const r = this.getInstance(s) || this.register(
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 p = null, r;
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 p !== s ? o(r) : r;
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 f = g;
122
- i(f, "prototypeHandlers", {
130
+ let h = _;
131
+ i(h, "prototypeHandlers", {
123
132
  get(t, e, s) {
124
- const r = O(t, e);
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(...w) {
129
- return c.apply(o(this), w);
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
- R as subscribe
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 M=Object.defineProperty;var R=(i,o,u)=>o in i?M(i,o,{enumerable:!0,configurable:!0,writable:!0,value:u}):i[o]=u;var h=(i,o,u)=>(R(i,typeof o!="symbol"?o+"":o,u),u);const o=new WeakMap,u=Symbol("origin");function f(n){if(n=l(n),o.has(n))return o.get(n);const e=new Proxy(n,new w(n));return o.set(n,e),e}function l(n){return n[u]||n}class w{constructor(e){h(this,"triggers",{});h(this,"cachedFns",{});this.obj=e}get(e,t,s){if(t===u)return this.obj;let r=j(e,t)||Reflect.get(e,t,s);return typeof r=="function"?this.cachedFns[t]||(this.cachedFns[t]=r.bind(f(e))):(typeof r=="object"&&(r=f(r),b(r,this.getTrigger(t))),r)}set(e,t,s,r){s&&(s=l(s));const c=Reflect.set(e,t,s,r);return g(this.obj,[t]),c}getTrigger(e){return e in this.triggers||(this.triggers[e]=t=>g(this.obj,[e,...t])),this.triggers[e]}}const d=["push","pop","shift","unshift","splice"];function j(n,e){return e==="hasOwnProperty"?function(t){return l(this).hasOwnProperty(t)}:Array.isArray(n)&&typeof d[e]=="function"?function(...t){const s=d[e].apply(l(this),t);return d.includes(e)&&g(this,[e]),s}:null}const p=new WeakMap;function y(n){return n=l(n),p.has(n)||p.set(n,new Set),p.get(n)}function b(n,e){y(n).add(e)}function _(n,e){const t=r=>{e(r),b(n,t)},s=()=>{y(n).delete(t)};return b(n,t),s}function g(n,e){const t=y(n),s=[...t];return t.clear(),s.forEach(r=>r(e))}let k=null;function m(n){return new Proxy(n,new a(n))}function C(n,e,t){const s=t?n(...t):Object.create(n.prototype);return f(Object.assign(s,e))}const O=class{constructor(e){h(this,"fakeCtor");h(this,"caches",new Map);this.Ctor=e;const t=function(){};t.prototype=new Proxy({constructor:e,__proto__:e.prototype},O.prototypeHandlers),this.fakeCtor=t}apply(e,t,s){k=this.fakeCtor;const r=this.getInstance(s)||this.register(s,Reflect.construct(this.Ctor,s,this.fakeCtor));return k=null,r}construct(e,t,s){const r=Reflect.construct(e,t,s===this.Ctor?this.fakeCtor:s);return k!==s?f(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()?f(s.deref()):(this.caches.delete(t),null)}return null}register(e,t){return this.caches.set(e,new WeakRef(t)),f(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 a=O;h(a,"prototypeHandlers",{get(e,t,s){const r=j(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(...H){return c.apply(f(this),H)}}}),i.extend=C,i.provide=m,i.subscribe=_,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})});
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e7w/easy-model",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "一个简单的状态管理包, A simple state management lib for Typescript",
5
5
  "main": "./src/index.ts",
6
6
  "module": "./dist/index.es.js",
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(path);
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
- return cbs.forEach((fn) => fn(path));
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 = null;
89
+ creatingTarget = last;
89
90
  return instance;
90
91
  }
91
92