valyrian.js 7.2.11 → 7.2.12

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.
Files changed (64) hide show
  1. package/dist/dataset/index.d.ts +2 -2
  2. package/dist/dataset/index.d.ts.map +1 -1
  3. package/dist/dataset/index.js +21 -21
  4. package/dist/dataset/index.js.map +2 -2
  5. package/dist/dataset/index.mjs +22 -22
  6. package/dist/dataset/index.mjs.map +2 -2
  7. package/dist/hooks/index.d.ts.map +1 -1
  8. package/dist/hooks/index.js +17 -32
  9. package/dist/hooks/index.js.map +3 -3
  10. package/dist/hooks/index.mjs +17 -32
  11. package/dist/hooks/index.mjs.map +3 -3
  12. package/dist/index.d.ts +49 -53
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +378 -326
  15. package/dist/index.js.map +3 -3
  16. package/dist/index.min.js +1 -1
  17. package/dist/index.min.js.map +1 -1
  18. package/dist/index.mjs +378 -326
  19. package/dist/index.mjs.map +3 -3
  20. package/dist/node/index.js +101 -78
  21. package/dist/node/index.js.map +2 -2
  22. package/dist/node/index.mjs +101 -78
  23. package/dist/node/index.mjs.map +2 -2
  24. package/dist/node/utils/tree-adapter.d.ts +5 -0
  25. package/dist/node/utils/tree-adapter.d.ts.map +1 -1
  26. package/dist/proxy-signal/index.js +10 -10
  27. package/dist/proxy-signal/index.js.map +2 -2
  28. package/dist/proxy-signal/index.mjs +10 -10
  29. package/dist/proxy-signal/index.mjs.map +2 -2
  30. package/dist/request/index.js +16 -16
  31. package/dist/request/index.js.map +2 -2
  32. package/dist/request/index.mjs +16 -16
  33. package/dist/request/index.mjs.map +2 -2
  34. package/dist/router/index.d.ts.map +1 -1
  35. package/dist/router/index.js +21 -20
  36. package/dist/router/index.js.map +2 -2
  37. package/dist/router/index.mjs +21 -20
  38. package/dist/router/index.mjs.map +2 -2
  39. package/dist/signal/index.d.ts +7 -18
  40. package/dist/signal/index.d.ts.map +1 -1
  41. package/dist/signal/index.js +29 -48
  42. package/dist/signal/index.js.map +3 -3
  43. package/dist/signal/index.mjs +31 -50
  44. package/dist/signal/index.mjs.map +3 -3
  45. package/dist/store/index.js +2 -2
  46. package/dist/store/index.js.map +2 -2
  47. package/dist/store/index.mjs +2 -2
  48. package/dist/store/index.mjs.map +2 -2
  49. package/lib/dataset/index.ts +25 -25
  50. package/lib/hooks/index.ts +25 -54
  51. package/lib/index.ts +465 -715
  52. package/lib/node/index.ts +2 -2
  53. package/lib/node/utils/icons.ts +5 -5
  54. package/lib/node/utils/inline.ts +17 -17
  55. package/lib/node/utils/sw.ts +3 -3
  56. package/lib/node/utils/tree-adapter.ts +81 -52
  57. package/lib/proxy-signal/index.ts +10 -10
  58. package/lib/request/index.ts +16 -16
  59. package/lib/router/index.ts +21 -20
  60. package/lib/signal/index.ts +56 -131
  61. package/lib/store/index.ts +2 -2
  62. package/package.json +10 -3
  63. package/lib/index.d.ts +0 -0
  64. package/lib/interfaces.ts.bak +0 -141
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../lib/store/index.ts"],
4
- "sourcesContent": ["import { update } from \"valyrian.js\";\n\ninterface StoreOptions {\n state?: Record<string, unknown> | (() => Record<string, unknown>);\n getters?: Record<string, Function>;\n mutations?: Record<string, Function>;\n actions?: Record<string, Function>;\n}\n\ninterface StoreInstance {\n // eslint-disable-next-line no-unused-vars\n new (options: StoreOptions): StoreInstance;\n state: Record<string, any>;\n getters?: Record<string, any>;\n // eslint-disable-next-line no-unused-vars\n commit: (type: string, ...payload: any[]) => void;\n // eslint-disable-next-line no-unused-vars\n dispatch: (type: string, ...payload: any[]) => void;\n}\n\nfunction keyExists(typeOfKey: string, object: Record<string, unknown>, key: string) {\n if (key in object === false) {\n throw new Error(`The ${typeOfKey} \"${key}\" does not exists.`);\n }\n}\n\nfunction deepFreeze(obj: any) {\n if (typeof obj === \"object\" && obj !== null && !Object.isFrozen(obj)) {\n if (Array.isArray(obj)) {\n for (let i = 0, l = obj.length; i < l; i++) {\n deepFreeze(obj[i]);\n }\n } else {\n let props = Reflect.ownKeys(obj);\n for (let i = 0, l = props.length; i < l; i++) {\n deepFreeze(obj[props[i]]);\n }\n }\n Object.freeze(obj);\n }\n\n return obj;\n}\n\nlet updateTimeout: any;\nfunction delayedUpdate() {\n clearTimeout(updateTimeout);\n updateTimeout = setTimeout(update);\n}\n\nexport const Store = function Store(\n this: StoreInstance,\n { state = {}, getters = {}, actions = {}, mutations = {} }: StoreOptions = {}\n) {\n let frozen = true;\n\n function isUnfrozen() {\n if (frozen) {\n throw new Error(\"You need to commit a mutation to change the state\");\n }\n }\n\n let localState = typeof state === \"function\" ? state() : state;\n\n this.state = new Proxy(localState || {}, {\n get: (state, prop: string) => deepFreeze(state[prop]),\n set: (state, prop: string, value: any) => {\n isUnfrozen();\n state[prop] = value;\n return true;\n },\n deleteProperty: (state, prop: string) => {\n isUnfrozen();\n Reflect.deleteProperty(state, prop);\n return true;\n }\n });\n\n this.getters = new Proxy(getters, {\n get: (getters, getter: string) => {\n try {\n return getters[getter](this.state, this.getters);\n } catch (e) {\n // Getters should fail silently\n }\n }\n });\n\n this.commit = (mutation, ...args) => {\n keyExists(\"mutation\", mutations, mutation);\n frozen = false;\n mutations[mutation](this.state, ...args);\n frozen = true;\n delayedUpdate();\n };\n\n this.dispatch = (action, ...args) => {\n keyExists(\"action\", actions, action);\n return Promise.resolve(actions[action](this, ...args));\n };\n} as unknown as StoreInstance;\n"],
5
- "mappings": ";AAAA,SAAS,cAAc;AAoBvB,SAAS,UAAU,WAAmB,QAAiC,KAAa;AAClF,MAAI,OAAO,WAAW,OAAO;AAC3B,UAAM,IAAI,MAAM,OAAO,SAAS,KAAK,GAAG,oBAAoB;AAAA,EAC9D;AACF;AAEA,SAAS,WAAW,KAAU;AAC5B,MAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,OAAO,SAAS,GAAG,GAAG;AACpE,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAI,GAAG,KAAK;AAC1C,mBAAW,IAAI,CAAC,CAAC;AAAA,MACnB;AAAA,IACF,OAAO;AACL,UAAI,QAAQ,QAAQ,QAAQ,GAAG;AAC/B,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAK;AAC5C,mBAAW,IAAI,MAAM,CAAC,CAAC,CAAC;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,OAAO,GAAG;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,IAAI;AACJ,SAAS,gBAAgB;AACvB,eAAa,aAAa;AAC1B,kBAAgB,WAAW,MAAM;AACnC;AAEO,IAAM,QAAQ,SAASA,OAE5B,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,YAAY,CAAC,EAAE,IAAkB,CAAC,GAC5E;AACA,MAAI,SAAS;AAEb,WAAS,aAAa;AACpB,QAAI,QAAQ;AACV,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAAA,EACF;AAEA,MAAI,aAAa,OAAO,UAAU,aAAa,MAAM,IAAI;AAEzD,OAAK,QAAQ,IAAI,MAAM,cAAc,CAAC,GAAG;AAAA,IACvC,KAAK,CAACC,QAAO,SAAiB,WAAWA,OAAM,IAAI,CAAC;AAAA,IACpD,KAAK,CAACA,QAAO,MAAc,UAAe;AACxC,iBAAW;AACX,MAAAA,OAAM,IAAI,IAAI;AACd,aAAO;AAAA,IACT;AAAA,IACA,gBAAgB,CAACA,QAAO,SAAiB;AACvC,iBAAW;AACX,cAAQ,eAAeA,QAAO,IAAI;AAClC,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,OAAK,UAAU,IAAI,MAAM,SAAS;AAAA,IAChC,KAAK,CAACC,UAAS,WAAmB;AAChC,UAAI;AACF,eAAOA,SAAQ,MAAM,EAAE,KAAK,OAAO,KAAK,OAAO;AAAA,MACjD,SAAS,GAAG;AAAA,MAEZ;AAAA,IACF;AAAA,EACF,CAAC;AAED,OAAK,SAAS,CAAC,aAAa,SAAS;AACnC,cAAU,YAAY,WAAW,QAAQ;AACzC,aAAS;AACT,cAAU,QAAQ,EAAE,KAAK,OAAO,GAAG,IAAI;AACvC,aAAS;AACT,kBAAc;AAAA,EAChB;AAEA,OAAK,WAAW,CAAC,WAAW,SAAS;AACnC,cAAU,UAAU,SAAS,MAAM;AACnC,WAAO,QAAQ,QAAQ,QAAQ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;AAAA,EACvD;AACF;",
4
+ "sourcesContent": ["import { update } from \"valyrian.js\";\n\ninterface StoreOptions {\n state?: Record<string, unknown> | (() => Record<string, unknown>);\n getters?: Record<string, Function>;\n mutations?: Record<string, Function>;\n actions?: Record<string, Function>;\n}\n\ninterface StoreInstance {\n // eslint-disable-next-line no-unused-vars\n new (options: StoreOptions): StoreInstance;\n state: Record<string, any>;\n getters?: Record<string, any>;\n // eslint-disable-next-line no-unused-vars\n commit: (type: string, ...payload: any[]) => void;\n // eslint-disable-next-line no-unused-vars\n dispatch: (type: string, ...payload: any[]) => void;\n}\n\nfunction keyExists(typeOfKey: string, object: Record<string, unknown>, key: string) {\n if (key in object === false) {\n throw new Error(`The ${typeOfKey} \"${key}\" does not exists.`);\n }\n}\n\nfunction deepFreeze(obj: any) {\n if (typeof obj === \"object\" && obj !== null && !Object.isFrozen(obj)) {\n if (Array.isArray(obj)) {\n for (let i = 0, l = obj.length; i < l; i++) {\n deepFreeze(obj[i]);\n }\n } else {\n const props = Reflect.ownKeys(obj);\n for (let i = 0, l = props.length; i < l; i++) {\n deepFreeze(obj[props[i]]);\n }\n }\n Object.freeze(obj);\n }\n\n return obj;\n}\n\nlet updateTimeout: any;\nfunction delayedUpdate() {\n clearTimeout(updateTimeout);\n updateTimeout = setTimeout(update);\n}\n\nexport const Store = function Store(\n this: StoreInstance,\n { state = {}, getters = {}, actions = {}, mutations = {} }: StoreOptions = {}\n) {\n let frozen = true;\n\n function isUnfrozen() {\n if (frozen) {\n throw new Error(\"You need to commit a mutation to change the state\");\n }\n }\n\n const localState = typeof state === \"function\" ? state() : state;\n\n this.state = new Proxy(localState || {}, {\n get: (state, prop: string) => deepFreeze(state[prop]),\n set: (state, prop: string, value: any) => {\n isUnfrozen();\n state[prop] = value;\n return true;\n },\n deleteProperty: (state, prop: string) => {\n isUnfrozen();\n Reflect.deleteProperty(state, prop);\n return true;\n }\n });\n\n this.getters = new Proxy(getters, {\n get: (getters, getter: string) => {\n try {\n return getters[getter](this.state, this.getters);\n } catch (e) {\n // Getters should fail silently\n }\n }\n });\n\n this.commit = (mutation, ...args) => {\n keyExists(\"mutation\", mutations, mutation);\n frozen = false;\n mutations[mutation](this.state, ...args);\n frozen = true;\n delayedUpdate();\n };\n\n this.dispatch = (action, ...args) => {\n keyExists(\"action\", actions, action);\n return Promise.resolve(actions[action](this, ...args));\n };\n} as unknown as StoreInstance;\n"],
5
+ "mappings": ";AAAA,SAAS,cAAc;AAoBvB,SAAS,UAAU,WAAmB,QAAiC,KAAa;AAClF,MAAI,OAAO,WAAW,OAAO;AAC3B,UAAM,IAAI,MAAM,OAAO,SAAS,KAAK,GAAG,oBAAoB;AAAA,EAC9D;AACF;AAEA,SAAS,WAAW,KAAU;AAC5B,MAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,OAAO,SAAS,GAAG,GAAG;AACpE,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAI,GAAG,KAAK;AAC1C,mBAAW,IAAI,CAAC,CAAC;AAAA,MACnB;AAAA,IACF,OAAO;AACL,YAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAK;AAC5C,mBAAW,IAAI,MAAM,CAAC,CAAC,CAAC;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,OAAO,GAAG;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,IAAI;AACJ,SAAS,gBAAgB;AACvB,eAAa,aAAa;AAC1B,kBAAgB,WAAW,MAAM;AACnC;AAEO,IAAM,QAAQ,SAASA,OAE5B,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,YAAY,CAAC,EAAE,IAAkB,CAAC,GAC5E;AACA,MAAI,SAAS;AAEb,WAAS,aAAa;AACpB,QAAI,QAAQ;AACV,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,aAAa,OAAO,UAAU,aAAa,MAAM,IAAI;AAE3D,OAAK,QAAQ,IAAI,MAAM,cAAc,CAAC,GAAG;AAAA,IACvC,KAAK,CAACC,QAAO,SAAiB,WAAWA,OAAM,IAAI,CAAC;AAAA,IACpD,KAAK,CAACA,QAAO,MAAc,UAAe;AACxC,iBAAW;AACX,MAAAA,OAAM,IAAI,IAAI;AACd,aAAO;AAAA,IACT;AAAA,IACA,gBAAgB,CAACA,QAAO,SAAiB;AACvC,iBAAW;AACX,cAAQ,eAAeA,QAAO,IAAI;AAClC,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,OAAK,UAAU,IAAI,MAAM,SAAS;AAAA,IAChC,KAAK,CAACC,UAAS,WAAmB;AAChC,UAAI;AACF,eAAOA,SAAQ,MAAM,EAAE,KAAK,OAAO,KAAK,OAAO;AAAA,MACjD,SAAS,GAAG;AAAA,MAEZ;AAAA,IACF;AAAA,EACF,CAAC;AAED,OAAK,SAAS,CAAC,aAAa,SAAS;AACnC,cAAU,YAAY,WAAW,QAAQ;AACzC,aAAS;AACT,cAAU,QAAQ,EAAE,KAAK,OAAO,GAAG,IAAI;AACvC,aAAS;AACT,kBAAc;AAAA,EAChB;AAEA,OAAK,WAAW,CAAC,WAAW,SAAS;AACnC,cAAU,UAAU,SAAS,MAAM;AACnC,WAAO,QAAQ,QAAQ,QAAQ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;AAAA,EACvD;AACF;",
6
6
  "names": ["Store", "state", "getters"]
