@e7w/easy-model 0.0.1 → 0.0.3

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/README.md CHANGED
@@ -21,6 +21,8 @@ const A = provide(
21
21
  );
22
22
 
23
23
  A(1) === A(1); // true
24
+ A(1) !== new A(1); // true
24
25
  subscribe(A(1), console.log.bind(console, "Path of changed value:"));
25
- A(1).msg = "123"; // Path of changed value: ["msg"]
26
+ const { random } = A(1);
27
+ random(); // Path of changed value: ["msg"]
26
28
  ```
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export { subscribe } from "./helpers";
2
- export { provide } from "./provide";
2
+ export { provide, extend } from "./provide";
package/dist/index.es.js CHANGED
@@ -1,70 +1,77 @@
1
- var O = Object.defineProperty;
2
- var _ = (n, t, e) => t in n ? O(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
3
- var c = (n, t, e) => (_(n, typeof t != "symbol" ? t + "" : t, e), e);
4
- const h = /* @__PURE__ */ new WeakMap(), g = Symbol("origin");
5
- function i(n) {
6
- if (n = f(n), h.has(n))
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");
5
+ function o(n) {
6
+ if (n = u(n), h.has(n))
7
7
  return h.get(n);
8
- const t = new Proxy(n, new j(n));
8
+ const t = new Proxy(n, new C(n));
9
9
  return h.set(n, t), t;
10
10
  }
11
- function f(n) {
12
- return n[g] || n;
11
+ function u(n) {
12
+ return n[k] || n;
13
13
  }
14
- class j {
14
+ class C {
15
15
  constructor(t) {
16
- c(this, "triggers", {});
16
+ i(this, "triggers", {});
17
+ i(this, "cachedFns", {});
17
18
  this.obj = t;
18
19
  }
19
- get(t, e, r) {
20
- if (e === g)
20
+ get(t, e, s) {
21
+ if (e === k)
21
22
  return this.obj;
22
- let s = k(t, e) || Reflect.get(t, e, r);
23
- return typeof s == "function" ? s.bind(i(t)) : (typeof s == "object" && (s = i(s), p(s, this.getTrigger(e))), s);
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);
24
25
  }
25
- set(t, e, r, s) {
26
- const o = Reflect.set(t, e, r, s);
27
- return y(this.obj, [e]), o;
26
+ set(t, e, s, r) {
27
+ s && (s = u(s));
28
+ const c = Reflect.set(t, e, s, r);
29
+ return d(this.obj, [e]), c;
28
30
  }
29
31
  getTrigger(t) {
30
- return t in this.triggers || (this.triggers[t] = (e) => y(this.obj, [t, ...e])), this.triggers[t];
32
+ return t in this.triggers || (this.triggers[t] = (e) => d(this.obj, [t, ...e])), this.triggers[t];
31
33
  }
32
34
  }
33
35
  const l = ["push", "pop", "shift", "unshift", "splice"];
34
- function k(n, t) {
36
+ function O(n, t) {
35
37
  return t === "hasOwnProperty" ? function(e) {
36
- return f(this).hasOwnProperty(e);
38
+ return u(this).hasOwnProperty(e);
37
39
  } : Array.isArray(n) && typeof l[t] == "function" ? function(...e) {
38
- const r = l[t].apply(f(this), e);
39
- return l.includes(t) && y(this, [t]), r;
40
+ const s = l[t].apply(u(this), e);
41
+ return l.includes(t) && d(this, [t]), s;
40
42
  } : null;
41
43
  }
42
44
  const a = /* @__PURE__ */ new WeakMap();
43
- function d(n) {
44
- return n = f(n), a.has(n) || a.set(n, /* @__PURE__ */ new Set()), a.get(n);
45
+ function b(n) {
46
+ return n = u(n), a.has(n) || a.set(n, /* @__PURE__ */ new Set()), a.get(n);
45
47
  }
46
- function p(n, t) {
47
- d(n).add(t);
48
+ function y(n, t) {
49
+ b(n).add(t);
48
50
  }
49
51
  function R(n, t) {
50
- const e = (s) => {
51
- t(s), p(n, e);
52
- }, r = () => {
53
- d(n).delete(e);
52
+ const e = (r) => {
53
+ t(r), y(n, e);
54
+ }, s = () => {
55
+ b(n).delete(e);
54
56
  };
55
- return p(n, e), r;
57
+ return y(n, e), s;
56
58
  }
57
- function y(n, t) {
58
- const e = d(n), r = [...e];
59
- return e.clear(), r.forEach((s) => s(t));
59
+ function d(n, t) {
60
+ const e = b(n), s = [...e];
61
+ return e.clear(), s.forEach((r) => r(t));
62
+ }
63
+ let p = null;
64
+ function M(n) {
65
+ return new Proxy(n, new f(n));
60
66
  }
61
- function C(n) {
62
- return new Proxy(n, new u(n));
67
+ function S(n, t, e) {
68
+ const s = e ? n(...e) : Object.create(n.prototype);
69
+ return o(Object.assign(s, t));
63
70
  }
64
- const b = class {
71
+ const g = class {
65
72
  constructor(t) {
66
- c(this, "fakeCtor");
67
- c(this, "caches", /* @__PURE__ */ new Map());
73
+ i(this, "fakeCtor");
74
+ i(this, "caches", /* @__PURE__ */ new Map());
68
75
  this.Ctor = t;
69
76
  const e = function() {
70
77
  };
@@ -73,54 +80,58 @@ const b = class {
73
80
  constructor: t,
74
81
  __proto__: t.prototype
75
82
  },
76
- b.prototypeHandlers
83
+ g.prototypeHandlers
77
84
  ), this.fakeCtor = e;
78
85
  }
79
- apply(t, e, r) {
80
- return this.getInstance(r) || this.register(
81
- r,
82
- Reflect.construct(this.Ctor, r, this.fakeCtor)
86
+ apply(t, e, s) {
87
+ p = this.fakeCtor;
88
+ const r = this.getInstance(s) || this.register(
89
+ s,
90
+ Reflect.construct(this.Ctor, s, this.fakeCtor)
83
91
  );
92
+ return p = null, r;
84
93
  }
85
- construct(t, e, r) {
86
- return Reflect.construct(
94
+ construct(t, e, s) {
95
+ const r = Reflect.construct(
87
96
  t,
88
97
  e,
89
- r === this.Ctor ? this.fakeCtor : r
98
+ s === this.Ctor ? this.fakeCtor : s
90
99
  );
100
+ return p !== s ? o(r) : r;
91
101
  }
92
102
  getInstance(t) {
93
103
  for (const e of this.caches.keys()) {
94
- if (!e.every(
95
- (s, o) => s === t[o] ? !0 : typeof s == "object" && typeof t[o] == "object" ? this.isShallowEqualObj(s, t[o]) : !1
104
+ if (e.length !== t.length || !e.every(
105
+ (r, c) => r === t[c] ? !0 : typeof r == "object" && typeof t[c] == "object" ? this.isShallowEqualObj(r, t[c]) : !1
96
106
  ))
97
107
  continue;
98
- const r = this.caches.get(e);
99
- return r.deref() ? i(r.deref()) : (this.caches.delete(e), null);
108
+ const s = this.caches.get(e);
109
+ return s.deref() ? o(s.deref()) : (this.caches.delete(e), null);
100
110
  }
101
111
  return null;
102
112
  }
103
113
  register(t, e) {
104
- return this.caches.set(t, new WeakRef(e)), i(e);
114
+ return this.caches.set(t, new WeakRef(e)), o(e);
105
115
  }
106
116
  isShallowEqualObj(t, e) {
107
- const r = Object.keys(t), s = e.keys(e);
108
- return r.length === s.length && r.every((o) => t[o] === e[o]);
117
+ const s = Object.keys(t), r = e.keys(e);
118
+ return s.length === r.length && s.every((c) => t[c] === e[c]);
109
119
  }
110
120
  };
111
- let u = b;
112
- c(u, "prototypeHandlers", {
113
- get(t, e, r) {
114
- const s = k(t, e);
115
- if (s)
116
- return s;
117
- const o = Reflect.get(t, e, r);
118
- return typeof e == "symbol" || ["constructor", "__proto__"].includes(e) || typeof o != "function" ? o : function(...w) {
119
- return o.apply(i(this), w);
121
+ let f = g;
122
+ i(f, "prototypeHandlers", {
123
+ get(t, e, s) {
124
+ const r = O(t, e);
125
+ if (r)
126
+ return r;
127
+ 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);
120
130
  };
121
131
  }
122
132
  });
123
133
  export {
124
- C as provide,
134
+ S as extend,
135
+ M as provide,
125
136
  R as subscribe
126
137
  };
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 v=Object.defineProperty;var H=(i,o,u)=>o in i?v(i,o,{enumerable:!0,configurable:!0,writable:!0,value:u}):i[o]=u;var h=(i,o,u)=>(H(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 O(n));return o.set(n,e),e}function l(n){return n[u]||n}class O{constructor(e){h(this,"triggers",{});this.obj=e}get(e,t,r){if(t===u)return this.obj;let s=k(e,t)||Reflect.get(e,t,r);return typeof s=="function"?s.bind(f(e)):(typeof s=="object"&&(s=f(s),b(s,this.getTrigger(t))),s)}set(e,t,r,s){const c=Reflect.set(e,t,r,s);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 k(n,e){return e==="hasOwnProperty"?function(t){return l(this).hasOwnProperty(t)}:Array.isArray(n)&&typeof d[e]=="function"?function(...t){const r=d[e].apply(l(this),t);return d.includes(e)&&g(this,[e]),r}: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 j(n,e){const t=s=>{e(s),b(n,t)},r=()=>{y(n).delete(t)};return b(n,t),r}function g(n,e){const t=y(n),r=[...t];return t.clear(),r.forEach(s=>s(e))}function _(n){return new Proxy(n,new a(n))}const w=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},w.prototypeHandlers),this.fakeCtor=t}apply(e,t,r){return this.getInstance(r)||this.register(r,Reflect.construct(this.Ctor,r,this.fakeCtor))}construct(e,t,r){return Reflect.construct(e,t,r===this.Ctor?this.fakeCtor:r)}getInstance(e){for(const t of this.caches.keys()){if(!t.every((s,c)=>s===e[c]?!0:typeof s=="object"&&typeof e[c]=="object"?this.isShallowEqualObj(s,e[c]):!1))continue;const r=this.caches.get(t);return r.deref()?f(r.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 r=Object.keys(e),s=t.keys(t);return r.length===s.length&&r.every(c=>e[c]===t[c])}};let a=w;h(a,"prototypeHandlers",{get(e,t,r){const s=k(e,t);if(s)return s;const c=Reflect.get(e,t,r);return typeof t=="symbol"||["constructor","__proto__"].includes(t)||typeof c!="function"?c:function(...m){return c.apply(f(this),m)}}}),i.provide=_,i.subscribe=j,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 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"})});
package/dist/provide.d.ts CHANGED
@@ -1,2 +1,4 @@
1
1
  import { type Ctor } from "./helpers";
2
2
  export declare function provide<T extends Ctor>(Ctor: T): T & ((...args: ConstructorParameters<T>) => InstanceType<T>);
3
+ 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
+ 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,8 +1,8 @@
1
1
  {
2
2
  "name": "@e7w/easy-model",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "一个简单的状态管理包, A simple state management lib for Typescript",
5
- "main": "./dist/index.es.js",
5
+ "main": "./src/index.ts",
6
6
  "module": "./dist/index.es.js",
7
7
  "types": "./src/index.d.ts",
8
8
  "typings": "./dist/index.d.ts",
package/src/index.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export { subscribe } from "./helpers";
2
- export { provide } from "./provide";
2
+ export { provide, extend } from "./provide";
package/src/observe.ts CHANGED
@@ -20,12 +20,18 @@ class ObserveHandler<T extends Obj> implements ProxyHandler<T> {
20
20
  (path: (string | symbol)[]) => void
21
21
  > = {};
22
22
 
23
+ private cachedFns: { [K in keyof T]?: T[K] } = {};
24
+
23
25
  public constructor(private obj: T) {}
24
26
 
25
27
  public get(target: T, p: string | symbol, receiver: any): any {
26
28
  if (p === origin) return this.obj;
27
29
  let ret = safeGet(target, p) || Reflect.get(target, p, receiver);
28
- if (typeof ret === "function") return ret.bind(observe(target));
30
+ if (typeof ret === "function")
31
+ return (
32
+ this.cachedFns[p] ||
33
+ (this.cachedFns[p as keyof T] = ret.bind(observe(target)))
34
+ );
29
35
  if (typeof ret === "object") {
30
36
  ret = observe(ret);
31
37
  track(ret, this.getTrigger(p));
@@ -39,6 +45,7 @@ class ObserveHandler<T extends Obj> implements ProxyHandler<T> {
39
45
  newValue: any,
40
46
  receiver: any
41
47
  ): boolean {
48
+ if (newValue) newValue = getOrigin(newValue);
42
49
  const ret = Reflect.set(target, p, newValue, receiver);
43
50
  trigger(this.obj, [p]);
44
51
  return ret;
package/src/provide.ts CHANGED
@@ -1,12 +1,40 @@
1
1
  import { type Ctor, type Obj, safeGet } from "./helpers";
2
2
  import { observe } from "./observe";
3
3
 
4
+ let creatingTarget: any = null;
5
+
4
6
  export function provide<T extends Ctor>(
5
7
  Ctor: T
6
8
  ): T & ((...args: ConstructorParameters<T>) => InstanceType<T>) {
7
9
  return new Proxy(Ctor, new Provider(Ctor)) as any;
8
10
  }
9
11
 
12
+ // type RequireAtLeastOne<T> = {
13
+ // [K in keyof T]-?: undefined extends T[K]
14
+ // ? never
15
+ // : T[K] extends Function
16
+ // ? never
17
+ // : Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>;
18
+ // }[keyof T];
19
+ // todo: 想办法过滤出所有field
20
+ export function extend<
21
+ T extends ReturnType<typeof provide>,
22
+ P extends Partial<InstanceType<T>>
23
+ >(Provider: T, extendData: P): P & Partial<Omit<InstanceType<T>, keyof P>>;
24
+ export function extend<
25
+ T extends ReturnType<typeof provide>,
26
+ P extends Partial<InstanceType<T>>,
27
+ M extends Parameters<T>
28
+ >(Provider: T, extendData: P, args: M): InstanceType<T>;
29
+ export function extend<
30
+ T extends ReturnType<typeof provide>,
31
+ P extends Partial<InstanceType<T>>,
32
+ M extends Parameters<T> | null | undefined
33
+ >(Provider: T, extendData: P, args?: M) {
34
+ const instance = args ? Provider(...args) : Object.create(Provider.prototype);
35
+ return observe(Object.assign(instance, extendData));
36
+ }
37
+
10
38
  class Provider<T extends Ctor> implements ProxyHandler<T> {
11
39
  private static prototypeHandlers: ProxyHandler<Obj> = {
12
40
  get(target, p, receiver) {
@@ -50,13 +78,15 @@ class Provider<T extends Ctor> implements ProxyHandler<T> {
50
78
  argArray: ConstructorParameters<T>
51
79
  ): InstanceType<T> {
52
80
  // todo: 循环引用创建时抛出错误
53
- return (
81
+ creatingTarget = this.fakeCtor;
82
+ const instance =
54
83
  this.getInstance(argArray) ||
55
84
  this.register(
56
85
  argArray,
57
86
  Reflect.construct(this.Ctor, argArray, this.fakeCtor)
58
- )
59
- );
87
+ );
88
+ creatingTarget = null;
89
+ return instance;
60
90
  }
61
91
 
62
92
  public construct(
@@ -64,16 +94,19 @@ class Provider<T extends Ctor> implements ProxyHandler<T> {
64
94
  argArray: any[],
65
95
  newTarget: any
66
96
  ): InstanceType<T> {
67
- return Reflect.construct(
97
+ const instance = Reflect.construct(
68
98
  target,
69
99
  argArray,
70
100
  newTarget === this.Ctor ? this.fakeCtor : newTarget
71
101
  );
102
+ if (creatingTarget !== newTarget) return observe(instance);
103
+ return instance;
72
104
  }
73
105
 
74
- public getInstance(args: ConstructorParameters<T>): InstanceType<T> | null {
106
+ private getInstance(args: ConstructorParameters<T>): InstanceType<T> | null {
75
107
  for (const cachedArgs of this.caches.keys()) {
76
108
  if (
109
+ cachedArgs.length !== args.length ||
77
110
  !cachedArgs.every((arg, index) =>
78
111
  arg === args[index]
79
112
  ? true
@@ -92,7 +125,7 @@ class Provider<T extends Ctor> implements ProxyHandler<T> {
92
125
  return null;
93
126
  }
94
127
 
95
- public register(
128
+ private register(
96
129
  args: ConstructorParameters<T>,
97
130
  instance: InstanceType<T>
98
131
  ): InstanceType<T> {