@cervello/react 0.9.0 โ†’ 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,12 @@
1
1
  # Cervello
2
+ <img src="https://img.shields.io/npm/v/@cervello/react?color=red&style=flat-square">
3
+
4
+ > (Beta version) - Working on it to be have SSR integration (hydration) and better documentation
5
+
6
+ <img src="https://img.shields.io/bundlephobia/minzip/@cervello/react?color=red&label=BundlePhobia%20size&style=flat-square">
7
+
8
+
9
+ #### `746 Bytes of bundle size for now (.br compressed)!! `
2
10
  Simplest and truly reactive state manager for React
3
11
 
4
12
 
@@ -27,7 +35,7 @@ The `cervello` function allows you to create a new store in an easy way.
27
35
 
28
36
  ```ts
29
37
  // - store-example.ts
30
- import { cervello } from 'cervello'
38
+ import { cervello } from '@cervello/react'
31
39
 
32
40
 
33
41
  /** Export it with the names you prefer to be used/imported */
@@ -38,12 +46,12 @@ import { cervello } from 'cervello'
38
46
  * Object returned => { storeNameProvided, useStore, useSelect }
39
47
  */
40
48
  export const {
41
- exampleStore, // The store object
49
+ exampleStore, // The store object
42
50
  useStore: useExampleStore, // The hook to use the store
43
51
  useSelect: useExampleSelect // The hook to use the selectors (part of the store)
44
52
  } = cervello(
45
53
  'exampleStore', /* store name */
46
- { count: 0 } /* initial value */
54
+ { count: 0 } /* initial value */
47
55
  )
48
56
  ```
49
57
 