7
7
  }
@@ -1,4 +1,4 @@
1
- import { VnodeInterface, VnodeWithDom, createDomElement, directive, patch, updateAttributes } from "valyrian.js";
1
+ import { VnodeWithDom, createElement, directive, patch, updateAttributes } from "valyrian.js";
2
2
 
3
3
  interface DataSetInterface<T> {
4
4
  data: T[];
@@ -13,7 +13,7 @@ interface DataSetInterface<T> {
13
13
  }
14
14
  interface DataSetHandler<T> {
15
15
  // eslint-disable-next-line no-unused-vars
16
- (data: T, index: number): VnodeInterface;
16
+ (data: T, index: number): VnodeWithDom;
17
17
  }
18
18
 
19
19
  function deepFreeze(obj: any) {
@@ -23,7 +23,7 @@ function deepFreeze(obj: any) {
23
23
  deepFreeze(obj[i]);
24
24
  }
25
25
  } else {
26
- let props = Reflect.ownKeys(obj);
26
+ const props = Reflect.ownKeys(obj);
27
27
  for (let i = 0, l = props.length; i < l; i++) {
28
28
  deepFreeze(obj[props[i]]);
29
29
  }
@@ -90,8 +90,8 @@ export class DataSet<T> implements DataSetInterface<T> {
90
90
  return;
91
91
  }
92
92
 
93
- let vnode = this.#vnode;
94
- let handler = this.#handler;
93
+ const vnode = this.#vnode;
94
+ const handler = this.#handler;
95
95
 
96
96
  if (data.length === 0) {
97
97
  vnode.children = [];
@@ -99,24 +99,24 @@ export class DataSet<T> implements DataSetInterface<T> {
99
99
  return;
100
100
  }
101
101
 
102
- let childrenLength = vnode.children.length;
102
+ const childrenLength = vnode.children.length;
103
103
  for (let i = 0, l = data.length; i < l; i++) {
104
- let child = handler(this.data[i], i);
104
+ const child = handler(this.data[i], i);
105
105
 
106
106
  if (i < childrenLength) {
107
- let oldChild = vnode.children[i];
107
+ const oldChild = vnode.children[i];
108
108
  child.isSVG = oldChild.isSVG;
109
109
  child.dom = oldChild.dom;
110
- updateAttributes(child as VnodeWithDom, oldChild);
110
+ updateAttributes(child as VnodeWithDom, null);
111
111
  vnode.children[i] = child;
112
- patch(child as VnodeWithDom, oldChild);
112
+ patch(child as VnodeWithDom);
113
113
  continue;
114
114
  }
115
115
 
116
116
  child.isSVG = vnode.isSVG || child.tag === "svg";
117
- child.dom = createDomElement(child.tag as string, child.isSVG);
117
+ child.dom = createElement(child.tag as string, child.isSVG);
118
118
  vnode.dom.appendChild(child.dom);
119
- updateAttributes(child as VnodeWithDom);
119
+ updateAttributes(child as VnodeWithDom, null);
120
120
  vnode.children.push(child);
121
121
  patch(child as VnodeWithDom);
122
122
  }
@@ -129,7 +129,7 @@ export class DataSet<T> implements DataSetInterface<T> {
129
129
 
130
130
  add(...data: T[]) {
131
131
  if (this.#data) {
132
- let oldLength = this.#data.length;
132
+ const oldLength = this.#data.length;
133
133
  if (this.#isFrozen) {
134
134
  this.#setData([...this.#data, ...data]);
135
135
  } else {
@@ -140,15 +140,15 @@ export class DataSet<T> implements DataSetInterface<T> {
140
140
  return;
141
141
  }
142
142
 
143
- let vnode = this.#vnode;
144
- let handler = this.#handler;
143
+ const vnode = this.#vnode;
144
+ const handler = this.#handler;
145
145
 
146
146
  for (let i = 0, ii = oldLength, l = data.length; i < l; i++, ii++) {
147
- let child = handler(this.#data[i], ii);
147
+ const child = handler(this.#data[i], ii);
148
148
  child.isSVG = vnode.isSVG || child.tag === "svg";
149
- child.dom = createDomElement(child.tag as string, child.isSVG);
149
+ child.dom = createElement(child.tag as string, child.isSVG);
150
150
  vnode.dom.appendChild(child.dom);
151
- updateAttributes(child as VnodeWithDom);
151
+ updateAttributes(child as VnodeWithDom, null);
152
152
  vnode.children.push(child);
153
153
  patch(child as VnodeWithDom);
154
154
  }
@@ -157,7 +157,7 @@ export class DataSet<T> implements DataSetInterface<T> {
157
157
 
158
158
  delete(index: number) {
159
159
  if (this.#data && this.#vnode) {
160
- let child = this.#vnode.children[index];
160
+ const child = this.#vnode.children[index];
161
161
  if (this.#isFrozen) {
162
162
  this.#setData(this.data.filter((_, i) => i !== index));
163
163
  } else {
@@ -171,23 +171,23 @@ export class DataSet<T> implements DataSetInterface<T> {
171
171
 
172
172
  update(index: number, item: Partial<T>) {
173
173
  if (this.#data && this.#vnode && this.#handler) {
174
- let child = this.#vnode.children[index];
174
+ const child = this.#vnode.children[index];
175
175
  if (this.#isFrozen) {
176
176
  this.#setData(this.#data.map((d, i) => (i === index ? { ...d, ...item } : d)));
177
177
  } else {
178
178
  this.#data[index] = { ...this.#data[index], ...item };
179
179
  }
180
- let newChild = this.#handler(this.#data[index], index);
180
+ const newChild = this.#handler(this.#data[index], index);
181
181
  newChild.isSVG = this.#vnode.isSVG || newChild.tag === "svg";
182
182
  newChild.dom = child.dom;
183
183
  this.#vnode.children[index] = newChild;
184
- updateAttributes(newChild as VnodeWithDom, child);
185
- patch(newChild as VnodeWithDom, child);
184
+ updateAttributes(newChild as VnodeWithDom, null);
185
+ patch(newChild as VnodeWithDom);
186
186
  }
187
187
  }
188
188
  }
189
189
 
190
- directive("with-dataset", (dataSet, vnode) => {
191
- dataSet.setVnodeAndHandler(vnode as VnodeWithDom, vnode.children[0]);
190
+ directive("with-dataset", (dataSet: DataSet<any>, vnode: VnodeWithDom) => {
191
+ dataSet.setVnodeAndHandler(vnode, vnode.children[0]);
192
192
  return false;
193
193
  });
@@ -1,10 +1,4 @@
1
- import { Component, POJOComponent, VnodeWithDom, current, directive, onCleanup, onUnmount, update } from "valyrian.js";
2
-
3
- interface CurrentOnPatch {
4
- component: Component | POJOComponent;
5
- vnode: VnodeWithDom;
6
- oldVnode: VnodeWithDom;
7
- }
1
+ import { Component, POJOComponent, current, directive, onCleanup, onUnmount, update } from "valyrian.js";
8
2
 
9
3
  export type Hook = any;
10
4
 
@@ -26,6 +20,13 @@ export interface CreateHook {
26
20
  (HookDefinition: HookDefinition): (...args: any[]) => any;
27
21
  }
28
22
 
23
+ type HookCalls = {
24
+ hooks: Hook[];
25
+ hook_calls: number;
26
+ };
27
+
28
+ const componentToHooksWeakMap = new WeakMap<Component | POJOComponent, HookCalls>();
29
+
29
30
  export const createHook = function createHook({
30
31
  onCreate,
31
32
  onUpdate: onUpdateHook,
@@ -34,62 +35,33 @@ export const createHook = function createHook({
34
35
  returnValue
35
36
  }: HookDefinition): Hook {
36
37
  return (...args: any[]) => {
37
- let { component, vnode } = current as CurrentOnPatch;
38
-
38
+ const component = current.component as Component | POJOComponent;
39
39
  let hook: any = null;
40
40
 
41
- if (vnode) {
42
- // Init the components array for the current vnode
43
- if (!vnode.components) {
44
- vnode.components = [];
45
- }
41
+ if (componentToHooksWeakMap.has(component) === false) {
42
+ const HookCalls = { hooks: [], hook_calls: -1 };
43
+ componentToHooksWeakMap.set(component, HookCalls);
44
+ onUnmount(() => componentToHooksWeakMap.delete(component));
45
+ }
46
46
 
47
- if (vnode.components.indexOf(component) === -1) {
48
- vnode.hook_calls = -1;
49
- vnode.components.push(component);
50
- if (!component.hooks) {
51
- component.hooks = [];
52
- onUnmount(() => Reflect.deleteProperty(component, "hooks"));
53
- }
54
- }
47
+ const HookCalls = componentToHooksWeakMap.get(component) as HookCalls;
48
+ onCleanup(() => (HookCalls.hook_calls = -1));
49
+
50
+ hook = HookCalls.hooks[++HookCalls.hook_calls];
55
51
 
56
- hook = component.hooks[++vnode.hook_calls];
52
+ if (hook) {
53
+ onUpdateHook && onUpdateHook(hook, ...args);
57
54
  }
58
55
 
59
56
  // If the hook doesn't exist, create it
60
57
  if (!hook) {
61
- // create a new hook
62
58
  hook = onCreate(...args);
63
-
64
- if (vnode) {
65
- // Add the hook to the component
66
- component.hooks.push(hook);
67
- }
68
-
69
- // if we have a onRemove hook, add it to the onUnmount set
70
- if (onRemove) {
71
- // Add the hook to the onRemove array
72
- onUnmount(() => onRemove(hook));
73
- }
74
- } else {
75
- if (onUpdateHook) {
76
- onUpdateHook(hook, ...args);
77
- }
59
+ HookCalls.hooks.push(hook);
60
+ onRemove && onUnmount(() => onRemove(hook));
78
61
  }
79
62
 
80
- // If we have an onCleanup function, add it to the cleanup set
81
- if (onCleanupHook) {
82
- // Add the hook to the onCleanup set
83
- onCleanup(() => onCleanupHook(hook));
84
- }
85
-
86
- // If we have a returnValue function, call it and return the result instead of the hook
87
- if (returnValue) {
88
- return returnValue(hook);
89
- }
90
-
91
- // Return the hook
92
- return hook;
63
+ onCleanupHook && onCleanup(() => onCleanupHook(hook));
64
+ return returnValue ? returnValue(hook) : hook;
93
65
  };
94
66
  } as unknown as CreateHook;
95
67
 
@@ -110,7 +82,6 @@ export const useState = createHook({
110
82
  get.toString = () => `${value}`;
111
83
 
112
84
  function set(newValue: any) {
113
- // Prevent default event if it exists
114
85
  if (current.event) {
115
86
  current.event.preventDefault();
116
87
  }
@@ -129,7 +100,7 @@ export const useState = createHook({
129
100
  // Effect hook
130
101
  export const useEffect = createHook({
131
102
  onCreate: (effect: Function, changes: any[]) => {
132
- let hook: {
103
+ const hook: {
133
104
  effect: Function;
134
105
  prev: any[];
135
106
  onRemove?: Function;