@blac/react 0.0.25 → 0.0.28

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/index.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("blac"),l=require("react"),i=(a,s)=>{let e=s(a.state);return{subscribe:u=>{const r=a.addEventListenerStateChange(c=>{const t=s(c);let d=!0;for(let o=0;o<t.length;o++)if(t[o]!==e[o]){d=!1;break}d||(e=t,u())});return()=>{r()}},getSnapshot:()=>a.state,getServerSnapshot:()=>a.state}};class y{static useBloc(s,e){const u=l.useId();let r=B=>[B],c,t;typeof e=="function"&&(r=e),typeof e=="string"&&(c=e),typeof e=="object"&&(r=e.dependencySelector??r,c=e.id,t=e.props??t),s.isolated&&(c=u);const n=h.Blac.getInstance().getBloc(s,{id:c,props:t,reconnect:!1});if(!n)throw new Error(`useBloc: could not resolve: ${s.name||s}`);const{subscribe:f,getSnapshot:S,getServerSnapshot:p}=l.useMemo(()=>i(n,r),[n.createdAt]),g=l.useSyncExternalStore(f,S,p);return l.useEffect(()=>{t&&!n.props&&(n.props=t)},[t]),[g,n]}}const b=y.useBloc;exports.externalBlocStore=i;exports.useBloc=b;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("blac"),l=require("react"),f=(r,s)=>{let e=s(r.state);return{subscribe:u=>{const c=r.addEventListenerStateChange(n=>{try{const t=s(n)??[];let i=!0;for(let a=0;a<t.length;a++)if(t[a]!==e[a]){i=!1;break}i||(e=t,u())}catch(t){console.error({e:t,bloc:r,dependencyArray:s,lastDependencyCheck:e})}});return()=>{c()}},getSnapshot:()=>r.state,getServerSnapshot:()=>r.state}};class y{static useBloc(s,e){const u=l.useId();let c=B=>[B],n,t;typeof e=="function"&&(c=e),typeof e=="string"&&(n=e),typeof e=="object"&&(c=e.dependencySelector??c,n=e.id,t=e.props??t),s.isolated&&(n=u);const o=h.Blac.getInstance().getBloc(s,{id:n,props:t,reconnect:!1});if(!o)throw new Error(`useBloc: could not resolve: ${s.name||s}`);const{subscribe:d,getSnapshot:S,getServerSnapshot:g}=l.useMemo(()=>f(o,c),[o.createdAt]),p=l.useSyncExternalStore(d,S,g);return l.useEffect(()=>{t&&!o.props&&(o.props=t)},[t]),[p,o]}}const b=y.useBloc;exports.externalBlocStore=f;exports.useBloc=b;
2
2
  //# sourceMappingURL=index.cjs.js.map
