@cervello/react 0.9.0 → 0.9.1
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 +38 -0
- package/dist/cervello.cjs +1 -1
- package/dist/cervello.cjs.map +1 -1
- package/dist/cervello.esm.js +1 -1
- package/dist/cervello.esm.js.map +1 -1
- package/dist/cervello.modern.js +1 -1
- package/dist/cervello.modern.js.map +1 -1
- package/dist/cervello.umd.js +1 -1
- package/dist/cervello.umd.js.map +1 -1
- package/package.json +1 -1
- package/types/index.d.ts +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
# Cervello
|
|
2
|
+
> (Beta version) - Working on it to be have SSR integration (hydration) and better documentation
|
|
3
|
+
|
|
4
|
+
#### `746 Bytes of bundle size for now!! `
|
|
2
5
|
Simplest and truly reactive state manager for React
|
|
3
6
|
|
|
4
7
|
|
|
@@ -99,3 +102,38 @@ const CounterLabel = () => {
|
|
|
99
102
|
}
|
|
100
103
|
|
|
101
104
|
```
|
|
105
|
+
|
|
106
|
+
## USE FUNCTION
|
|
107
|
+
The use function allows you to implement side effects due to a change in a the store
|
|
108
|
+
```ts
|
|
109
|
+
import type { UseFunction } from '@cervello/react'
|
|
110
|
+
|
|
111
|
+
const logger: UseFunction<'testStore', typeof testStore> = ({ $onChange }): void => {
|
|
112
|
+
$onChange((store) => {
|
|
113
|
+
console.log('Store changed to :>>', store)
|
|
114
|
+
})
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
const { testStore } =
|
|
119
|
+
cervello('testStore', { test: 'test', count: -1 })
|
|
120
|
+
.use(logger, /* other use functions */) // Adds the logger to the store
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### Use function callback object
|
|
125
|
+
```ts
|
|
126
|
+
import type { UseFunction } from '@cervello/react'
|
|
127
|
+
|
|
128
|
+
const logger: UseFunction<'testStore', typeof testStore> = ({ testStore, $onPartialChange, $onChange }): void => {
|
|
129
|
+
// Listen to all the changes happened in the store
|
|
130
|
+
$onChange((store) => {
|
|
131
|
+
console.log('Store changed to :>>', store)
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// Listen to the changes happened in the store's attributes provided
|
|
135
|
+
$onPartialChange(['test', 'count'], (store) => {
|
|
136
|
+
store.count += 1
|
|
137
|
+
})
|
|
138
|
+
}
|
|
139
|
+
```
|
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.
|
|
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
|
package/dist/cervello.cjs.map
CHANGED
|
@@ -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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"}
|
package/dist/cervello.esm.js
CHANGED
|
@@ -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
|
|
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
|
package/dist/cervello.esm.js.map
CHANGED
|
@@ -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":"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"}
|
|
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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"}
|
package/dist/cervello.modern.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{observeOn as
|
|
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"}
|
package/dist/cervello.umd.js
CHANGED
|
@@ -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).
|
|
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
|
package/dist/cervello.umd.js.map
CHANGED
|
@@ -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
package/types/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { cervello
|
|
1
|
+
export { cervello } from './lib/store';
|
|
2
2
|
export type { CervelloUseFunction as UseFunction } from './lib/store';
|