@@ -73,14 +81,17 @@ const CounterButton = () => (
73
81
  ```
74
82
 
75
83
 
76
- #### ๐Ÿ”– Changing the store
84
+ ### ๐Ÿ”– Changing the store
77
85
  ```ts
78
86
  const CounterLabel = () => {
79
87
  /**
80
- * If you want to just listen for changes, then you can destructure the value but...
88
+ * If you want to just listen for changes, then you
89
+ * can destructure the value but...
81
90
  *
82
- * IMPORTANT!: In order to change reactively any store attribute, you must use
83
- * the object returned from the `useStore` hook without destructuring
91
+ * IMPORTANT!:
92
+ * In order to change reactively any store attribute, you
93
+ * must use the object returned from the `useStore` hook
94
+ * without destructuring
84
95
  * */
85
96
  const exampleStore = useExampleStore()
86
97
 
@@ -99,3 +110,38 @@ const CounterLabel = () => {
99
110
  }
100
111
 
101
112
  ```
113
+
114
+ ### โคต๏ธ The `Use` function
115
+ The use function allows you to implement side effects due to a change in happened in the store
116
+ ```ts
117
+ import type { UseFunction } from '@cervello/react'
118
+
119
+ const logger: UseFunction<'testStore', typeof testStore> = ({ $onChange }): void => {
120
+ $onChange((store) => {
121
+ console.log('Store changed to :>>', store)
122
+ })
123
+ }
124
+
125
+
126
+ const { testStore } =
127
+ cervello('testStore', { test: 'test', count: -1 })
128
+ .use(logger, /* other use functions */) // Adds the logger to the store
129
+
130
+ ```
131
+
132
+ #### ๐Ÿ—ณ๏ธ Use function callback object
133
+ ```ts
134
+ import type { UseFunction } from '@cervello/react'
135
+
136
+ const logger: UseFunction<'testStore', typeof testStore> = ({ testStore, $onPartialChange, $onChange }): void => {
137
+ // Listen to all the changes happened in the store
138
+ $onChange((store) => {
139
+ console.log('Store changed to :>>', store)
140
+ });
141
+
142
+ // Listen to the changes happened in the store's attributes provided
143
+ $onPartialChange(['test', 'count'], (store) => {
144
+ store.count += 1
145
+ })
146
+ }
147
+ ```
package/dist/cervello.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var n=require("rxjs"),e=require("react");function r(){return r=Object.assign?Object.assign.bind():function(n){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(n[t]=r[t])}return n},r.apply(this,arguments)}function t(n,e){if("object"!=typeof e)throw new Error("Store must be an object");return new Proxy(e,{get:function(e,r){var u=n.value;return r in u?"function"==typeof u[r]?u[r].bind(t(n,u)):u[r]:Reflect.get(e,r)},set:function(e,r,t){var u=Object.assign({},n.value);return u[r]=t,n.next(u),Reflect.set(e,r,t)}})}function u(n,e){return n.reduce(function(n,r){return n[r]=e[r],n},{})}exports.c=function(i,c){var o,f,s=Symbol("__cervello-store__"),a=new n.BehaviorSubject(c),b=t(a,r(((o={})[s]=a,o),c)),l=((f={})[i]=b,f.useStore=function(r){return function(){var u=e.useState(t(r,r.value)),i=u[0],c=u[1],o=e.useRef(!0);return e.useEffect(function(){var e=r.pipe(n.observeOn(n.queueScheduler)).subscribe(function(n){o.current?o.current=!1:c(t(r,n))});return function(){return e.unsubscribe()}},[]),i}}(a),f.useSelect=function(r){return function(){var i=[].slice.call(arguments),c=e.useState(function(){var n=u(i,r.value);return t(r,n)}),o=c[0],f=c[1],s=e.useRef(!0);return e.useEffect(function(){var e=r.pipe(n.distinctUntilChanged(function(n,e){var r=!0;return i.forEach(function(t){"object"==typeof e[t]&&r?JSON.stringify(n[t])!==JSON.stringify(e[t])&&(r=!1):n[t]!==e[t]&&r&&(r=!1)}),r})).subscribe(function(n){if(s.current)s.current=!1;else{var e=u(i,n);f(t(r,e))}});return function(){return e.unsubscribe()}},[i.length]),o}}(a),f.use=function(){return[].slice.call(arguments).forEach(function(e){var r;e(((r={})[i]=b,r.$onChange=function(e){a.pipe(n.pairwise(),n.switchMap(function(e){var r=e[1];return e[0]!==r?n.of(r):n.NEVER})).subscribe(function(n){return e(b)})},r.$onPartialChange=function(e,r){a.pipe(n.pairwise(),n.switchMap(function(e){var r=e[1];return e[0]!==r?n.of(r):n.NEVER}),n.distinctUntilChanged(function(n,r){var t=!0;return e.forEach(function(e){"object"==typeof r[e]&&t?JSON.stringify(n[e])!==JSON.stringify(r[e])&&(t=!1):n[e]!==r[e]&&t&&(t=!1)}),t})).subscribe(function(n){return r(b)})},r))}),this},f);return l};
1
+ var n=require("rxjs"),e=require("react");function r(){return r=Object.assign?Object.assign.bind():function(n){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(n[t]=r[t])}return n},r.apply(this,arguments)}function t(n,e){if("object"!=typeof e)throw new Error("Store must be an object");return new Proxy(e,{get:function(e,r){var u=n.value;return r in u?"function"==typeof u[r]?u[r].bind(t(n,u)):u[r]:Reflect.get(e,r)},set:function(e,r,t){var u=Object.assign({},n.value);return u[r]=t,n.next(u),Reflect.set(e,r,t)}})}function u(n,e){return n.reduce(function(n,r){return n[r]=e[r],n},{})}exports.cervello=function(i,c){var o,f=new n.BehaviorSubject(c),s=t(f,r({},c)),a=((o={})[i]=s,o.useStore=function(r){return function(){var u=e.useState(t(r,r.value)),i=u[0],c=u[1],o=e.useRef(!0);return e.useEffect(function(){var e=r.pipe(n.observeOn(n.queueScheduler)).subscribe(function(n){o.current?o.current=!1:c(t(r,n))});return function(){return e.unsubscribe()}},[]),i}}(f),o.useSelect=function(r){return function(){var i=[].slice.call(arguments),c=e.useState(function(){var n=u(i,r.value);return t(r,n)}),o=c[0],f=c[1],s=e.useRef(!0);return e.useEffect(function(){var e=r.pipe(n.distinctUntilChanged(function(n,e){var r=!0;return i.forEach(function(t){"object"==typeof e[t]&&r?JSON.stringify(n[t])!==JSON.stringify(e[t])&&(r=!1):n[t]!==e[t]&&r&&(r=!1)}),r})).subscribe(function(n){if(s.current)s.current=!1;else{var e=u(i,n);f(t(r,e))}});return function(){return e.unsubscribe()}},[i.length]),o}}(f),o.use=function(){return[].slice.call(arguments).forEach(function(e){var r;e(((r={})[i]=s,r.$onChange=function(e){f.pipe(n.pairwise(),n.switchMap(function(e){var r=e[1];return e[0]!==r?n.of(r):n.NEVER})).subscribe(function(n){return e(s)})},r.$onPartialChange=function(e,r){f.pipe(n.pairwise(),n.switchMap(function(e){var r=e[1];return e[0]!==r?n.of(r):n.NEVER}),n.distinctUntilChanged(function(n,r){var t=!0;return e.forEach(function(e){"object"==typeof r[e]&&t?JSON.stringify(n[e])!==JSON.stringify(r[e])&&(t=!1):n[e]!==r[e]&&t&&(t=!1)}),t})).subscribe(function(n){return r(s)})},r))}),this},o);return a};
2
2
  //# sourceMappingURL=cervello.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cervello.cjs","sources":["../src/lib/helpers/proxify-store.ts","../src/lib/helpers/create-use-select.ts","../src/lib/store/index.ts","../src/lib/helpers/create-use-store.ts"],"sourcesContent":["import type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (store$$: BehaviorSubject<T>, storeObject: T): T {\n if (typeof storeObject !== 'object') throw new Error('Store must be an object')\n\n return new Proxy<T>(\n storeObject,\n {\n get: function (target: T, prop: string | symbol): any {\n const currentStore = store$$.value as any\n\n if (prop in currentStore) {\n if (typeof currentStore[prop] === 'function') {\n return currentStore[prop].bind(proxifyStore(store$$, currentStore))\n }\n\n return currentStore[prop]\n }\n\n return Reflect.get(target, prop)\n },\n set: function (target: T, prop: string | symbol, value: any) {\n const currentStore = store$$.value as any\n\n const clonedStore = Object.assign({}, currentStore)\n clonedStore[prop] = value\n\n store$$.next(clonedStore)\n\n return Reflect.set(target, prop, value)\n },\n },\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { distinctUntilChanged } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function getPartialObjectFromAttributes <T> (attributes: Array<keyof T>, store: T): any {\n return attributes.reduce<any>((acc, curr) => {\n acc[curr] = store[curr]\n return acc\n }, {})\n}\n\n\nexport function createUseSelect <T> (store$$: BehaviorSubject<T>) {\n //\n return <Attributes extends Array<keyof T>>(...selectors: Attributes): ObjectFromAttributes<T, Attributes> => {\n const [store, setStore] = useState<any>(() => {\n const selectedStore = getPartialObjectFromAttributes(selectors, store$$.value)\n return proxifyStore(store$$, selectedStore)\n })\n const isFirstTime = useRef(true)\n\n\n useEffect(() => {\n const subscription = store$$.pipe(distinctUntilChanged((prev, curr) => {\n let isEqual = true\n selectors.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n\n return isEqual\n })).subscribe((partialStore) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n const selectedStore = getPartialObjectFromAttributes(selectors, partialStore)\n setStore(proxifyStore(store$$, selectedStore))\n }\n })\n\n\n return () => subscription.unsubscribe()\n }, [selectors.length])\n\n\n return store\n }\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelect, createUseStore, proxifyStore } from '../helpers'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\n\n\n\nconst STORE_SYMBOL = '__cervello-store__'\n\n\n\n\ntype CervelloStoreUseParam<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n $onChange: (cb: (store: StoreType) => void) => void\n $onPartialChange: <\n Attributes extends Array<keyof StoreType>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n\nexport type CervelloUseFunction<StoreName extends string, StoreType> = (param: CervelloStoreUseParam<StoreName, StoreType>) => void\n\n\ntype CervelloStore<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n useStore: () => StoreType\n useSelect: <Attributes extends Array<keyof StoreType>>(...selectors: Attributes) => ObjectFromAttributes<StoreType, Attributes>\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreName, StoreType>) => void>) => CervelloStore<StoreName, StoreType>\n}\n\n\n\n\n// type Rec<Obj extends Record<string, any>> = {\n// [k in keyof Omit<Obj, 'middlewares'>]: Obj[keyof Omit<Obj, 'middlewares'>]\n// }\n// & Record<'middlewares', {\n// [Middleware in keyof Obj['middlewares']]:\n// (this: Omit<Obj, 'middlewares'>, ...params: Parameters<Obj['middlewares'][Middleware]>) => ReturnType<Obj['middlewares'][Middleware]>\n// }>\n\n\nexport function cervello <\n StoreName extends string,\n T\n> (storeName: StoreName, initialValue: T): CervelloStore<StoreName, T> {\n // Unique symbol to be used to keep a reference of the BehaviourSubject\n const storeSymbol = Symbol(STORE_SYMBOL)\n\n\n const store$$ = new BehaviorSubject<T>(initialValue)\n\n const proxiedStore = proxifyStore(store$$, {\n [storeSymbol]: store$$,\n ...initialValue,\n })\n\n const cervelloStore = {\n [storeName]: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelect: createUseSelect<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\n [storeName]: proxiedStore,\n $onChange (cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n ).subscribe((_) => cb(proxiedStore))\n },\n $onPartialChange (attrs: Array<keyof T>, cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n distinctUntilChanged((prev, curr) => {\n let isEqual = true\n attrs.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n return isEqual\n }),\n ).subscribe((_) => cb(proxiedStore))\n },\n })\n })\n return this\n },\n } as any\n\n\n\n return cervelloStore as CervelloStore<StoreName, T>\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { observeOn, queueScheduler } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n return () => {\n const [store, setStore] = useState<T>(proxifyStore(store$$, store$$.value))\n const isFirstTime = useRef(true)\n\n useEffect(() => {\n const subscription = store$$.pipe(observeOn(queueScheduler)).subscribe((n) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n setStore(proxifyStore(store$$, n))\n }\n })\n\n return () => subscription.unsubscribe()\n }, [])\n\n\n return store\n }\n}\n"],"names":["proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","currentStore","value","bind","Reflect","set","clonedStore","Object","assign","next","getPartialObjectFromAttributes","attributes","store","reduce","acc","curr","storeName","initialValue","_extends2","_cervelloStore","storeSymbol","Symbol","BehaviorSubject","proxiedStore","useStore","_useState","useState","setStore","isFirstTime","useRef","useEffect","subscription","pipe","observeOn","queueScheduler","subscribe","n","current","unsubscribe","createUseStore","useSelect","createUseSelect","selectors","slice","call","arguments","selectedStore","distinctUntilChanged","prev","isEqual","forEach","selector","JSON","stringify","partialStore","length","use","func","_func","$onChange","cb","pairwise","switchMap","_ref","newValue","of","NEVER","_","$onPartialChange","attrs","oldValue","this","cervelloStore"],"mappings":"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"}
1
+ {"version":3,"file":"cervello.cjs","sources":["../src/lib/helpers/proxify-store.ts","../src/lib/helpers/create-use-select.ts","../src/lib/store/index.ts","../src/lib/helpers/create-use-store.ts"],"sourcesContent":["import type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (store$$: BehaviorSubject<T>, storeObject: T): T {\n if (typeof storeObject !== 'object') throw new Error('Store must be an object')\n\n return new Proxy<T>(\n storeObject,\n {\n get: function (target: T, prop: string | symbol): any {\n const currentStore = store$$.value as any\n\n if (prop in currentStore) {\n if (typeof currentStore[prop] === 'function') {\n return currentStore[prop].bind(proxifyStore(store$$, currentStore))\n }\n\n return currentStore[prop]\n }\n\n return Reflect.get(target, prop)\n },\n set: function (target: T, prop: string | symbol, value: any) {\n const currentStore = store$$.value as any\n\n const clonedStore = Object.assign({}, currentStore)\n clonedStore[prop] = value\n\n store$$.next(clonedStore)\n\n return Reflect.set(target, prop, value)\n },\n },\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { distinctUntilChanged } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function getPartialObjectFromAttributes <T> (attributes: Array<keyof T>, store: T): any {\n return attributes.reduce<any>((acc, curr) => {\n acc[curr] = store[curr]\n return acc\n }, {})\n}\n\n\nexport function createUseSelect <T> (store$$: BehaviorSubject<T>) {\n //\n return <Attributes extends Array<keyof T>>(...selectors: Attributes): ObjectFromAttributes<T, Attributes> => {\n const [store, setStore] = useState<any>(() => {\n const selectedStore = getPartialObjectFromAttributes(selectors, store$$.value)\n return proxifyStore(store$$, selectedStore)\n })\n const isFirstTime = useRef(true)\n\n\n useEffect(() => {\n const subscription = store$$.pipe(distinctUntilChanged((prev, curr) => {\n let isEqual = true\n selectors.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n\n return isEqual\n })).subscribe((partialStore) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n const selectedStore = getPartialObjectFromAttributes(selectors, partialStore)\n setStore(proxifyStore(store$$, selectedStore))\n }\n })\n\n\n return () => subscription.unsubscribe()\n }, [selectors.length])\n\n\n return store\n }\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelect, createUseStore, proxifyStore } from '../helpers'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\n\n\n\n// const STORE_SYMBOL = '__cervello-store__'\n\n\n\n\ntype CervelloStoreUseParam<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n $onChange: (cb: (store: StoreType) => void) => void\n $onPartialChange: <\n Attributes extends Array<keyof StoreType>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n\nexport type CervelloUseFunction<StoreName extends string, StoreType> = (param: CervelloStoreUseParam<StoreName, StoreType>) => void\n\n\ntype CervelloStore<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n useStore: () => StoreType\n useSelect: <Attributes extends Array<keyof StoreType>>(...selectors: Attributes) => ObjectFromAttributes<StoreType, Attributes>\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreName, StoreType>) => void>) => CervelloStore<StoreName, StoreType>\n}\n\n\n\n\nexport function cervello <\n StoreName extends string,\n T\n> (storeName: StoreName, initialValue: T): CervelloStore<StoreName, T> {\n // Unique symbol to be used to keep a reference of the BehaviourSubject\n // const storeSymbol = Symbol(STORE_SYMBOL)\n\n\n const store$$ = new BehaviorSubject<T>(initialValue)\n\n const proxiedStore = proxifyStore(store$$, { ...initialValue })\n\n const cervelloStore = {\n [storeName]: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelect: createUseSelect<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\n [storeName]: proxiedStore,\n $onChange (cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n ).subscribe((_) => cb(proxiedStore))\n },\n $onPartialChange (attrs: Array<keyof T>, cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n distinctUntilChanged((prev, curr) => {\n let isEqual = true\n attrs.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n return isEqual\n }),\n ).subscribe((_) => cb(proxiedStore))\n },\n })\n })\n return this\n },\n } as any\n\n\n\n return cervelloStore as CervelloStore<StoreName, T>\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { observeOn, queueScheduler } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n return () => {\n const [store, setStore] = useState<T>(proxifyStore(store$$, store$$.value))\n const isFirstTime = useRef(true)\n\n // TODO: Use new useSyncExternalStore API hook\n useEffect(() => {\n const subscription = store$$.pipe(observeOn(queueScheduler)).subscribe((n) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n setStore(proxifyStore(store$$, n))\n }\n })\n\n return () => subscription.unsubscribe()\n }, [])\n\n\n return store\n }\n}\n"],"names":["proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","currentStore","value","bind","Reflect","set","clonedStore","Object","assign","next","getPartialObjectFromAttributes","attributes","store","reduce","acc","curr","storeName","initialValue","_cervelloStore","BehaviorSubject","proxiedStore","cervelloStore","useStore","_useState","useState","setStore","isFirstTime","useRef","useEffect","subscription","pipe","observeOn","queueScheduler","subscribe","n","current","unsubscribe","createUseStore","useSelect","createUseSelect","selectors","slice","call","arguments","selectedStore","distinctUntilChanged","prev","isEqual","forEach","selector","JSON","stringify","partialStore","length","use","func","_func","$onChange","cb","pairwise","switchMap","oldValue","newValue","of","NEVER","_","$onPartialChange","attrs","_ref2","this"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{observeOn as n,queueScheduler as r,distinctUntilChanged as t,BehaviorSubject as e,pairwise as u,switchMap as i,of as c,NEVER as o}from"rxjs";import{useState as f,useRef as a,useEffect as s}from"react";function b(){return b=Object.assign?Object.assign.bind():function(n){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&(n[e]=t[e])}return n},b.apply(this,arguments)}function l(n,r){if("object"!=typeof r)throw new Error("Store must be an object");return new Proxy(r,{get:function(r,t){var e=n.value;return t in e?"function"==typeof e[t]?e[t].bind(l(n,e)):e[t]:Reflect.get(r,t)},set:function(r,t,e){var u=Object.assign({},n.value);return u[t]=e,n.next(u),Reflect.set(r,t,e)}})}function v(n,r){return n.reduce(function(n,t){return n[t]=r[t],n},{})}function p(p,g){var y,h,j=Symbol("__cervello-store__"),O=new e(g),S=l(O,b(((y={})[j]=O,y),g)),m=((h={})[p]=S,h.useStore=function(t){return function(){var e=f(l(t,t.value)),u=e[0],i=e[1],c=a(!0);return s(function(){var e=t.pipe(n(r)).subscribe(function(n){c.current?c.current=!1:i(l(t,n))});return function(){return e.unsubscribe()}},[]),u}}(O),h.useSelect=function(n){return function(){var r=[].slice.call(arguments),e=f(function(){var t=v(r,n.value);return l(n,t)}),u=e[0],i=e[1],c=a(!0);return s(function(){var e=n.pipe(t(function(n,t){var e=!0;return r.forEach(function(r){"object"==typeof t[r]&&e?JSON.stringify(n[r])!==JSON.stringify(t[r])&&(e=!1):n[r]!==t[r]&&e&&(e=!1)}),e})).subscribe(function(t){if(c.current)c.current=!1;else{var e=v(r,t);i(l(n,e))}});return function(){return e.unsubscribe()}},[r.length]),u}}(O),h.use=function(){return[].slice.call(arguments).forEach(function(n){var r;n(((r={})[p]=S,r.$onChange=function(n){O.pipe(u(),i(function(n){var r=n[1];return n[0]!==r?c(r):o})).subscribe(function(r){return n(S)})},r.$onPartialChange=function(n,r){O.pipe(u(),i(function(n){var r=n[1];return n[0]!==r?c(r):o}),t(function(r,t){var e=!0;return n.forEach(function(n){"object"==typeof t[n]&&e?JSON.stringify(r[n])!==JSON.stringify(t[n])&&(e=!1):r[n]!==t[n]&&e&&(e=!1)}),e})).subscribe(function(n){return r(S)})},r))}),this},h);return m}export{p as c};
1
+ import{observeOn as n,queueScheduler as r,distinctUntilChanged as t,BehaviorSubject as e,pairwise as u,switchMap as i,of as c,NEVER as o}from"rxjs";import{useState as f,useRef as a,useEffect as s}from"react";function b(){return b=Object.assign?Object.assign.bind():function(n){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&(n[e]=t[e])}return n},b.apply(this,arguments)}function v(n,r){if("object"!=typeof r)throw new Error("Store must be an object");return new Proxy(r,{get:function(r,t){var e=n.value;return t in e?"function"==typeof e[t]?e[t].bind(v(n,e)):e[t]:Reflect.get(r,t)},set:function(r,t,e){var u=Object.assign({},n.value);return u[t]=e,n.next(u),Reflect.set(r,t,e)}})}function l(n,r){return n.reduce(function(n,t){return n[t]=r[t],n},{})}function p(p,g){var y,h=new e(g),j=v(h,b({},g)),O=((y={})[p]=j,y.useStore=function(t){return function(){var e=f(v(t,t.value)),u=e[0],i=e[1],c=a(!0);return s(function(){var e=t.pipe(n(r)).subscribe(function(n){c.current?c.current=!1:i(v(t,n))});return function(){return e.unsubscribe()}},[]),u}}(h),y.useSelect=function(n){return function(){var r=[].slice.call(arguments),e=f(function(){var t=l(r,n.value);return v(n,t)}),u=e[0],i=e[1],c=a(!0);return s(function(){var e=n.pipe(t(function(n,t){var e=!0;return r.forEach(function(r){"object"==typeof t[r]&&e?JSON.stringify(n[r])!==JSON.stringify(t[r])&&(e=!1):n[r]!==t[r]&&e&&(e=!1)}),e})).subscribe(function(t){if(c.current)c.current=!1;else{var e=l(r,t);i(v(n,e))}});return function(){return e.unsubscribe()}},[r.length]),u}}(h),y.use=function(){return[].slice.call(arguments).forEach(function(n){var r;n(((r={})[p]=j,r.$onChange=function(n){h.pipe(u(),i(function(n){var r=n[1];return n[0]!==r?c(r):o})).subscribe(function(r){return n(j)})},r.$onPartialChange=function(n,r){h.pipe(u(),i(function(n){var r=n[1];return n[0]!==r?c(r):o}),t(function(r,t){var e=!0;return n.forEach(function(n){"object"==typeof t[n]&&e?JSON.stringify(r[n])!==JSON.stringify(t[n])&&(e=!1):r[n]!==t[n]&&e&&(e=!1)}),e})).subscribe(function(n){return r(j)})},r))}),this},y);return O}export{p as cervello};
2
2
  //# sourceMappingURL=cervello.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cervello.esm.js","sources":["../src/lib/helpers/proxify-store.ts","../src/lib/helpers/create-use-select.ts","../src/lib/store/index.ts","../src/lib/helpers/create-use-store.ts"],"sourcesContent":["import type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (store$$: BehaviorSubject<T>, storeObject: T): T {\n if (typeof storeObject !== 'object') throw new Error('Store must be an object')\n\n return new Proxy<T>(\n storeObject,\n {\n get: function (target: T, prop: string | symbol): any {\n const currentStore = store$$.value as any\n\n if (prop in currentStore) {\n if (typeof currentStore[prop] === 'function') {\n return currentStore[prop].bind(proxifyStore(store$$, currentStore))\n }\n\n return currentStore[prop]\n }\n\n return Reflect.get(target, prop)\n },\n set: function (target: T, prop: string | symbol, value: any) {\n const currentStore = store$$.value as any\n\n const clonedStore = Object.assign({}, currentStore)\n clonedStore[prop] = value\n\n store$$.next(clonedStore)\n\n return Reflect.set(target, prop, value)\n },\n },\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { distinctUntilChanged } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function getPartialObjectFromAttributes <T> (attributes: Array<keyof T>, store: T): any {\n return attributes.reduce<any>((acc, curr) => {\n acc[curr] = store[curr]\n return acc\n }, {})\n}\n\n\nexport function createUseSelect <T> (store$$: BehaviorSubject<T>) {\n //\n return <Attributes extends Array<keyof T>>(...selectors: Attributes): ObjectFromAttributes<T, Attributes> => {\n const [store, setStore] = useState<any>(() => {\n const selectedStore = getPartialObjectFromAttributes(selectors, store$$.value)\n return proxifyStore(store$$, selectedStore)\n })\n const isFirstTime = useRef(true)\n\n\n useEffect(() => {\n const subscription = store$$.pipe(distinctUntilChanged((prev, curr) => {\n let isEqual = true\n selectors.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n\n return isEqual\n })).subscribe((partialStore) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n const selectedStore = getPartialObjectFromAttributes(selectors, partialStore)\n setStore(proxifyStore(store$$, selectedStore))\n }\n })\n\n\n return () => subscription.unsubscribe()\n }, [selectors.length])\n\n\n return store\n }\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelect, createUseStore, proxifyStore } from '../helpers'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\n\n\n\nconst STORE_SYMBOL = '__cervello-store__'\n\n\n\n\ntype CervelloStoreUseParam<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n $onChange: (cb: (store: StoreType) => void) => void\n $onPartialChange: <\n Attributes extends Array<keyof StoreType>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n\nexport type CervelloUseFunction<StoreName extends string, StoreType> = (param: CervelloStoreUseParam<StoreName, StoreType>) => void\n\n\ntype CervelloStore<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n useStore: () => StoreType\n useSelect: <Attributes extends Array<keyof StoreType>>(...selectors: Attributes) => ObjectFromAttributes<StoreType, Attributes>\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreName, StoreType>) => void>) => CervelloStore<StoreName, StoreType>\n}\n\n\n\n\n// type Rec<Obj extends Record<string, any>> = {\n// [k in keyof Omit<Obj, 'middlewares'>]: Obj[keyof Omit<Obj, 'middlewares'>]\n// }\n// & Record<'middlewares', {\n// [Middleware in keyof Obj['middlewares']]:\n// (this: Omit<Obj, 'middlewares'>, ...params: Parameters<Obj['middlewares'][Middleware]>) => ReturnType<Obj['middlewares'][Middleware]>\n// }>\n\n\nexport function cervello <\n StoreName extends string,\n T\n> (storeName: StoreName, initialValue: T): CervelloStore<StoreName, T> {\n // Unique symbol to be used to keep a reference of the BehaviourSubject\n const storeSymbol = Symbol(STORE_SYMBOL)\n\n\n const store$$ = new BehaviorSubject<T>(initialValue)\n\n const proxiedStore = proxifyStore(store$$, {\n [storeSymbol]: store$$,\n ...initialValue,\n })\n\n const cervelloStore = {\n [storeName]: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelect: createUseSelect<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\n [storeName]: proxiedStore,\n $onChange (cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n ).subscribe((_) => cb(proxiedStore))\n },\n $onPartialChange (attrs: Array<keyof T>, cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n distinctUntilChanged((prev, curr) => {\n let isEqual = true\n attrs.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n return isEqual\n }),\n ).subscribe((_) => cb(proxiedStore))\n },\n })\n })\n return this\n },\n } as any\n\n\n\n return cervelloStore as CervelloStore<StoreName, T>\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { observeOn, queueScheduler } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n return () => {\n const [store, setStore] = useState<T>(proxifyStore(store$$, store$$.value))\n const isFirstTime = useRef(true)\n\n useEffect(() => {\n const subscription = store$$.pipe(observeOn(queueScheduler)).subscribe((n) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n setStore(proxifyStore(store$$, n))\n }\n })\n\n return () => subscription.unsubscribe()\n }, [])\n\n\n return store\n }\n}\n"],"names":["proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","currentStore","value","bind","Reflect","set","clonedStore","Object","assign","next","getPartialObjectFromAttributes","attributes","store","reduce","acc","curr","cervello","storeName","initialValue","_extends2","_cervelloStore","storeSymbol","Symbol","BehaviorSubject","proxiedStore","useStore","_useState","useState","setStore","isFirstTime","useRef","useEffect","subscription","pipe","observeOn","queueScheduler","subscribe","n","current","unsubscribe","createUseStore","useSelect","createUseSelect","selectors","slice","call","arguments","selectedStore","distinctUntilChanged","prev","isEqual","forEach","selector","JSON","stringify","partialStore","length","use","func","_func","$onChange","cb","pairwise","switchMap","_ref","newValue","of","NEVER","_","$onPartialChange","attrs","oldValue","this","cervelloStore"],"mappings":"obAIgBA,SAAAA,EAAuDC,EAA6BC,GAClG,GAA2B,iBAAhBA,EAA0B,MAAM,IAAAC,MAAU,2BAErD,WAAOC,MACLF,EACA,CACEG,IAAK,SAAUC,EAAWC,GACxB,IAAkBC,EAAGP,EAAQQ,MAE7B,OAAIF,OACgC,qBAAVA,KACFA,GAAMG,KAAKV,EAAaC,EAASO,IAGhDA,EAAaD,GAGRI,QAACN,IAAIC,EAAQC,IAE7BK,IAAK,SAAUN,EAAWC,EAAuBE,GAC/C,IAEMI,EAAcC,OAAOC,OAAO,GAFbd,EAAQQ,OAO7B,OAJAI,EAAYN,GAAQE,EAEpBR,EAAQe,KAAKH,GAENF,QAAQC,IAAIN,EAAQC,EAAME,MCrBzB,SAAAQ,EAAoCC,EAA4BC,GAC9E,SAAkBC,OAAY,SAACC,EAAKC,GAElC,OADAD,EAAIC,GAAQH,EAAMG,GACXD,GACN,ICgCW,SAAAE,EAGbC,EAAsBC,GAAe,IAAAC,EAAAC,EAEhCC,EAAcC,OA3CD,sBA8CN5B,EAAG,IAAI6B,EAAmBL,GAErBM,EAAG/B,EAAaC,EAC/B2B,IAAAA,EAAAA,IAAAA,GAAc3B,KACZwB,QAIFD,EAAAA,IAAAA,GAAYO,EAGbC,EAAAA,SCxDE,SAA8B/B,GAClC,kBACE,IAAAgC,EAA0BC,EAAYlC,EAAaC,EAASA,EAAQQ,QAA7DU,EAAPc,EAAA,GAAcE,EAAdF,EAAA,GACMG,EAAcC,GAAO,GAe3B,OAbAC,EAAU,WACR,IAAkBC,EAAGtC,EAAQuC,KAAKC,EAAUC,IAAiBC,UAAU,SAACC,GAClER,EAAYS,QACdT,EAAYS,SAAU,EAEtBV,EAASnC,EAAaC,EAAS2C,MAInC,OAAO,WAAA,OAAkBL,EAACO,gBACzB,IAGI3B,GDsCG4B,CAAkB9C,GAC5B+C,EAAAA,UDhDYC,SAAqBhD,GAEnC,OAA4G,WAAA,IAAAiD,EAAA,GAAAC,MAAAC,KAAAC,WAChFnB,EAAAA,EAAc,WACtC,IAAmBoB,EAAGrC,EAA+BiC,EAAWjD,EAAQQ,OACxE,OAAmBT,EAACC,EAASqD,KAFxBnC,OAAOgB,EAAdF,EAAA,GAIMG,EAAcC,GAAO,GAiC3B,OA9BAC,EAAU,WACR,IAAMC,EAAetC,EAAQuC,KAAKe,EAAqB,SAACC,EAAMlC,GAC5D,IAAImC,GAAU,EAad,OAZAP,EAAUQ,QAAQ,SAACC,GACa,iBAAfrC,EAACqC,IAA0BF,EACpCG,KAAKC,UAAUL,EAAKG,MAAeC,KAAKC,UAAUvC,EAAKqC,MACzDF,GAAU,GAGRD,EAAKG,KAAcrC,EAAKqC,IAAaF,IACvCA,GAAU,KAKTA,KACLd,UAAU,SAACmB,GACb,GAAI1B,EAAYS,QACdT,EAAYS,SAAU,MACjB,CACL,IAAMS,EAAgBrC,EAA+BiC,EAAWY,GAChE3B,EAASnC,EAAaC,EAASqD,OAKnC,OAAaf,WAAAA,OAAAA,EAAaO,gBACzB,CAACI,EAAUa,YCWHd,CAAmBhD,GAG9B+D,EAAAA,IAAyB,WAiCvB,MAhCA,GAAaN,MAAAA,KAAAA,WAAAA,QAAQ,SAACO,GAAa,IAAAC,EACjCD,IAAIC,EAAA,IACD1C,GAAYO,EACboC,EAAAA,mBAAWC,GACTnE,EAAQuC,KACN6B,IACAC,EAAU,SAAAC,GAAA,IAAYC,EAAZD,EAAA,GAAA,OAAAA,EAAA,KAAwCC,EAAWC,EAAGD,GAAYE,KAC5E/B,UAAU,SAACgC,GAAMP,OAAAA,EAAGrC,MANtBmC,EAQFU,iBARE,SAQgBC,EAAuBT,GACvCnE,EAAQuC,KACN6B,IACAC,EAAU,SAAEQ,GAAAA,IAAUN,cAAAA,EAAAA,KAA4BA,EAAWC,EAAGD,GAAYE,IAC5EnB,EAAqB,SAACC,EAAMlC,GAC1B,IAAImC,GAAU,EAYd,OAXAoB,EAAMnB,QAAQ,SAACC,GACiB,mBAAdA,IAA0BF,EACpCG,KAAKC,UAAUL,EAAKG,MAAeC,KAAKC,UAAUvC,EAAKqC,MACzDF,GAAU,GAGRD,EAAKG,KAAcrC,EAAKqC,IAAaF,IACvCA,GAAU,KAITA,KAETd,UAAU,SAACgC,GAAMP,OAAAA,EAAGrC,MA3BtBmC,MAgCPa,MA1CHpD,GA+CA,OACDqD"}
1
+ {"version":3,"file":"cervello.esm.js","sources":["../src/lib/helpers/proxify-store.ts","../src/lib/helpers/create-use-select.ts","../src/lib/store/index.ts","../src/lib/helpers/create-use-store.ts"],"sourcesContent":["import type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (store$$: BehaviorSubject<T>, storeObject: T): T {\n if (typeof storeObject !== 'object') throw new Error('Store must be an object')\n\n return new Proxy<T>(\n storeObject,\n {\n get: function (target: T, prop: string | symbol): any {\n const currentStore = store$$.value as any\n\n if (prop in currentStore) {\n if (typeof currentStore[prop] === 'function') {\n return currentStore[prop].bind(proxifyStore(store$$, currentStore))\n }\n\n return currentStore[prop]\n }\n\n return Reflect.get(target, prop)\n },\n set: function (target: T, prop: string | symbol, value: any) {\n const currentStore = store$$.value as any\n\n const clonedStore = Object.assign({}, currentStore)\n clonedStore[prop] = value\n\n store$$.next(clonedStore)\n\n return Reflect.set(target, prop, value)\n },\n },\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { distinctUntilChanged } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function getPartialObjectFromAttributes <T> (attributes: Array<keyof T>, store: T): any {\n return attributes.reduce<any>((acc, curr) => {\n acc[curr] = store[curr]\n return acc\n }, {})\n}\n\n\nexport function createUseSelect <T> (store$$: BehaviorSubject<T>) {\n //\n return <Attributes extends Array<keyof T>>(...selectors: Attributes): ObjectFromAttributes<T, Attributes> => {\n const [store, setStore] = useState<any>(() => {\n const selectedStore = getPartialObjectFromAttributes(selectors, store$$.value)\n return proxifyStore(store$$, selectedStore)\n })\n const isFirstTime = useRef(true)\n\n\n useEffect(() => {\n const subscription = store$$.pipe(distinctUntilChanged((prev, curr) => {\n let isEqual = true\n selectors.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n\n return isEqual\n })).subscribe((partialStore) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n const selectedStore = getPartialObjectFromAttributes(selectors, partialStore)\n setStore(proxifyStore(store$$, selectedStore))\n }\n })\n\n\n return () => subscription.unsubscribe()\n }, [selectors.length])\n\n\n return store\n }\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelect, createUseStore, proxifyStore } from '../helpers'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\n\n\n\n// const STORE_SYMBOL = '__cervello-store__'\n\n\n\n\ntype CervelloStoreUseParam<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n $onChange: (cb: (store: StoreType) => void) => void\n $onPartialChange: <\n Attributes extends Array<keyof StoreType>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n\nexport type CervelloUseFunction<StoreName extends string, StoreType> = (param: CervelloStoreUseParam<StoreName, StoreType>) => void\n\n\ntype CervelloStore<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n useStore: () => StoreType\n useSelect: <Attributes extends Array<keyof StoreType>>(...selectors: Attributes) => ObjectFromAttributes<StoreType, Attributes>\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreName, StoreType>) => void>) => CervelloStore<StoreName, StoreType>\n}\n\n\n\n\nexport function cervello <\n StoreName extends string,\n T\n> (storeName: StoreName, initialValue: T): CervelloStore<StoreName, T> {\n // Unique symbol to be used to keep a reference of the BehaviourSubject\n // const storeSymbol = Symbol(STORE_SYMBOL)\n\n\n const store$$ = new BehaviorSubject<T>(initialValue)\n\n const proxiedStore = proxifyStore(store$$, { ...initialValue })\n\n const cervelloStore = {\n [storeName]: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelect: createUseSelect<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\n [storeName]: proxiedStore,\n $onChange (cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n ).subscribe((_) => cb(proxiedStore))\n },\n $onPartialChange (attrs: Array<keyof T>, cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n distinctUntilChanged((prev, curr) => {\n let isEqual = true\n attrs.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n return isEqual\n }),\n ).subscribe((_) => cb(proxiedStore))\n },\n })\n })\n return this\n },\n } as any\n\n\n\n return cervelloStore as CervelloStore<StoreName, T>\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { observeOn, queueScheduler } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n return () => {\n const [store, setStore] = useState<T>(proxifyStore(store$$, store$$.value))\n const isFirstTime = useRef(true)\n\n // TODO: Use new useSyncExternalStore API hook\n useEffect(() => {\n const subscription = store$$.pipe(observeOn(queueScheduler)).subscribe((n) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n setStore(proxifyStore(store$$, n))\n }\n })\n\n return () => subscription.unsubscribe()\n }, [])\n\n\n return store\n }\n}\n"],"names":["proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","currentStore","value","bind","Reflect","set","clonedStore","Object","assign","next","getPartialObjectFromAttributes","attributes","store","reduce","acc","curr","cervello","storeName","initialValue","_cervelloStore","BehaviorSubject","proxiedStore","cervelloStore","useStore","_useState","useState","setStore","isFirstTime","useRef","useEffect","subscription","pipe","observeOn","queueScheduler","subscribe","n","current","unsubscribe","createUseStore","useSelect","createUseSelect","selectors","slice","call","arguments","selectedStore","distinctUntilChanged","prev","isEqual","forEach","selector","JSON","stringify","partialStore","length","use","func","_func","$onChange","cb","pairwise","switchMap","oldValue","newValue","of","NEVER","_","$onPartialChange","attrs","_ref2","this"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{observeOn as e,queueScheduler as t,distinctUntilChanged as r,BehaviorSubject as n,pairwise as o,switchMap as c,of as u,NEVER as s}from"rxjs";import{useState as i,useRef as f,useEffect as b}from"react";function a(){return a=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},a.apply(this,arguments)}function p(e,t){if("object"!=typeof t)throw new Error("Store must be an object");return new Proxy(t,{get:function(t,r){const n=e.value;return r in n?"function"==typeof n[r]?n[r].bind(p(e,n)):n[r]:Reflect.get(t,r)},set:function(t,r,n){const o=Object.assign({},e.value);return o[r]=n,e.next(o),Reflect.set(t,r,n)}})}function l(r){return()=>{const[n,o]=i(p(r,r.value)),c=f(!0);return b(()=>{const n=r.pipe(e(t)).subscribe(e=>{c.current?c.current=!1:o(p(r,e))});return()=>n.unsubscribe()},[]),n}}function g(e,t){return e.reduce((e,r)=>(e[r]=t[r],e),{})}function y(e){return(...t)=>{const[n,o]=i(()=>{const r=g(t,e.value);return p(e,r)}),c=f(!0);return b(()=>{const n=e.pipe(r((e,r)=>{let n=!0;return t.forEach(t=>{"object"==typeof r[t]&&n?JSON.stringify(e[t])!==JSON.stringify(r[t])&&(n=!1):e[t]!==r[t]&&n&&(n=!1)}),n})).subscribe(r=>{if(c.current)c.current=!1;else{const n=g(t,r);o(p(e,n))}});return()=>n.unsubscribe()},[t.length]),n}}function h(e,t){const i=Symbol("__cervello-store__"),f=new n(t),b=p(f,a({[i]:f},t));return{[e]:b,useStore:l(f),useSelect:y(f),use(...t){return t.forEach(t=>{t({[e]:b,$onChange(e){f.pipe(o(),c(([e,t])=>e!==t?u(t):s)).subscribe(t=>e(b))},$onPartialChange(e,t){f.pipe(o(),c(([e,t])=>e!==t?u(t):s),r((t,r)=>{let n=!0;return e.forEach(e=>{"object"==typeof r[e]&&n?JSON.stringify(t[e])!==JSON.stringify(r[e])&&(n=!1):t[e]!==r[e]&&n&&(n=!1)}),n})).subscribe(e=>t(b))}})}),this}}}export{h as c};
1
+ import{observeOn as t,queueScheduler as e,distinctUntilChanged as r,BehaviorSubject as n,pairwise as u,switchMap as o,of as c,NEVER as i}from"rxjs";import{useState as s,useRef as f,useEffect as b}from"react";function a(){return a=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t},a.apply(this,arguments)}function p(t,e){if("object"!=typeof e)throw new Error("Store must be an object");return new Proxy(e,{get:function(e,r){const n=t.value;return r in n?"function"==typeof n[r]?n[r].bind(p(t,n)):n[r]:Reflect.get(e,r)},set:function(e,r,n){const u=Object.assign({},t.value);return u[r]=n,t.next(u),Reflect.set(e,r,n)}})}function l(r){return()=>{const[n,u]=s(p(r,r.value)),o=f(!0);return b(()=>{const n=r.pipe(t(e)).subscribe(t=>{o.current?o.current=!1:u(p(r,t))});return()=>n.unsubscribe()},[]),n}}function g(t,e){return t.reduce((t,r)=>(t[r]=e[r],t),{})}function y(t){return(...e)=>{const[n,u]=s(()=>{const r=g(e,t.value);return p(t,r)}),o=f(!0);return b(()=>{const n=t.pipe(r((t,r)=>{let n=!0;return e.forEach(e=>{"object"==typeof r[e]&&n?JSON.stringify(t[e])!==JSON.stringify(r[e])&&(n=!1):t[e]!==r[e]&&n&&(n=!1)}),n})).subscribe(r=>{if(o.current)o.current=!1;else{const n=g(e,r);u(p(t,n))}});return()=>n.unsubscribe()},[e.length]),n}}function h(t,e){const s=new n(e),f=p(s,a({},e));return{[t]:f,useStore:l(s),useSelect:y(s),use(...e){return e.forEach(e=>{e({[t]:f,$onChange(t){s.pipe(u(),o(([t,e])=>t!==e?c(e):i)).subscribe(e=>t(f))},$onPartialChange(t,e){s.pipe(u(),o(([t,e])=>t!==e?c(e):i),r((e,r)=>{let n=!0;return t.forEach(t=>{"object"==typeof r[t]&&n?JSON.stringify(e[t])!==JSON.stringify(r[t])&&(n=!1):e[t]!==r[t]&&n&&(n=!1)}),n})).subscribe(t=>e(f))}})}),this}}}export{h as cervello};
2
2
  //# sourceMappingURL=cervello.modern.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cervello.modern.js","sources":["../src/lib/helpers/proxify-store.ts","../src/lib/helpers/create-use-store.ts","../src/lib/helpers/create-use-select.ts","../src/lib/store/index.ts"],"sourcesContent":["import type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (store$$: BehaviorSubject<T>, storeObject: T): T {\n if (typeof storeObject !== 'object') throw new Error('Store must be an object')\n\n return new Proxy<T>(\n storeObject,\n {\n get: function (target: T, prop: string | symbol): any {\n const currentStore = store$$.value as any\n\n if (prop in currentStore) {\n if (typeof currentStore[prop] === 'function') {\n return currentStore[prop].bind(proxifyStore(store$$, currentStore))\n }\n\n return currentStore[prop]\n }\n\n return Reflect.get(target, prop)\n },\n set: function (target: T, prop: string | symbol, value: any) {\n const currentStore = store$$.value as any\n\n const clonedStore = Object.assign({}, currentStore)\n clonedStore[prop] = value\n\n store$$.next(clonedStore)\n\n return Reflect.set(target, prop, value)\n },\n },\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { observeOn, queueScheduler } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n return () => {\n const [store, setStore] = useState<T>(proxifyStore(store$$, store$$.value))\n const isFirstTime = useRef(true)\n\n useEffect(() => {\n const subscription = store$$.pipe(observeOn(queueScheduler)).subscribe((n) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n setStore(proxifyStore(store$$, n))\n }\n })\n\n return () => subscription.unsubscribe()\n }, [])\n\n\n return store\n }\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { distinctUntilChanged } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function getPartialObjectFromAttributes <T> (attributes: Array<keyof T>, store: T): any {\n return attributes.reduce<any>((acc, curr) => {\n acc[curr] = store[curr]\n return acc\n }, {})\n}\n\n\nexport function createUseSelect <T> (store$$: BehaviorSubject<T>) {\n //\n return <Attributes extends Array<keyof T>>(...selectors: Attributes): ObjectFromAttributes<T, Attributes> => {\n const [store, setStore] = useState<any>(() => {\n const selectedStore = getPartialObjectFromAttributes(selectors, store$$.value)\n return proxifyStore(store$$, selectedStore)\n })\n const isFirstTime = useRef(true)\n\n\n useEffect(() => {\n const subscription = store$$.pipe(distinctUntilChanged((prev, curr) => {\n let isEqual = true\n selectors.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n\n return isEqual\n })).subscribe((partialStore) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n const selectedStore = getPartialObjectFromAttributes(selectors, partialStore)\n setStore(proxifyStore(store$$, selectedStore))\n }\n })\n\n\n return () => subscription.unsubscribe()\n }, [selectors.length])\n\n\n return store\n }\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelect, createUseStore, proxifyStore } from '../helpers'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\n\n\n\nconst STORE_SYMBOL = '__cervello-store__'\n\n\n\n\ntype CervelloStoreUseParam<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n $onChange: (cb: (store: StoreType) => void) => void\n $onPartialChange: <\n Attributes extends Array<keyof StoreType>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n\nexport type CervelloUseFunction<StoreName extends string, StoreType> = (param: CervelloStoreUseParam<StoreName, StoreType>) => void\n\n\ntype CervelloStore<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n useStore: () => StoreType\n useSelect: <Attributes extends Array<keyof StoreType>>(...selectors: Attributes) => ObjectFromAttributes<StoreType, Attributes>\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreName, StoreType>) => void>) => CervelloStore<StoreName, StoreType>\n}\n\n\n\n\n// type Rec<Obj extends Record<string, any>> = {\n// [k in keyof Omit<Obj, 'middlewares'>]: Obj[keyof Omit<Obj, 'middlewares'>]\n// }\n// & Record<'middlewares', {\n// [Middleware in keyof Obj['middlewares']]:\n// (this: Omit<Obj, 'middlewares'>, ...params: Parameters<Obj['middlewares'][Middleware]>) => ReturnType<Obj['middlewares'][Middleware]>\n// }>\n\n\nexport function cervello <\n StoreName extends string,\n T\n> (storeName: StoreName, initialValue: T): CervelloStore<StoreName, T> {\n // Unique symbol to be used to keep a reference of the BehaviourSubject\n const storeSymbol = Symbol(STORE_SYMBOL)\n\n\n const store$$ = new BehaviorSubject<T>(initialValue)\n\n const proxiedStore = proxifyStore(store$$, {\n [storeSymbol]: store$$,\n ...initialValue,\n })\n\n const cervelloStore = {\n [storeName]: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelect: createUseSelect<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\n [storeName]: proxiedStore,\n $onChange (cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n ).subscribe((_) => cb(proxiedStore))\n },\n $onPartialChange (attrs: Array<keyof T>, cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n distinctUntilChanged((prev, curr) => {\n let isEqual = true\n attrs.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n return isEqual\n }),\n ).subscribe((_) => cb(proxiedStore))\n },\n })\n })\n return this\n },\n } as any\n\n\n\n return cervelloStore as CervelloStore<StoreName, T>\n}\n"],"names":["proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","currentStore","value","bind","Reflect","set","clonedStore","Object","assign","next","createUseStore","store","setStore","useState","isFirstTime","useRef","useEffect","subscription","pipe","observeOn","queueScheduler","subscribe","n","current","unsubscribe","getPartialObjectFromAttributes","attributes","reduce","acc","curr","createUseSelect","selectors","selectedStore","distinctUntilChanged","prev","isEqual","forEach","selector","JSON","stringify","partialStore","length","cervello","storeName","initialValue","storeSymbol","Symbol","BehaviorSubject","proxiedStore","useStore","useSelect","use","functionList","func","$onChange","cb","pairwise","switchMap","oldValue","newValue","of","NEVER","_","$onPartialChange","attrs","this"],"mappings":"obAIgBA,SAAAA,EAAuDC,EAA6BC,GAClG,GAA2B,iBAAhBA,EAA0B,MAAM,IAAAC,MAAU,2BAErD,WAAOC,MACLF,EACA,CACEG,IAAK,SAAUC,EAAWC,GACxB,MAAkBC,EAAGP,EAAQQ,MAE7B,OAAIF,OACgC,qBAAVA,KACFA,GAAMG,KAAKV,EAAaC,EAASO,IAGhDA,EAAaD,GAGRI,QAACN,IAAIC,EAAQC,IAE7BK,IAAK,SAAUN,EAAWC,EAAuBE,GAC/C,MAEMI,EAAcC,OAAOC,OAAO,GAFbd,EAAQQ,OAO7B,OAJAI,EAAYN,GAAQE,EAEpBR,EAAQe,KAAKH,GAENF,QAAQC,IAAIN,EAAQC,EAAME,MCtBnC,SAAAQ,EAA8BhB,GAClC,MAAO,KACL,MAAOiB,EAAOC,GAAYC,EAAYpB,EAAaC,EAASA,EAAQQ,QAC9DY,EAAcC,GAAO,GAe3B,OAbAC,EAAU,KACR,MAAkBC,EAAGvB,EAAQwB,KAAKC,EAAUC,IAAiBC,UAAWC,IAClER,EAAYS,QACdT,EAAYS,SAAU,EAEtBX,EAASnB,EAAaC,EAAS4B,MAInC,MAAO,IAAML,EAAaO,eACzB,IAGIb,GCjBK,SAAAc,EAAoCC,EAA4Bf,GAC9E,SAAkBgB,OAAY,CAACC,EAAKC,KAClCD,EAAIC,GAAQlB,EAAMkB,GACXD,GACN,IAIWE,SAAAA,EAAqBpC,GAEnC,MAAO,IAAuCqC,KAC5C,MAAOpB,EAAOC,GAAYC,EAAc,KACtC,MAAmBmB,EAAGP,EAA+BM,EAAWrC,EAAQQ,OACxE,OAAmBT,EAACC,EAASsC,KAEzBlB,EAAcC,GAAO,GAiC3B,OA9BAC,EAAU,KACR,MAAkBC,EAAGvB,EAAQwB,KAAKe,EAAqB,CAACC,EAAML,KAC5D,IAAIM,GAAU,EAad,OAZAJ,EAAUK,QAASC,IACa,iBAAnBR,EAAKQ,IAA0BF,EACpCG,KAAKC,UAAUL,EAAKG,MAAeC,KAAKC,UAAUV,EAAKQ,MACzDF,GAAU,GAGRD,EAAKG,KAAcR,EAAKQ,IAAaF,IACvCA,GAAU,KAMjBA,KAAGd,UAAWmB,IACb,GAAI1B,EAAYS,QACdT,EAAYS,SAAU,MACjB,CACL,MAAmBS,EAAGP,EAA+BM,EAAWS,GAChE5B,EAASnB,EAAaC,EAASsC,OAKnC,MAAO,IAAMf,EAAaO,eACzB,CAACO,EAAUU,YCTF,SAAAC,EAGbC,EAAsBC,GAEvB,MAAMC,EAAcC,OA3CD,wBA8CH,IAAAC,EAAuBH,GAEjCI,EAAevD,EAAaC,KAChCmD,CAACA,GAAcnD,GACZkD,IAkDL,MA/CsB,CACpBD,CAACA,GAAYK,EAGbC,SAAUvC,EAAkBhB,GAC5BwD,UAAWpB,EAAmBpC,GAG9ByD,OAAQC,GAiCN,OAhCAA,EAAahB,QAASiB,IACpBA,EAAK,CACHV,CAACA,GAAYK,EACbM,UAAWC,GACT7D,EAAQwB,KACNsC,IACAC,EAAU,EAAEC,EAAUC,KAAeD,IAAaC,EAAWC,EAAGD,GAAYE,IAC5ExC,UAAWyC,GAAMP,EAAGP,KAExBe,iBAAkBC,EAAuBT,GACvC7D,EAAQwB,KACNsC,IACAC,EAAU,EAAEC,EAAUC,KAAeD,IAAaC,EAAWC,EAAGD,GAAYE,GAC5E5B,EAAqB,CAACC,EAAML,KAC1B,IAAIM,GAAU,EAYd,OAXA6B,EAAM5B,QAASC,IACiB,iBAAfR,EAACQ,IAA0BF,EACpCG,KAAKC,UAAUL,EAAKG,MAAeC,KAAKC,UAAUV,EAAKQ,MACzDF,GAAU,GAGRD,EAAKG,KAAcR,EAAKQ,IAAaF,IACvCA,GAAU,KAKjBA,KACDd,UAAWyC,GAAMP,EAAGP,SAK7BiB"}
1
+ {"version":3,"file":"cervello.modern.js","sources":["../src/lib/helpers/proxify-store.ts","../src/lib/helpers/create-use-store.ts","../src/lib/helpers/create-use-select.ts","../src/lib/store/index.ts"],"sourcesContent":["import type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (store$$: BehaviorSubject<T>, storeObject: T): T {\n if (typeof storeObject !== 'object') throw new Error('Store must be an object')\n\n return new Proxy<T>(\n storeObject,\n {\n get: function (target: T, prop: string | symbol): any {\n const currentStore = store$$.value as any\n\n if (prop in currentStore) {\n if (typeof currentStore[prop] === 'function') {\n return currentStore[prop].bind(proxifyStore(store$$, currentStore))\n }\n\n return currentStore[prop]\n }\n\n return Reflect.get(target, prop)\n },\n set: function (target: T, prop: string | symbol, value: any) {\n const currentStore = store$$.value as any\n\n const clonedStore = Object.assign({}, currentStore)\n clonedStore[prop] = value\n\n store$$.next(clonedStore)\n\n return Reflect.set(target, prop, value)\n },\n },\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { observeOn, queueScheduler } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n return () => {\n const [store, setStore] = useState<T>(proxifyStore(store$$, store$$.value))\n const isFirstTime = useRef(true)\n\n // TODO: Use new useSyncExternalStore API hook\n useEffect(() => {\n const subscription = store$$.pipe(observeOn(queueScheduler)).subscribe((n) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n setStore(proxifyStore(store$$, n))\n }\n })\n\n return () => subscription.unsubscribe()\n }, [])\n\n\n return store\n }\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { distinctUntilChanged } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function getPartialObjectFromAttributes <T> (attributes: Array<keyof T>, store: T): any {\n return attributes.reduce<any>((acc, curr) => {\n acc[curr] = store[curr]\n return acc\n }, {})\n}\n\n\nexport function createUseSelect <T> (store$$: BehaviorSubject<T>) {\n //\n return <Attributes extends Array<keyof T>>(...selectors: Attributes): ObjectFromAttributes<T, Attributes> => {\n const [store, setStore] = useState<any>(() => {\n const selectedStore = getPartialObjectFromAttributes(selectors, store$$.value)\n return proxifyStore(store$$, selectedStore)\n })\n const isFirstTime = useRef(true)\n\n\n useEffect(() => {\n const subscription = store$$.pipe(distinctUntilChanged((prev, curr) => {\n let isEqual = true\n selectors.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n\n return isEqual\n })).subscribe((partialStore) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n const selectedStore = getPartialObjectFromAttributes(selectors, partialStore)\n setStore(proxifyStore(store$$, selectedStore))\n }\n })\n\n\n return () => subscription.unsubscribe()\n }, [selectors.length])\n\n\n return store\n }\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelect, createUseStore, proxifyStore } from '../helpers'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\n\n\n\n// const STORE_SYMBOL = '__cervello-store__'\n\n\n\n\ntype CervelloStoreUseParam<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n $onChange: (cb: (store: StoreType) => void) => void\n $onPartialChange: <\n Attributes extends Array<keyof StoreType>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n\nexport type CervelloUseFunction<StoreName extends string, StoreType> = (param: CervelloStoreUseParam<StoreName, StoreType>) => void\n\n\ntype CervelloStore<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n useStore: () => StoreType\n useSelect: <Attributes extends Array<keyof StoreType>>(...selectors: Attributes) => ObjectFromAttributes<StoreType, Attributes>\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreName, StoreType>) => void>) => CervelloStore<StoreName, StoreType>\n}\n\n\n\n\nexport function cervello <\n StoreName extends string,\n T\n> (storeName: StoreName, initialValue: T): CervelloStore<StoreName, T> {\n // Unique symbol to be used to keep a reference of the BehaviourSubject\n // const storeSymbol = Symbol(STORE_SYMBOL)\n\n\n const store$$ = new BehaviorSubject<T>(initialValue)\n\n const proxiedStore = proxifyStore(store$$, { ...initialValue })\n\n const cervelloStore = {\n [storeName]: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelect: createUseSelect<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\n [storeName]: proxiedStore,\n $onChange (cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n ).subscribe((_) => cb(proxiedStore))\n },\n $onPartialChange (attrs: Array<keyof T>, cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n distinctUntilChanged((prev, curr) => {\n let isEqual = true\n attrs.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n return isEqual\n }),\n ).subscribe((_) => cb(proxiedStore))\n },\n })\n })\n return this\n },\n } as any\n\n\n\n return cervelloStore as CervelloStore<StoreName, T>\n}\n"],"names":["proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","currentStore","value","bind","Reflect","set","clonedStore","Object","assign","next","createUseStore","store","setStore","useState","isFirstTime","useRef","useEffect","subscription","pipe","observeOn","queueScheduler","subscribe","n","current","unsubscribe","getPartialObjectFromAttributes","attributes","reduce","acc","curr","createUseSelect","selectors","selectedStore","distinctUntilChanged","prev","isEqual","forEach","selector","JSON","stringify","partialStore","length","cervello","storeName","initialValue","BehaviorSubject","proxiedStore","_extends","useStore","useSelect","use","functionList","func","$onChange","cb","pairwise","switchMap","oldValue","newValue","of","NEVER","_","$onPartialChange","attrs","this"],"mappings":"obAIgBA,SAAAA,EAAuDC,EAA6BC,GAClG,GAA2B,iBAAhBA,EAA0B,MAAM,IAAAC,MAAU,2BAErD,WAAOC,MACLF,EACA,CACEG,IAAK,SAAUC,EAAWC,GACxB,MAAkBC,EAAGP,EAAQQ,MAE7B,OAAIF,OACgC,qBAAVA,KACFA,GAAMG,KAAKV,EAAaC,EAASO,IAGhDA,EAAaD,GAGRI,QAACN,IAAIC,EAAQC,IAE7BK,IAAK,SAAUN,EAAWC,EAAuBE,GAC/C,MAEMI,EAAcC,OAAOC,OAAO,GAFbd,EAAQQ,OAO7B,OAJAI,EAAYN,GAAQE,EAEpBR,EAAQe,KAAKH,GAENF,QAAQC,IAAIN,EAAQC,EAAME,MCtBnC,SAAAQ,EAA8BhB,GAClC,MAAO,KACL,MAAOiB,EAAOC,GAAYC,EAAYpB,EAAaC,EAASA,EAAQQ,QAC9DY,EAAcC,GAAO,GAgB3B,OAbAC,EAAU,KACR,MAAkBC,EAAGvB,EAAQwB,KAAKC,EAAUC,IAAiBC,UAAWC,IAClER,EAAYS,QACdT,EAAYS,SAAU,EAEtBX,EAASnB,EAAaC,EAAS4B,MAInC,MAAO,IAAML,EAAaO,eACzB,IAGIb,GClBK,SAAAc,EAAoCC,EAA4Bf,GAC9E,SAAkBgB,OAAY,CAACC,EAAKC,KAClCD,EAAIC,GAAQlB,EAAMkB,GACXD,GACN,IAIWE,SAAAA,EAAqBpC,GAEnC,MAAO,IAAuCqC,KAC5C,MAAOpB,EAAOC,GAAYC,EAAc,KACtC,MAAmBmB,EAAGP,EAA+BM,EAAWrC,EAAQQ,OACxE,OAAmBT,EAACC,EAASsC,KAEzBlB,EAAcC,GAAO,GAiC3B,OA9BAC,EAAU,KACR,MAAkBC,EAAGvB,EAAQwB,KAAKe,EAAqB,CAACC,EAAML,KAC5D,IAAIM,GAAU,EAad,OAZAJ,EAAUK,QAASC,IACa,iBAAnBR,EAAKQ,IAA0BF,EACpCG,KAAKC,UAAUL,EAAKG,MAAeC,KAAKC,UAAUV,EAAKQ,MACzDF,GAAU,GAGRD,EAAKG,KAAcR,EAAKQ,IAAaF,IACvCA,GAAU,KAMjBA,KAAGd,UAAWmB,IACb,GAAI1B,EAAYS,QACdT,EAAYS,SAAU,MACjB,CACL,MAAmBS,EAAGP,EAA+BM,EAAWS,GAChE5B,EAASnB,EAAaC,EAASsC,OAKnC,MAAO,IAAMf,EAAaO,eACzB,CAACO,EAAUU,YClBFC,SAAAA,EAGbC,EAAsBC,GAKvB,MAAalD,EAAG,IAAImD,EAAmBD,GAErBE,EAAGrD,EAAaC,EAADqD,EAAA,GAAeH,IAiDhD,MA/CsB,CACpBD,CAACA,GAAYG,EAGbE,SAAUtC,EAAkBhB,GAC5BuD,UAAWnB,EAAmBpC,GAG9BwD,OAAQC,GAiCN,OAhCAA,EAAaf,QAASgB,IACpBA,EAAK,CACHT,CAACA,GAAYG,EACbO,UAAWC,GACT5D,EAAQwB,KACNqC,IACAC,EAAU,EAAEC,EAAUC,KAAeD,IAAaC,EAAWC,EAAGD,GAAYE,IAC5EvC,UAAWwC,GAAMP,EAAGR,KAExBgB,iBAAkBC,EAAuBT,GACvC5D,EAAQwB,KACNqC,IACAC,EAAU,EAAEC,EAAUC,KAAeD,IAAaC,EAAWC,EAAGD,GAAYE,GAC5E3B,EAAqB,CAACC,EAAML,KAC1B,IAAIM,GAAU,EAYd,OAXA4B,EAAM3B,QAASC,IACiB,iBAAnBR,EAAKQ,IAA0BF,EACpCG,KAAKC,UAAUL,EAAKG,MAAeC,KAAKC,UAAUV,EAAKQ,MACzDF,GAAU,GAGRD,EAAKG,KAAcR,EAAKQ,IAAaF,IACvCA,GAAU,KAITA,KAETd,UAAWwC,GAAMP,EAAGR,SAK7BkB"}
@@ -1,2 +1,2 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("rxjs"),require("react")):"function"==typeof define&&define.amd?define(["exports","rxjs","react"],n):n((e||self).cervello={},e.rxjs,e.react)}(this,function(e,n,t){function r(){return r=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},r.apply(this,arguments)}function u(e,n){if("object"!=typeof n)throw new Error("Store must be an object");return new Proxy(n,{get:function(n,t){var r=e.value;return t in r?"function"==typeof r[t]?r[t].bind(u(e,r)):r[t]:Reflect.get(n,t)},set:function(n,t,r){var u=Object.assign({},e.value);return u[t]=r,e.next(u),Reflect.set(n,t,r)}})}function i(e,n){return e.reduce(function(e,t){return e[t]=n[t],e},{})}e.c=function(e,c){var o,f,s=Symbol("__cervello-store__"),a=new n.BehaviorSubject(c),l=u(a,r(((o={})[s]=a,o),c)),b=((f={})[e]=l,f.useStore=function(e){return function(){var r=t.useState(u(e,e.value)),i=r[0],c=r[1],o=t.useRef(!0);return t.useEffect(function(){var t=e.pipe(n.observeOn(n.queueScheduler)).subscribe(function(n){o.current?o.current=!1:c(u(e,n))});return function(){return t.unsubscribe()}},[]),i}}(a),f.useSelect=function(e){return function(){var r=[].slice.call(arguments),c=t.useState(function(){var n=i(r,e.value);return u(e,n)}),o=c[0],f=c[1],s=t.useRef(!0);return t.useEffect(function(){var t=e.pipe(n.distinctUntilChanged(function(e,n){var t=!0;return r.forEach(function(r){"object"==typeof n[r]&&t?JSON.stringify(e[r])!==JSON.stringify(n[r])&&(t=!1):e[r]!==n[r]&&t&&(t=!1)}),t})).subscribe(function(n){if(s.current)s.current=!1;else{var t=i(r,n);f(u(e,t))}});return function(){return t.unsubscribe()}},[r.length]),o}}(a),f.use=function(){return[].slice.call(arguments).forEach(function(t){var r;t(((r={})[e]=l,r.$onChange=function(e){a.pipe(n.pairwise(),n.switchMap(function(e){var t=e[1];return e[0]!==t?n.of(t):n.NEVER})).subscribe(function(n){return e(l)})},r.$onPartialChange=function(e,t){a.pipe(n.pairwise(),n.switchMap(function(e){var t=e[1];return e[0]!==t?n.of(t):n.NEVER}),n.distinctUntilChanged(function(n,t){var r=!0;return e.forEach(function(e){"object"==typeof t[e]&&r?JSON.stringify(n[e])!==JSON.stringify(t[e])&&(r=!1):n[e]!==t[e]&&r&&(r=!1)}),r})).subscribe(function(e){return t(l)})},r))}),this},f);return b}});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("rxjs"),require("react")):"function"==typeof define&&define.amd?define(["exports","rxjs","react"],n):n((e||self).react={},e.rxjs,e.react)}(this,function(e,n,t){function r(){return r=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},r.apply(this,arguments)}function u(e,n){if("object"!=typeof n)throw new Error("Store must be an object");return new Proxy(n,{get:function(n,t){var r=e.value;return t in r?"function"==typeof r[t]?r[t].bind(u(e,r)):r[t]:Reflect.get(n,t)},set:function(n,t,r){var u=Object.assign({},e.value);return u[t]=r,e.next(u),Reflect.set(n,t,r)}})}function i(e,n){return e.reduce(function(e,t){return e[t]=n[t],e},{})}e.cervello=function(e,c){var o,f=new n.BehaviorSubject(c),s=u(f,r({},c)),a=((o={})[e]=s,o.useStore=function(e){return function(){var r=t.useState(u(e,e.value)),i=r[0],c=r[1],o=t.useRef(!0);return t.useEffect(function(){var t=e.pipe(n.observeOn(n.queueScheduler)).subscribe(function(n){o.current?o.current=!1:c(u(e,n))});return function(){return t.unsubscribe()}},[]),i}}(f),o.useSelect=function(e){return function(){var r=[].slice.call(arguments),c=t.useState(function(){var n=i(r,e.value);return u(e,n)}),o=c[0],f=c[1],s=t.useRef(!0);return t.useEffect(function(){var t=e.pipe(n.distinctUntilChanged(function(e,n){var t=!0;return r.forEach(function(r){"object"==typeof n[r]&&t?JSON.stringify(e[r])!==JSON.stringify(n[r])&&(t=!1):e[r]!==n[r]&&t&&(t=!1)}),t})).subscribe(function(n){if(s.current)s.current=!1;else{var t=i(r,n);f(u(e,t))}});return function(){return t.unsubscribe()}},[r.length]),o}}(f),o.use=function(){return[].slice.call(arguments).forEach(function(t){var r;t(((r={})[e]=s,r.$onChange=function(e){f.pipe(n.pairwise(),n.switchMap(function(e){var t=e[1];return e[0]!==t?n.of(t):n.NEVER})).subscribe(function(n){return e(s)})},r.$onPartialChange=function(e,t){f.pipe(n.pairwise(),n.switchMap(function(e){var t=e[1];return e[0]!==t?n.of(t):n.NEVER}),n.distinctUntilChanged(function(n,t){var r=!0;return e.forEach(function(e){"object"==typeof t[e]&&r?JSON.stringify(n[e])!==JSON.stringify(t[e])&&(r=!1):n[e]!==t[e]&&r&&(r=!1)}),r})).subscribe(function(e){return t(s)})},r))}),this},o);return a}});
2
2
  //# sourceMappingURL=cervello.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cervello.umd.js","sources":["../src/lib/helpers/proxify-store.ts","../src/lib/helpers/create-use-select.ts","../src/lib/store/index.ts","../src/lib/helpers/create-use-store.ts"],"sourcesContent":["import type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (store$$: BehaviorSubject<T>, storeObject: T): T {\n if (typeof storeObject !== 'object') throw new Error('Store must be an object')\n\n return new Proxy<T>(\n storeObject,\n {\n get: function (target: T, prop: string | symbol): any {\n const currentStore = store$$.value as any\n\n if (prop in currentStore) {\n if (typeof currentStore[prop] === 'function') {\n return currentStore[prop].bind(proxifyStore(store$$, currentStore))\n }\n\n return currentStore[prop]\n }\n\n return Reflect.get(target, prop)\n },\n set: function (target: T, prop: string | symbol, value: any) {\n const currentStore = store$$.value as any\n\n const clonedStore = Object.assign({}, currentStore)\n clonedStore[prop] = value\n\n store$$.next(clonedStore)\n\n return Reflect.set(target, prop, value)\n },\n },\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { distinctUntilChanged } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function getPartialObjectFromAttributes <T> (attributes: Array<keyof T>, store: T): any {\n return attributes.reduce<any>((acc, curr) => {\n acc[curr] = store[curr]\n return acc\n }, {})\n}\n\n\nexport function createUseSelect <T> (store$$: BehaviorSubject<T>) {\n //\n return <Attributes extends Array<keyof T>>(...selectors: Attributes): ObjectFromAttributes<T, Attributes> => {\n const [store, setStore] = useState<any>(() => {\n const selectedStore = getPartialObjectFromAttributes(selectors, store$$.value)\n return proxifyStore(store$$, selectedStore)\n })\n const isFirstTime = useRef(true)\n\n\n useEffect(() => {\n const subscription = store$$.pipe(distinctUntilChanged((prev, curr) => {\n let isEqual = true\n selectors.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n\n return isEqual\n })).subscribe((partialStore) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n const selectedStore = getPartialObjectFromAttributes(selectors, partialStore)\n setStore(proxifyStore(store$$, selectedStore))\n }\n })\n\n\n return () => subscription.unsubscribe()\n }, [selectors.length])\n\n\n return store\n }\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelect, createUseStore, proxifyStore } from '../helpers'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\n\n\n\nconst STORE_SYMBOL = '__cervello-store__'\n\n\n\n\ntype CervelloStoreUseParam<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n $onChange: (cb: (store: StoreType) => void) => void\n $onPartialChange: <\n Attributes extends Array<keyof StoreType>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n\nexport type CervelloUseFunction<StoreName extends string, StoreType> = (param: CervelloStoreUseParam<StoreName, StoreType>) => void\n\n\ntype CervelloStore<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n useStore: () => StoreType\n useSelect: <Attributes extends Array<keyof StoreType>>(...selectors: Attributes) => ObjectFromAttributes<StoreType, Attributes>\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreName, StoreType>) => void>) => CervelloStore<StoreName, StoreType>\n}\n\n\n\n\n// type Rec<Obj extends Record<string, any>> = {\n// [k in keyof Omit<Obj, 'middlewares'>]: Obj[keyof Omit<Obj, 'middlewares'>]\n// }\n// & Record<'middlewares', {\n// [Middleware in keyof Obj['middlewares']]:\n// (this: Omit<Obj, 'middlewares'>, ...params: Parameters<Obj['middlewares'][Middleware]>) => ReturnType<Obj['middlewares'][Middleware]>\n// }>\n\n\nexport function cervello <\n StoreName extends string,\n T\n> (storeName: StoreName, initialValue: T): CervelloStore<StoreName, T> {\n // Unique symbol to be used to keep a reference of the BehaviourSubject\n const storeSymbol = Symbol(STORE_SYMBOL)\n\n\n const store$$ = new BehaviorSubject<T>(initialValue)\n\n const proxiedStore = proxifyStore(store$$, {\n [storeSymbol]: store$$,\n ...initialValue,\n })\n\n const cervelloStore = {\n [storeName]: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelect: createUseSelect<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\n [storeName]: proxiedStore,\n $onChange (cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n ).subscribe((_) => cb(proxiedStore))\n },\n $onPartialChange (attrs: Array<keyof T>, cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n distinctUntilChanged((prev, curr) => {\n let isEqual = true\n attrs.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n return isEqual\n }),\n ).subscribe((_) => cb(proxiedStore))\n },\n })\n })\n return this\n },\n } as any\n\n\n\n return cervelloStore as CervelloStore<StoreName, T>\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { observeOn, queueScheduler } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n return () => {\n const [store, setStore] = useState<T>(proxifyStore(store$$, store$$.value))\n const isFirstTime = useRef(true)\n\n useEffect(() => {\n const subscription = store$$.pipe(observeOn(queueScheduler)).subscribe((n) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n setStore(proxifyStore(store$$, n))\n }\n })\n\n return () => subscription.unsubscribe()\n }, [])\n\n\n return store\n }\n}\n"],"names":["proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","currentStore","value","bind","Reflect","set","clonedStore","Object","assign","next","getPartialObjectFromAttributes","attributes","store","reduce","acc","curr","storeName","initialValue","_extends2","_cervelloStore","storeSymbol","Symbol","BehaviorSubject","proxiedStore","useStore","_useState","useState","setStore","isFirstTime","useRef","useEffect","subscription","pipe","observeOn","queueScheduler","subscribe","n","current","unsubscribe","createUseStore","useSelect","createUseSelect","selectors","slice","call","arguments","selectedStore","distinctUntilChanged","prev","isEqual","forEach","selector","JSON","stringify","partialStore","length","use","func","_func","$onChange","cb","pairwise","switchMap","_ref","newValue","of","NEVER","_","$onPartialChange","attrs","oldValue","this","cervelloStore"],"mappings":"ygBAIgBA,SAAAA,EAAuDC,EAA6BC,GAClG,GAA2B,iBAAhBA,EAA0B,MAAM,IAAAC,MAAU,2BAErD,WAAOC,MACLF,EACA,CACEG,IAAK,SAAUC,EAAWC,GACxB,IAAkBC,EAAGP,EAAQQ,MAE7B,OAAIF,OACgC,qBAAVA,KACFA,GAAMG,KAAKV,EAAaC,EAASO,IAGhDA,EAAaD,GAGRI,QAACN,IAAIC,EAAQC,IAE7BK,IAAK,SAAUN,EAAWC,EAAuBE,GAC/C,IAEMI,EAAcC,OAAOC,OAAO,GAFbd,EAAQQ,OAO7B,OAJAI,EAAYN,GAAQE,EAEpBR,EAAQe,KAAKH,GAENF,QAAQC,IAAIN,EAAQC,EAAME,MCrBzB,SAAAQ,EAAoCC,EAA4BC,GAC9E,SAAkBC,OAAY,SAACC,EAAKC,GAElC,OADAD,EAAIC,GAAQH,EAAMG,GACXD,GACN,QCgCW,SAGbE,EAAsBC,GAAe,IAAAC,EAAAC,EAEhCC,EAAcC,OA3CD,sBA8CN3B,EAAG,IAAI4B,kBAAmBL,GAErBM,EAAG9B,EAAaC,EAC/B0B,IAAAA,EAAAA,IAAAA,GAAc1B,KACZuB,QAIFD,EAAAA,IAAAA,GAAYO,EAGbC,EAAAA,SCxDE,SAA8B9B,GAClC,kBACE,IAAA+B,EAA0BC,EAAAA,SAAYjC,EAAaC,EAASA,EAAQQ,QAA7DU,EAAPa,EAAA,GAAcE,EAAdF,EAAA,GACMG,EAAcC,UAAO,GAe3B,OAbAC,EAASA,UAAC,WACR,IAAkBC,EAAGrC,EAAQsC,KAAKC,EAASA,UAACC,EAADA,iBAAkBC,UAAU,SAACC,GAClER,EAAYS,QACdT,EAAYS,SAAU,EAEtBV,EAASlC,EAAaC,EAAS0C,MAInC,OAAO,WAAA,OAAkBL,EAACO,gBACzB,IAGI1B,GDsCG2B,CAAkB7C,GAC5B8C,EAAAA,UDhDYC,SAAqB/C,GAEnC,OAA4G,WAAA,IAAAgD,EAAA,GAAAC,MAAAC,KAAAC,WAChFnB,EAAAA,EAAQA,SAAM,WACtC,IAAmBoB,EAAGpC,EAA+BgC,EAAWhD,EAAQQ,OACxE,OAAmBT,EAACC,EAASoD,KAFxBlC,OAAOe,EAAdF,EAAA,GAIMG,EAAcC,EAAMA,QAAC,GAiC3B,OA9BAC,EAAAA,UAAU,WACR,IAAMC,EAAerC,EAAQsC,KAAKe,EAAAA,qBAAqB,SAACC,EAAMjC,GAC5D,IAAIkC,GAAU,EAad,OAZAP,EAAUQ,QAAQ,SAACC,GACa,iBAAfpC,EAACoC,IAA0BF,EACpCG,KAAKC,UAAUL,EAAKG,MAAeC,KAAKC,UAAUtC,EAAKoC,MACzDF,GAAU,GAGRD,EAAKG,KAAcpC,EAAKoC,IAAaF,IACvCA,GAAU,KAKTA,KACLd,UAAU,SAACmB,GACb,GAAI1B,EAAYS,QACdT,EAAYS,SAAU,MACjB,CACL,IAAMS,EAAgBpC,EAA+BgC,EAAWY,GAChE3B,EAASlC,EAAaC,EAASoD,OAKnC,OAAaf,WAAAA,OAAAA,EAAaO,gBACzB,CAACI,EAAUa,YCWHd,CAAmB/C,GAG9B8D,EAAAA,IAAyB,WAiCvB,MAhCA,GAAaN,MAAAA,KAAAA,WAAAA,QAAQ,SAACO,GAAa,IAAAC,EACjCD,IAAIC,EAAA,IACD1C,GAAYO,EACboC,EAAAA,mBAAWC,GACTlE,EAAQsC,KACN6B,EAAAA,WACAC,EAAAA,UAAU,SAAAC,GAAA,IAAYC,EAAZD,EAAA,GAAA,OAAAA,EAAA,KAAwCC,EAAWC,EAAEA,GAACD,GAAYE,WAC5E/B,UAAU,SAACgC,GAAMP,OAAAA,EAAGrC,MANtBmC,EAQFU,iBARE,SAQgBC,EAAuBT,GACvClE,EAAQsC,KACN6B,EAAQA,WACRC,EAASA,UAAC,SAAEQ,GAAAA,IAAUN,cAAAA,EAAAA,KAA4BA,EAAWC,EAAEA,GAACD,GAAYE,UAC5EnB,EAAoBA,qBAAC,SAACC,EAAMjC,GAC1B,IAAIkC,GAAU,EAYd,OAXAoB,EAAMnB,QAAQ,SAACC,GACiB,mBAAdA,IAA0BF,EACpCG,KAAKC,UAAUL,EAAKG,MAAeC,KAAKC,UAAUtC,EAAKoC,MACzDF,GAAU,GAGRD,EAAKG,KAAcpC,EAAKoC,IAAaF,IACvCA,GAAU,KAITA,KAETd,UAAU,SAACgC,GAAMP,OAAAA,EAAGrC,MA3BtBmC,MAgCPa,MA1CHpD,GA+CA,OACDqD"}
1
+ {"version":3,"file":"cervello.umd.js","sources":["../src/lib/helpers/proxify-store.ts","../src/lib/helpers/create-use-select.ts","../src/lib/store/index.ts","../src/lib/helpers/create-use-store.ts"],"sourcesContent":["import type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (store$$: BehaviorSubject<T>, storeObject: T): T {\n if (typeof storeObject !== 'object') throw new Error('Store must be an object')\n\n return new Proxy<T>(\n storeObject,\n {\n get: function (target: T, prop: string | symbol): any {\n const currentStore = store$$.value as any\n\n if (prop in currentStore) {\n if (typeof currentStore[prop] === 'function') {\n return currentStore[prop].bind(proxifyStore(store$$, currentStore))\n }\n\n return currentStore[prop]\n }\n\n return Reflect.get(target, prop)\n },\n set: function (target: T, prop: string | symbol, value: any) {\n const currentStore = store$$.value as any\n\n const clonedStore = Object.assign({}, currentStore)\n clonedStore[prop] = value\n\n store$$.next(clonedStore)\n\n return Reflect.set(target, prop, value)\n },\n },\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { distinctUntilChanged } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function getPartialObjectFromAttributes <T> (attributes: Array<keyof T>, store: T): any {\n return attributes.reduce<any>((acc, curr) => {\n acc[curr] = store[curr]\n return acc\n }, {})\n}\n\n\nexport function createUseSelect <T> (store$$: BehaviorSubject<T>) {\n //\n return <Attributes extends Array<keyof T>>(...selectors: Attributes): ObjectFromAttributes<T, Attributes> => {\n const [store, setStore] = useState<any>(() => {\n const selectedStore = getPartialObjectFromAttributes(selectors, store$$.value)\n return proxifyStore(store$$, selectedStore)\n })\n const isFirstTime = useRef(true)\n\n\n useEffect(() => {\n const subscription = store$$.pipe(distinctUntilChanged((prev, curr) => {\n let isEqual = true\n selectors.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n\n return isEqual\n })).subscribe((partialStore) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n const selectedStore = getPartialObjectFromAttributes(selectors, partialStore)\n setStore(proxifyStore(store$$, selectedStore))\n }\n })\n\n\n return () => subscription.unsubscribe()\n }, [selectors.length])\n\n\n return store\n }\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelect, createUseStore, proxifyStore } from '../helpers'\n\nimport type { ObjectFromAttributes } from '../../types/shared'\n\n\n\n// const STORE_SYMBOL = '__cervello-store__'\n\n\n\n\ntype CervelloStoreUseParam<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n $onChange: (cb: (store: StoreType) => void) => void\n $onPartialChange: <\n Attributes extends Array<keyof StoreType>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n\nexport type CervelloUseFunction<StoreName extends string, StoreType> = (param: CervelloStoreUseParam<StoreName, StoreType>) => void\n\n\ntype CervelloStore<StoreName extends string, StoreType> = {\n [k in StoreName]: StoreType\n} & {\n useStore: () => StoreType\n useSelect: <Attributes extends Array<keyof StoreType>>(...selectors: Attributes) => ObjectFromAttributes<StoreType, Attributes>\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreName, StoreType>) => void>) => CervelloStore<StoreName, StoreType>\n}\n\n\n\n\nexport function cervello <\n StoreName extends string,\n T\n> (storeName: StoreName, initialValue: T): CervelloStore<StoreName, T> {\n // Unique symbol to be used to keep a reference of the BehaviourSubject\n // const storeSymbol = Symbol(STORE_SYMBOL)\n\n\n const store$$ = new BehaviorSubject<T>(initialValue)\n\n const proxiedStore = proxifyStore(store$$, { ...initialValue })\n\n const cervelloStore = {\n [storeName]: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelect: createUseSelect<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\n [storeName]: proxiedStore,\n $onChange (cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n ).subscribe((_) => cb(proxiedStore))\n },\n $onPartialChange (attrs: Array<keyof T>, cb: any) {\n store$$.pipe(\n pairwise(),\n switchMap(([oldValue, newValue]) => (oldValue !== newValue ? of(newValue) : NEVER)),\n distinctUntilChanged((prev, curr) => {\n let isEqual = true\n attrs.forEach((selector) => {\n if (typeof curr[selector] === 'object' && isEqual) {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (prev[selector] !== curr[selector] && isEqual) {\n isEqual = false\n }\n }\n })\n return isEqual\n }),\n ).subscribe((_) => cb(proxiedStore))\n },\n })\n })\n return this\n },\n } as any\n\n\n\n return cervelloStore as CervelloStore<StoreName, T>\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { observeOn, queueScheduler } from 'rxjs'\n\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n return () => {\n const [store, setStore] = useState<T>(proxifyStore(store$$, store$$.value))\n const isFirstTime = useRef(true)\n\n // TODO: Use new useSyncExternalStore API hook\n useEffect(() => {\n const subscription = store$$.pipe(observeOn(queueScheduler)).subscribe((n) => {\n if (isFirstTime.current) {\n isFirstTime.current = false\n } else {\n setStore(proxifyStore(store$$, n))\n }\n })\n\n return () => subscription.unsubscribe()\n }, [])\n\n\n return store\n }\n}\n"],"names":["proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","currentStore","value","bind","Reflect","set","clonedStore","Object","assign","next","getPartialObjectFromAttributes","attributes","store","reduce","acc","curr","storeName","initialValue","_cervelloStore","BehaviorSubject","proxiedStore","cervelloStore","useStore","_useState","useState","setStore","isFirstTime","useRef","useEffect","subscription","pipe","observeOn","queueScheduler","subscribe","n","current","unsubscribe","createUseStore","useSelect","createUseSelect","selectors","slice","call","arguments","selectedStore","distinctUntilChanged","prev","isEqual","forEach","selector","JSON","stringify","partialStore","length","use","func","_func","$onChange","cb","pairwise","switchMap","oldValue","newValue","of","NEVER","_","$onPartialChange","attrs","_ref2","this"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cervello/react",
3
- "version": "0.9.0",
3
+ "version": "0.9.3",
4
4
  "description": "Simplest and truly reactive state manager for React",
5
5
  "main": "./dist/cervello.cjs",
6
6
  "module": "./dist/cervello.esm.js",
@@ -47,7 +47,7 @@
47
47
  "local"
48
48
  ],
49
49
  "author": "Chempo",
50
- "license": "ISC",
50
+ "license": "MIT",
51
51
  "bugs": {
52
52
  "url": "https://github.com/chempogonzalez/cervello/issues"
53
53
  },
@@ -57,16 +57,15 @@
57
57
  "rxjs": ">= 7.4.0"
58
58
  },
59
59
  "dependencies": {
60
- "observable-lib": "workspace:*",
61
- "use-sync-external-store": "^1.1.0"
60
+ "use-sync-external-store": "^1.2.0"
62
61
  },
63
62
  "devDependencies": {
64
63
  "@chempo/ec-linter": "^1.0.10",
65
- "@types/react": "18.0.12",
64
+ "@types/react": "18.0.15",
66
65
  "@types/use-sync-external-store": "^0.0.3",
67
66
  "microbundle": "0.15.0",
68
- "react": "18.1.0",
69
- "rxjs": "7.5.5",
70
- "typescript": "4.7.3"
67
+ "react": "18.2.0",
68
+ "rxjs": "7.5.6",
69
+ "typescript": "4.7.4"
71
70
  }
72
71
  }
package/types/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { cervello as c } from './lib/store';
1
+ export { cervello } from './lib/store';
2
2
  export type { CervelloUseFunction as UseFunction } from './lib/store';