@cervello/react 0.9.0
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 +101 -0
- package/dist/cervello.cjs +2 -0
- package/dist/cervello.cjs.map +1 -0
- package/dist/cervello.esm.js +2 -0
- package/dist/cervello.esm.js.map +1 -0
- package/dist/cervello.modern.js +2 -0
- package/dist/cervello.modern.js.map +1 -0
- package/dist/cervello.umd.js +2 -0
- package/dist/cervello.umd.js.map +1 -0
- package/package.json +72 -0
- package/types/index.d.ts +2 -0
- package/types/lib/helpers/create-use-select.d.ts +4 -0
- package/types/lib/helpers/create-use-store.d.ts +2 -0
- package/types/lib/helpers/index.d.ts +3 -0
- package/types/lib/helpers/proxify-store.d.ts +2 -0
- package/types/lib/index.d.ts +1 -0
- package/types/lib/store/index.d.ts +17 -0
- package/types/lib/utils/index.d.ts +0 -0
- package/types/types/shared.d.ts +4 -0
package/README.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Cervello
|
|
2
|
+
Simplest and truly reactive state manager for React
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
## 🚀 **Features**
|
|
6
|
+
- ⚡️ Optimized and super performant
|
|
7
|
+
- ⚛️ Truly reactive on item change
|
|
8
|
+
- ✅ Super simple and minimalistic API
|
|
9
|
+
- 🐨 Listen to attributes or items lazily
|
|
10
|
+
- 👌 No unnecessary re-renders
|
|
11
|
+
- 🔑 Typescript support
|
|
12
|
+
|
|
13
|
+
## 📦 **Install**
|
|
14
|
+
```zsh
|
|
15
|
+
# NPM install as a dependency
|
|
16
|
+
npm install cervello
|
|
17
|
+
|
|
18
|
+
# YARN install as a dependency
|
|
19
|
+
yarn add cervello
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## 💻 **Usage**
|
|
24
|
+
The `cervello` function allows you to create a new store in an easy way.
|
|
25
|
+
1. Define the store name
|
|
26
|
+
2. Set the initial value _`(the type will be inferred based on this value)`_
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
// - store-example.ts
|
|
30
|
+
import { cervello } from 'cervello'
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
/** Export it with the names you prefer to be used/imported */
|
|
34
|
+
/**
|
|
35
|
+
* The cervello function returns a store with the given name and 2 hooks
|
|
36
|
+
* to be reactive and change the store value
|
|
37
|
+
*
|
|
38
|
+
* Object returned => { storeNameProvided, useStore, useSelect }
|
|
39
|
+
*/
|
|
40
|
+
export const {
|
|
41
|
+
exampleStore, // The store object
|
|
42
|
+
useStore: useExampleStore, // The hook to use the store
|
|
43
|
+
useSelect: useExampleSelect // The hook to use the selectors (part of the store)
|
|
44
|
+
} = cervello(
|
|
45
|
+
'exampleStore', /* store name */
|
|
46
|
+
{ count: 0 } /* initial value */
|
|
47
|
+
)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
Use it in your components. They don't need to know about each other. They can be in different pages or locations:
|
|
52
|
+
```tsx
|
|
53
|
+
import { useExampleStore } from './store-example'
|
|
54
|
+
|
|
55
|
+
const CounterLabel = () => {
|
|
56
|
+
const { count } = useExampleStore()
|
|
57
|
+
|
|
58
|
+
return (<span>{ count }</span>)
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
import { exampleStore } from './store-example'
|
|
65
|
+
|
|
66
|
+
const CounterButton = () => (
|
|
67
|
+
// This makes all the components using the store (i.e.: CounterLabel)
|
|
68
|
+
// to be reactive and re-renders with the new value
|
|
69
|
+
<button onClick={e => exampleStore.count += 1}>
|
|
70
|
+
Increment
|
|
71
|
+
</button>
|
|
72
|
+
)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
#### 🔖 Changing the store
|
|
77
|
+
```ts
|
|
78
|
+
const CounterLabel = () => {
|
|
79
|
+
/**
|
|
80
|
+
* If you want to just listen for changes, then you can destructure the value but...
|
|
81
|
+
*
|
|
82
|
+
* IMPORTANT!: In order to change reactively any store attribute, you must use
|
|
83
|
+
* the object returned from the `useStore` hook without destructuring
|
|
84
|
+
* */
|
|
85
|
+
const exampleStore = useExampleStore()
|
|
86
|
+
|
|
87
|
+
// Destructured just to be listened if changes
|
|
88
|
+
const { count } = exampleStore
|
|
89
|
+
|
|
90
|
+
// In order to be reactive, you MUST use the object when you change a value
|
|
91
|
+
const increment = () => exampleStore.count += 1
|
|
92
|
+
|
|
93
|
+
return (
|
|
94
|
+
<div>
|
|
95
|
+
<span>{ count }</span>
|
|
96
|
+
<button onClick={increment}> Increment </button>
|
|
97
|
+
</div>
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
```
|
|
@@ -0,0 +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};
|
|
2
|
+
//# sourceMappingURL=cervello.cjs.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +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};
|
|
2
|
+
//# sourceMappingURL=cervello.esm.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +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};
|
|
2
|
+
//# sourceMappingURL=cervello.modern.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +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}});
|
|
2
|
+
//# sourceMappingURL=cervello.umd.js.map
|
|
@@ -0,0 +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":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cervello/react",
|
|
3
|
+
"version": "0.9.0",
|
|
4
|
+
"description": "Simplest and truly reactive state manager for React",
|
|
5
|
+
"main": "./dist/cervello.cjs",
|
|
6
|
+
"module": "./dist/cervello.esm.js",
|
|
7
|
+
"unpkg": "./dist/cervello.umd.js",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"source": "src/index.ts",
|
|
10
|
+
"types": "./types/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"browser": "./dist/cervello.esm.js",
|
|
14
|
+
"import": "./dist/cervello.esm.js",
|
|
15
|
+
"umd": "./dist/cervello.umd.js",
|
|
16
|
+
"require": "./dist/cervello.cjs",
|
|
17
|
+
"default": "./dist/cervello.modern.js"
|
|
18
|
+
},
|
|
19
|
+
"./types": {
|
|
20
|
+
"browser": "./types/index.d.ts",
|
|
21
|
+
"import": "./types/index.d.ts",
|
|
22
|
+
"require": "./types/index.d.ts",
|
|
23
|
+
"default": "./types/index.d.ts"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"types"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "(rm -rf types & rm -rf dist) && microbundle",
|
|
32
|
+
"dev": "microbundle watch"
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/chempogonzalez/cervello.git"
|
|
37
|
+
},
|
|
38
|
+
"sideEffects": false,
|
|
39
|
+
"keywords": [
|
|
40
|
+
"state",
|
|
41
|
+
"manager",
|
|
42
|
+
"reactive",
|
|
43
|
+
"react",
|
|
44
|
+
"immutable",
|
|
45
|
+
"observable",
|
|
46
|
+
"global",
|
|
47
|
+
"local"
|
|
48
|
+
],
|
|
49
|
+
"author": "Chempo",
|
|
50
|
+
"license": "ISC",
|
|
51
|
+
"bugs": {
|
|
52
|
+
"url": "https://github.com/chempogonzalez/cervello/issues"
|
|
53
|
+
},
|
|
54
|
+
"homepage": "https://github.com/chempogonzalez/cervello#readme",
|
|
55
|
+
"peerDependencies": {
|
|
56
|
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
|
57
|
+
"rxjs": ">= 7.4.0"
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"observable-lib": "workspace:*",
|
|
61
|
+
"use-sync-external-store": "^1.1.0"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@chempo/ec-linter": "^1.0.10",
|
|
65
|
+
"@types/react": "18.0.12",
|
|
66
|
+
"@types/use-sync-external-store": "^0.0.3",
|
|
67
|
+
"microbundle": "0.15.0",
|
|
68
|
+
"react": "18.1.0",
|
|
69
|
+
"rxjs": "7.5.5",
|
|
70
|
+
"typescript": "4.7.3"
|
|
71
|
+
}
|
|
72
|
+
}
|
package/types/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ObjectFromAttributes } from '../../types/shared';
|
|
2
|
+
import type { BehaviorSubject } from 'rxjs';
|
|
3
|
+
export declare function getPartialObjectFromAttributes<T>(attributes: Array<keyof T>, store: T): any;
|
|
4
|
+
export declare function createUseSelect<T>(store$$: BehaviorSubject<T>): <Attributes extends (keyof T)[]>(...selectors: Attributes) => ObjectFromAttributes<T, Attributes>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { cervello as c } from './core';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ObjectFromAttributes } from '../../types/shared';
|
|
2
|
+
declare type CervelloStoreUseParam<StoreName extends string, StoreType> = {
|
|
3
|
+
[k in StoreName]: StoreType;
|
|
4
|
+
} & {
|
|
5
|
+
$onChange: (cb: (store: StoreType) => void) => void;
|
|
6
|
+
$onPartialChange: <Attributes extends Array<keyof StoreType>>(selectors: Attributes, cb: (store: StoreType) => void) => void;
|
|
7
|
+
};
|
|
8
|
+
export declare type CervelloUseFunction<StoreName extends string, StoreType> = (param: CervelloStoreUseParam<StoreName, StoreType>) => void;
|
|
9
|
+
declare type CervelloStore<StoreName extends string, StoreType> = {
|
|
10
|
+
[k in StoreName]: StoreType;
|
|
11
|
+
} & {
|
|
12
|
+
useStore: () => StoreType;
|
|
13
|
+
useSelect: <Attributes extends Array<keyof StoreType>>(...selectors: Attributes) => ObjectFromAttributes<StoreType, Attributes>;
|
|
14
|
+
use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreName, StoreType>) => void>) => CervelloStore<StoreName, StoreType>;
|
|
15
|
+
};
|
|
16
|
+
export declare function cervello<StoreName extends string, T>(storeName: StoreName, initialValue: T): CervelloStore<StoreName, T>;
|
|
17
|
+
export {};
|
|
File without changes
|