react-shared-states 2.0.1 → 2.1.2

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.
@@ -3,7 +3,9 @@ export declare const staticStores: SharedCreated[];
3
3
  export declare class SharedValuesManager<T> {
4
4
  protected defaultValue: () => T;
5
5
  data: Map<string, SharedValue<T>>;
6
+ static INSTANCES: Map<string, SharedValuesManager<any>>;
6
7
  constructor(defaultValue?: () => T);
8
+ static getInstance<T>(instanceKey: string, defaultValue?: () => T): SharedValuesManager<T>;
7
9
  addListener(key: string, prefix: Prefix, listener: AFunction): void;
8
10
  removeListener(key: string, prefix: Prefix, listener: AFunction): void;
9
11
  callListeners(key: string, prefix: Prefix): void;
@@ -5,8 +5,8 @@ export interface SharedStateCreated<T> extends SharedCreated {
5
5
  initialValue: T;
6
6
  }
7
7
  export declare const createSharedState: <T>(initialValue: T, scopeName?: Prefix) => SharedStateCreated<T>;
8
- export declare function useSharedState<T, S extends string>(key: S, initialValue: T, scopeName?: Prefix): readonly [T, (v: T | ((prev: T) => T)) => void];
8
+ export declare function useSharedState<T>(key: string, initialValue: T, scopeName?: Prefix): readonly [T, (v: T | ((prev: T) => T)) => void];
9
9
  export declare function useSharedState<T>(sharedStateCreated: SharedStateCreated<T>): readonly [T, (v: T | ((prev: T) => T)) => void];
10
10
  export type SharedStateSelector<S, T = S> = (original: S) => T;
11
- export declare function useSharedStateSelector<T, S extends string, R>(key: S, selector: SharedStateSelector<T, R>, scopeName?: Prefix): Readonly<R>;
11
+ export declare function useSharedStateSelector<T, R = T>(key: string, selector: SharedStateSelector<T, R>, scopeName?: Prefix): Readonly<R>;
12
12
  export declare function useSharedStateSelector<T, R>(sharedStateCreated: SharedStateCreated<T>, selector: SharedStateSelector<T, R>): Readonly<R>;
package/dist/main.esm.js CHANGED
@@ -1,323 +1,336 @@
1
1
  /*!
2
- * react-shared-states v2.0.1
2
+ * react-shared-states v2.1.2
3
3
  * (c) Hichem Taboukouyout
4
4
  * Released under the MIT License.
5
5
  * Github: github.com/HichemTab-tech/react-shared-states
6
6
  */
7
7
 
8
- import { jsx as M } from "react/jsx-runtime";
9
- import { createContext as T, useMemo as b, useContext as W, useEffect as P, useSyncExternalStore as _, useRef as k } from "react";
10
- let z = !1;
11
- const Z = (o) => {
12
- z = o;
13
- }, K = (...o) => {
14
- z && console.log(
8
+ import { jsx as V } from "react/jsx-runtime";
9
+ import { createContext as W, useMemo as b, useContext as Y, useEffect as I, useSyncExternalStore as j, useRef as k } from "react";
10
+ let B = !1;
11
+ const ee = (a) => {
12
+ B = a;
13
+ }, K = (...a) => {
14
+ B && console.log(
15
15
  "%c[react-shared-states]",
16
16
  "color: #007acc; font-weight: bold",
17
- ...o
17
+ ...a
18
18
  );
19
- }, E = (o) => {
20
- if (!o) throw new Error("Value is empty");
21
- return o;
22
- }, G = () => Math.random().toString(36).substring(2, 15), I = T(void 0), N = ({ children: o, scopeName: t }) => {
19
+ }, w = (a) => {
20
+ if (!a) throw new Error("Value is empty");
21
+ return a;
22
+ }, G = () => Math.random().toString(36).substring(2, 15), z = W(void 0), te = ({ children: a, scopeName: t }) => {
23
23
  if (t && t.includes("//")) throw new Error("scopeName cannot contain '//'");
24
- return t || (t = b(() => G(), [])), /* @__PURE__ */ M(I.Provider, { value: { scopeName: t }, children: o });
25
- }, H = () => W(I), B = [];
24
+ return t || (t = b(() => G(), [])), /* @__PURE__ */ V(z.Provider, { value: { scopeName: t }, children: a });
25
+ }, H = () => Y(z), $ = [], D = /* @__PURE__ */ Symbol.for("react-shared-states.manager");
26
+ function J(a, t = () => null) {
27
+ const s = globalThis;
28
+ return s[D] || (s[D] = {}), s[D][a] || (s[D][a] = new l(t)), s[D][a];
29
+ }
26
30
  class l {
27
31
  constructor(t = () => null) {
28
32
  this.defaultValue = t;
29
33
  }
30
34
  data = /* @__PURE__ */ new Map();
31
- addListener(t, n, e) {
32
- const i = l.prefix(t, n), r = this.data.get(i);
35
+ static INSTANCES = /* @__PURE__ */ new Map();
36
+ static getInstance(t, s = () => null) {
37
+ return J(t, s);
38
+ }
39
+ addListener(t, s, e) {
40
+ const i = l.prefix(t, s), r = this.data.get(i);
33
41
  r && r.listeners.push(e);
34
42
  }
35
- removeListener(t, n, e) {
36
- const i = l.prefix(t, n), r = this.data.get(i);
37
- r && (r.listeners = r.listeners.filter((s) => s !== e));
43
+ removeListener(t, s, e) {
44
+ const i = l.prefix(t, s), r = this.data.get(i);
45
+ r && (r.listeners = r.listeners.filter((n) => n !== e));
38
46
  }
39
- callListeners(t, n) {
40
- const e = l.prefix(t, n), i = this.data.get(e);
47
+ callListeners(t, s) {
48
+ const e = l.prefix(t, s), i = this.data.get(e);
41
49
  i && i.listeners.forEach((r) => r());
42
50
  }
43
- init(t, n, e, i = !1) {
44
- const r = l.prefix(t, n);
51
+ init(t, s, e, i = !1) {
52
+ const r = l.prefix(t, s);
45
53
  this.data.has(r) || this.data.set(r, {
46
54
  value: e,
47
55
  isStatic: i || void 0,
48
56
  listeners: []
49
57
  });
50
58
  }
51
- createStatic(t, n, e) {
59
+ createStatic(t, s, e) {
52
60
  const i = e ?? "_global", r = {
53
61
  key: G(),
54
62
  prefix: i,
55
63
  ...t
56
64
  };
57
- return B.push(r), this.init(r.key, r.prefix, n, !0), this.defaultValue = () => n, r;
65
+ return $.push(r), this.init(r.key, r.prefix, s, !0), this.defaultValue = () => s, r;
58
66
  }
59
67
  initStatic(t) {
60
- const { key: n, prefix: e } = t;
61
- this.init(n, e, this.defaultValue(), !0);
68
+ const { key: s, prefix: e } = t;
69
+ this.init(s, e, this.defaultValue(), !0);
62
70
  }
63
- clearAll(t = !1, n = !1) {
71
+ clearAll(t = !1, s = !1) {
64
72
  this.data.forEach((e, i) => {
65
- const [r, s] = l.extractPrefix(i);
66
- this.clear(s, r, t, n);
73
+ const [r, n] = l.extractPrefix(i);
74
+ this.clear(n, r, t, s);
67
75
  });
68
76
  }
69
- clear(t, n, e = !1, i = !1) {
70
- const r = l.prefix(t, n);
71
- e || this.callListeners(t, n);
72
- const s = this.data.get(r);
73
- if (s && (this.data.delete(r), s.isStatic && !i)) {
74
- const a = B.find((c) => c.key === t && c.prefix === n);
75
- a && this.initStatic(a);
77
+ clear(t, s, e = !1, i = !1) {
78
+ const r = l.prefix(t, s);
79
+ e || this.callListeners(t, s);
80
+ const n = this.data.get(r);
81
+ if (n && (this.data.delete(r), n.isStatic && !i)) {
82
+ const o = $.find((c) => c.key === t && c.prefix === s);
83
+ o && this.initStatic(o);
76
84
  }
77
85
  }
78
- get(t, n) {
79
- let e = this.has(t, n);
86
+ get(t, s) {
87
+ let e = this.has(t, s);
80
88
  if (e)
81
89
  return this.data.get(e);
82
90
  }
83
- setValue(t, n, e) {
84
- const i = l.prefix(t, n), r = this.data.get(i);
91
+ setValue(t, s, e) {
92
+ const i = l.prefix(t, s), r = this.data.get(i);
85
93
  r && (r.value = e, this.data.set(i, r));
86
94
  }
87
- has(t, n) {
88
- return this.data.has(l.prefix(t, n)) ? l.prefix(t, n) : this.data.has(l.prefix(t, "_global")) ? l.prefix(t, "_global") : void 0;
95
+ has(t, s) {
96
+ return this.data.has(l.prefix(t, s)) ? l.prefix(t, s) : this.data.has(l.prefix(t, "_global")) ? l.prefix(t, "_global") : void 0;
89
97
  }
90
- static prefix(t, n) {
98
+ static prefix(t, s) {
91
99
  if (t.includes("//")) throw new Error("key cannot contain '//'");
92
- return `${n}//${t}`;
100
+ return `${s}//${t}`;
93
101
  }
94
102
  static extractPrefix(t) {
95
- const n = t.split("//");
96
- return [n[0], n.slice(1).join("//")];
103
+ const s = t.split("//");
104
+ return [s[0], s.slice(1).join("//")];
97
105
  }
98
- useEffect(t, n, e = null) {
99
- P(() => () => {
100
- e?.(), K(`[${l.prefix(t, n)}]`, "unmount effect");
101
- const i = this.get(t, n);
102
- i && i.listeners?.length === 0 && this.clear(t, n);
103
- }, [t, n]);
106
+ useEffect(t, s, e = null) {
107
+ I(() => () => {
108
+ e?.(), K(`[${l.prefix(t, s)}]`, "unmount effect");
109
+ const i = this.get(t, s);
110
+ i && i.listeners?.length === 0 && this.clear(t, s);
111
+ }, [t, s]);
104
112
  }
105
113
  }
106
- class q {
114
+ class R {
107
115
  constructor(t) {
108
116
  this.sharedData = t;
109
117
  }
110
- _get(t, n) {
111
- let e, i = n;
118
+ _get(t, s) {
119
+ let e, i = s;
112
120
  if (typeof t != "string") {
113
- const { key: a, prefix: c } = t;
114
- e = a, i = c;
121
+ const { key: o, prefix: c } = t;
122
+ e = o, i = c;
115
123
  } else
116
- e = E(t);
117
- const r = i || "_global", s = this.sharedData.get(e, r);
118
- return s ? { value: s.value, key: e, prefix: r } : {
124
+ e = w(t);
125
+ const r = i || "_global", n = this.sharedData.get(e, r);
126
+ return n ? { value: n.value, key: e, prefix: r } : {
119
127
  key: e,
120
128
  prefix: r,
121
129
  value: void 0
122
130
  };
123
131
  }
124
- get(t, n) {
125
- return this._get(t, n).value;
132
+ get(t, s) {
133
+ return this._get(t, s).value;
126
134
  }
127
- set(t, n, e) {
135
+ set(t, s, e) {
128
136
  let i, r = e;
129
137
  if (typeof t != "string") {
130
- const { key: a, prefix: c } = t;
131
- i = a, r = c;
138
+ const { key: o, prefix: c } = t;
139
+ i = o, r = c;
132
140
  } else
133
- i = E(t);
134
- const s = r || "_global";
135
- this.sharedData.init(i, s, n), this.sharedData.setValue(i, s, n), this.sharedData.callListeners(i, s);
141
+ i = w(t);
142
+ const n = r || "_global";
143
+ this.sharedData.init(i, n, s), this.sharedData.setValue(i, n, s), this.sharedData.callListeners(i, n);
136
144
  }
137
- update(t, n, e) {
145
+ update(t, s, e) {
138
146
  const i = this._get(t, e);
139
147
  if (i) {
140
- const r = n(i.value);
148
+ const r = s(i.value);
141
149
  this.set(i.key, r, i.prefix);
142
150
  }
143
151
  }
152
+ // noinspection JSUnusedGlobalSymbols
144
153
  clearAll() {
145
154
  this.sharedData.clearAll();
146
155
  }
156
+ // noinspection JSUnusedGlobalSymbols
147
157
  clearScope(t) {
148
- const n = t || "_global";
158
+ const s = t || "_global";
149
159
  this.sharedData.data.forEach((e, i) => {
150
- const [r, s] = l.extractPrefix(i);
151
- r === n && (this.sharedData.clear(s, r), this.sharedData.callListeners(s, r));
160
+ const [r, n] = l.extractPrefix(i);
161
+ r === s && (this.sharedData.clear(n, r), this.sharedData.callListeners(n, r));
152
162
  });
153
163
  }
164
+ // noinspection JSUnusedGlobalSymbols
154
165
  resolve(t) {
155
- const { key: n, prefix: e } = t;
156
- return this.get(n, e);
166
+ const { key: s, prefix: e } = t;
167
+ return this.get(s, e);
157
168
  }
158
- clear(t, n) {
169
+ clear(t, s) {
159
170
  let e, i;
160
- typeof t == "string" ? (e = t, i = n || "_global") : (e = t.key, i = t.prefix), this.sharedData.clear(e, i);
171
+ typeof t == "string" ? (e = t, i = s || "_global") : (e = t.key, i = t.prefix), this.sharedData.clear(e, i);
161
172
  }
162
- has(t, n = "_global") {
163
- const e = n || "_global";
173
+ // noinspection JSUnusedGlobalSymbols
174
+ has(t, s = "_global") {
175
+ const e = s || "_global";
164
176
  return !!this.sharedData.has(t, e);
165
177
  }
178
+ // noinspection JSUnusedGlobalSymbols
166
179
  getAll() {
167
180
  const t = {};
168
- return this.sharedData.data.forEach((n, e) => {
181
+ return this.sharedData.data.forEach((s, e) => {
169
182
  const [i, r] = l.extractPrefix(e);
170
- t[i] = t[i] || {}, t[i][r] = n.value;
183
+ t[i] = t[i] || {}, t[i][r] = s.value;
171
184
  }), t;
172
185
  }
173
- subscribe(t, n, e) {
186
+ subscribe(t, s, e) {
174
187
  let i, r;
175
- return typeof t == "string" ? (i = t, r = e || "_global") : (i = t.key, r = t.prefix), this.sharedData.addListener(i, r, n), () => {
176
- this.sharedData.removeListener(i, r, n);
188
+ return typeof t == "string" ? (i = t, r = e || "_global") : (i = t.key, r = t.prefix), this.sharedData.addListener(i, r, s), () => {
189
+ this.sharedData.removeListener(i, r, s);
177
190
  };
178
191
  }
179
192
  }
180
- const j = (o) => {
193
+ const C = (a) => {
181
194
  const t = H();
182
195
  return {
183
- prefix: o ?? t?.scopeName ?? "_global"
196
+ prefix: a ?? t?.scopeName ?? "_global"
184
197
  };
185
198
  };
186
- function J(o) {
187
- return o && o.__esModule && Object.prototype.hasOwnProperty.call(o, "default") ? o.default : o;
199
+ function N(a) {
200
+ return a && a.__esModule && Object.prototype.hasOwnProperty.call(a, "default") ? a.default : a;
188
201
  }
189
- var C, R;
202
+ var F, q;
190
203
  function Q() {
191
- if (R) return C;
192
- R = 1;
193
- var o = typeof Element < "u", t = typeof Map == "function", n = typeof Set == "function", e = typeof ArrayBuffer == "function" && !!ArrayBuffer.isView;
194
- function i(r, s) {
195
- if (r === s) return !0;
196
- if (r && s && typeof r == "object" && typeof s == "object") {
197
- if (r.constructor !== s.constructor) return !1;
198
- var a, c, d;
204
+ if (q) return F;
205
+ q = 1;
206
+ var a = typeof Element < "u", t = typeof Map == "function", s = typeof Set == "function", e = typeof ArrayBuffer == "function" && !!ArrayBuffer.isView;
207
+ function i(r, n) {
208
+ if (r === n) return !0;
209
+ if (r && n && typeof r == "object" && typeof n == "object") {
210
+ if (r.constructor !== n.constructor) return !1;
211
+ var o, c, d;
199
212
  if (Array.isArray(r)) {
200
- if (a = r.length, a != s.length) return !1;
201
- for (c = a; c-- !== 0; )
202
- if (!i(r[c], s[c])) return !1;
213
+ if (o = r.length, o != n.length) return !1;
214
+ for (c = o; c-- !== 0; )
215
+ if (!i(r[c], n[c])) return !1;
203
216
  return !0;
204
217
  }
205
218
  var u;
206
- if (t && r instanceof Map && s instanceof Map) {
207
- if (r.size !== s.size) return !1;
219
+ if (t && r instanceof Map && n instanceof Map) {
220
+ if (r.size !== n.size) return !1;
208
221
  for (u = r.entries(); !(c = u.next()).done; )
209
- if (!s.has(c.value[0])) return !1;
222
+ if (!n.has(c.value[0])) return !1;
210
223
  for (u = r.entries(); !(c = u.next()).done; )
211
- if (!i(c.value[1], s.get(c.value[0]))) return !1;
224
+ if (!i(c.value[1], n.get(c.value[0]))) return !1;
212
225
  return !0;
213
226
  }
214
- if (n && r instanceof Set && s instanceof Set) {
215
- if (r.size !== s.size) return !1;
227
+ if (s && r instanceof Set && n instanceof Set) {
228
+ if (r.size !== n.size) return !1;
216
229
  for (u = r.entries(); !(c = u.next()).done; )
217
- if (!s.has(c.value[0])) return !1;
230
+ if (!n.has(c.value[0])) return !1;
218
231
  return !0;
219
232
  }
220
- if (e && ArrayBuffer.isView(r) && ArrayBuffer.isView(s)) {
221
- if (a = r.length, a != s.length) return !1;
222
- for (c = a; c-- !== 0; )
223
- if (r[c] !== s[c]) return !1;
233
+ if (e && ArrayBuffer.isView(r) && ArrayBuffer.isView(n)) {
234
+ if (o = r.length, o != n.length) return !1;
235
+ for (c = o; c-- !== 0; )
236
+ if (r[c] !== n[c]) return !1;
224
237
  return !0;
225
238
  }
226
- if (r.constructor === RegExp) return r.source === s.source && r.flags === s.flags;
227
- if (r.valueOf !== Object.prototype.valueOf && typeof r.valueOf == "function" && typeof s.valueOf == "function") return r.valueOf() === s.valueOf();
228
- if (r.toString !== Object.prototype.toString && typeof r.toString == "function" && typeof s.toString == "function") return r.toString() === s.toString();
229
- if (d = Object.keys(r), a = d.length, a !== Object.keys(s).length) return !1;
230
- for (c = a; c-- !== 0; )
231
- if (!Object.prototype.hasOwnProperty.call(s, d[c])) return !1;
232
- if (o && r instanceof Element) return !1;
233
- for (c = a; c-- !== 0; )
234
- if (!((d[c] === "_owner" || d[c] === "__v" || d[c] === "__o") && r.$$typeof) && !i(r[d[c]], s[d[c]]))
239
+ if (r.constructor === RegExp) return r.source === n.source && r.flags === n.flags;
240
+ if (r.valueOf !== Object.prototype.valueOf && typeof r.valueOf == "function" && typeof n.valueOf == "function") return r.valueOf() === n.valueOf();
241
+ if (r.toString !== Object.prototype.toString && typeof r.toString == "function" && typeof n.toString == "function") return r.toString() === n.toString();
242
+ if (d = Object.keys(r), o = d.length, o !== Object.keys(n).length) return !1;
243
+ for (c = o; c-- !== 0; )
244
+ if (!Object.prototype.hasOwnProperty.call(n, d[c])) return !1;
245
+ if (a && r instanceof Element) return !1;
246
+ for (c = o; c-- !== 0; )
247
+ if (!((d[c] === "_owner" || d[c] === "__v" || d[c] === "__o") && r.$$typeof) && !i(r[d[c]], n[d[c]]))
235
248
  return !1;
236
249
  return !0;
237
250
  }
238
- return r !== r && s !== s;
251
+ return r !== r && n !== n;
239
252
  }
240
- return C = function(s, a) {
253
+ return F = function(n, o) {
241
254
  try {
242
- return i(s, a);
255
+ return i(n, o);
243
256
  } catch (c) {
244
257
  if ((c.message || "").match(/stack|recursion/i))
245
258
  return console.warn("react-fast-compare cannot handle circular refs"), !1;
246
259
  throw c;
247
260
  }
248
- }, C;
261
+ }, F;
249
262
  }
250
263
  var U = Q();
251
- const V = /* @__PURE__ */ J(U), h = new l(), ee = new q(h), te = (o, t) => h.createStatic({ initialValue: o }, o, t);
252
- function re(o, t, n) {
253
- let e, i, r = n;
254
- if (typeof o != "string") {
255
- const { key: f, initialValue: v, prefix: x } = o;
256
- e = f, i = v, r = x;
264
+ const T = /* @__PURE__ */ N(U), h = l.getInstance("sharedStatesManager"), re = new R(h), se = (a, t) => h.createStatic({ initialValue: a }, a, t);
265
+ function ne(a, t, s) {
266
+ let e, i, r = s;
267
+ if (typeof a != "string") {
268
+ const { key: f, initialValue: v, prefix: S } = a;
269
+ e = f, i = v, r = S;
257
270
  } else
258
- e = E(o), i = t;
259
- const { prefix: s } = j(r);
260
- h.init(e, s, i);
261
- const a = b(() => (f) => (h.init(e, s, t), h.addListener(e, s, f), () => {
262
- h.removeListener(e, s, f);
263
- }), [e, s, t]), c = b(() => () => h.get(e, s)?.value, [e, s]), d = _(a, c), u = (f) => {
264
- const v = typeof f == "function" ? f(h.get(e, s)?.value) : f;
265
- V(v, d) || (h.setValue(e, s, v), h.callListeners(e, s));
271
+ e = w(a), i = t;
272
+ const { prefix: n } = C(r);
273
+ h.init(e, n, i);
274
+ const o = b(() => (f) => (h.init(e, n, t), h.addListener(e, n, f), () => {
275
+ h.removeListener(e, n, f);
276
+ }), [e, n, t]), c = b(() => () => h.get(e, n)?.value, [e, n]), d = j(o, c), u = (f) => {
277
+ const v = typeof f == "function" ? f(h.get(e, n)?.value) : f;
278
+ T(v, d) || (h.setValue(e, n, v), h.callListeners(e, n));
266
279
  };
267
- return h.useEffect(e, s), [
280
+ return h.useEffect(e, n), [
268
281
  d,
269
282
  u
270
283
  ];
271
284
  }
272
- function se(o, t, n) {
273
- let e, i = n;
274
- if (typeof o != "string") {
275
- const { key: u, prefix: f } = o;
285
+ function ie(a, t, s) {
286
+ let e, i = s;
287
+ if (typeof a != "string") {
288
+ const { key: u, prefix: f } = a;
276
289
  e = u, i = f;
277
290
  } else
278
- e = E(o);
279
- const { prefix: r } = j(i), s = k(void 0), a = b(() => (u) => (h.addListener(e, r, u), () => {
291
+ e = w(a);
292
+ const { prefix: r } = C(i), n = k(void 0), o = b(() => (u) => (h.init(e, r, void 0), h.addListener(e, r, u), () => {
280
293
  h.removeListener(e, r, u);
281
294
  }), [e, r]), c = b(() => () => {
282
295
  const u = h.get(e, r)?.value, f = t(u);
283
- return V(s.current, f) ? s.current : (s.current = f, f);
284
- }, [e, r, t]), d = _(a, c);
296
+ return T(n.current, f) ? n.current : (n.current = f, f);
297
+ }, [e, r, t]), d = j(o, c);
285
298
  return h.useEffect(e, r), d;
286
299
  }
287
- const y = new l(), A = new q(y), O = {
300
+ const y = l.getInstance("SharedFunctionValue"), _ = new R(y), O = {
288
301
  results: void 0,
289
302
  isLoading: !1,
290
303
  error: void 0
291
- }, ne = (o, t) => y.createStatic({ fn: o }, O, t);
292
- function ie(o, t, n) {
293
- let e, i, r = n;
294
- if (typeof o != "string") {
295
- const { key: f, fn: v, prefix: x } = o;
296
- e = f, i = v, r = x;
304
+ }, ae = (a, t) => y.createStatic({ fn: a }, O, t);
305
+ function oe(a, t, s) {
306
+ let e, i, r = s;
307
+ if (typeof a != "string") {
308
+ const { key: f, fn: v, prefix: S } = a;
309
+ e = f, i = v, r = S;
297
310
  } else
298
- e = E(o), i = t;
299
- const { prefix: s } = j(r);
300
- y.init(e, s, O);
301
- const a = b(
302
- () => (f) => (y.init(e, s, O), y.addListener(e, s, f), () => {
303
- y.removeListener(e, s, f);
311
+ e = w(a), i = t;
312
+ const { prefix: n } = C(r);
313
+ y.init(e, n, O);
314
+ const o = b(
315
+ () => (f) => (y.init(e, n, O), y.addListener(e, n, f), () => {
316
+ y.removeListener(e, n, f);
304
317
  }),
305
- [e, s]
318
+ [e, n]
306
319
  ), c = b(
307
- () => () => y.get(e, s).value,
308
- [e, s]
309
- ), d = _(a, c), u = async (f, ...v) => {
310
- const x = y.get(e, s);
311
- if (!f && (x.value.isLoading || x.value.results !== void 0)) return x.value;
312
- A.update(e, (S) => ({ ...S, isLoading: !0, error: void 0 }), s);
320
+ () => () => y.get(e, n).value,
321
+ [e, n]
322
+ ), d = j(o, c), u = async (f, ...v) => {
323
+ const S = y.get(e, n);
324
+ if (!f && (S.value.isLoading || S.value.results !== void 0)) return S.value;
325
+ _.update(e, (x) => ({ ...x, isLoading: !0, error: void 0 }), n);
313
326
  try {
314
- const S = await i(...v);
315
- A.set(e, { results: S, isLoading: !1, error: void 0 }, s);
316
- } catch (S) {
317
- A.update(e, (p) => ({ ...p, isLoading: !1, error: S }), s);
327
+ const x = await i(...v);
328
+ _.set(e, { results: x, isLoading: !1, error: void 0 }, n);
329
+ } catch (x) {
330
+ _.update(e, (p) => ({ ...p, isLoading: !1, error: x }), n);
318
331
  }
319
332
  };
320
- return y.useEffect(e, s), {
333
+ return y.useEffect(e, n), {
321
334
  state: d,
322
335
  trigger: (...f) => {
323
336
  u(!1, ...f);
@@ -326,85 +339,85 @@ function ie(o, t, n) {
326
339
  u(!0, ...f);
327
340
  },
328
341
  clear: () => {
329
- A.set(e, O, s);
342
+ _.set(e, O, n);
330
343
  }
331
344
  };
332
345
  }
333
- const g = new l(), w = new q(g), $ = {
346
+ const g = l.getInstance("SharedSubscription"), E = new R(g), M = {
334
347
  data: void 0,
335
348
  isLoading: !1,
336
349
  error: void 0,
337
350
  subscribed: !1,
338
351
  unsubscribe: void 0
339
- }, ae = (o, t, n) => g.createStatic({ subscriber: o }, { ...$, data: t?.initialValue }, n);
340
- async function F(o, t) {
341
- const n = g.get(o, t);
342
- n?.value.unsubscribe && (n.value.unsubscribe(), w.update(o, (e) => ({ ...e, unsubscribe: void 0, subscribed: !1 }), t));
352
+ }, ce = (a, t, s) => g.createStatic({ subscriber: a }, { ...M, data: t?.initialValue }, s);
353
+ async function P(a, t) {
354
+ const s = g.get(a, t);
355
+ s?.value.unsubscribe && (s.value.unsubscribe(), E.update(a, (e) => ({ ...e, unsubscribe: void 0, subscribed: !1 }), t));
343
356
  }
344
- function oe(o, t, n) {
345
- let e, i, r = n, s = !1;
346
- if (typeof o != "string") {
347
- const { key: p, subscriber: m, prefix: L, triggerImmediately: D } = o;
348
- e = p, i = m, r = L, s = D ?? !1;
357
+ function fe(a, t, s) {
358
+ let e, i, r = s, n = !1;
359
+ if (typeof a != "string") {
360
+ const { key: p, subscriber: m, prefix: L, triggerImmediately: A } = a;
361
+ e = p, i = m, r = L, n = A ?? !1;
349
362
  } else
350
- e = E(o), i = t;
351
- const { prefix: a } = j(r);
352
- g.init(e, a, $);
363
+ e = w(a), i = t;
364
+ const { prefix: o } = C(r);
365
+ g.init(e, o, M);
353
366
  const c = b(
354
- () => (p) => (g.init(e, a, $), g.addListener(e, a, p), () => {
355
- g.removeListener(e, a, p);
367
+ () => (p) => (g.init(e, o, M), g.addListener(e, o, p), () => {
368
+ g.removeListener(e, o, p);
356
369
  }),
357
- [e, a]
370
+ [e, o]
358
371
  ), d = b(
359
- () => () => g.get(e, a).value,
360
- [e, a]
361
- ), u = _(c, d), f = (p) => {
362
- w.update(e, (m) => ({ ...m, data: p }), a);
372
+ () => () => g.get(e, o).value,
373
+ [e, o]
374
+ ), u = j(c, d), f = (p) => {
375
+ E.update(e, (m) => ({ ...m, data: p }), o);
363
376
  }, v = (p) => {
364
- w.update(e, (m) => ({ ...m, isLoading: !1, data: void 0, error: p }), a);
365
- }, x = () => {
366
- w.update(e, (p) => ({ ...p, isLoading: !1 }), a);
367
- }, S = async (p) => {
368
- const m = g.get(e, a);
369
- if (p && await F(e, a), m.value.subscribed && !p) return m.value;
370
- K("triggered !!"), w.update(e, (L) => ({ ...L, isLoading: !0, error: void 0 }), a);
377
+ E.update(e, (m) => ({ ...m, isLoading: !1, data: void 0, error: p }), o);
378
+ }, S = () => {
379
+ E.update(e, (p) => ({ ...p, isLoading: !1 }), o);
380
+ }, x = async (p) => {
381
+ const m = g.get(e, o);
382
+ if (p && await P(e, o), m.value.subscribed && !p) return m.value;
383
+ K("triggered !!"), E.update(e, (L) => ({ ...L, isLoading: !0, error: void 0 }), o);
371
384
  try {
372
- const L = await i(f, v, x);
373
- w.update(e, (D) => ({ ...D, unsubscribe: L, subscribed: !0, isLoading: !1 }), a);
385
+ const L = await i(f, v, S);
386
+ E.update(e, (A) => ({ ...A, unsubscribe: L, subscribed: !0, isLoading: !1 }), o);
374
387
  } catch (L) {
375
- w.update(e, (D) => ({ ...D, isLoading: !1, error: L }), a);
388
+ E.update(e, (A) => ({ ...A, isLoading: !1, error: L }), o);
376
389
  }
377
390
  };
378
- return P(() => () => {
379
- K(`[${l.prefix(e, a)}]`, "unmount effect2"), g.get(e, a)?.listeners.length === 0 && F(e, a);
380
- }, [e, a]), g.useEffect(e, a), P(() => {
381
- s && S(!1);
391
+ return I(() => () => {
392
+ K(`[${l.prefix(e, o)}]`, "unmount effect2"), g.get(e, o)?.listeners.length === 0 && P(e, o);
393
+ }, [e, o]), g.useEffect(e, o), I(() => {
394
+ n && x(!1);
382
395
  }, []), {
383
396
  state: u,
384
397
  trigger: () => {
385
- S(!1);
398
+ x(!1);
386
399
  },
387
400
  forceTrigger: () => {
388
- S(!0);
401
+ x(!0);
389
402
  },
390
403
  unsubscribe: () => {
391
- F(e, a);
404
+ P(e, o);
392
405
  }
393
406
  };
394
407
  }
395
408
  export {
396
- N as SharedStatesProvider,
397
- ne as createSharedFunction,
398
- te as createSharedState,
399
- ae as createSharedSubscription,
400
- z as isDevMode,
401
- Z as setDevMode,
402
- A as sharedFunctionsApi,
403
- ee as sharedStatesApi,
404
- w as sharedSubscriptionsApi,
405
- j as useSharedContext,
406
- ie as useSharedFunction,
407
- re as useSharedState,
408
- se as useSharedStateSelector,
409
- oe as useSharedSubscription
409
+ te as SharedStatesProvider,
410
+ ae as createSharedFunction,
411
+ se as createSharedState,
412
+ ce as createSharedSubscription,
413
+ B as isDevMode,
414
+ ee as setDevMode,
415
+ _ as sharedFunctionsApi,
416
+ re as sharedStatesApi,
417
+ E as sharedSubscriptionsApi,
418
+ C as useSharedContext,
419
+ oe as useSharedFunction,
420
+ ne as useSharedState,
421
+ ie as useSharedStateSelector,
422
+ fe as useSharedSubscription
410
423
  };
package/dist/main.min.js CHANGED
@@ -1,8 +1,8 @@
1
1
  /*!
2
- * react-shared-states v2.0.1
2
+ * react-shared-states v2.1.2
3
3
  * (c) Hichem Taboukouyout
4
4
  * Released under the MIT License.
5
5
  * Github: github.com/HichemTab-tech/react-shared-states
6
6
  */
7
7
 
8
- (function(c,A){typeof exports=="object"&&typeof module<"u"?A(exports,require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react"],A):(c=typeof globalThis<"u"?globalThis:c||self,A(c.ReactSharedStates={},c.jsxRuntime,c.React))})(this,(function(c,A,d){"use strict";c.isDevMode=!1;const G=o=>{c.isDevMode=o},P=(...o)=>{c.isDevMode&&console.log("%c[react-shared-states]","color: #007acc; font-weight: bold",...o)},D=o=>{if(!o)throw new Error("Value is empty");return o},K=()=>Math.random().toString(36).substring(2,15),$=d.createContext(void 0),I=({children:o,scopeName:t})=>{if(t&&t.includes("//"))throw new Error("scopeName cannot contain '//'");return t||(t=d.useMemo(()=>K(),[])),A.jsx($.Provider,{value:{scopeName:t},children:o})},V=()=>d.useContext($),B=[];class h{constructor(t=()=>null){this.defaultValue=t}data=new Map;addListener(t,n,e){const i=h.prefix(t,n),r=this.data.get(i);r&&r.listeners.push(e)}removeListener(t,n,e){const i=h.prefix(t,n),r=this.data.get(i);r&&(r.listeners=r.listeners.filter(s=>s!==e))}callListeners(t,n){const e=h.prefix(t,n),i=this.data.get(e);i&&i.listeners.forEach(r=>r())}init(t,n,e,i=!1){const r=h.prefix(t,n);this.data.has(r)||this.data.set(r,{value:e,isStatic:i||void 0,listeners:[]})}createStatic(t,n,e){const i=e??"_global",r={key:K(),prefix:i,...t};return B.push(r),this.init(r.key,r.prefix,n,!0),this.defaultValue=()=>n,r}initStatic(t){const{key:n,prefix:e}=t;this.init(n,e,this.defaultValue(),!0)}clearAll(t=!1,n=!1){this.data.forEach((e,i)=>{const[r,s]=h.extractPrefix(i);this.clear(s,r,t,n)})}clear(t,n,e=!1,i=!1){const r=h.prefix(t,n);e||this.callListeners(t,n);const s=this.data.get(r);if(s&&(this.data.delete(r),s.isStatic&&!i)){const a=B.find(u=>u.key===t&&u.prefix===n);a&&this.initStatic(a)}}get(t,n){let e=this.has(t,n);if(e)return this.data.get(e)}setValue(t,n,e){const i=h.prefix(t,n),r=this.data.get(i);r&&(r.value=e,this.data.set(i,r))}has(t,n){return this.data.has(h.prefix(t,n))?h.prefix(t,n):this.data.has(h.prefix(t,"_global"))?h.prefix(t,"_global"):void 0}static prefix(t,n){if(t.includes("//"))throw new Error("key cannot contain '//'");return`${n}//${t}`}static extractPrefix(t){const n=t.split("//");return[n[0],n.slice(1).join("//")]}useEffect(t,n,e=null){d.useEffect(()=>()=>{e?.(),P(`[${h.prefix(t,n)}]`,"unmount effect");const i=this.get(t,n);i&&i.listeners?.length===0&&this.clear(t,n)},[t,n])}}class _{constructor(t){this.sharedData=t}_get(t,n){let e,i=n;if(typeof t!="string"){const{key:a,prefix:u}=t;e=a,i=u}else e=D(t);const r=i||"_global",s=this.sharedData.get(e,r);return s?{value:s.value,key:e,prefix:r}:{key:e,prefix:r,value:void 0}}get(t,n){return this._get(t,n).value}set(t,n,e){let i,r=e;if(typeof t!="string"){const{key:a,prefix:u}=t;i=a,r=u}else i=D(t);const s=r||"_global";this.sharedData.init(i,s,n),this.sharedData.setValue(i,s,n),this.sharedData.callListeners(i,s)}update(t,n,e){const i=this._get(t,e);if(i){const r=n(i.value);this.set(i.key,r,i.prefix)}}clearAll(){this.sharedData.clearAll()}clearScope(t){const n=t||"_global";this.sharedData.data.forEach((e,i)=>{const[r,s]=h.extractPrefix(i);r===n&&(this.sharedData.clear(s,r),this.sharedData.callListeners(s,r))})}resolve(t){const{key:n,prefix:e}=t;return this.get(n,e)}clear(t,n){let e,i;typeof t=="string"?(e=t,i=n||"_global"):(e=t.key,i=t.prefix),this.sharedData.clear(e,i)}has(t,n="_global"){const e=n||"_global";return!!this.sharedData.has(t,e)}getAll(){const t={};return this.sharedData.data.forEach((n,e)=>{const[i,r]=h.extractPrefix(e);t[i]=t[i]||{},t[i][r]=n.value}),t}subscribe(t,n,e){let i,r;return typeof t=="string"?(i=t,r=e||"_global"):(i=t.key,r=t.prefix),this.sharedData.addListener(i,r,n),()=>{this.sharedData.removeListener(i,r,n)}}}const j=o=>{const t=V();return{prefix:o??t?.scopeName??"_global"}};function W(o){return o&&o.__esModule&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o}var C,T;function k(){if(T)return C;T=1;var o=typeof Element<"u",t=typeof Map=="function",n=typeof Set=="function",e=typeof ArrayBuffer=="function"&&!!ArrayBuffer.isView;function i(r,s){if(r===s)return!0;if(r&&s&&typeof r=="object"&&typeof s=="object"){if(r.constructor!==s.constructor)return!1;var a,u,p;if(Array.isArray(r)){if(a=r.length,a!=s.length)return!1;for(u=a;u--!==0;)if(!i(r[u],s[u]))return!1;return!0}var l;if(t&&r instanceof Map&&s instanceof Map){if(r.size!==s.size)return!1;for(l=r.entries();!(u=l.next()).done;)if(!s.has(u.value[0]))return!1;for(l=r.entries();!(u=l.next()).done;)if(!i(u.value[1],s.get(u.value[0])))return!1;return!0}if(n&&r instanceof Set&&s instanceof Set){if(r.size!==s.size)return!1;for(l=r.entries();!(u=l.next()).done;)if(!s.has(u.value[0]))return!1;return!0}if(e&&ArrayBuffer.isView(r)&&ArrayBuffer.isView(s)){if(a=r.length,a!=s.length)return!1;for(u=a;u--!==0;)if(r[u]!==s[u])return!1;return!0}if(r.constructor===RegExp)return r.source===s.source&&r.flags===s.flags;if(r.valueOf!==Object.prototype.valueOf&&typeof r.valueOf=="function"&&typeof s.valueOf=="function")return r.valueOf()===s.valueOf();if(r.toString!==Object.prototype.toString&&typeof r.toString=="function"&&typeof s.toString=="function")return r.toString()===s.toString();if(p=Object.keys(r),a=p.length,a!==Object.keys(s).length)return!1;for(u=a;u--!==0;)if(!Object.prototype.hasOwnProperty.call(s,p[u]))return!1;if(o&&r instanceof Element)return!1;for(u=a;u--!==0;)if(!((p[u]==="_owner"||p[u]==="__v"||p[u]==="__o")&&r.$$typeof)&&!i(r[p[u]],s[p[u]]))return!1;return!0}return r!==r&&s!==s}return C=function(s,a){try{return i(s,a)}catch(u){if((u.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw u}},C}var H=k();const z=W(H),g=new h,J=new _(g),Q=(o,t)=>g.createStatic({initialValue:o},o,t);function U(o,t,n){let e,i,r=n;if(typeof o!="string"){const{key:f,initialValue:y,prefix:m}=o;e=f,i=y,r=m}else e=D(o),i=t;const{prefix:s}=j(r);g.init(e,s,i);const a=d.useMemo(()=>f=>(g.init(e,s,t),g.addListener(e,s,f),()=>{g.removeListener(e,s,f)}),[e,s,t]),u=d.useMemo(()=>()=>g.get(e,s)?.value,[e,s]),p=d.useSyncExternalStore(a,u),l=f=>{const y=typeof f=="function"?f(g.get(e,s)?.value):f;z(y,p)||(g.setValue(e,s,y),g.callListeners(e,s))};return g.useEffect(e,s),[p,l]}function X(o,t,n){let e,i=n;if(typeof o!="string"){const{key:l,prefix:f}=o;e=l,i=f}else e=D(o);const{prefix:r}=j(i),s=d.useRef(void 0),a=d.useMemo(()=>l=>(g.addListener(e,r,l),()=>{g.removeListener(e,r,l)}),[e,r]),u=d.useMemo(()=>()=>{const l=g.get(e,r)?.value,f=t(l);return z(s.current,f)?s.current:(s.current=f,f)},[e,r,t]),p=d.useSyncExternalStore(a,u);return g.useEffect(e,r),p}const x=new h,M=new _(x),O={results:void 0,isLoading:!1,error:void 0},Y=(o,t)=>x.createStatic({fn:o},O,t);function Z(o,t,n){let e,i,r=n;if(typeof o!="string"){const{key:f,fn:y,prefix:m}=o;e=f,i=y,r=m}else e=D(o),i=t;const{prefix:s}=j(r);x.init(e,s,O);const a=d.useMemo(()=>f=>(x.init(e,s,O),x.addListener(e,s,f),()=>{x.removeListener(e,s,f)}),[e,s]),u=d.useMemo(()=>()=>x.get(e,s).value,[e,s]),p=d.useSyncExternalStore(a,u),l=async(f,...y)=>{const m=x.get(e,s);if(!f&&(m.value.isLoading||m.value.results!==void 0))return m.value;M.update(e,b=>({...b,isLoading:!0,error:void 0}),s);try{const b=await i(...y);M.set(e,{results:b,isLoading:!1,error:void 0},s)}catch(b){M.update(e,S=>({...S,isLoading:!1,error:b}),s)}};return x.useEffect(e,s),{state:p,trigger:(...f)=>{l(!1,...f)},forceTrigger:(...f)=>{l(!0,...f)},clear:()=>{M.set(e,O,s)}}}const v=new h,E=new _(v),R={data:void 0,isLoading:!1,error:void 0,subscribed:!1,unsubscribe:void 0},N=(o,t,n)=>v.createStatic({subscriber:o},{...R,data:t?.initialValue},n);async function q(o,t){const n=v.get(o,t);n?.value.unsubscribe&&(n.value.unsubscribe(),E.update(o,e=>({...e,unsubscribe:void 0,subscribed:!1}),t))}function ee(o,t,n){let e,i,r=n,s=!1;if(typeof o!="string"){const{key:S,subscriber:L,prefix:w,triggerImmediately:F}=o;e=S,i=L,r=w,s=F??!1}else e=D(o),i=t;const{prefix:a}=j(r);v.init(e,a,R);const u=d.useMemo(()=>S=>(v.init(e,a,R),v.addListener(e,a,S),()=>{v.removeListener(e,a,S)}),[e,a]),p=d.useMemo(()=>()=>v.get(e,a).value,[e,a]),l=d.useSyncExternalStore(u,p),f=S=>{E.update(e,L=>({...L,data:S}),a)},y=S=>{E.update(e,L=>({...L,isLoading:!1,data:void 0,error:S}),a)},m=()=>{E.update(e,S=>({...S,isLoading:!1}),a)},b=async S=>{const L=v.get(e,a);if(S&&await q(e,a),L.value.subscribed&&!S)return L.value;P("triggered !!"),E.update(e,w=>({...w,isLoading:!0,error:void 0}),a);try{const w=await i(f,y,m);E.update(e,F=>({...F,unsubscribe:w,subscribed:!0,isLoading:!1}),a)}catch(w){E.update(e,F=>({...F,isLoading:!1,error:w}),a)}};return d.useEffect(()=>()=>{P(`[${h.prefix(e,a)}]`,"unmount effect2"),v.get(e,a)?.listeners.length===0&&q(e,a)},[e,a]),v.useEffect(e,a),d.useEffect(()=>{s&&b(!1)},[]),{state:l,trigger:()=>{b(!1)},forceTrigger:()=>{b(!0)},unsubscribe:()=>{q(e,a)}}}c.SharedStatesProvider=I,c.createSharedFunction=Y,c.createSharedState=Q,c.createSharedSubscription=N,c.setDevMode=G,c.sharedFunctionsApi=M,c.sharedStatesApi=J,c.sharedSubscriptionsApi=E,c.useSharedContext=j,c.useSharedFunction=Z,c.useSharedState=U,c.useSharedStateSelector=X,c.useSharedSubscription=ee,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
8
+ (function(f,D){typeof exports=="object"&&typeof module<"u"?D(exports,require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react"],D):(f=typeof globalThis<"u"?globalThis:f||self,D(f.ReactSharedStates={},f.jsxRuntime,f.React))})(this,(function(f,D,h){"use strict";f.isDevMode=!1;const z=a=>{f.isDevMode=a},P=(...a)=>{f.isDevMode&&console.log("%c[react-shared-states]","color: #007acc; font-weight: bold",...a)},A=a=>{if(!a)throw new Error("Value is empty");return a},T=()=>Math.random().toString(36).substring(2,15),K=h.createContext(void 0),V=({children:a,scopeName:t})=>{if(t&&t.includes("//"))throw new Error("scopeName cannot contain '//'");return t||(t=h.useMemo(()=>T(),[])),D.jsx(K.Provider,{value:{scopeName:t},children:a})},W=()=>h.useContext(K),$=[],M=Symbol.for("react-shared-states.manager");function Y(a,t=()=>null){const s=globalThis;return s[M]||(s[M]={}),s[M][a]||(s[M][a]=new l(t)),s[M][a]}class l{constructor(t=()=>null){this.defaultValue=t}data=new Map;static INSTANCES=new Map;static getInstance(t,s=()=>null){return Y(t,s)}addListener(t,s,e){const i=l.prefix(t,s),r=this.data.get(i);r&&r.listeners.push(e)}removeListener(t,s,e){const i=l.prefix(t,s),r=this.data.get(i);r&&(r.listeners=r.listeners.filter(n=>n!==e))}callListeners(t,s){const e=l.prefix(t,s),i=this.data.get(e);i&&i.listeners.forEach(r=>r())}init(t,s,e,i=!1){const r=l.prefix(t,s);this.data.has(r)||this.data.set(r,{value:e,isStatic:i||void 0,listeners:[]})}createStatic(t,s,e){const i=e??"_global",r={key:T(),prefix:i,...t};return $.push(r),this.init(r.key,r.prefix,s,!0),this.defaultValue=()=>s,r}initStatic(t){const{key:s,prefix:e}=t;this.init(s,e,this.defaultValue(),!0)}clearAll(t=!1,s=!1){this.data.forEach((e,i)=>{const[r,n]=l.extractPrefix(i);this.clear(n,r,t,s)})}clear(t,s,e=!1,i=!1){const r=l.prefix(t,s);e||this.callListeners(t,s);const n=this.data.get(r);if(n&&(this.data.delete(r),n.isStatic&&!i)){const o=$.find(u=>u.key===t&&u.prefix===s);o&&this.initStatic(o)}}get(t,s){let e=this.has(t,s);if(e)return this.data.get(e)}setValue(t,s,e){const i=l.prefix(t,s),r=this.data.get(i);r&&(r.value=e,this.data.set(i,r))}has(t,s){return this.data.has(l.prefix(t,s))?l.prefix(t,s):this.data.has(l.prefix(t,"_global"))?l.prefix(t,"_global"):void 0}static prefix(t,s){if(t.includes("//"))throw new Error("key cannot contain '//'");return`${s}//${t}`}static extractPrefix(t){const s=t.split("//");return[s[0],s.slice(1).join("//")]}useEffect(t,s,e=null){h.useEffect(()=>()=>{e?.(),P(`[${l.prefix(t,s)}]`,"unmount effect");const i=this.get(t,s);i&&i.listeners?.length===0&&this.clear(t,s)},[t,s])}}class C{constructor(t){this.sharedData=t}_get(t,s){let e,i=s;if(typeof t!="string"){const{key:o,prefix:u}=t;e=o,i=u}else e=A(t);const r=i||"_global",n=this.sharedData.get(e,r);return n?{value:n.value,key:e,prefix:r}:{key:e,prefix:r,value:void 0}}get(t,s){return this._get(t,s).value}set(t,s,e){let i,r=e;if(typeof t!="string"){const{key:o,prefix:u}=t;i=o,r=u}else i=A(t);const n=r||"_global";this.sharedData.init(i,n,s),this.sharedData.setValue(i,n,s),this.sharedData.callListeners(i,n)}update(t,s,e){const i=this._get(t,e);if(i){const r=s(i.value);this.set(i.key,r,i.prefix)}}clearAll(){this.sharedData.clearAll()}clearScope(t){const s=t||"_global";this.sharedData.data.forEach((e,i)=>{const[r,n]=l.extractPrefix(i);r===s&&(this.sharedData.clear(n,r),this.sharedData.callListeners(n,r))})}resolve(t){const{key:s,prefix:e}=t;return this.get(s,e)}clear(t,s){let e,i;typeof t=="string"?(e=t,i=s||"_global"):(e=t.key,i=t.prefix),this.sharedData.clear(e,i)}has(t,s="_global"){const e=s||"_global";return!!this.sharedData.has(t,e)}getAll(){const t={};return this.sharedData.data.forEach((s,e)=>{const[i,r]=l.extractPrefix(e);t[i]=t[i]||{},t[i][r]=s.value}),t}subscribe(t,s,e){let i,r;return typeof t=="string"?(i=t,r=e||"_global"):(i=t.key,r=t.prefix),this.sharedData.addListener(i,r,s),()=>{this.sharedData.removeListener(i,r,s)}}}const j=a=>{const t=W();return{prefix:a??t?.scopeName??"_global"}};function k(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}var I,B;function H(){if(B)return I;B=1;var a=typeof Element<"u",t=typeof Map=="function",s=typeof Set=="function",e=typeof ArrayBuffer=="function"&&!!ArrayBuffer.isView;function i(r,n){if(r===n)return!0;if(r&&n&&typeof r=="object"&&typeof n=="object"){if(r.constructor!==n.constructor)return!1;var o,u,p;if(Array.isArray(r)){if(o=r.length,o!=n.length)return!1;for(u=o;u--!==0;)if(!i(r[u],n[u]))return!1;return!0}var d;if(t&&r instanceof Map&&n instanceof Map){if(r.size!==n.size)return!1;for(d=r.entries();!(u=d.next()).done;)if(!n.has(u.value[0]))return!1;for(d=r.entries();!(u=d.next()).done;)if(!i(u.value[1],n.get(u.value[0])))return!1;return!0}if(s&&r instanceof Set&&n instanceof Set){if(r.size!==n.size)return!1;for(d=r.entries();!(u=d.next()).done;)if(!n.has(u.value[0]))return!1;return!0}if(e&&ArrayBuffer.isView(r)&&ArrayBuffer.isView(n)){if(o=r.length,o!=n.length)return!1;for(u=o;u--!==0;)if(r[u]!==n[u])return!1;return!0}if(r.constructor===RegExp)return r.source===n.source&&r.flags===n.flags;if(r.valueOf!==Object.prototype.valueOf&&typeof r.valueOf=="function"&&typeof n.valueOf=="function")return r.valueOf()===n.valueOf();if(r.toString!==Object.prototype.toString&&typeof r.toString=="function"&&typeof n.toString=="function")return r.toString()===n.toString();if(p=Object.keys(r),o=p.length,o!==Object.keys(n).length)return!1;for(u=o;u--!==0;)if(!Object.prototype.hasOwnProperty.call(n,p[u]))return!1;if(a&&r instanceof Element)return!1;for(u=o;u--!==0;)if(!((p[u]==="_owner"||p[u]==="__v"||p[u]==="__o")&&r.$$typeof)&&!i(r[p[u]],n[p[u]]))return!1;return!0}return r!==r&&n!==n}return I=function(n,o){try{return i(n,o)}catch(u){if((u.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw u}},I}var J=H();const G=k(J),g=l.getInstance("sharedStatesManager"),N=new C(g),Q=(a,t)=>g.createStatic({initialValue:a},a,t);function U(a,t,s){let e,i,r=s;if(typeof a!="string"){const{key:c,initialValue:y,prefix:m}=a;e=c,i=y,r=m}else e=A(a),i=t;const{prefix:n}=j(r);g.init(e,n,i);const o=h.useMemo(()=>c=>(g.init(e,n,t),g.addListener(e,n,c),()=>{g.removeListener(e,n,c)}),[e,n,t]),u=h.useMemo(()=>()=>g.get(e,n)?.value,[e,n]),p=h.useSyncExternalStore(o,u),d=c=>{const y=typeof c=="function"?c(g.get(e,n)?.value):c;G(y,p)||(g.setValue(e,n,y),g.callListeners(e,n))};return g.useEffect(e,n),[p,d]}function X(a,t,s){let e,i=s;if(typeof a!="string"){const{key:d,prefix:c}=a;e=d,i=c}else e=A(a);const{prefix:r}=j(i),n=h.useRef(void 0),o=h.useMemo(()=>d=>(g.init(e,r,void 0),g.addListener(e,r,d),()=>{g.removeListener(e,r,d)}),[e,r]),u=h.useMemo(()=>()=>{const d=g.get(e,r)?.value,c=t(d);return G(n.current,c)?n.current:(n.current=c,c)},[e,r,t]),p=h.useSyncExternalStore(o,u);return g.useEffect(e,r),p}const x=l.getInstance("SharedFunctionValue"),F=new C(x),_={results:void 0,isLoading:!1,error:void 0},Z=(a,t)=>x.createStatic({fn:a},_,t);function ee(a,t,s){let e,i,r=s;if(typeof a!="string"){const{key:c,fn:y,prefix:m}=a;e=c,i=y,r=m}else e=A(a),i=t;const{prefix:n}=j(r);x.init(e,n,_);const o=h.useMemo(()=>c=>(x.init(e,n,_),x.addListener(e,n,c),()=>{x.removeListener(e,n,c)}),[e,n]),u=h.useMemo(()=>()=>x.get(e,n).value,[e,n]),p=h.useSyncExternalStore(o,u),d=async(c,...y)=>{const m=x.get(e,n);if(!c&&(m.value.isLoading||m.value.results!==void 0))return m.value;F.update(e,b=>({...b,isLoading:!0,error:void 0}),n);try{const b=await i(...y);F.set(e,{results:b,isLoading:!1,error:void 0},n)}catch(b){F.update(e,S=>({...S,isLoading:!1,error:b}),n)}};return x.useEffect(e,n),{state:p,trigger:(...c)=>{d(!1,...c)},forceTrigger:(...c)=>{d(!0,...c)},clear:()=>{F.set(e,_,n)}}}const v=l.getInstance("SharedSubscription"),E=new C(v),R={data:void 0,isLoading:!1,error:void 0,subscribed:!1,unsubscribe:void 0},te=(a,t,s)=>v.createStatic({subscriber:a},{...R,data:t?.initialValue},s);async function q(a,t){const s=v.get(a,t);s?.value.unsubscribe&&(s.value.unsubscribe(),E.update(a,e=>({...e,unsubscribe:void 0,subscribed:!1}),t))}function re(a,t,s){let e,i,r=s,n=!1;if(typeof a!="string"){const{key:S,subscriber:L,prefix:w,triggerImmediately:O}=a;e=S,i=L,r=w,n=O??!1}else e=A(a),i=t;const{prefix:o}=j(r);v.init(e,o,R);const u=h.useMemo(()=>S=>(v.init(e,o,R),v.addListener(e,o,S),()=>{v.removeListener(e,o,S)}),[e,o]),p=h.useMemo(()=>()=>v.get(e,o).value,[e,o]),d=h.useSyncExternalStore(u,p),c=S=>{E.update(e,L=>({...L,data:S}),o)},y=S=>{E.update(e,L=>({...L,isLoading:!1,data:void 0,error:S}),o)},m=()=>{E.update(e,S=>({...S,isLoading:!1}),o)},b=async S=>{const L=v.get(e,o);if(S&&await q(e,o),L.value.subscribed&&!S)return L.value;P("triggered !!"),E.update(e,w=>({...w,isLoading:!0,error:void 0}),o);try{const w=await i(c,y,m);E.update(e,O=>({...O,unsubscribe:w,subscribed:!0,isLoading:!1}),o)}catch(w){E.update(e,O=>({...O,isLoading:!1,error:w}),o)}};return h.useEffect(()=>()=>{P(`[${l.prefix(e,o)}]`,"unmount effect2"),v.get(e,o)?.listeners.length===0&&q(e,o)},[e,o]),v.useEffect(e,o),h.useEffect(()=>{n&&b(!1)},[]),{state:d,trigger:()=>{b(!1)},forceTrigger:()=>{b(!0)},unsubscribe:()=>{q(e,o)}}}f.SharedStatesProvider=V,f.createSharedFunction=Z,f.createSharedState=Q,f.createSharedSubscription=te,f.setDevMode=z,f.sharedFunctionsApi=F,f.sharedStatesApi=N,f.sharedSubscriptionsApi=E,f.useSharedContext=j,f.useSharedFunction=ee,f.useSharedState=U,f.useSharedStateSelector=X,f.useSharedSubscription=re,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-shared-states",
3
- "version": "2.0.1",
3
+ "version": "2.1.2",
4
4
  "type": "module",
5
5
  "description": "Global state made as simple as useState, with zero config, built-in async caching, and automatic scoping.",
6
6
  "keywords": [
@@ -38,19 +38,19 @@
38
38
  "homepage": "https://github.com/HichemTab-tech/react-shared-states#readme",
39
39
  "devDependencies": {
40
40
  "@testing-library/dom": "^10.4.1",
41
- "@testing-library/react": "^16.3.0",
42
- "@types/node": "^24.3.0",
43
- "@types/react": "^19.1.11",
44
- "@types/react-dom": "^19.1.7",
45
- "@vitejs/plugin-react": "^5.0.1",
46
- "jsdom": "^27.0.0",
47
- "react": "^19.1.1",
48
- "react-dom": "^19.1.1",
49
- "typescript": "^5.9.2",
50
- "vite": "7.1.9",
41
+ "@testing-library/react": "^16.3.1",
42
+ "@types/node": "^25.0.3",
43
+ "@types/react": "^19.2.7",
44
+ "@types/react-dom": "^19.2.3",
45
+ "@vitejs/plugin-react": "^5.1.2",
46
+ "jsdom": "^27.4.0",
47
+ "react": "^19.2.3",
48
+ "react-dom": "^19.2.3",
49
+ "typescript": "^5.9.3",
50
+ "vite": "7.3.0",
51
51
  "vite-plugin-banner": "^0.8.1",
52
52
  "vite-plugin-dts": "^4.5.4",
53
- "vitest": "^3.2.4"
53
+ "vitest": "^4.0.16"
54
54
  },
55
55
  "dependencies": {
56
56
  "react-fast-compare": "^3.2.2"