package/index.cjs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/externalBlocStore.ts","../src/useBloc.tsx"],"sourcesContent":["import { BlocBase } from 'blac';\n\nexport interface ExternalStore<B extends BlocBase<S>, S> {\n subscribe: (onStoreChange: () => void) => () => void;\n getSnapshot: () => S;\n getServerSnapshot?: () => S;\n}\n\nconst externalBlocStore = <B extends BlocBase<S>, S>(\n bloc: B,\n dependencyArray: (state: S) => unknown[],\n): ExternalStore<B, S> => {\n let lastDependencyCheck = dependencyArray(bloc.state);\n\n return {\n subscribe: (listener: () => void) => {\n const unSub = bloc.addEventListenerStateChange((data) => {\n const newDependencyCheck = dependencyArray(data);\n\n let allEqual = true;\n for (let i = 0; i < newDependencyCheck.length; i++) {\n if (newDependencyCheck[i] !== lastDependencyCheck[i]) {\n allEqual = false;\n break;\n }\n }\n\n if (!allEqual) {\n lastDependencyCheck = newDependencyCheck;\n listener();\n }\n });\n return () => {\n unSub();\n };\n },\n getSnapshot: (): S => bloc.state,\n getServerSnapshot: (): S => bloc.state,\n };\n};\n\nexport default externalBlocStore;\n","import {\n Blac,\n BlocBase,\n BlocConstructor,\n BlocInstanceId,\n BlocProps,\n CubitPropsType,\n ValueType,\n} from 'blac';\nimport { useEffect, useId, useMemo, useSyncExternalStore } from 'react';\nimport externalBlocStore from './externalBlocStore';\n\nexport type BlocHookData<B extends BlocBase<S>, S> = [\n value: ValueType<B>,\n instance: B,\n];\n\n// type BlocHookData<B extends BlocBase<S>, S> = [S, InstanceType<B>]; // B is the bloc class, S is the state of the bloc\n// type UseBlocClassResult<B, S> = BlocHookData<B, S>;\n\nexport type BlocHookDependencyArrayFn<B extends BlocBase<S>, S> = (\n state: ValueType<B>,\n) => unknown[];\n\nexport interface BlocHookOptions<B extends BlocBase<S>, S> {\n id?: string;\n dependencySelector?: BlocHookDependencyArrayFn<B, S>;\n props?: CubitPropsType<B>;\n}\n\nexport class UseBlocClass {\n // constructor, no options\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n options: BlocHookOptions<InstanceType<B>, S>,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n depsSelector: BlocHookDependencyArrayFn<InstanceType<B>, S>,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n instanceId: string,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n options?:\n | BlocHookOptions<InstanceType<B>, S>\n | BlocHookDependencyArrayFn<InstanceType<B>, S>\n | BlocInstanceId,\n ): BlocHookData<InstanceType<B>, S> {\n const rid = useId();\n // default options\n let dependencyArray: BlocHookDependencyArrayFn<InstanceType<B>, S> = (\n state: ValueType<InstanceType<B>>,\n ) => [state];\n let blocId: BlocInstanceId | undefined;\n let props: BlocProps | undefined;\n\n // parse options\n\n // if options is a function, its a dependencySelector\n if (typeof options === 'function') {\n dependencyArray = options;\n }\n\n // if options is a string its an ID\n if (typeof options === 'string') {\n blocId = options;\n }\n\n if (typeof options === 'object') {\n dependencyArray = options.dependencySelector ?? dependencyArray;\n blocId = options.id;\n props = options.props ?? props;\n }\n\n const base = bloc as unknown as BlocBase<S>;\n const isIsolated = base.isolated;\n if (isIsolated) {\n blocId = rid;\n }\n\n const resolvedBloc = Blac.getInstance().getBloc(bloc, {\n id: blocId,\n props,\n reconnect: false,\n }) as InstanceType<B>;\n\n if (!resolvedBloc) {\n throw new Error(`useBloc: could not resolve: ${bloc.name || bloc}`);\n }\n\n const { subscribe, getSnapshot, getServerSnapshot } = useMemo(\n () => externalBlocStore(resolvedBloc, dependencyArray),\n [resolvedBloc.createdAt],\n );\n\n const state = useSyncExternalStore<ValueType<InstanceType<B>>>(\n subscribe,\n getSnapshot,\n getServerSnapshot,\n );\n\n useEffect(() => {\n if (props && !resolvedBloc.props) {\n resolvedBloc.props = props;\n }\n }, [props]);\n\n return [state, resolvedBloc];\n }\n}\n\nconst useBloc = UseBlocClass.useBloc;\n\nexport default useBloc;\n"],"names":["externalBlocStore","bloc","dependencyArray","lastDependencyCheck","listener","unSub","data","newDependencyCheck","allEqual","i","UseBlocClass","options","rid","useId","state","blocId","props","resolvedBloc","Blac","subscribe","getSnapshot","getServerSnapshot","useMemo","useSyncExternalStore","useEffect","useBloc"],"mappings":"2HAQMA,EAAoB,CACxBC,EACAC,IACwB,CACpB,IAAAC,EAAsBD,EAAgBD,EAAK,KAAK,EAE7C,MAAA,CACL,UAAYG,GAAyB,CACnC,MAAMC,EAAQJ,EAAK,4BAA6BK,GAAS,CACjD,MAAAC,EAAqBL,EAAgBI,CAAI,EAE/C,IAAIE,EAAW,GACf,QAASC,EAAI,EAAGA,EAAIF,EAAmB,OAAQE,IAC7C,GAAIF,EAAmBE,CAAC,IAAMN,EAAoBM,CAAC,EAAG,CACzCD,EAAA,GACX,KACF,CAGGA,IACmBL,EAAAI,EACbH,IACX,CACD,EACD,MAAO,IAAM,CACLC,GAAA,CAEV,EACA,YAAa,IAASJ,EAAK,MAC3B,kBAAmB,IAASA,EAAK,KAAA,CAErC,ECTO,MAAMS,CAAa,CAiBxB,OAAO,QACLT,EACAU,EAIkC,CAClC,MAAMC,EAAMC,EAAAA,QAEZ,IAAIX,EACFY,GACG,CAACA,CAAK,EACPC,EACAC,EAKA,OAAOL,GAAY,aACHT,EAAAS,GAIhB,OAAOA,GAAY,WACZI,EAAAJ,GAGP,OAAOA,GAAY,WACrBT,EAAkBS,EAAQ,oBAAsBT,EAChDa,EAASJ,EAAQ,GACjBK,EAAQL,EAAQ,OAASK,GAGdf,EACW,WAEbc,EAAAH,GAGX,MAAMK,EAAeC,EAAA,KAAK,YAAY,EAAE,QAAQjB,EAAM,CACpD,GAAIc,EACJ,MAAAC,EACA,UAAW,EAAA,CACZ,EAED,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,+BAA+BhB,EAAK,MAAQA,CAAI,EAAE,EAGpE,KAAM,CAAE,UAAAkB,EAAW,YAAAC,EAAa,kBAAAC,CAAsB,EAAAC,EAAA,QACpD,IAAMtB,EAAkBiB,EAAcf,CAAe,EACrD,CAACe,EAAa,SAAS,CAAA,EAGnBH,EAAQS,EAAA,qBACZJ,EACAC,EACAC,CAAA,EAGFG,OAAAA,EAAAA,UAAU,IAAM,CACVR,GAAS,CAACC,EAAa,QACzBA,EAAa,MAAQD,EACvB,EACC,CAACA,CAAK,CAAC,EAEH,CAACF,EAAOG,CAAY,CAC7B,CACF,CAEA,MAAMQ,EAAUf,EAAa"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/externalBlocStore.ts","../src/useBloc.tsx"],"sourcesContent":["import { BlocBase } from 'blac';\n\nexport interface ExternalStore<B extends BlocBase<S>, S> {\n subscribe: (onStoreChange: () => void) => () => void;\n getSnapshot: () => S;\n getServerSnapshot?: () => S;\n}\n\nconst externalBlocStore = <B extends BlocBase<S>, S>(\n bloc: B,\n dependencyArray: (state: S) => unknown[],\n): ExternalStore<B, S> => {\n let lastDependencyCheck = dependencyArray(bloc.state);\n\n return {\n subscribe: (listener: () => void) => {\n const unSub = bloc.addEventListenerStateChange((data) => {\n try {\n const newDependencyCheck = dependencyArray(data) ?? [];\n\n let allEqual = true;\n for (let i = 0; i < newDependencyCheck.length; i++) {\n if (newDependencyCheck[i] !== lastDependencyCheck[i]) {\n allEqual = false;\n break;\n }\n }\n\n if (!allEqual) {\n lastDependencyCheck = newDependencyCheck;\n listener();\n }\n } catch (e) {\n console.error({\n e,\n bloc,\n dependencyArray,\n lastDependencyCheck,\n });\n }\n });\n return () => {\n unSub();\n };\n },\n getSnapshot: (): S => bloc.state,\n getServerSnapshot: (): S => bloc.state,\n };\n};\n\nexport default externalBlocStore;\n","import {\n Blac,\n BlocBase,\n BlocConstructor,\n BlocInstanceId,\n BlocProps,\n CubitPropsType,\n ValueType,\n} from 'blac';\nimport { useEffect, useId, useMemo, useSyncExternalStore } from 'react';\nimport externalBlocStore from './externalBlocStore';\n\nexport type BlocHookData<B extends BlocBase<S>, S> = [\n value: ValueType<B>,\n instance: B,\n];\n\n// type BlocHookData<B extends BlocBase<S>, S> = [S, InstanceType<B>]; // B is the bloc class, S is the state of the bloc\n// type UseBlocClassResult<B, S> = BlocHookData<B, S>;\n\nexport type BlocHookDependencyArrayFn<B extends BlocBase<S>, S> = (\n state: ValueType<B>,\n) => unknown[];\n\nexport interface BlocHookOptions<B extends BlocBase<S>, S> {\n id?: string;\n dependencySelector?: BlocHookDependencyArrayFn<B, S>;\n props?: CubitPropsType<B>;\n}\n\nexport class UseBlocClass {\n // constructor, no options\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n options: BlocHookOptions<InstanceType<B>, S>,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n depsSelector: BlocHookDependencyArrayFn<InstanceType<B>, S>,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n instanceId: string,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n options?:\n | BlocHookOptions<InstanceType<B>, S>\n | BlocHookDependencyArrayFn<InstanceType<B>, S>\n | BlocInstanceId,\n ): BlocHookData<InstanceType<B>, S> {\n const rid = useId();\n // default options\n let dependencyArray: BlocHookDependencyArrayFn<InstanceType<B>, S> = (\n state: ValueType<InstanceType<B>>,\n ) => [state];\n let blocId: BlocInstanceId | undefined;\n let props: BlocProps | undefined;\n\n // parse options\n\n // if options is a function, its a dependencySelector\n if (typeof options === 'function') {\n dependencyArray = options;\n }\n\n // if options is a string its an ID\n if (typeof options === 'string') {\n blocId = options;\n }\n\n if (typeof options === 'object') {\n dependencyArray = options.dependencySelector ?? dependencyArray;\n blocId = options.id;\n props = options.props ?? props;\n }\n\n const base = bloc as unknown as BlocBase<S>;\n const isIsolated = base.isolated;\n if (isIsolated) {\n blocId = rid;\n }\n\n const resolvedBloc = Blac.getInstance().getBloc(bloc, {\n id: blocId,\n props,\n reconnect: false,\n }) as InstanceType<B>;\n\n if (!resolvedBloc) {\n throw new Error(`useBloc: could not resolve: ${bloc.name || bloc}`);\n }\n\n const { subscribe, getSnapshot, getServerSnapshot } = useMemo(\n () => externalBlocStore(resolvedBloc, dependencyArray),\n [resolvedBloc.createdAt],\n );\n\n const state = useSyncExternalStore<ValueType<InstanceType<B>>>(\n subscribe,\n getSnapshot,\n getServerSnapshot,\n );\n\n useEffect(() => {\n if (props && !resolvedBloc.props) {\n resolvedBloc.props = props;\n }\n }, [props]);\n\n return [state, resolvedBloc];\n }\n}\n\nconst useBloc = UseBlocClass.useBloc;\n\nexport default useBloc;\n"],"names":["externalBlocStore","bloc","dependencyArray","lastDependencyCheck","listener","unSub","data","newDependencyCheck","allEqual","i","e","UseBlocClass","options","rid","useId","state","blocId","props","resolvedBloc","Blac","subscribe","getSnapshot","getServerSnapshot","useMemo","useSyncExternalStore","useEffect","useBloc"],"mappings":"2HAQMA,EAAoB,CACxBC,EACAC,IACwB,CACpB,IAAAC,EAAsBD,EAAgBD,EAAK,KAAK,EAE7C,MAAA,CACL,UAAYG,GAAyB,CACnC,MAAMC,EAAQJ,EAAK,4BAA6BK,GAAS,CACnD,GAAA,CACF,MAAMC,EAAqBL,EAAgBI,CAAI,GAAK,CAAA,EAEpD,IAAIE,EAAW,GACf,QAASC,EAAI,EAAGA,EAAIF,EAAmB,OAAQE,IAC7C,GAAIF,EAAmBE,CAAC,IAAMN,EAAoBM,CAAC,EAAG,CACzCD,EAAA,GACX,KACF,CAGGA,IACmBL,EAAAI,EACbH,WAEJM,EAAG,CACV,QAAQ,MAAM,CACZ,EAAAA,EACA,KAAAT,EACA,gBAAAC,EACA,oBAAAC,CAAA,CACD,CACH,CAAA,CACD,EACD,MAAO,IAAM,CACLE,GAAA,CAEV,EACA,YAAa,IAASJ,EAAK,MAC3B,kBAAmB,IAASA,EAAK,KAAA,CAErC,EClBO,MAAMU,CAAa,CAiBxB,OAAO,QACLV,EACAW,EAIkC,CAClC,MAAMC,EAAMC,EAAAA,QAEZ,IAAIZ,EACFa,GACG,CAACA,CAAK,EACPC,EACAC,EAKA,OAAOL,GAAY,aACHV,EAAAU,GAIhB,OAAOA,GAAY,WACZI,EAAAJ,GAGP,OAAOA,GAAY,WACrBV,EAAkBU,EAAQ,oBAAsBV,EAChDc,EAASJ,EAAQ,GACjBK,EAAQL,EAAQ,OAASK,GAGdhB,EACW,WAEbe,EAAAH,GAGX,MAAMK,EAAeC,EAAA,KAAK,YAAY,EAAE,QAAQlB,EAAM,CACpD,GAAIe,EACJ,MAAAC,EACA,UAAW,EAAA,CACZ,EAED,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,+BAA+BjB,EAAK,MAAQA,CAAI,EAAE,EAGpE,KAAM,CAAE,UAAAmB,EAAW,YAAAC,EAAa,kBAAAC,CAAsB,EAAAC,EAAA,QACpD,IAAMvB,EAAkBkB,EAAchB,CAAe,EACrD,CAACgB,EAAa,SAAS,CAAA,EAGnBH,EAAQS,EAAA,qBACZJ,EACAC,EACAC,CAAA,EAGFG,OAAAA,EAAAA,UAAU,IAAM,CACVR,GAAS,CAACC,EAAa,QACzBA,EAAa,MAAQD,EACvB,EACC,CAACA,CAAK,CAAC,EAEH,CAACF,EAAOG,CAAY,CAC7B,CACF,CAEA,MAAMQ,EAAUf,EAAa"}
package/index.es.js CHANGED
@@ -1,55 +1,64 @@
1
- import { Blac as g } from "blac";
2
- import { useId as h, useMemo as B, useSyncExternalStore as y, useEffect as m } from "react";
3
- const v = (o, s) => {
4
- let e = s(o.state);
1
+ import { Blac as h } from "blac";
2
+ import { useId as g, useMemo as B, useSyncExternalStore as m, useEffect as y } from "react";
3
+ const v = (r, s) => {
4
+ let e = s(r.state);
5
5
  return {
6
6
  subscribe: (l) => {
7
- const r = o.addEventListenerStateChange((n) => {
8
- const t = s(n);
9
- let f = !0;
10
- for (let a = 0; a < t.length; a++)
11
- if (t[a] !== e[a]) {
12
- f = !1;
13
- break;
14
- }
15
- f || (e = t, l());
7
+ const c = r.addEventListenerStateChange((n) => {
8
+ try {
9
+ const t = s(n) ?? [];
10
+ let f = !0;
11
+ for (let a = 0; a < t.length; a++)
12
+ if (t[a] !== e[a]) {
13
+ f = !1;
14
+ break;
15
+ }
16
+ f || (e = t, l());
17
+ } catch (t) {
18
+ console.error({
19
+ e: t,
20
+ bloc: r,
21
+ dependencyArray: s,
22
+ lastDependencyCheck: e
23
+ });
24
+ }
16
25
  });
17
26
  return () => {
18
- r();
27
+ c();
19
28
  };
20
29
  },
21
- getSnapshot: () => o.state,
22
- getServerSnapshot: () => o.state
30
+ getSnapshot: () => r.state,
31
+ getServerSnapshot: () => r.state
23
32
  };
24
33
  };
25
34
  class E {
26
35
  static useBloc(s, e) {
27
- const l = h();
28
- let r = (S) => [S], n, t;
29
- typeof e == "function" && (r = e), typeof e == "string" && (n = e), typeof e == "object" && (r = e.dependencySelector ?? r, n = e.id, t = e.props ?? t), s.isolated && (n = l);
30
- const c = g.getInstance().getBloc(s, {
36
+ const l = g();
37
+ let c = (S) => [S], n, t;
38
+ typeof e == "function" && (c = e), typeof e == "string" && (n = e), typeof e == "object" && (c = e.dependencySelector ?? c, n = e.id, t = e.props ?? t), s.isolated && (n = l);
39
+ const o = h.getInstance().getBloc(s, {
31
40
  id: n,
32
41
  props: t,
33
42
  reconnect: !1
34
43
  });
35
- if (!c)
44
+ if (!o)
36
45
  throw new Error(`useBloc: could not resolve: ${s.name || s}`);
37
- const { subscribe: u, getSnapshot: d, getServerSnapshot: i } = B(
38
- () => v(c, r),
39
- [c.createdAt]
40
- ), p = y(
46
+ const { subscribe: u, getSnapshot: i, getServerSnapshot: d } = B(
47
+ () => v(o, c),
48
+ [o.createdAt]
49
+ ), p = m(
41
50
  u,
42
- d,
43
- i
51
+ i,
52
+ d
44
53
  );
45
- return m(() => {
46
- t && !c.props && (c.props = t);
47
- }, [t]), [p, c];
54
+ return y(() => {
55
+ t && !o.props && (o.props = t);
56
+ }, [t]), [p, o];
48
57
  }
49
58
  }
50
- const C = E.useBloc;
59
+ const b = E.useBloc;
51
60
  export {
52
61
  v as externalBlocStore,
53
- C as useBloc
62
+ b as useBloc
54
63
  };
55
64
  //# sourceMappingURL=index.es.js.map
package/index.es.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/externalBlocStore.ts","../src/useBloc.tsx"],"sourcesContent":["import { BlocBase } from 'blac';\n\nexport interface ExternalStore<B extends BlocBase<S>, S> {\n subscribe: (onStoreChange: () => void) => () => void;\n getSnapshot: () => S;\n getServerSnapshot?: () => S;\n}\n\nconst externalBlocStore = <B extends BlocBase<S>, S>(\n bloc: B,\n dependencyArray: (state: S) => unknown[],\n): ExternalStore<B, S> => {\n let lastDependencyCheck = dependencyArray(bloc.state);\n\n return {\n subscribe: (listener: () => void) => {\n const unSub = bloc.addEventListenerStateChange((data) => {\n const newDependencyCheck = dependencyArray(data);\n\n let allEqual = true;\n for (let i = 0; i < newDependencyCheck.length; i++) {\n if (newDependencyCheck[i] !== lastDependencyCheck[i]) {\n allEqual = false;\n break;\n }\n }\n\n if (!allEqual) {\n lastDependencyCheck = newDependencyCheck;\n listener();\n }\n });\n return () => {\n unSub();\n };\n },\n getSnapshot: (): S => bloc.state,\n getServerSnapshot: (): S => bloc.state,\n };\n};\n\nexport default externalBlocStore;\n","import {\n Blac,\n BlocBase,\n BlocConstructor,\n BlocInstanceId,\n BlocProps,\n CubitPropsType,\n ValueType,\n} from 'blac';\nimport { useEffect, useId, useMemo, useSyncExternalStore } from 'react';\nimport externalBlocStore from './externalBlocStore';\n\nexport type BlocHookData<B extends BlocBase<S>, S> = [\n value: ValueType<B>,\n instance: B,\n];\n\n// type BlocHookData<B extends BlocBase<S>, S> = [S, InstanceType<B>]; // B is the bloc class, S is the state of the bloc\n// type UseBlocClassResult<B, S> = BlocHookData<B, S>;\n\nexport type BlocHookDependencyArrayFn<B extends BlocBase<S>, S> = (\n state: ValueType<B>,\n) => unknown[];\n\nexport interface BlocHookOptions<B extends BlocBase<S>, S> {\n id?: string;\n dependencySelector?: BlocHookDependencyArrayFn<B, S>;\n props?: CubitPropsType<B>;\n}\n\nexport class UseBlocClass {\n // constructor, no options\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n options: BlocHookOptions<InstanceType<B>, S>,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n depsSelector: BlocHookDependencyArrayFn<InstanceType<B>, S>,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n instanceId: string,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n options?:\n | BlocHookOptions<InstanceType<B>, S>\n | BlocHookDependencyArrayFn<InstanceType<B>, S>\n | BlocInstanceId,\n ): BlocHookData<InstanceType<B>, S> {\n const rid = useId();\n // default options\n let dependencyArray: BlocHookDependencyArrayFn<InstanceType<B>, S> = (\n state: ValueType<InstanceType<B>>,\n ) => [state];\n let blocId: BlocInstanceId | undefined;\n let props: BlocProps | undefined;\n\n // parse options\n\n // if options is a function, its a dependencySelector\n if (typeof options === 'function') {\n dependencyArray = options;\n }\n\n // if options is a string its an ID\n if (typeof options === 'string') {\n blocId = options;\n }\n\n if (typeof options === 'object') {\n dependencyArray = options.dependencySelector ?? dependencyArray;\n blocId = options.id;\n props = options.props ?? props;\n }\n\n const base = bloc as unknown as BlocBase<S>;\n const isIsolated = base.isolated;\n if (isIsolated) {\n blocId = rid;\n }\n\n const resolvedBloc = Blac.getInstance().getBloc(bloc, {\n id: blocId,\n props,\n reconnect: false,\n }) as InstanceType<B>;\n\n if (!resolvedBloc) {\n throw new Error(`useBloc: could not resolve: ${bloc.name || bloc}`);\n }\n\n const { subscribe, getSnapshot, getServerSnapshot } = useMemo(\n () => externalBlocStore(resolvedBloc, dependencyArray),\n [resolvedBloc.createdAt],\n );\n\n const state = useSyncExternalStore<ValueType<InstanceType<B>>>(\n subscribe,\n getSnapshot,\n getServerSnapshot,\n );\n\n useEffect(() => {\n if (props && !resolvedBloc.props) {\n resolvedBloc.props = props;\n }\n }, [props]);\n\n return [state, resolvedBloc];\n }\n}\n\nconst useBloc = UseBlocClass.useBloc;\n\nexport default useBloc;\n"],"names":["externalBlocStore","bloc","dependencyArray","lastDependencyCheck","listener","unSub","data","newDependencyCheck","allEqual","i","UseBlocClass","options","rid","useId","state","blocId","props","resolvedBloc","Blac","subscribe","getSnapshot","getServerSnapshot","useMemo","useSyncExternalStore","useEffect","useBloc"],"mappings":";;AAQM,MAAAA,IAAoB,CACxBC,GACAC,MACwB;AACpB,MAAAC,IAAsBD,EAAgBD,EAAK,KAAK;AAE7C,SAAA;AAAA,IACL,WAAW,CAACG,MAAyB;AACnC,YAAMC,IAAQJ,EAAK,4BAA4B,CAACK,MAAS;AACjD,cAAAC,IAAqBL,EAAgBI,CAAI;AAE/C,YAAIE,IAAW;AACf,iBAASC,IAAI,GAAGA,IAAIF,EAAmB,QAAQE;AAC7C,cAAIF,EAAmBE,CAAC,MAAMN,EAAoBM,CAAC,GAAG;AACzC,YAAAD,IAAA;AACX;AAAA,UACF;AAGF,QAAKA,MACmBL,IAAAI,GACbH;MACX,CACD;AACD,aAAO,MAAM;AACL,QAAAC;MAAA;AAAA,IAEV;AAAA,IACA,aAAa,MAASJ,EAAK;AAAA,IAC3B,mBAAmB,MAASA,EAAK;AAAA,EAAA;AAErC;ACTO,MAAMS,EAAa;AAAA,EAiBxB,OAAO,QACLT,GACAU,GAIkC;AAClC,UAAMC,IAAMC;AAEZ,QAAIX,IAAiE,CACnEY,MACG,CAACA,CAAK,GACPC,GACAC;AAKA,IAAA,OAAOL,KAAY,eACHT,IAAAS,IAIhB,OAAOA,KAAY,aACZI,IAAAJ,IAGP,OAAOA,KAAY,aACrBT,IAAkBS,EAAQ,sBAAsBT,GAChDa,IAASJ,EAAQ,IACjBK,IAAQL,EAAQ,SAASK,IAGdf,EACW,aAEbc,IAAAH;AAGX,UAAMK,IAAeC,EAAK,YAAY,EAAE,QAAQjB,GAAM;AAAA,MACpD,IAAIc;AAAA,MACJ,OAAAC;AAAA,MACA,WAAW;AAAA,IAAA,CACZ;AAED,QAAI,CAACC;AACH,YAAM,IAAI,MAAM,+BAA+BhB,EAAK,QAAQA,CAAI,EAAE;AAGpE,UAAM,EAAE,WAAAkB,GAAW,aAAAC,GAAa,mBAAAC,EAAsB,IAAAC;AAAA,MACpD,MAAMtB,EAAkBiB,GAAcf,CAAe;AAAA,MACrD,CAACe,EAAa,SAAS;AAAA,IAAA,GAGnBH,IAAQS;AAAA,MACZJ;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA;AAGF,WAAAG,EAAU,MAAM;AACV,MAAAR,KAAS,CAACC,EAAa,UACzBA,EAAa,QAAQD;AAAA,IACvB,GACC,CAACA,CAAK,CAAC,GAEH,CAACF,GAAOG,CAAY;AAAA,EAC7B;AACF;AAEA,MAAMQ,IAAUf,EAAa;"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/externalBlocStore.ts","../src/useBloc.tsx"],"sourcesContent":["import { BlocBase } from 'blac';\n\nexport interface ExternalStore<B extends BlocBase<S>, S> {\n subscribe: (onStoreChange: () => void) => () => void;\n getSnapshot: () => S;\n getServerSnapshot?: () => S;\n}\n\nconst externalBlocStore = <B extends BlocBase<S>, S>(\n bloc: B,\n dependencyArray: (state: S) => unknown[],\n): ExternalStore<B, S> => {\n let lastDependencyCheck = dependencyArray(bloc.state);\n\n return {\n subscribe: (listener: () => void) => {\n const unSub = bloc.addEventListenerStateChange((data) => {\n try {\n const newDependencyCheck = dependencyArray(data) ?? [];\n\n let allEqual = true;\n for (let i = 0; i < newDependencyCheck.length; i++) {\n if (newDependencyCheck[i] !== lastDependencyCheck[i]) {\n allEqual = false;\n break;\n }\n }\n\n if (!allEqual) {\n lastDependencyCheck = newDependencyCheck;\n listener();\n }\n } catch (e) {\n console.error({\n e,\n bloc,\n dependencyArray,\n lastDependencyCheck,\n });\n }\n });\n return () => {\n unSub();\n };\n },\n getSnapshot: (): S => bloc.state,\n getServerSnapshot: (): S => bloc.state,\n };\n};\n\nexport default externalBlocStore;\n","import {\n Blac,\n BlocBase,\n BlocConstructor,\n BlocInstanceId,\n BlocProps,\n CubitPropsType,\n ValueType,\n} from 'blac';\nimport { useEffect, useId, useMemo, useSyncExternalStore } from 'react';\nimport externalBlocStore from './externalBlocStore';\n\nexport type BlocHookData<B extends BlocBase<S>, S> = [\n value: ValueType<B>,\n instance: B,\n];\n\n// type BlocHookData<B extends BlocBase<S>, S> = [S, InstanceType<B>]; // B is the bloc class, S is the state of the bloc\n// type UseBlocClassResult<B, S> = BlocHookData<B, S>;\n\nexport type BlocHookDependencyArrayFn<B extends BlocBase<S>, S> = (\n state: ValueType<B>,\n) => unknown[];\n\nexport interface BlocHookOptions<B extends BlocBase<S>, S> {\n id?: string;\n dependencySelector?: BlocHookDependencyArrayFn<B, S>;\n props?: CubitPropsType<B>;\n}\n\nexport class UseBlocClass {\n // constructor, no options\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n options: BlocHookOptions<InstanceType<B>, S>,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n depsSelector: BlocHookDependencyArrayFn<InstanceType<B>, S>,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n instanceId: string,\n ): BlocHookData<InstanceType<B>, S>;\n static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(\n bloc: B,\n options?:\n | BlocHookOptions<InstanceType<B>, S>\n | BlocHookDependencyArrayFn<InstanceType<B>, S>\n | BlocInstanceId,\n ): BlocHookData<InstanceType<B>, S> {\n const rid = useId();\n // default options\n let dependencyArray: BlocHookDependencyArrayFn<InstanceType<B>, S> = (\n state: ValueType<InstanceType<B>>,\n ) => [state];\n let blocId: BlocInstanceId | undefined;\n let props: BlocProps | undefined;\n\n // parse options\n\n // if options is a function, its a dependencySelector\n if (typeof options === 'function') {\n dependencyArray = options;\n }\n\n // if options is a string its an ID\n if (typeof options === 'string') {\n blocId = options;\n }\n\n if (typeof options === 'object') {\n dependencyArray = options.dependencySelector ?? dependencyArray;\n blocId = options.id;\n props = options.props ?? props;\n }\n\n const base = bloc as unknown as BlocBase<S>;\n const isIsolated = base.isolated;\n if (isIsolated) {\n blocId = rid;\n }\n\n const resolvedBloc = Blac.getInstance().getBloc(bloc, {\n id: blocId,\n props,\n reconnect: false,\n }) as InstanceType<B>;\n\n if (!resolvedBloc) {\n throw new Error(`useBloc: could not resolve: ${bloc.name || bloc}`);\n }\n\n const { subscribe, getSnapshot, getServerSnapshot } = useMemo(\n () => externalBlocStore(resolvedBloc, dependencyArray),\n [resolvedBloc.createdAt],\n );\n\n const state = useSyncExternalStore<ValueType<InstanceType<B>>>(\n subscribe,\n getSnapshot,\n getServerSnapshot,\n );\n\n useEffect(() => {\n if (props && !resolvedBloc.props) {\n resolvedBloc.props = props;\n }\n }, [props]);\n\n return [state, resolvedBloc];\n }\n}\n\nconst useBloc = UseBlocClass.useBloc;\n\nexport default useBloc;\n"],"names":["externalBlocStore","bloc","dependencyArray","lastDependencyCheck","listener","unSub","data","newDependencyCheck","allEqual","i","e","UseBlocClass","options","rid","useId","state","blocId","props","resolvedBloc","Blac","subscribe","getSnapshot","getServerSnapshot","useMemo","useSyncExternalStore","useEffect","useBloc"],"mappings":";;AAQM,MAAAA,IAAoB,CACxBC,GACAC,MACwB;AACpB,MAAAC,IAAsBD,EAAgBD,EAAK,KAAK;AAE7C,SAAA;AAAA,IACL,WAAW,CAACG,MAAyB;AACnC,YAAMC,IAAQJ,EAAK,4BAA4B,CAACK,MAAS;AACnD,YAAA;AACF,gBAAMC,IAAqBL,EAAgBI,CAAI,KAAK,CAAA;AAEpD,cAAIE,IAAW;AACf,mBAASC,IAAI,GAAGA,IAAIF,EAAmB,QAAQE;AAC7C,gBAAIF,EAAmBE,CAAC,MAAMN,EAAoBM,CAAC,GAAG;AACzC,cAAAD,IAAA;AACX;AAAA,YACF;AAGF,UAAKA,MACmBL,IAAAI,GACbH;iBAEJM,GAAG;AACV,kBAAQ,MAAM;AAAA,YACZ,GAAAA;AAAA,YACA,MAAAT;AAAA,YACA,iBAAAC;AAAA,YACA,qBAAAC;AAAA,UAAA,CACD;AAAA,QACH;AAAA,MAAA,CACD;AACD,aAAO,MAAM;AACL,QAAAE;MAAA;AAAA,IAEV;AAAA,IACA,aAAa,MAASJ,EAAK;AAAA,IAC3B,mBAAmB,MAASA,EAAK;AAAA,EAAA;AAErC;AClBO,MAAMU,EAAa;AAAA,EAiBxB,OAAO,QACLV,GACAW,GAIkC;AAClC,UAAMC,IAAMC;AAEZ,QAAIZ,IAAiE,CACnEa,MACG,CAACA,CAAK,GACPC,GACAC;AAKA,IAAA,OAAOL,KAAY,eACHV,IAAAU,IAIhB,OAAOA,KAAY,aACZI,IAAAJ,IAGP,OAAOA,KAAY,aACrBV,IAAkBU,EAAQ,sBAAsBV,GAChDc,IAASJ,EAAQ,IACjBK,IAAQL,EAAQ,SAASK,IAGdhB,EACW,aAEbe,IAAAH;AAGX,UAAMK,IAAeC,EAAK,YAAY,EAAE,QAAQlB,GAAM;AAAA,MACpD,IAAIe;AAAA,MACJ,OAAAC;AAAA,MACA,WAAW;AAAA,IAAA,CACZ;AAED,QAAI,CAACC;AACH,YAAM,IAAI,MAAM,+BAA+BjB,EAAK,QAAQA,CAAI,EAAE;AAGpE,UAAM,EAAE,WAAAmB,GAAW,aAAAC,GAAa,mBAAAC,EAAsB,IAAAC;AAAA,MACpD,MAAMvB,EAAkBkB,GAAchB,CAAe;AAAA,MACrD,CAACgB,EAAa,SAAS;AAAA,IAAA,GAGnBH,IAAQS;AAAA,MACZJ;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA;AAGF,WAAAG,EAAU,MAAM;AACV,MAAAR,KAAS,CAACC,EAAa,UACzBA,EAAa,QAAQD;AAAA,IACvB,GACC,CAACA,CAAK,CAAC,GAEH,CAACF,GAAOG,CAAY;AAAA,EAC7B;AACF;AAEA,MAAMQ,IAAUf,EAAa;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blac/react",
3
- "version": "0.0.25",
3
+ "version": "0.0.28",
4
4
  "license": "MIT",
5
5
  "main": "index.cjs.js",
6
6
  "module": "index.es.js",
@@ -25,12 +25,12 @@
25
25
  "pub": "npm run build && npm publish"
26
26
  },
27
27
  "dependencies": {
28
- "blac": "*",
29
- "vite-plugin-dts": "^3.6.4"
28
+ "blac": "*"
30
29
  },
31
30
  "devDependencies": {
32
- "@types/react": "^18.2.20",
31
+ "vite-plugin-dts": "^3.7.1",
32
+ "@types/react": "^18.2.48",
33
33
  "react": "^18.2.0",
34
- "vitest": "^0.34.1"
34
+ "vitest": "^1.2.1"
35
35
  }
36
36
  }
@@ -0,0 +1,8 @@
1
+ import { BlocBase } from 'blac';
2
+ export interface ExternalStore<B extends BlocBase<S>, S> {
3
+ subscribe: (onStoreChange: () => void) => () => void;
4
+ getSnapshot: () => S;
5
+ getServerSnapshot?: () => S;
6
+ }
7
+ declare const externalBlocStore: <B extends BlocBase<S, {}>, S>(bloc: B, dependencyArray: (state: S) => unknown[]) => ExternalStore<B, S>;
8
+ export default externalBlocStore;
package/src/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import externalBlocStore from './externalBlocStore';
2
+ import useBloc from './useBloc';
3
+ export { externalBlocStore, useBloc };
@@ -0,0 +1,19 @@
1
+ import { BlocBase, BlocConstructor, CubitPropsType, ValueType } from 'blac';
2
+ export type BlocHookData<B extends BlocBase<S>, S> = [
3
+ value: ValueType<B>,
4
+ instance: B
5
+ ];
6
+ export type BlocHookDependencyArrayFn<B extends BlocBase<S>, S> = (state: ValueType<B>) => unknown[];
7
+ export interface BlocHookOptions<B extends BlocBase<S>, S> {
8
+ id?: string;
9
+ dependencySelector?: BlocHookDependencyArrayFn<B, S>;
10
+ props?: CubitPropsType<B>;
11
+ }
12
+ export declare class UseBlocClass {
13
+ static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(bloc: B): BlocHookData<InstanceType<B>, S>;
14
+ static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(bloc: B, options: BlocHookOptions<InstanceType<B>, S>): BlocHookData<InstanceType<B>, S>;
15
+ static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(bloc: B, depsSelector: BlocHookDependencyArrayFn<InstanceType<B>, S>): BlocHookData<InstanceType<B>, S>;
16
+ static useBloc<B extends BlocConstructor<BlocBase<S>>, S>(bloc: B, instanceId: string): BlocHookData<InstanceType<B>, S>;
17
+ }
18
+ declare const useBloc: typeof UseBlocClass.useBloc;
19
+ export default useBloc;
package/dev.d.ts DELETED
@@ -1 +0,0 @@
1
- export {};