@siberiacancode/reactuse 0.2.16 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -25,16 +25,16 @@ npm install @siberiacancode/reactuse
25
25
  ```
26
26
 
27
27
  ```tsx
28
- import { useCounter } from '@siberiacancode/reactuse';
28
+ import { useCounter } from "@siberiacancode/reactuse";
29
29
 
30
30
  function App() {
31
31
  const counter = useCounter(0);
32
32
 
33
33
  return (
34
34
  <div>
35
- <h1>Count: {const.value}</h1>
36
- <button onClick={() => const.inc()}>+1</button>
37
- <button onClick={() => const.dec()}>-1</button>
35
+ <h1>Count: {counter.value}</h1>
36
+ <button onClick={() => counter.inc()}>+1</button>
37
+ <button onClick={() => counter.dec()}>-1</button>
38
38
  </div>
39
39
  );
40
40
  }
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react"),l=()=>{const r=new EventTarget,E=(e,t)=>r.dispatchEvent(new CustomEvent(e,{detail:t})),u=(e,t)=>{const n=s=>t(s.detail);return r.addEventListener(e,n),()=>r.removeEventListener(e,n)},o=(e,t)=>{const n=s=>t(s.detail);r.removeEventListener(e,n)};return{instance:r,push:E,subscribe:u,unsubscribe:o,useSubscribe:(e,t)=>{const[n,s]=c.useState(void 0),a=c.useRef(t);return a.current=t,c.useEffect(()=>{const i=b=>{s(b),a.current?.(b)};return u(e,i),()=>{o(e,i)}},[e]),n}}};exports.createEventEmitter=l;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react"),v=()=>{const r=new Map,a=(e,t)=>{r.get(e)?.forEach(n=>n(t))},u=(e,t)=>{const s=e,n=r.get(s);n&&(n.delete(t),n.size||r.delete(s))},o=(e,t)=>{const s=e;return r.has(s)||r.set(s,new Set),r.get(e).add(t),()=>{u(e,t)}};return{push:a,subscribe:o,unsubscribe:u,useSubscribe:(e,t)=>{const[s,n]=c.useState(void 0),i=c.useRef(t);return i.current=t,c.useEffect(()=>{const f=o(e,b=>{n(b),i.current?.(b)});return()=>{f()}},[e]),s}}};exports.createEventEmitter=v;
2
2
  //# sourceMappingURL=createEventEmitter.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"createEventEmitter.cjs","sources":["../../../../src/helpers/createEventEmitter/createEventEmitter.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\n/**\n * @name createEventEmitter\n * @description - Creates a type-safe event emitter\n * @category Helpers\n *\n * @template Events - The type of events and their data\n * @returns {Events} - Object containing event emitter methods and hook\n *\n * @example\n * const { instance, push, subscribe, unsubscribe, useSubscribe } = createEventEmitter<{ foo: number }>();\n */\nexport const createEventEmitter = <Events extends Record<string, any> = Record<string, any>>() => {\n const eventTarget = new EventTarget();\n\n const push = <Event extends keyof Events>(event: Event, data: Events[Event]) =>\n eventTarget.dispatchEvent(new CustomEvent(event as string, { detail: data }));\n\n const subscribe = <Key extends keyof Events>(\n event: Key,\n listener: (data: Events[Key]) => void\n ) => {\n const callback = (event: Event) => listener((event as CustomEvent).detail);\n\n eventTarget.addEventListener(event as string, callback);\n return () => eventTarget.removeEventListener(event as string, callback);\n };\n\n const unsubscribe = <Key extends keyof Events>(\n event: Key,\n listener: (data: Events[Key]) => void\n ) => {\n const callback = (event: Event) => listener((event as CustomEvent).detail);\n eventTarget.removeEventListener(event as string, callback);\n };\n\n const useSubscribe = <Event extends keyof Events>(\n event: Event,\n listener?: (data: Events[Event]) => void\n ) => {\n const [data, setData] = useState<Events[Event] | undefined>(undefined);\n const listenerRef = useRef(listener);\n listenerRef.current = listener;\n\n useEffect(() => {\n const onSubscribe = (data: Events[Event]) => {\n setData(data);\n listenerRef.current?.(data);\n };\n subscribe(event, onSubscribe);\n return () => {\n unsubscribe(event, onSubscribe);\n };\n }, [event]);\n\n return data;\n };\n\n return {\n instance: eventTarget,\n push,\n subscribe,\n unsubscribe,\n useSubscribe\n };\n};\n"],"names":["createEventEmitter","eventTarget","push","event","data","subscribe","listener","callback","unsubscribe","setData","useState","listenerRef","useRef","useEffect","onSubscribe"],"mappings":"yGAaaA,EAAqB,IAAgE,CAChG,MAAMC,EAAc,IAAI,YAElBC,EAAO,CAA6BC,EAAcC,IACtDH,EAAY,cAAc,IAAI,YAAYE,EAAiB,CAAE,OAAQC,CAAA,CAAM,CAAC,EAExEC,EAAY,CAChBF,EACAG,IACG,CACH,MAAMC,EAAYJ,GAAiBG,EAAUH,EAAsB,MAAM,EAEzE,OAAAF,EAAY,iBAAiBE,EAAiBI,CAAQ,EAC/C,IAAMN,EAAY,oBAAoBE,EAAiBI,CAAQ,CAAA,EAGlEC,EAAc,CAClBL,EACAG,IACG,CACH,MAAMC,EAAYJ,GAAiBG,EAAUH,EAAsB,MAAM,EACzEF,EAAY,oBAAoBE,EAAiBI,CAAQ,CAAA,EAyB3D,MAAO,CACL,SAAUN,EACV,KAAAC,EACA,UAAAG,EACA,YAAAG,EACA,aA3BmB,CACnBL,EACAG,IACG,CACH,KAAM,CAACF,EAAMK,CAAO,EAAIC,EAAAA,SAAoC,MAAS,EAC/DC,EAAcC,EAAAA,OAAON,CAAQ,EACnC,OAAAK,EAAY,QAAUL,EAEtBO,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAeV,GAAwB,CAC3CK,EAAQL,CAAI,EACZO,EAAY,UAAUP,CAAI,CAAA,EAE5B,OAAAC,EAAUF,EAAOW,CAAW,EACrB,IAAM,CACXN,EAAYL,EAAOW,CAAW,CAAA,CAChC,EACC,CAACX,CAAK,CAAC,EAEHC,CAAA,CAQP,CAEJ"}
1
+ {"version":3,"file":"createEventEmitter.cjs","sources":["../../../../src/helpers/createEventEmitter/createEventEmitter.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\n/**\n * @name createEventEmitter\n * @description - Creates a type-safe event emitter\n * @category Helpers\n *\n * @template Events - The type of events and their data\n * @returns {EventEmitterApi<Events>} - Object containing event emitter methods and hook\n *\n * @example\n * const { push, subscribe, unsubscribe, useSubscribe } = createEventEmitter<{ foo: number }>();\n */\nexport const createEventEmitter = <Events extends Record<string, any> = Record<string, any>>() => {\n type ListenerMap = Map<string, Set<(data: any) => void>>;\n const listeners: ListenerMap = new Map();\n\n const push = <Event extends keyof Events>(event: Event, data: Events[Event]) => {\n const eventListeners = listeners.get(event as string);\n eventListeners?.forEach((listener) => listener(data));\n };\n\n const unsubscribe = <Key extends keyof Events>(\n event: Key,\n listener: (data: Events[Key]) => void\n ) => {\n const eventKey = event as string;\n const eventListeners = listeners.get(eventKey);\n if (!eventListeners) return;\n eventListeners.delete(listener);\n if (!eventListeners.size) listeners.delete(eventKey);\n };\n\n const subscribe = <Key extends keyof Events>(\n event: Key,\n listener: (data: Events[Key]) => void\n ) => {\n const eventKey = event as string;\n if (!listeners.has(eventKey)) listeners.set(eventKey, new Set());\n const eventListeners = listeners.get(event as string)!;\n eventListeners.add(listener);\n\n return () => {\n unsubscribe(event, listener);\n };\n };\n\n const useSubscribe = <Event extends keyof Events>(\n event: Event,\n listener?: (data: Events[Event]) => void\n ) => {\n const [data, setData] = useState<Events[Event] | undefined>(undefined);\n const listenerRef = useRef(listener);\n listenerRef.current = listener;\n\n useEffect(() => {\n const onSubscribe = (data: Events[Event]) => {\n setData(data);\n listenerRef.current?.(data);\n };\n\n const unsubscribe = subscribe(event, onSubscribe);\n return () => {\n unsubscribe();\n };\n }, [event]);\n\n return data;\n };\n\n return {\n push,\n subscribe,\n unsubscribe,\n useSubscribe\n };\n};\n"],"names":["createEventEmitter","listeners","push","event","data","listener","unsubscribe","eventKey","eventListeners","subscribe","setData","useState","listenerRef","useRef","useEffect"],"mappings":"yGAaaA,EAAqB,IAAgE,CAEhG,MAAMC,MAA6B,IAE7BC,EAAO,CAA6BC,EAAcC,IAAwB,CACvDH,EAAU,IAAIE,CAAe,GACpC,QAASE,GAAaA,EAASD,CAAI,CAAC,CAAA,EAGhDE,EAAc,CAClBH,EACAE,IACG,CACH,MAAME,EAAWJ,EACXK,EAAiBP,EAAU,IAAIM,CAAQ,EACxCC,IACLA,EAAe,OAAOH,CAAQ,EACzBG,EAAe,MAAMP,EAAU,OAAOM,CAAQ,EAAA,EAG/CE,EAAY,CAChBN,EACAE,IACG,CACH,MAAME,EAAWJ,EACjB,OAAKF,EAAU,IAAIM,CAAQ,KAAa,IAAIA,EAAU,IAAI,GAAK,EACxCN,EAAU,IAAIE,CAAe,EACrC,IAAIE,CAAQ,EAEpB,IAAM,CACXC,EAAYH,EAAOE,CAAQ,CAAA,CAC7B,EA0BF,MAAO,CACL,KAAAH,EACA,UAAAO,EACA,YAAAH,EACA,aA3BmB,CACnBH,EACAE,IACG,CACH,KAAM,CAACD,EAAMM,CAAO,EAAIC,EAAAA,SAAoC,MAAS,EAC/DC,EAAcC,EAAAA,OAAOR,CAAQ,EACnC,OAAAO,EAAY,QAAUP,EAEtBS,EAAAA,UAAU,IAAM,CAMd,MAAMR,EAAcG,EAAUN,EALTC,GAAwB,CAC3CM,EAAQN,CAAI,EACZQ,EAAY,UAAUR,CAAI,CAAA,CAGoB,EAChD,MAAO,IAAM,CACXE,EAAAA,CAAY,CACd,EACC,CAACH,CAAK,CAAC,EAEHC,CAAA,CAOP,CAEJ"}
@@ -1,31 +1,34 @@
1
- import { useState as E, useRef as v, useEffect as d } from "react";
2
- const f = () => {
3
- const s = new EventTarget(), b = (e, t) => s.dispatchEvent(new CustomEvent(e, { detail: t })), c = (e, t) => {
4
- const n = (r) => t(r.detail);
5
- return s.addEventListener(e, n), () => s.removeEventListener(e, n);
1
+ import { useState as a, useRef as v, useEffect as S } from "react";
2
+ const E = () => {
3
+ const r = /* @__PURE__ */ new Map(), b = (e, t) => {
4
+ r.get(e)?.forEach((n) => n(t));
5
+ }, c = (e, t) => {
6
+ const s = e, n = r.get(s);
7
+ n && (n.delete(t), n.size || r.delete(s));
6
8
  }, o = (e, t) => {
7
- const n = (r) => t(r.detail);
8
- s.removeEventListener(e, n);
9
+ const s = e;
10
+ return r.has(s) || r.set(s, /* @__PURE__ */ new Set()), r.get(e).add(t), () => {
11
+ c(e, t);
12
+ };
9
13
  };
10
14
  return {
11
- instance: s,
12
15
  push: b,
13
- subscribe: c,
14
- unsubscribe: o,
16
+ subscribe: o,
17
+ unsubscribe: c,
15
18
  useSubscribe: (e, t) => {
16
- const [n, r] = E(void 0), u = v(t);
17
- return u.current = t, d(() => {
18
- const a = (i) => {
19
- r(i), u.current?.(i);
19
+ const [s, n] = a(void 0), u = v(t);
20
+ return u.current = t, S(() => {
21
+ const f = o(e, (i) => {
22
+ n(i), u.current?.(i);
23
+ });
24
+ return () => {
25
+ f();
20
26
  };
21
- return c(e, a), () => {
22
- o(e, a);
23
- };
24
- }, [e]), n;
27
+ }, [e]), s;
25
28
  }
26
29
  };
27
30
  };
28
31
  export {
29
- f as createEventEmitter
32
+ E as createEventEmitter
30
33
  };
31
34
  //# sourceMappingURL=createEventEmitter.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"createEventEmitter.mjs","sources":["../../../../src/helpers/createEventEmitter/createEventEmitter.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\n/**\n * @name createEventEmitter\n * @description - Creates a type-safe event emitter\n * @category Helpers\n *\n * @template Events - The type of events and their data\n * @returns {Events} - Object containing event emitter methods and hook\n *\n * @example\n * const { instance, push, subscribe, unsubscribe, useSubscribe } = createEventEmitter<{ foo: number }>();\n */\nexport const createEventEmitter = <Events extends Record<string, any> = Record<string, any>>() => {\n const eventTarget = new EventTarget();\n\n const push = <Event extends keyof Events>(event: Event, data: Events[Event]) =>\n eventTarget.dispatchEvent(new CustomEvent(event as string, { detail: data }));\n\n const subscribe = <Key extends keyof Events>(\n event: Key,\n listener: (data: Events[Key]) => void\n ) => {\n const callback = (event: Event) => listener((event as CustomEvent).detail);\n\n eventTarget.addEventListener(event as string, callback);\n return () => eventTarget.removeEventListener(event as string, callback);\n };\n\n const unsubscribe = <Key extends keyof Events>(\n event: Key,\n listener: (data: Events[Key]) => void\n ) => {\n const callback = (event: Event) => listener((event as CustomEvent).detail);\n eventTarget.removeEventListener(event as string, callback);\n };\n\n const useSubscribe = <Event extends keyof Events>(\n event: Event,\n listener?: (data: Events[Event]) => void\n ) => {\n const [data, setData] = useState<Events[Event] | undefined>(undefined);\n const listenerRef = useRef(listener);\n listenerRef.current = listener;\n\n useEffect(() => {\n const onSubscribe = (data: Events[Event]) => {\n setData(data);\n listenerRef.current?.(data);\n };\n subscribe(event, onSubscribe);\n return () => {\n unsubscribe(event, onSubscribe);\n };\n }, [event]);\n\n return data;\n };\n\n return {\n instance: eventTarget,\n push,\n subscribe,\n unsubscribe,\n useSubscribe\n };\n};\n"],"names":["createEventEmitter","eventTarget","push","event","data","subscribe","listener","callback","unsubscribe","setData","useState","listenerRef","useRef","useEffect","onSubscribe"],"mappings":";AAaO,MAAMA,IAAqB,MAAgE;AAChG,QAAMC,IAAc,IAAI,YAAA,GAElBC,IAAO,CAA6BC,GAAcC,MACtDH,EAAY,cAAc,IAAI,YAAYE,GAAiB,EAAE,QAAQC,EAAA,CAAM,CAAC,GAExEC,IAAY,CAChBF,GACAG,MACG;AACH,UAAMC,IAAW,CAACJ,MAAiBG,EAAUH,EAAsB,MAAM;AAEzE,WAAAF,EAAY,iBAAiBE,GAAiBI,CAAQ,GAC/C,MAAMN,EAAY,oBAAoBE,GAAiBI,CAAQ;AAAA,EAAA,GAGlEC,IAAc,CAClBL,GACAG,MACG;AACH,UAAMC,IAAW,CAACJ,MAAiBG,EAAUH,EAAsB,MAAM;AACzE,IAAAF,EAAY,oBAAoBE,GAAiBI,CAAQ;AAAA,EAAA;AAyB3D,SAAO;AAAA,IACL,UAAUN;AAAA,IACV,MAAAC;AAAA,IACA,WAAAG;AAAA,IACA,aAAAG;AAAA,IACA,cA3BmB,CACnBL,GACAG,MACG;AACH,YAAM,CAACF,GAAMK,CAAO,IAAIC,EAAoC,MAAS,GAC/DC,IAAcC,EAAON,CAAQ;AACnC,aAAAK,EAAY,UAAUL,GAEtBO,EAAU,MAAM;AACd,cAAMC,IAAc,CAACV,MAAwB;AAC3C,UAAAK,EAAQL,CAAI,GACZO,EAAY,UAAUP,CAAI;AAAA,QAAA;AAE5B,eAAAC,EAAUF,GAAOW,CAAW,GACrB,MAAM;AACX,UAAAN,EAAYL,GAAOW,CAAW;AAAA,QAAA;AAAA,MAChC,GACC,CAACX,CAAK,CAAC,GAEHC;AAAA,IAAA;AAAA,EAQP;AAEJ;"}
1
+ {"version":3,"file":"createEventEmitter.mjs","sources":["../../../../src/helpers/createEventEmitter/createEventEmitter.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\n/**\n * @name createEventEmitter\n * @description - Creates a type-safe event emitter\n * @category Helpers\n *\n * @template Events - The type of events and their data\n * @returns {EventEmitterApi<Events>} - Object containing event emitter methods and hook\n *\n * @example\n * const { push, subscribe, unsubscribe, useSubscribe } = createEventEmitter<{ foo: number }>();\n */\nexport const createEventEmitter = <Events extends Record<string, any> = Record<string, any>>() => {\n type ListenerMap = Map<string, Set<(data: any) => void>>;\n const listeners: ListenerMap = new Map();\n\n const push = <Event extends keyof Events>(event: Event, data: Events[Event]) => {\n const eventListeners = listeners.get(event as string);\n eventListeners?.forEach((listener) => listener(data));\n };\n\n const unsubscribe = <Key extends keyof Events>(\n event: Key,\n listener: (data: Events[Key]) => void\n ) => {\n const eventKey = event as string;\n const eventListeners = listeners.get(eventKey);\n if (!eventListeners) return;\n eventListeners.delete(listener);\n if (!eventListeners.size) listeners.delete(eventKey);\n };\n\n const subscribe = <Key extends keyof Events>(\n event: Key,\n listener: (data: Events[Key]) => void\n ) => {\n const eventKey = event as string;\n if (!listeners.has(eventKey)) listeners.set(eventKey, new Set());\n const eventListeners = listeners.get(event as string)!;\n eventListeners.add(listener);\n\n return () => {\n unsubscribe(event, listener);\n };\n };\n\n const useSubscribe = <Event extends keyof Events>(\n event: Event,\n listener?: (data: Events[Event]) => void\n ) => {\n const [data, setData] = useState<Events[Event] | undefined>(undefined);\n const listenerRef = useRef(listener);\n listenerRef.current = listener;\n\n useEffect(() => {\n const onSubscribe = (data: Events[Event]) => {\n setData(data);\n listenerRef.current?.(data);\n };\n\n const unsubscribe = subscribe(event, onSubscribe);\n return () => {\n unsubscribe();\n };\n }, [event]);\n\n return data;\n };\n\n return {\n push,\n subscribe,\n unsubscribe,\n useSubscribe\n };\n};\n"],"names":["createEventEmitter","listeners","push","event","data","listener","unsubscribe","eventKey","eventListeners","subscribe","setData","useState","listenerRef","useRef","useEffect"],"mappings":";AAaO,MAAMA,IAAqB,MAAgE;AAEhG,QAAMC,wBAA6B,IAAA,GAE7BC,IAAO,CAA6BC,GAAcC,MAAwB;AAE9E,IADuBH,EAAU,IAAIE,CAAe,GACpC,QAAQ,CAACE,MAAaA,EAASD,CAAI,CAAC;AAAA,EAAA,GAGhDE,IAAc,CAClBH,GACAE,MACG;AACH,UAAME,IAAWJ,GACXK,IAAiBP,EAAU,IAAIM,CAAQ;AAC7C,IAAKC,MACLA,EAAe,OAAOH,CAAQ,GACzBG,EAAe,QAAMP,EAAU,OAAOM,CAAQ;AAAA,EAAA,GAG/CE,IAAY,CAChBN,GACAE,MACG;AACH,UAAME,IAAWJ;AACjB,WAAKF,EAAU,IAAIM,CAAQ,OAAa,IAAIA,GAAU,oBAAI,KAAK,GACxCN,EAAU,IAAIE,CAAe,EACrC,IAAIE,CAAQ,GAEpB,MAAM;AACX,MAAAC,EAAYH,GAAOE,CAAQ;AAAA,IAAA;AAAA,EAC7B;AA0BF,SAAO;AAAA,IACL,MAAAH;AAAA,IACA,WAAAO;AAAA,IACA,aAAAH;AAAA,IACA,cA3BmB,CACnBH,GACAE,MACG;AACH,YAAM,CAACD,GAAMM,CAAO,IAAIC,EAAoC,MAAS,GAC/DC,IAAcC,EAAOR,CAAQ;AACnC,aAAAO,EAAY,UAAUP,GAEtBS,EAAU,MAAM;AAMd,cAAMR,IAAcG,EAAUN,GALV,CAACC,MAAwB;AAC3C,UAAAM,EAAQN,CAAI,GACZQ,EAAY,UAAUR,CAAI;AAAA,QAAA,CAGoB;AAChD,eAAO,MAAM;AACXE,UAAAA,EAAAA;AAAAA,QAAY;AAAA,MACd,GACC,CAACH,CAAK,CAAC,GAEHC;AAAA,IAAA;AAAA,EAOP;AAEJ;"}
@@ -4,14 +4,13 @@
4
4
  * @category Helpers
5
5
  *
6
6
  * @template Events - The type of events and their data
7
- * @returns {Events} - Object containing event emitter methods and hook
7
+ * @returns {EventEmitterApi<Events>} - Object containing event emitter methods and hook
8
8
  *
9
9
  * @example
10
- * const { instance, push, subscribe, unsubscribe, useSubscribe } = createEventEmitter<{ foo: number }>();
10
+ * const { push, subscribe, unsubscribe, useSubscribe } = createEventEmitter<{ foo: number }>();
11
11
  */
12
12
  export declare const createEventEmitter: <Events extends Record<string, any> = Record<string, any>>() => {
13
- instance: EventTarget;
14
- push: <Event extends keyof Events>(event: Event, data: Events[Event]) => boolean;
13
+ push: <Event extends keyof Events>(event: Event, data: Events[Event]) => void;
15
14
  subscribe: <Key extends keyof Events>(event: Key, listener: (data: Events[Key]) => void) => () => void;
16
15
  unsubscribe: <Key extends keyof Events>(event: Key, listener: (data: Events[Key]) => void) => void;
17
16
  useSubscribe: <Event extends keyof Events>(event: Event, listener?: (data: Events[Event]) => void) => Events[Event] | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@siberiacancode/reactuse",
3
- "version": "0.2.16",
3
+ "version": "0.2.18",
4
4
  "description": "The ultimate collection of react hooks",
5
5
  "author": {
6
6
  "name": "SIBERIA CAN CODE 🧊",