@cervello/react 0.9.4 → 0.10.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 +53 -17
- 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 +2 -2
- package/types/lib/store/index.d.ts +6 -3
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
🤯 Simplest and truly reactive state manager for React
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
## 🚀 **Features**
|
|
@@ -39,18 +39,15 @@ Just set the initial value _`(the type will be inferred based on this value)`_ a
|
|
|
39
39
|
import { cervello } from '@cervello/react'
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
/** Export it with the names you prefer to be used/imported */
|
|
43
42
|
/**
|
|
44
43
|
* The cervello function returns a reactive store and 2 hooks
|
|
45
|
-
* to be
|
|
44
|
+
* to be ready to changes inside react components
|
|
46
45
|
*
|
|
47
|
-
*
|
|
48
|
-
* Object returned => { store, useStore, useSelector }
|
|
49
46
|
*/
|
|
50
47
|
export const {
|
|
51
|
-
store
|
|
52
|
-
useStore
|
|
53
|
-
useSelector
|
|
48
|
+
store, // The store object
|
|
49
|
+
useStore, // The hook to use the store
|
|
50
|
+
useSelector, // The hook to use the selectors (part of the store)
|
|
54
51
|
} = cervello({ count: 0 })
|
|
55
52
|
```
|
|
56
53
|
|
|
@@ -65,7 +62,7 @@ import { store } from './store-example'
|
|
|
65
62
|
* It can be used outside the react components
|
|
66
63
|
* It will notify all the components listening for changes
|
|
67
64
|
*/
|
|
68
|
-
const increment = () => { store.count++}
|
|
65
|
+
const increment = () => { store.count++ }
|
|
69
66
|
|
|
70
67
|
const CounterButton = () => (
|
|
71
68
|
/**
|
|
@@ -94,6 +91,9 @@ const CounterLabel = () => {
|
|
|
94
91
|
### 🟢 `useSelector`
|
|
95
92
|
|
|
96
93
|
React hook that allows you to have a reactive store which re-renders when a new value was set on properties you specified
|
|
94
|
+
- _Parameters_:
|
|
95
|
+
- `selectors`: an array of store properties to be watched
|
|
96
|
+
- `isEqualFunction`: a custom function to compare the new value with the old one
|
|
97
97
|
```tsx
|
|
98
98
|
import { useSelector } from './store-example'
|
|
99
99
|
|
|
@@ -113,30 +113,32 @@ The use function allows you to implement side effects due to a store change
|
|
|
113
113
|
```ts
|
|
114
114
|
import type { UseFunction } from '@cervello/react'
|
|
115
115
|
|
|
116
|
-
const logger: UseFunction<typeof store> = ({
|
|
117
|
-
|
|
116
|
+
const logger: UseFunction<typeof store> = ({ onChange }): void => {
|
|
117
|
+
onChange((store) => {
|
|
118
118
|
console.log('[Store-changed] to ==>', store)
|
|
119
119
|
})
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
|
|
123
|
-
const { store } = cervello({
|
|
124
|
-
|
|
123
|
+
const { store } = cervello({
|
|
124
|
+
name: 'chempo',
|
|
125
|
+
surname: 'gonzalez'
|
|
126
|
+
}).use(logger, /* ... */)
|
|
125
127
|
|
|
126
128
|
```
|
|
127
129
|
|
|
128
|
-
#### 🗳️ Use function
|
|
130
|
+
#### 🗳️ Use function - `utility functions`
|
|
129
131
|
```ts
|
|
130
132
|
import type { UseFunction } from '@cervello/react'
|
|
131
133
|
|
|
132
|
-
const logger: UseFunction<typeof store> = ({
|
|
134
|
+
const logger: UseFunction<typeof store> = ({ onChange, onPartialChange }): void => {
|
|
133
135
|
// Listen to all the changes happened in the store
|
|
134
|
-
|
|
136
|
+
onChange((store) => {
|
|
135
137
|
console.log('Store changed to :>>', store)
|
|
136
138
|
});
|
|
137
139
|
|
|
138
140
|
// Listen to the changes happened in the store's attributes provided
|
|
139
|
-
|
|
141
|
+
onPartialChange(['name'], (store) => {
|
|
140
142
|
console.log('Name has changed to:', store.name)
|
|
141
143
|
})
|
|
142
144
|
}
|
|
@@ -144,6 +146,40 @@ const logger: UseFunction<typeof store> = ({ $onChange, $onPartialChange }): voi
|
|
|
144
146
|
------
|
|
145
147
|
<br>
|
|
146
148
|
|
|
149
|
+
## 💡 Features out-of-the-box
|
|
150
|
+
### **`💠 Nested objects reactivity`**
|
|
151
|
+
You can change a nested property of an object and it will be notified automatically
|
|
152
|
+
|
|
153
|
+
```jsx
|
|
154
|
+
import { store } from './other-example'
|
|
155
|
+
|
|
156
|
+
const AddressChanger = () => {
|
|
157
|
+
return (
|
|
158
|
+
<button onClick={() => { store.address.street = 'New street' }}>
|
|
159
|
+
Change street to Seville
|
|
160
|
+
</button>
|
|
161
|
+
)
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```tsx
|
|
166
|
+
import { useSelector } from './other-example'
|
|
167
|
+
|
|
168
|
+
// Component listening for address object changes
|
|
169
|
+
const Address = () => {
|
|
170
|
+
const { address } = useSelector(['address'])
|
|
171
|
+
const { street, city } = address
|
|
172
|
+
return (
|
|
173
|
+
<div>
|
|
174
|
+
<span>{ street }</span>
|
|
175
|
+
<span>{ city }</span>
|
|
176
|
+
</div>
|
|
177
|
+
)
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
147
183
|
|
|
148
184
|
## 🤓 Happy Code
|
|
149
185
|
|
package/dist/cervello.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var n=require("rxjs"),
|
|
1
|
+
var n=require("rxjs"),e=require("use-sync-external-store/shim"),r=require("use-sync-external-store/shim/with-selector");function t(){return t=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},t.apply(this,arguments)}var i=Symbol("$$nested-attributes");function u(n,e){if("object"!=typeof e)throw new Error("Store must be an object");return new Proxy(e,{get:function(e,r){var o=e;if(r in o){if("function"==typeof o[r])return o[r].bind(u(n,o));if(o[r]&&"object"==typeof o[r]&&!Array.isArray(o[r])&&"symbol"!=typeof r){var c=null==e?void 0:e[i],f=c?c+".":"";return u(n,Object.defineProperty(t({},o[r]),i,{value:""+f+r,enumerable:!1,writable:!1,configurable:!1}))}return o[r]}return Reflect.get(e,r)},set:function(e,r,t){var u,o=n.getValue(),c=Boolean(null==(u=e[i])?void 0:u.length),f=Object.assign({},o);return c?function(n,e,r,t){e.forEach(function(e){n=n[e]}),n[r]=t}(f,e[i].split("."),r,t):f[r]=t,n.next(f),Reflect.set(e,r,t)}})}var o=function(n){return function(e){var r=n.subscribe(e);return function(){r.unsubscribe()}}};function c(n){var r=o(n),t=n.getValue.bind(n);return function(){var i=e.useSyncExternalStore(r,t,t);return u(n,i)}}function f(n){var e=o(n),t=n.getValue.bind(n);return function(i,o){var c=r.useSyncExternalStoreWithSelector(e,t,t,function(n){return function(n,e){return n.reduce(function(n,r){return n[r]=e[r],n},{})}(i,n)},function(n,e){return o?o(n,e):JSON.stringify(n)===JSON.stringify(e)});return u(n,c)}}exports.cervello=function(e,r){var i="function"==typeof e?e():e,o=new n.BehaviorSubject(i),a=u(o,t({},i)),s={store:a,useStore:c(o),useSelector:f(o),use:function(){return[].slice.call(arguments).forEach(function(e){e({onChange:function(e){o.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(a)})},onPartialChange:function(e,r){o.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){t&&"object"==typeof r[e]?JSON.stringify(n[e])!==JSON.stringify(r[e])&&(t=!1):t&&n[e]!==r[e]&&(t=!1)}),t})).subscribe(function(n){return r(a)})}})}),this}};return s};
|
|
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/utils/subscribe-for-react.ts","../src/lib/helpers/create-use-store.ts","../src/lib/helpers/create-use-selector.ts","../src/lib/store/index.ts"],"sourcesContent":["import type { BehaviorSubject } from 'rxjs'\n\n\n\nconst NESTED_ATTRIBUTES_SYMBOL = '___nested-attributes___'\nconst nestedAttrs = Symbol(NESTED_ATTRIBUTES_SYMBOL)\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 = target as any\n // console.log('get', { target, prop, in: prop in currentStore })\n\n // Problem with nested proxies because of currentStore is the root object\n if (prop in currentStore) {\n if (typeof currentStore[prop] === 'function') {\n return currentStore[prop].bind(proxifyStore(store$$, currentStore))\n }\n\n // console.log('------', prop, typeof currentStore[prop] === 'object', !Array.isArray(currentStore[prop]))\n // TODO: add pseudo identifier in order to return\n // TODO: the same object with a identifier of the level and the name of the property\n if (typeof currentStore[prop] === 'object' && !Array.isArray(currentStore[prop]) && typeof prop !== 'symbol') {\n // console.log('returning proxified object', prop)\n return proxifyStore(\n store$$,\n {\n ...currentStore[prop],\n [nestedAttrs]: `${(target?.[nestedAttrs]) ?? ''}${prop}`,\n })\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 // Write a merge deep nested objects function (as 'deepmerge lib')\n console.log('set', { target, prop, value })\n const currentStore = store$$.getValue() 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 type { BehaviorSubject } from 'rxjs'\n\n\n\nexport const subscribeForReactHook = <T>(store$$: BehaviorSubject<T>): typeof subscribe => {\n const subscribe = (onStoreChange: () => void): () => void => {\n const subscription = store$$.subscribe(onStoreChange)\n return () => {\n subscription.unsubscribe()\n }\n }\n return subscribe\n}\n","\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n\n // USE STORE HOOK -------------------------------------------------\n const useStore = (): T => {\n const store = useSyncExternalStore(subscribe, getValue, getValue)\n\n return proxifyStore(store$$, store)\n }\n\n\n return useStore\n}\n","\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector'\n\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes, WithoutType } 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\nexport type UseSelector<T> = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ) => ObjectFromAttributes<T, Attributes>\n\nexport function createUseSelector <T> (store$$: BehaviorSubject<T>): UseSelector<T> {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n // const subscribeWithSelectors = (selectors: Array<keyof T>): (onStoreChange: () => void) => () => void => {\n // return (onStoreChange: () => void): (() => void) => {\n // const subscription = store$$.subscribe(onStoreChange)\n // // console.log('1- FUNCTION OF SUBSCRIBE')\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 // // console.log('1- FUNCTION OF distinctUntilChanged', { isEqual })\n\n // // return isEqual\n // // })).subscribe(onStoreChange)\n\n // return () => {\n // subscription.unsubscribe()\n // }\n // }\n // }\n\n\n\n\n // USE SELECTOR HOOK -------------------------------------------------\n const useSelector = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ): ObjectFromAttributes<T, Attributes> => {\n const store = useSyncExternalStoreWithSelector<T, ObjectFromAttributes<T, Attributes>>(\n subscribe,\n getValue,\n getValue,\n (store) => getPartialObjectFromAttributes(selectors, store),\n (prev, curr) => isEqualFunction\n ? isEqualFunction(prev, curr)\n : JSON.stringify(prev) === JSON.stringify(curr),\n\n )\n\n return proxifyStore(store$$ as any, store)\n }\n\n return useSelector\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelector, createUseStore, proxifyStore } from '../helpers'\n\nimport type { WithoutType } from '../../types/shared'\nimport type { UseSelector } from '../helpers'\n\n\n\n// const STORE_SYMBOL = '__cervello-store__'\n\n\ninterface CervelloStoreUseParam<StoreType> {\n store: StoreType\n $onChange: (cb: (store: StoreType) => void) => void\n $onPartialChange: <\n Attributes extends Array< keyof WithoutType<StoreType, Function>>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n/**\n * Use function which allows you to listen for changes in the store.\n */\nexport type CervelloUseFunction<StoreType> = (param: CervelloStoreUseParam<StoreType>) => void\n\n\ninterface CervelloStore<StoreType> {\n store: StoreType\n useStore: () => StoreType\n useSelector: UseSelector<StoreType>\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreType>) => void>) => CervelloStore<StoreType>\n}\n\n/**\n * @note Currently not working\n */\nexport interface CervelloOptions {\n persist?:\n | boolean\n // | {\n // getItem: (key: string) => any\n // }\n}\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Object with the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T extends Record<any, unknown>> (initialValue: T, options?: CervelloOptions): CervelloStore<T>\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Function which returns the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T> (initialValue: () => T, options?: CervelloOptions): CervelloStore<T>\n\n\n\n\n\n\n\n/** @internal */\nexport function cervello <T> (initialValue: T | (() => T), options?: CervelloOptions): CervelloStore<T> {\n const defaultValue = (typeof initialValue === 'function' ? (initialValue as any)() : initialValue) as T\n const store$$ = new BehaviorSubject<T>(defaultValue)\n\n const proxiedStore = proxifyStore<T>(store$$, { ...defaultValue })\n\n const cervelloStore = {\n store: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelector: createUseSelector<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\n store: 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 (isEqual && typeof curr[selector] === 'object') {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (isEqual && prev[selector] !== curr[selector]) {\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<T>\n}\n"],"names":["Symbol","proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","_target$nestedAttrs","_extends2","currentStore","bind","Array","isArray","_extends","nestedAttrs","set","value","console","log","getValue","clonedStore","Object","assign","next","Reflect","subscribeForReactHook","onStoreChange","subscription","subscribe","unsubscribe","createUseStore","store","useSyncExternalStore","createUseSelector","selectors","isEqualFunction","useSyncExternalStoreWithSelector","getPartialObjectFromAttributes","attributes","reduce","acc","curr","prev","JSON","stringify","initialValue","options","defaultValue","proxiedStore","cervelloStore","useStore","useSelector","use","forEach","func","$onChange","cb","pipe","pairwise","switchMap","oldValue","newValue","of","NEVER","_","$onPartialChange","attrs","_ref2","distinctUntilChanged","isEqual","selector","this"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cervello.cjs","sources":["../src/lib/helpers/proxify-store.ts","../src/lib/utils/subscribe-for-react.ts","../src/lib/helpers/create-use-store.ts","../src/lib/helpers/create-use-selector.ts","../src/lib/store/index.ts"],"sourcesContent":["\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nconst NESTED_ATTRIBUTES_SYMBOL = '$$nested-attributes'\nconst nestedAttrs = Symbol(NESTED_ATTRIBUTES_SYMBOL)\n\nfunction assignNestedProperty (obj: any, keyPath: Array<string>, prop: string, value: unknown): any {\n keyPath.forEach((key) => { obj = obj[key] })\n obj[prop] = value\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 = target 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 proxied object for nested reactivity\n if (currentStore[prop]\n && typeof currentStore[prop] === 'object'\n && !Array.isArray(currentStore[prop])\n && typeof prop !== 'symbol') {\n const currentNestedAttrs = target?.[nestedAttrs]\n const nestedAttrsPrefix = currentNestedAttrs ? `${currentNestedAttrs as string}.` : ''\n return proxifyStore(\n store$$,\n Object.defineProperty({\n ...currentStore[prop],\n },\n nestedAttrs,\n {\n value: `${nestedAttrsPrefix}${prop}`,\n enumerable: false,\n writable: false,\n configurable: false,\n },\n ),\n )\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$$.getValue() as any\n const isNestedProp = Boolean(target[nestedAttrs]?.length)\n\n\n const clonedStore = Object.assign({}, currentStore)\n\n if (isNestedProp) {\n const nestedAttributes = (target[nestedAttrs] as string).split('.')\n assignNestedProperty(clonedStore, nestedAttributes, prop as string, value)\n } else {\n clonedStore[prop] = value\n }\n\n store$$.next(clonedStore)\n\n return Reflect.set(target, prop, value)\n },\n },\n )\n}\n","import type { BehaviorSubject } from 'rxjs'\n\n\n\nexport const subscribeForReactHook = <T>(store$$: BehaviorSubject<T>): typeof subscribe => {\n const subscribe = (onStoreChange: () => void): () => void => {\n const subscription = store$$.subscribe(onStoreChange)\n return () => {\n subscription.unsubscribe()\n }\n }\n return subscribe\n}\n","\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n\n // USE STORE HOOK -------------------------------------------------\n const useStore = (): T => {\n const store = useSyncExternalStore(subscribe, getValue, getValue)\n\n return proxifyStore(store$$, store)\n }\n\n\n return useStore\n}\n","\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector'\n\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes, WithoutType } 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\nexport type UseSelector<T> = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ) => ObjectFromAttributes<T, Attributes>\n\n\n\nexport function createUseSelector <T> (store$$: BehaviorSubject<T>): UseSelector<T> {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n // USE SELECTOR HOOK -------------------------------------------------\n const useSelector = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ): ObjectFromAttributes<T, Attributes> => {\n const store = useSyncExternalStoreWithSelector<T, ObjectFromAttributes<T, Attributes>>(\n subscribe,\n getValue,\n getValue,\n (store) => getPartialObjectFromAttributes(selectors, store),\n (prev, curr) => isEqualFunction\n ? isEqualFunction(prev, curr)\n : JSON.stringify(prev) === JSON.stringify(curr),\n\n )\n\n return proxifyStore(store$$ as any, store)\n }\n\n return useSelector\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelector, createUseStore, proxifyStore } from '../helpers'\n\nimport type { WithoutType } from '../../types/shared'\nimport type { UseSelector } from '../helpers'\n\n\n\n// const STORE_SYMBOL = '__cervello-store__'\n\n\ninterface CervelloStoreUseParam<StoreType> {\n onChange: (cb: (store: StoreType) => void) => void\n onPartialChange: <\n Attributes extends Array< keyof WithoutType<StoreType, Function>>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n/**\n * Use function which allows you to listen for changes in the store.\n */\nexport type CervelloUseFunction<StoreType> = (param: CervelloStoreUseParam<StoreType>) => void\n\n\ninterface CervelloStore<StoreType> {\n /** Reactive store */\n store: StoreType\n /** Hook to react to all changes done to 'store' */\n useStore: () => StoreType\n /** Hook to react to changes done to 'store' in all the attributes provided */\n useSelector: UseSelector<StoreType>\n /** Functions to be attached to changes in a general way (tracking, loggers, ... etc) */\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreType>) => void>) => CervelloStore<StoreType>\n}\n\n/**\n * @note Currently not working\n */\nexport interface CervelloOptions {\n persist?:\n | boolean\n // | {\n // getItem: (key: string) => any\n // }\n}\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Object with the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T extends Record<any, unknown>> (initialValue: T, options?: CervelloOptions): CervelloStore<T>\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Function which returns the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T> (initialValue: () => T, options?: CervelloOptions): CervelloStore<T>\n\n\n\n\n\n\n\n/** @internal */\nexport function cervello <T> (initialValue: T | (() => T), options?: CervelloOptions): CervelloStore<T> {\n const defaultValue = (typeof initialValue === 'function' ? (initialValue as any)() : initialValue) as T\n const store$$ = new BehaviorSubject<T>(defaultValue)\n\n const proxiedStore = proxifyStore<T>(store$$, { ...defaultValue })\n\n const cervelloStore = {\n store: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelector: createUseSelector<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\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 (isEqual && typeof curr[selector] === 'object') {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (isEqual && prev[selector] !== curr[selector]) {\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<T>\n}\n"],"names":["Symbol","proxifyStore","store$$","storeObject","Error","get","target","prop","currentStore","bind","Array","isArray","currentNestedAttrs","nestedAttrs","nestedAttrsPrefix","Object","defineProperty","_extends","value","enumerable","writable","configurable","set","_target$nestedAttrs","getValue","isNestedProp","Boolean","length","clonedStore","assign","obj","keyPath","forEach","key","assignNestedProperty","split","next","subscribeForReactHook","onStoreChange","subscription","subscribe","unsubscribe","createUseStore","store","useSyncExternalStore","createUseSelector","selectors","isEqualFunction","useSyncExternalStoreWithSelector","getPartialObjectFromAttributes","attributes","reduce","acc","curr","prev","JSON","stringify","initialValue","options","defaultValue","proxiedStore","cervelloStore","useStore","useSelector","use","slice","call","arguments","func","onChange","cb","pipe","pairwise","switchMap","oldValue","newValue","of","NEVER","_","onPartialChange","attrs","_ref2","distinctUntilChanged","isEqual","selector","this"],"mappings":"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"}
|
package/dist/cervello.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{BehaviorSubject as n,pairwise as
|
|
1
|
+
import{BehaviorSubject as n,pairwise as r,switchMap as t,of as e,NEVER as u,distinctUntilChanged as i}from"rxjs";import{useSyncExternalStore as o}from"use-sync-external-store/shim";import{useSyncExternalStoreWithSelector as c}from"use-sync-external-store/shim/with-selector";function f(){return f=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},f.apply(this,arguments)}var a=Symbol("$$nested-attributes");function s(n,r){if("object"!=typeof r)throw new Error("Store must be an object");return new Proxy(r,{get:function(r,t){var e=r;if(t in e){if("function"==typeof e[t])return e[t].bind(s(n,e));if(e[t]&&"object"==typeof e[t]&&!Array.isArray(e[t])&&"symbol"!=typeof t){var u=null==r?void 0:r[a],i=u?u+".":"";return s(n,Object.defineProperty(f({},e[t]),a,{value:""+i+t,enumerable:!1,writable:!1,configurable:!1}))}return e[t]}return Reflect.get(r,t)},set:function(r,t,e){var u,i=n.getValue(),o=Boolean(null==(u=r[a])?void 0:u.length),c=Object.assign({},i);return o?function(n,r,t,e){r.forEach(function(r){n=n[r]}),n[t]=e}(c,r[a].split("."),t,e):c[t]=e,n.next(c),Reflect.set(r,t,e)}})}var l=function(n){return function(r){var t=n.subscribe(r);return function(){t.unsubscribe()}}};function b(n){var r=l(n),t=n.getValue.bind(n);return function(){var e=o(r,t,t);return s(n,e)}}function p(n){var r=l(n),t=n.getValue.bind(n);return function(e,u){var i=c(r,t,t,function(n){return function(n,r){return n.reduce(function(n,t){return n[t]=r[t],n},{})}(e,n)},function(n,r){return u?u(n,r):JSON.stringify(n)===JSON.stringify(r)});return s(n,i)}}function y(o,c){var a="function"==typeof o?o():o,l=new n(a),y=s(l,f({},a)),v={store:y,useStore:b(l),useSelector:p(l),use:function(){return[].slice.call(arguments).forEach(function(n){n({onChange:function(n){l.pipe(r(),t(function(n){var r=n[1];return n[0]!==r?e(r):u})).subscribe(function(r){return n(y)})},onPartialChange:function(n,o){l.pipe(r(),t(function(n){var r=n[1];return n[0]!==r?e(r):u}),i(function(r,t){var e=!0;return n.forEach(function(n){e&&"object"==typeof t[n]?JSON.stringify(r[n])!==JSON.stringify(t[n])&&(e=!1):e&&r[n]!==t[n]&&(e=!1)}),e})).subscribe(function(n){return o(y)})}})}),this}};return v}export{y 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/utils/subscribe-for-react.ts","../src/lib/helpers/create-use-store.ts","../src/lib/helpers/create-use-selector.ts","../src/lib/store/index.ts"],"sourcesContent":["import type { BehaviorSubject } from 'rxjs'\n\n\n\nconst NESTED_ATTRIBUTES_SYMBOL = '___nested-attributes___'\nconst nestedAttrs = Symbol(NESTED_ATTRIBUTES_SYMBOL)\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 = target as any\n // console.log('get', { target, prop, in: prop in currentStore })\n\n // Problem with nested proxies because of currentStore is the root object\n if (prop in currentStore) {\n if (typeof currentStore[prop] === 'function') {\n return currentStore[prop].bind(proxifyStore(store$$, currentStore))\n }\n\n // console.log('------', prop, typeof currentStore[prop] === 'object', !Array.isArray(currentStore[prop]))\n // TODO: add pseudo identifier in order to return\n // TODO: the same object with a identifier of the level and the name of the property\n if (typeof currentStore[prop] === 'object' && !Array.isArray(currentStore[prop]) && typeof prop !== 'symbol') {\n // console.log('returning proxified object', prop)\n return proxifyStore(\n store$$,\n {\n ...currentStore[prop],\n [nestedAttrs]: `${(target?.[nestedAttrs]) ?? ''}${prop}`,\n })\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 // Write a merge deep nested objects function (as 'deepmerge lib')\n console.log('set', { target, prop, value })\n const currentStore = store$$.getValue() 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 type { BehaviorSubject } from 'rxjs'\n\n\n\nexport const subscribeForReactHook = <T>(store$$: BehaviorSubject<T>): typeof subscribe => {\n const subscribe = (onStoreChange: () => void): () => void => {\n const subscription = store$$.subscribe(onStoreChange)\n return () => {\n subscription.unsubscribe()\n }\n }\n return subscribe\n}\n","\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n\n // USE STORE HOOK -------------------------------------------------\n const useStore = (): T => {\n const store = useSyncExternalStore(subscribe, getValue, getValue)\n\n return proxifyStore(store$$, store)\n }\n\n\n return useStore\n}\n","\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector'\n\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes, WithoutType } 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\nexport type UseSelector<T> = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ) => ObjectFromAttributes<T, Attributes>\n\nexport function createUseSelector <T> (store$$: BehaviorSubject<T>): UseSelector<T> {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n // const subscribeWithSelectors = (selectors: Array<keyof T>): (onStoreChange: () => void) => () => void => {\n // return (onStoreChange: () => void): (() => void) => {\n // const subscription = store$$.subscribe(onStoreChange)\n // // console.log('1- FUNCTION OF SUBSCRIBE')\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 // // console.log('1- FUNCTION OF distinctUntilChanged', { isEqual })\n\n // // return isEqual\n // // })).subscribe(onStoreChange)\n\n // return () => {\n // subscription.unsubscribe()\n // }\n // }\n // }\n\n\n\n\n // USE SELECTOR HOOK -------------------------------------------------\n const useSelector = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ): ObjectFromAttributes<T, Attributes> => {\n const store = useSyncExternalStoreWithSelector<T, ObjectFromAttributes<T, Attributes>>(\n subscribe,\n getValue,\n getValue,\n (store) => getPartialObjectFromAttributes(selectors, store),\n (prev, curr) => isEqualFunction\n ? isEqualFunction(prev, curr)\n : JSON.stringify(prev) === JSON.stringify(curr),\n\n )\n\n return proxifyStore(store$$ as any, store)\n }\n\n return useSelector\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelector, createUseStore, proxifyStore } from '../helpers'\n\nimport type { WithoutType } from '../../types/shared'\nimport type { UseSelector } from '../helpers'\n\n\n\n// const STORE_SYMBOL = '__cervello-store__'\n\n\ninterface CervelloStoreUseParam<StoreType> {\n store: StoreType\n $onChange: (cb: (store: StoreType) => void) => void\n $onPartialChange: <\n Attributes extends Array< keyof WithoutType<StoreType, Function>>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n/**\n * Use function which allows you to listen for changes in the store.\n */\nexport type CervelloUseFunction<StoreType> = (param: CervelloStoreUseParam<StoreType>) => void\n\n\ninterface CervelloStore<StoreType> {\n store: StoreType\n useStore: () => StoreType\n useSelector: UseSelector<StoreType>\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreType>) => void>) => CervelloStore<StoreType>\n}\n\n/**\n * @note Currently not working\n */\nexport interface CervelloOptions {\n persist?:\n | boolean\n // | {\n // getItem: (key: string) => any\n // }\n}\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Object with the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T extends Record<any, unknown>> (initialValue: T, options?: CervelloOptions): CervelloStore<T>\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Function which returns the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T> (initialValue: () => T, options?: CervelloOptions): CervelloStore<T>\n\n\n\n\n\n\n\n/** @internal */\nexport function cervello <T> (initialValue: T | (() => T), options?: CervelloOptions): CervelloStore<T> {\n const defaultValue = (typeof initialValue === 'function' ? (initialValue as any)() : initialValue) as T\n const store$$ = new BehaviorSubject<T>(defaultValue)\n\n const proxiedStore = proxifyStore<T>(store$$, { ...defaultValue })\n\n const cervelloStore = {\n store: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelector: createUseSelector<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\n store: 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 (isEqual && typeof curr[selector] === 'object') {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (isEqual && prev[selector] !== curr[selector]) {\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<T>\n}\n"],"names":["Symbol","proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","_target$nestedAttrs","_extends2","currentStore","bind","Array","isArray","_extends","nestedAttrs","set","value","console","log","getValue","clonedStore","Object","assign","next","Reflect","subscribeForReactHook","onStoreChange","subscription","subscribe","unsubscribe","createUseStore","store","useSyncExternalStore","createUseSelector","selectors","isEqualFunction","useSyncExternalStoreWithSelector","getPartialObjectFromAttributes","attributes","reduce","acc","curr","prev","JSON","stringify","cervello","initialValue","options","defaultValue","proxiedStore","cervelloStore","useStore","useSelector","use","forEach","func","$onChange","cb","pipe","pairwise","switchMap","oldValue","newValue","of","NEVER","_","$onPartialChange","attrs","_ref2","distinctUntilChanged","isEqual","selector","this"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cervello.esm.js","sources":["../src/lib/helpers/proxify-store.ts","../src/lib/utils/subscribe-for-react.ts","../src/lib/helpers/create-use-store.ts","../src/lib/helpers/create-use-selector.ts","../src/lib/store/index.ts"],"sourcesContent":["\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nconst NESTED_ATTRIBUTES_SYMBOL = '$$nested-attributes'\nconst nestedAttrs = Symbol(NESTED_ATTRIBUTES_SYMBOL)\n\nfunction assignNestedProperty (obj: any, keyPath: Array<string>, prop: string, value: unknown): any {\n keyPath.forEach((key) => { obj = obj[key] })\n obj[prop] = value\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 = target 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 proxied object for nested reactivity\n if (currentStore[prop]\n && typeof currentStore[prop] === 'object'\n && !Array.isArray(currentStore[prop])\n && typeof prop !== 'symbol') {\n const currentNestedAttrs = target?.[nestedAttrs]\n const nestedAttrsPrefix = currentNestedAttrs ? `${currentNestedAttrs as string}.` : ''\n return proxifyStore(\n store$$,\n Object.defineProperty({\n ...currentStore[prop],\n },\n nestedAttrs,\n {\n value: `${nestedAttrsPrefix}${prop}`,\n enumerable: false,\n writable: false,\n configurable: false,\n },\n ),\n )\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$$.getValue() as any\n const isNestedProp = Boolean(target[nestedAttrs]?.length)\n\n\n const clonedStore = Object.assign({}, currentStore)\n\n if (isNestedProp) {\n const nestedAttributes = (target[nestedAttrs] as string).split('.')\n assignNestedProperty(clonedStore, nestedAttributes, prop as string, value)\n } else {\n clonedStore[prop] = value\n }\n\n store$$.next(clonedStore)\n\n return Reflect.set(target, prop, value)\n },\n },\n )\n}\n","import type { BehaviorSubject } from 'rxjs'\n\n\n\nexport const subscribeForReactHook = <T>(store$$: BehaviorSubject<T>): typeof subscribe => {\n const subscribe = (onStoreChange: () => void): () => void => {\n const subscription = store$$.subscribe(onStoreChange)\n return () => {\n subscription.unsubscribe()\n }\n }\n return subscribe\n}\n","\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n\n // USE STORE HOOK -------------------------------------------------\n const useStore = (): T => {\n const store = useSyncExternalStore(subscribe, getValue, getValue)\n\n return proxifyStore(store$$, store)\n }\n\n\n return useStore\n}\n","\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector'\n\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes, WithoutType } 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\nexport type UseSelector<T> = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ) => ObjectFromAttributes<T, Attributes>\n\n\n\nexport function createUseSelector <T> (store$$: BehaviorSubject<T>): UseSelector<T> {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n // USE SELECTOR HOOK -------------------------------------------------\n const useSelector = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ): ObjectFromAttributes<T, Attributes> => {\n const store = useSyncExternalStoreWithSelector<T, ObjectFromAttributes<T, Attributes>>(\n subscribe,\n getValue,\n getValue,\n (store) => getPartialObjectFromAttributes(selectors, store),\n (prev, curr) => isEqualFunction\n ? isEqualFunction(prev, curr)\n : JSON.stringify(prev) === JSON.stringify(curr),\n\n )\n\n return proxifyStore(store$$ as any, store)\n }\n\n return useSelector\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelector, createUseStore, proxifyStore } from '../helpers'\n\nimport type { WithoutType } from '../../types/shared'\nimport type { UseSelector } from '../helpers'\n\n\n\n// const STORE_SYMBOL = '__cervello-store__'\n\n\ninterface CervelloStoreUseParam<StoreType> {\n onChange: (cb: (store: StoreType) => void) => void\n onPartialChange: <\n Attributes extends Array< keyof WithoutType<StoreType, Function>>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n/**\n * Use function which allows you to listen for changes in the store.\n */\nexport type CervelloUseFunction<StoreType> = (param: CervelloStoreUseParam<StoreType>) => void\n\n\ninterface CervelloStore<StoreType> {\n /** Reactive store */\n store: StoreType\n /** Hook to react to all changes done to 'store' */\n useStore: () => StoreType\n /** Hook to react to changes done to 'store' in all the attributes provided */\n useSelector: UseSelector<StoreType>\n /** Functions to be attached to changes in a general way (tracking, loggers, ... etc) */\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreType>) => void>) => CervelloStore<StoreType>\n}\n\n/**\n * @note Currently not working\n */\nexport interface CervelloOptions {\n persist?:\n | boolean\n // | {\n // getItem: (key: string) => any\n // }\n}\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Object with the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T extends Record<any, unknown>> (initialValue: T, options?: CervelloOptions): CervelloStore<T>\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Function which returns the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T> (initialValue: () => T, options?: CervelloOptions): CervelloStore<T>\n\n\n\n\n\n\n\n/** @internal */\nexport function cervello <T> (initialValue: T | (() => T), options?: CervelloOptions): CervelloStore<T> {\n const defaultValue = (typeof initialValue === 'function' ? (initialValue as any)() : initialValue) as T\n const store$$ = new BehaviorSubject<T>(defaultValue)\n\n const proxiedStore = proxifyStore<T>(store$$, { ...defaultValue })\n\n const cervelloStore = {\n store: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelector: createUseSelector<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\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 (isEqual && typeof curr[selector] === 'object') {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (isEqual && prev[selector] !== curr[selector]) {\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<T>\n}\n"],"names":["Symbol","proxifyStore","store$$","storeObject","Error","get","target","prop","currentStore","bind","Array","isArray","currentNestedAttrs","nestedAttrs","nestedAttrsPrefix","Object","defineProperty","_extends","value","enumerable","writable","configurable","set","_target$nestedAttrs","getValue","isNestedProp","Boolean","length","clonedStore","assign","obj","keyPath","forEach","key","assignNestedProperty","split","next","subscribeForReactHook","onStoreChange","subscription","subscribe","unsubscribe","createUseStore","store","useSyncExternalStore","createUseSelector","selectors","isEqualFunction","useSyncExternalStoreWithSelector","getPartialObjectFromAttributes","attributes","reduce","acc","curr","prev","JSON","stringify","cervello","initialValue","options","defaultValue","proxiedStore","cervelloStore","useStore","useSelector","use","slice","call","arguments","func","onChange","cb","pipe","pairwise","switchMap","oldValue","newValue","of","NEVER","_","onPartialChange","attrs","_ref2","distinctUntilChanged","isEqual","selector","this"],"mappings":"ufAKA,MACoBA,OADa,uBAQjB,SAAAC,EAAuDC,EAA6BC,GAClG,GAA2B,iBAAhBA,EAA0B,MAAM,IAAAC,MAAU,2BAErD,OAAO,UACLD,EACA,CACEE,IAAK,SAAUC,EAAWC,GACxB,IAAkBC,EAAGF,EAErB,GAAIC,OAAsB,CACxB,GAAkC,qBAAVA,GACtB,OAAOC,EAAaD,GAAME,KAAKR,EAAaC,EAASM,IAIvD,GAAIA,EAAaD,IACkB,mBAAVA,KACnBG,MAAMC,QAAQH,EAAaD,KACZ,iBAAhBA,EAA0B,CAC7B,IAAMK,EAAkB,MAAGN,OAAH,EAAGA,EAASO,GACbC,EAAGF,EAAwBA,EAAkC,IAAA,GACpF,OAAOX,EACLC,EACAa,OAAOC,eAAPC,EAAA,GACKT,EAAaD,IAElBM,EACA,CACEK,MAAK,GAAKJ,EAAoBP,EAC9BY,YAAY,EACZC,UAAU,EACVC,cAAc,IAInB,CAED,OAAOb,EAAaD,EACrB,CAED,eAAeF,IAAIC,EAAQC,EAC5B,EACDe,IAAK,SAAUhB,EAAWC,EAAuBW,GAAU,IAAAK,EACvCf,EAAGN,EAAQsB,WACXC,EAAGC,QAAQ,OAAApB,EAAAA,EAAOO,SAAP,EAAAU,EAAqBI,QAG5CC,EAAcb,OAAOc,OAAO,GAAIrB,GAWtC,OATIiB,EAtDZ,SAA+BK,EAAUC,EAAwBxB,EAAcW,GAC7Ea,EAAQC,QAAQ,SAACC,GAAUH,EAAMA,EAAIG,EAAM,GAC3CH,EAAIvB,GAAQW,CACb,CAqDSgB,CAAqBN,EADKtB,EAAOO,GAAwBsB,MAAM,KACX5B,EAAgBW,GAEpEU,EAAYrB,GAAQW,EAGtBhB,EAAQkC,KAAKR,WAEEN,IAAIhB,EAAQC,EAAMW,EAClC,GAGN,KCvEiCmB,EAAG,SAAInC,GAOvC,OANkB,SAACoC,GACjB,IAAMC,EAAerC,EAAQsC,UAAUF,GACvC,OAAY,WACVC,EAAaE,aACd,CACF,CAEF,ECFK,SAAAC,EAA8BxC,GAClC,MAAkBmC,EAAsBnC,GAC1BsB,EAAGtB,EAAQsB,SAASf,KAAKP,GAWvC,OAPiB,WACf,IAAMyC,EAAQC,EAAqBJ,EAAWhB,EAAUA,GAExD,OAAOvB,EAAaC,EAASyC,EAC9B,CAIF,UCEKE,EAAiC3C,GACrC,IAAMsC,EAAYH,EAAsBnC,KACvBA,EAAQsB,SAASf,KAAKP,GAqBvC,OAlBoB,SAClB4C,EACAC,GAEA,IAAMJ,EAAQK,EACZR,EACAhB,EACAA,EACA,SAACmB,GAAD,OA3BUM,SAAoCC,EAA4BP,GAC9E,OAAiBO,EAACC,OAAY,SAACC,EAAKC,GAElC,OADAD,EAAIC,GAAQV,EAAMU,GAEnBD,CAAA,EAAE,CAAA,EACJ,CAsB8CH,CAACH,EAAWH,EAArD,EACA,SAACW,EAAMD,GAASN,OAAAA,EACZA,EAAgBO,EAAMD,GACtBE,KAAKC,UAAUF,KAAUC,KAAKC,UAAUH,EAF5C,GAMF,OAAOpD,EAAaC,EAAgByC,EACrC,CAGF,CCsBe,SAAAc,EAAcC,EAA6BC,GACzD,IAAMC,EAAwC,mBAAxBF,EAAsCA,IAAyBA,EAC/ExD,EAAU,MAAuB0D,GAEjCC,EAAe5D,EAAgBC,EAAJe,EAAA,CAAA,EAAkB2C,IAEhCE,EAAG,CACpBnB,MAAOkB,EAGPE,SAAUrB,EAAkBxC,GAC5B8D,YAAanB,EAAqB3C,GAGlC+D,IARoB,WAwClB,MA/BA,GAAAC,MAAAC,KAAAC,WAAapC,QAAQ,SAACqC,GACpBA,EAAK,CACHC,SADG,SACOC,GACRrE,EAAQsE,KACNC,IACAC,EAAU,SAAEC,GAAAA,IAAUC,EAAeD,EAAAA,GAAAA,OAAfC,EAAAA,KAA4BA,EAAWC,EAAGD,GAAYE,CAAlE,IACVtC,UAAU,SAACuC,UAAQR,EAACV,EAAV,EACb,EACDmB,gBAAiBC,SAAAA,EAAuBV,GACtCrE,EAAQsE,KACNC,IACAC,EAAU,SAAAQ,GAAA,IAAYN,EAAZM,EAAA,GAAA,OAAAA,EAAA,KAAwCN,EAAWC,EAAGD,GAAYE,CAAlE,GACVK,EAAqB,SAAC7B,EAAMD,GAC1B,IAAI+B,GAAU,EAYd,OAXAH,EAAMjD,QAAQ,SAACqD,GACTD,GAAqC,mBAAdC,GACrB9B,KAAKC,UAAUF,EAAK+B,MAAe9B,KAAKC,UAAUH,EAAKgC,MACzDD,GAAU,GAGRA,GAAW9B,EAAK+B,KAAchC,EAAKgC,KACrCD,GAAU,EAGf,GAEFA,CAAA,IACD5C,UAAU,SAACuC,GAAD,OAASR,EAACV,EAAV,EACb,GAEJ,GAEFyB,IAAA,GAKH,OACDxB,CAAA"}
|
package/dist/cervello.modern.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{BehaviorSubject as t,pairwise as e,switchMap as n,of as r,NEVER as o,distinctUntilChanged as
|
|
1
|
+
import{BehaviorSubject as t,pairwise as e,switchMap as n,of as r,NEVER as o,distinctUntilChanged as i}from"rxjs";import{useSyncExternalStore as s}from"use-sync-external-store/shim";import{useSyncExternalStoreWithSelector as u}from"use-sync-external-store/shim/with-selector";function c(){return c=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},c.apply(this,arguments)}const f=Symbol("$$nested-attributes");function a(t,e){if("object"!=typeof e)throw new Error("Store must be an object");return new Proxy(e,{get:function(e,n){const r=e;if(n in r){if("function"==typeof r[n])return r[n].bind(a(t,r));if(r[n]&&"object"==typeof r[n]&&!Array.isArray(r[n])&&"symbol"!=typeof n){const o=null==e?void 0:e[f],i=o?`${o}.`:"";return a(t,Object.defineProperty(c({},r[n]),f,{value:`${i}${n}`,enumerable:!1,writable:!1,configurable:!1}))}return r[n]}return Reflect.get(e,n)},set:function(e,n,r){var o;const i=t.getValue(),s=Boolean(null==(o=e[f])?void 0:o.length),u=Object.assign({},i);return s?function(t,e,n,r){e.forEach(e=>{t=t[e]}),t[n]=r}(u,e[f].split("."),n,r):u[n]=r,t.next(u),Reflect.set(e,n,r)}})}const b=t=>e=>{const n=t.subscribe(e);return()=>{n.unsubscribe()}};function l(t){const e=b(t),n=t.getValue.bind(t);return()=>{const r=s(e,n,n);return a(t,r)}}function p(t){const e=b(t),n=t.getValue.bind(t);return(r,o)=>{const i=u(e,n,n,t=>function(t,e){return t.reduce((t,n)=>(t[n]=e[n],t),{})}(r,t),(t,e)=>o?o(t,e):JSON.stringify(t)===JSON.stringify(e));return a(t,i)}}function y(s,u){const f="function"==typeof s?s():s,b=new t(f),y=a(b,c({},f));return{store:y,useStore:l(b),useSelector:p(b),use(...t){return t.forEach(t=>{t({onChange(t){b.pipe(e(),n(([t,e])=>t!==e?r(e):o)).subscribe(e=>t(y))},onPartialChange(t,s){b.pipe(e(),n(([t,e])=>t!==e?r(e):o),i((e,n)=>{let r=!0;return t.forEach(t=>{r&&"object"==typeof n[t]?JSON.stringify(e[t])!==JSON.stringify(n[t])&&(r=!1):r&&e[t]!==n[t]&&(r=!1)}),r})).subscribe(t=>s(y))}})}),this}}}export{y 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/utils/subscribe-for-react.ts","../src/lib/helpers/create-use-store.ts","../src/lib/helpers/create-use-selector.ts","../src/lib/store/index.ts"],"sourcesContent":["import type { BehaviorSubject } from 'rxjs'\n\n\n\nconst NESTED_ATTRIBUTES_SYMBOL = '___nested-attributes___'\nconst nestedAttrs = Symbol(NESTED_ATTRIBUTES_SYMBOL)\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 = target as any\n // console.log('get', { target, prop, in: prop in currentStore })\n\n // Problem with nested proxies because of currentStore is the root object\n if (prop in currentStore) {\n if (typeof currentStore[prop] === 'function') {\n return currentStore[prop].bind(proxifyStore(store$$, currentStore))\n }\n\n // console.log('------', prop, typeof currentStore[prop] === 'object', !Array.isArray(currentStore[prop]))\n // TODO: add pseudo identifier in order to return\n // TODO: the same object with a identifier of the level and the name of the property\n if (typeof currentStore[prop] === 'object' && !Array.isArray(currentStore[prop]) && typeof prop !== 'symbol') {\n // console.log('returning proxified object', prop)\n return proxifyStore(\n store$$,\n {\n ...currentStore[prop],\n [nestedAttrs]: `${(target?.[nestedAttrs]) ?? ''}${prop}`,\n })\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 // Write a merge deep nested objects function (as 'deepmerge lib')\n console.log('set', { target, prop, value })\n const currentStore = store$$.getValue() 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 type { BehaviorSubject } from 'rxjs'\n\n\n\nexport const subscribeForReactHook = <T>(store$$: BehaviorSubject<T>): typeof subscribe => {\n const subscribe = (onStoreChange: () => void): () => void => {\n const subscription = store$$.subscribe(onStoreChange)\n return () => {\n subscription.unsubscribe()\n }\n }\n return subscribe\n}\n","\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n\n // USE STORE HOOK -------------------------------------------------\n const useStore = (): T => {\n const store = useSyncExternalStore(subscribe, getValue, getValue)\n\n return proxifyStore(store$$, store)\n }\n\n\n return useStore\n}\n","\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector'\n\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes, WithoutType } 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\nexport type UseSelector<T> = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ) => ObjectFromAttributes<T, Attributes>\n\nexport function createUseSelector <T> (store$$: BehaviorSubject<T>): UseSelector<T> {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n // const subscribeWithSelectors = (selectors: Array<keyof T>): (onStoreChange: () => void) => () => void => {\n // return (onStoreChange: () => void): (() => void) => {\n // const subscription = store$$.subscribe(onStoreChange)\n // // console.log('1- FUNCTION OF SUBSCRIBE')\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 // // console.log('1- FUNCTION OF distinctUntilChanged', { isEqual })\n\n // // return isEqual\n // // })).subscribe(onStoreChange)\n\n // return () => {\n // subscription.unsubscribe()\n // }\n // }\n // }\n\n\n\n\n // USE SELECTOR HOOK -------------------------------------------------\n const useSelector = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ): ObjectFromAttributes<T, Attributes> => {\n const store = useSyncExternalStoreWithSelector<T, ObjectFromAttributes<T, Attributes>>(\n subscribe,\n getValue,\n getValue,\n (store) => getPartialObjectFromAttributes(selectors, store),\n (prev, curr) => isEqualFunction\n ? isEqualFunction(prev, curr)\n : JSON.stringify(prev) === JSON.stringify(curr),\n\n )\n\n return proxifyStore(store$$ as any, store)\n }\n\n return useSelector\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelector, createUseStore, proxifyStore } from '../helpers'\n\nimport type { WithoutType } from '../../types/shared'\nimport type { UseSelector } from '../helpers'\n\n\n\n// const STORE_SYMBOL = '__cervello-store__'\n\n\ninterface CervelloStoreUseParam<StoreType> {\n store: StoreType\n $onChange: (cb: (store: StoreType) => void) => void\n $onPartialChange: <\n Attributes extends Array< keyof WithoutType<StoreType, Function>>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n/**\n * Use function which allows you to listen for changes in the store.\n */\nexport type CervelloUseFunction<StoreType> = (param: CervelloStoreUseParam<StoreType>) => void\n\n\ninterface CervelloStore<StoreType> {\n store: StoreType\n useStore: () => StoreType\n useSelector: UseSelector<StoreType>\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreType>) => void>) => CervelloStore<StoreType>\n}\n\n/**\n * @note Currently not working\n */\nexport interface CervelloOptions {\n persist?:\n | boolean\n // | {\n // getItem: (key: string) => any\n // }\n}\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Object with the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T extends Record<any, unknown>> (initialValue: T, options?: CervelloOptions): CervelloStore<T>\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Function which returns the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T> (initialValue: () => T, options?: CervelloOptions): CervelloStore<T>\n\n\n\n\n\n\n\n/** @internal */\nexport function cervello <T> (initialValue: T | (() => T), options?: CervelloOptions): CervelloStore<T> {\n const defaultValue = (typeof initialValue === 'function' ? (initialValue as any)() : initialValue) as T\n const store$$ = new BehaviorSubject<T>(defaultValue)\n\n const proxiedStore = proxifyStore<T>(store$$, { ...defaultValue })\n\n const cervelloStore = {\n store: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelector: createUseSelector<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\n store: 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 (isEqual && typeof curr[selector] === 'object') {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (isEqual && prev[selector] !== curr[selector]) {\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<T>\n}\n"],"names":["Symbol","proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","currentStore","_target$nestedAttrs","bind","Array","isArray","nestedAttrs","Reflect","set","value","console","log","getValue","clonedStore","Object","assign","next","subscribeForReactHook","onStoreChange","subscription","subscribe","unsubscribe","createUseStore","store","useSyncExternalStore","createUseSelector","selectors","isEqualFunction","useSyncExternalStoreWithSelector","attributes","reduce","acc","curr","getPartialObjectFromAttributes","prev","JSON","stringify","cervello","initialValue","options","defaultValue","proxiedStore","_extends","useStore","useSelector","use","functionList","forEach","func","$onChange","cb","pipe","pairwise","switchMap","oldValue","newValue","of","NEVER","_","$onPartialChange","attrs","distinctUntilChanged","isEqual","selector","this"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cervello.modern.js","sources":["../src/lib/helpers/proxify-store.ts","../src/lib/utils/subscribe-for-react.ts","../src/lib/helpers/create-use-store.ts","../src/lib/helpers/create-use-selector.ts","../src/lib/store/index.ts"],"sourcesContent":["\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nconst NESTED_ATTRIBUTES_SYMBOL = '$$nested-attributes'\nconst nestedAttrs = Symbol(NESTED_ATTRIBUTES_SYMBOL)\n\nfunction assignNestedProperty (obj: any, keyPath: Array<string>, prop: string, value: unknown): any {\n keyPath.forEach((key) => { obj = obj[key] })\n obj[prop] = value\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 = target 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 proxied object for nested reactivity\n if (currentStore[prop]\n && typeof currentStore[prop] === 'object'\n && !Array.isArray(currentStore[prop])\n && typeof prop !== 'symbol') {\n const currentNestedAttrs = target?.[nestedAttrs]\n const nestedAttrsPrefix = currentNestedAttrs ? `${currentNestedAttrs as string}.` : ''\n return proxifyStore(\n store$$,\n Object.defineProperty({\n ...currentStore[prop],\n },\n nestedAttrs,\n {\n value: `${nestedAttrsPrefix}${prop}`,\n enumerable: false,\n writable: false,\n configurable: false,\n },\n ),\n )\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$$.getValue() as any\n const isNestedProp = Boolean(target[nestedAttrs]?.length)\n\n\n const clonedStore = Object.assign({}, currentStore)\n\n if (isNestedProp) {\n const nestedAttributes = (target[nestedAttrs] as string).split('.')\n assignNestedProperty(clonedStore, nestedAttributes, prop as string, value)\n } else {\n clonedStore[prop] = value\n }\n\n store$$.next(clonedStore)\n\n return Reflect.set(target, prop, value)\n },\n },\n )\n}\n","import type { BehaviorSubject } from 'rxjs'\n\n\n\nexport const subscribeForReactHook = <T>(store$$: BehaviorSubject<T>): typeof subscribe => {\n const subscribe = (onStoreChange: () => void): () => void => {\n const subscription = store$$.subscribe(onStoreChange)\n return () => {\n subscription.unsubscribe()\n }\n }\n return subscribe\n}\n","\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n\n // USE STORE HOOK -------------------------------------------------\n const useStore = (): T => {\n const store = useSyncExternalStore(subscribe, getValue, getValue)\n\n return proxifyStore(store$$, store)\n }\n\n\n return useStore\n}\n","\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector'\n\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes, WithoutType } 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\nexport type UseSelector<T> = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ) => ObjectFromAttributes<T, Attributes>\n\n\n\nexport function createUseSelector <T> (store$$: BehaviorSubject<T>): UseSelector<T> {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n // USE SELECTOR HOOK -------------------------------------------------\n const useSelector = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ): ObjectFromAttributes<T, Attributes> => {\n const store = useSyncExternalStoreWithSelector<T, ObjectFromAttributes<T, Attributes>>(\n subscribe,\n getValue,\n getValue,\n (store) => getPartialObjectFromAttributes(selectors, store),\n (prev, curr) => isEqualFunction\n ? isEqualFunction(prev, curr)\n : JSON.stringify(prev) === JSON.stringify(curr),\n\n )\n\n return proxifyStore(store$$ as any, store)\n }\n\n return useSelector\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelector, createUseStore, proxifyStore } from '../helpers'\n\nimport type { WithoutType } from '../../types/shared'\nimport type { UseSelector } from '../helpers'\n\n\n\n// const STORE_SYMBOL = '__cervello-store__'\n\n\ninterface CervelloStoreUseParam<StoreType> {\n onChange: (cb: (store: StoreType) => void) => void\n onPartialChange: <\n Attributes extends Array< keyof WithoutType<StoreType, Function>>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n/**\n * Use function which allows you to listen for changes in the store.\n */\nexport type CervelloUseFunction<StoreType> = (param: CervelloStoreUseParam<StoreType>) => void\n\n\ninterface CervelloStore<StoreType> {\n /** Reactive store */\n store: StoreType\n /** Hook to react to all changes done to 'store' */\n useStore: () => StoreType\n /** Hook to react to changes done to 'store' in all the attributes provided */\n useSelector: UseSelector<StoreType>\n /** Functions to be attached to changes in a general way (tracking, loggers, ... etc) */\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreType>) => void>) => CervelloStore<StoreType>\n}\n\n/**\n * @note Currently not working\n */\nexport interface CervelloOptions {\n persist?:\n | boolean\n // | {\n // getItem: (key: string) => any\n // }\n}\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Object with the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T extends Record<any, unknown>> (initialValue: T, options?: CervelloOptions): CervelloStore<T>\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Function which returns the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T> (initialValue: () => T, options?: CervelloOptions): CervelloStore<T>\n\n\n\n\n\n\n\n/** @internal */\nexport function cervello <T> (initialValue: T | (() => T), options?: CervelloOptions): CervelloStore<T> {\n const defaultValue = (typeof initialValue === 'function' ? (initialValue as any)() : initialValue) as T\n const store$$ = new BehaviorSubject<T>(defaultValue)\n\n const proxiedStore = proxifyStore<T>(store$$, { ...defaultValue })\n\n const cervelloStore = {\n store: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelector: createUseSelector<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\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 (isEqual && typeof curr[selector] === 'object') {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (isEqual && prev[selector] !== curr[selector]) {\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<T>\n}\n"],"names":["Symbol","proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","currentStore","bind","Array","isArray","currentNestedAttrs","nestedAttrs","nestedAttrsPrefix","Object","defineProperty","_extends","value","enumerable","writable","configurable","Reflect","set","getValue","isNestedProp","Boolean","_target$nestedAttrs","length","assign","obj","keyPath","forEach","key","assignNestedProperty","clonedStore","split","next","subscribeForReactHook","onStoreChange","subscription","subscribe","unsubscribe","createUseStore","store","useSyncExternalStore","createUseSelector","selectors","isEqualFunction","useSyncExternalStoreWithSelector","attributes","reduce","acc","curr","getPartialObjectFromAttributes","prev","JSON","stringify","cervello","initialValue","options","defaultValue","proxiedStore","useStore","useSelector","use","functionList","func","onChange","cb","pipe","pairwise","switchMap","oldValue","newValue","of","NEVER","_","onPartialChange","attrs","distinctUntilChanged","isEqual","selector","this"],"mappings":"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"}
|
package/dist/cervello.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,
|
|
1
|
+
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("rxjs"),require("use-sync-external-store/shim"),require("use-sync-external-store/shim/with-selector")):"function"==typeof define&&define.amd?define(["exports","rxjs","use-sync-external-store/shim","use-sync-external-store/shim/with-selector"],n):n((e||self).react={},e.rxjs,e.shim,e.withSelector)}(this,function(e,n,t,r){function i(){return i=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},i.apply(this,arguments)}var o=Symbol("$$nested-attributes");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=n;if(t in r){if("function"==typeof r[t])return r[t].bind(u(e,r));if(r[t]&&"object"==typeof r[t]&&!Array.isArray(r[t])&&"symbol"!=typeof t){var c=null==n?void 0:n[o],s=c?c+".":"";return u(e,Object.defineProperty(i({},r[t]),o,{value:""+s+t,enumerable:!1,writable:!1,configurable:!1}))}return r[t]}return Reflect.get(n,t)},set:function(n,t,r){var i,u=e.getValue(),c=Boolean(null==(i=n[o])?void 0:i.length),s=Object.assign({},u);return c?function(e,n,t,r){n.forEach(function(n){e=e[n]}),e[t]=r}(s,n[o].split("."),t,r):s[t]=r,e.next(s),Reflect.set(n,t,r)}})}var c=function(e){return function(n){var t=e.subscribe(n);return function(){t.unsubscribe()}}};function s(e){var n=c(e),r=e.getValue.bind(e);return function(){var i=t.useSyncExternalStore(n,r,r);return u(e,i)}}function f(e){var n=c(e),t=e.getValue.bind(e);return function(i,o){var c=r.useSyncExternalStoreWithSelector(n,t,t,function(e){return function(e,n){return e.reduce(function(e,t){return e[t]=n[t],e},{})}(i,e)},function(e,n){return o?o(e,n):JSON.stringify(e)===JSON.stringify(n)});return u(e,c)}}e.cervello=function(e,t){var r="function"==typeof e?e():e,o=new n.BehaviorSubject(r),c=u(o,i({},r)),a={store:c,useStore:s(o),useSelector:f(o),use:function(){return[].slice.call(arguments).forEach(function(e){e({onChange:function(e){o.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(c)})},onPartialChange:function(e,t){o.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){r&&"object"==typeof t[e]?JSON.stringify(n[e])!==JSON.stringify(t[e])&&(r=!1):r&&n[e]!==t[e]&&(r=!1)}),r})).subscribe(function(e){return t(c)})}})}),this}};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/utils/subscribe-for-react.ts","../src/lib/helpers/create-use-store.ts","../src/lib/helpers/create-use-selector.ts","../src/lib/store/index.ts"],"sourcesContent":["import type { BehaviorSubject } from 'rxjs'\n\n\n\nconst NESTED_ATTRIBUTES_SYMBOL = '___nested-attributes___'\nconst nestedAttrs = Symbol(NESTED_ATTRIBUTES_SYMBOL)\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 = target as any\n // console.log('get', { target, prop, in: prop in currentStore })\n\n // Problem with nested proxies because of currentStore is the root object\n if (prop in currentStore) {\n if (typeof currentStore[prop] === 'function') {\n return currentStore[prop].bind(proxifyStore(store$$, currentStore))\n }\n\n // console.log('------', prop, typeof currentStore[prop] === 'object', !Array.isArray(currentStore[prop]))\n // TODO: add pseudo identifier in order to return\n // TODO: the same object with a identifier of the level and the name of the property\n if (typeof currentStore[prop] === 'object' && !Array.isArray(currentStore[prop]) && typeof prop !== 'symbol') {\n // console.log('returning proxified object', prop)\n return proxifyStore(\n store$$,\n {\n ...currentStore[prop],\n [nestedAttrs]: `${(target?.[nestedAttrs]) ?? ''}${prop}`,\n })\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 // Write a merge deep nested objects function (as 'deepmerge lib')\n console.log('set', { target, prop, value })\n const currentStore = store$$.getValue() 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 type { BehaviorSubject } from 'rxjs'\n\n\n\nexport const subscribeForReactHook = <T>(store$$: BehaviorSubject<T>): typeof subscribe => {\n const subscribe = (onStoreChange: () => void): () => void => {\n const subscription = store$$.subscribe(onStoreChange)\n return () => {\n subscription.unsubscribe()\n }\n }\n return subscribe\n}\n","\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n\n // USE STORE HOOK -------------------------------------------------\n const useStore = (): T => {\n const store = useSyncExternalStore(subscribe, getValue, getValue)\n\n return proxifyStore(store$$, store)\n }\n\n\n return useStore\n}\n","\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector'\n\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes, WithoutType } 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\nexport type UseSelector<T> = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ) => ObjectFromAttributes<T, Attributes>\n\nexport function createUseSelector <T> (store$$: BehaviorSubject<T>): UseSelector<T> {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n // const subscribeWithSelectors = (selectors: Array<keyof T>): (onStoreChange: () => void) => () => void => {\n // return (onStoreChange: () => void): (() => void) => {\n // const subscription = store$$.subscribe(onStoreChange)\n // // console.log('1- FUNCTION OF SUBSCRIBE')\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 // // console.log('1- FUNCTION OF distinctUntilChanged', { isEqual })\n\n // // return isEqual\n // // })).subscribe(onStoreChange)\n\n // return () => {\n // subscription.unsubscribe()\n // }\n // }\n // }\n\n\n\n\n // USE SELECTOR HOOK -------------------------------------------------\n const useSelector = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ): ObjectFromAttributes<T, Attributes> => {\n const store = useSyncExternalStoreWithSelector<T, ObjectFromAttributes<T, Attributes>>(\n subscribe,\n getValue,\n getValue,\n (store) => getPartialObjectFromAttributes(selectors, store),\n (prev, curr) => isEqualFunction\n ? isEqualFunction(prev, curr)\n : JSON.stringify(prev) === JSON.stringify(curr),\n\n )\n\n return proxifyStore(store$$ as any, store)\n }\n\n return useSelector\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelector, createUseStore, proxifyStore } from '../helpers'\n\nimport type { WithoutType } from '../../types/shared'\nimport type { UseSelector } from '../helpers'\n\n\n\n// const STORE_SYMBOL = '__cervello-store__'\n\n\ninterface CervelloStoreUseParam<StoreType> {\n store: StoreType\n $onChange: (cb: (store: StoreType) => void) => void\n $onPartialChange: <\n Attributes extends Array< keyof WithoutType<StoreType, Function>>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n/**\n * Use function which allows you to listen for changes in the store.\n */\nexport type CervelloUseFunction<StoreType> = (param: CervelloStoreUseParam<StoreType>) => void\n\n\ninterface CervelloStore<StoreType> {\n store: StoreType\n useStore: () => StoreType\n useSelector: UseSelector<StoreType>\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreType>) => void>) => CervelloStore<StoreType>\n}\n\n/**\n * @note Currently not working\n */\nexport interface CervelloOptions {\n persist?:\n | boolean\n // | {\n // getItem: (key: string) => any\n // }\n}\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Object with the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T extends Record<any, unknown>> (initialValue: T, options?: CervelloOptions): CervelloStore<T>\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Function which returns the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T> (initialValue: () => T, options?: CervelloOptions): CervelloStore<T>\n\n\n\n\n\n\n\n/** @internal */\nexport function cervello <T> (initialValue: T | (() => T), options?: CervelloOptions): CervelloStore<T> {\n const defaultValue = (typeof initialValue === 'function' ? (initialValue as any)() : initialValue) as T\n const store$$ = new BehaviorSubject<T>(defaultValue)\n\n const proxiedStore = proxifyStore<T>(store$$, { ...defaultValue })\n\n const cervelloStore = {\n store: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelector: createUseSelector<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\n store: 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 (isEqual && typeof curr[selector] === 'object') {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (isEqual && prev[selector] !== curr[selector]) {\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<T>\n}\n"],"names":["Symbol","proxifyStore","store$$","storeObject","Error","Proxy","get","target","prop","_target$nestedAttrs","_extends2","currentStore","bind","Array","isArray","_extends","nestedAttrs","set","value","console","log","getValue","clonedStore","Object","assign","next","Reflect","subscribeForReactHook","onStoreChange","subscription","subscribe","unsubscribe","createUseStore","store","useSyncExternalStore","createUseSelector","selectors","isEqualFunction","useSyncExternalStoreWithSelector","getPartialObjectFromAttributes","attributes","reduce","acc","curr","prev","JSON","stringify","initialValue","options","defaultValue","proxiedStore","cervelloStore","useStore","useSelector","use","forEach","func","$onChange","cb","pipe","pairwise","switchMap","oldValue","newValue","of","NEVER","_","$onPartialChange","attrs","_ref2","distinctUntilChanged","isEqual","selector","this"],"mappings":"uqBAIA,MACoBA,OADa,2BAGjBC,SAAAA,EAAuDC,EAA6BC,GAClG,GAA2B,iBAAvBA,EAAiC,MAAUC,IAAAA,MAAM,2BAErD,OAAWC,IAAAA,MACTF,EACA,CACEG,IAAK,SAAUC,EAAWC,GACxB,IAYgHC,EAAAC,EAZ9FC,EAAGJ,EAIrB,OAAIC,KAAJG,EACoC,mBAAvBA,EAAaH,GACHG,EAACH,GAAMI,KAAKX,EAAaC,EAASS,IAMrB,iBAAXA,EAACH,IAAuBK,MAAMC,QAAQH,EAAaH,KAA0B,iBAATA,EAUxEG,EAACH,GARXP,EACLC,EADiBa,EAAA,CAAA,EAGZJ,EAAaH,WACfQ,GAJc,IAAA,OAAAP,EAAA,MAIIF,OAJJ,EAIIA,EAASS,IAJbP,EAI8B,IAAKD,EAJnCE,aAWRJ,IAAIC,EAAQC,EAC5B,EACDS,IAAK,SAAUV,EAAWC,EAAuBU,GAE/CC,QAAQC,IAAI,MAAO,CAAEb,OAAAA,EAAQC,KAAAA,EAAMU,MAAAA,IACnC,IAAkBP,EAAGT,EAAQmB,WAEvBC,EAAcC,OAAOC,OAAO,CAAd,EAAkBb,GAKtC,OAJAW,EAAYd,GAAQU,EAEpBhB,EAAQuB,KAAKH,GAECI,QAACT,IAAIV,EAAQC,EAAMU,EAClC,GAGN,KCnDiCS,EAAG,SAAIzB,GAOvC,OANkB,SAAC0B,GACjB,IAAMC,EAAe3B,EAAQ4B,UAAUF,GACvC,OAAY,WACVC,EAAaE,aACd,CACF,CAEF,ECFK,SAAAC,EAA8B9B,GAClC,MAAkByB,EAAsBzB,GAC1BmB,EAAGnB,EAAQmB,SAAST,KAAKV,GAWvC,OAPiB,WACf,IAAM+B,EAAQC,EAAoBA,qBAACJ,EAAWT,EAAUA,GAExD,OAAOpB,EAAaC,EAAS+B,EAC9B,CAIF,UCAKE,EAAiCjC,GACrC,IAAM4B,EAAYH,EAAsBzB,KACvBA,EAAQmB,SAAST,KAAKV,GAoDvC,OAlBoB,SAClBkC,EACAC,GAEA,IAAMJ,EAAQK,EAAgCA,iCAC5CR,EACAT,EACAA,EACA,SAACY,GAAD,OAxDUM,SAAoCC,EAA4BP,GAC9E,OAAiBO,EAACC,OAAY,SAACC,EAAKC,GAElC,OADAD,EAAIC,GAAQV,EAAMU,GAEnBD,CAAA,EAAE,CAAA,EACJ,CAmD8CH,CAACH,EAAWH,EAArD,EACA,SAACW,EAAMD,GAASN,OAAAA,EACZA,EAAgBO,EAAMD,GACtBE,KAAKC,UAAUF,KAAUC,KAAKC,UAAUH,EAF5C,GAMF,OAAO1C,EAAaC,EAAgB+B,EACrC,CAGF,YCVe,SAAcc,EAA6BC,GACzD,IAAMC,EAAwC,mBAAxBF,EAAsCA,IAAyBA,EAC/E7C,EAAU,sBAAuB+C,GAEjCC,EAAejD,EAAgBC,EAAJa,EAAA,CAAA,EAAkBkC,IAE7CE,EAAgB,CACpBlB,MAAOiB,EAGPE,SAAUpB,EAAkB9B,GAC5BmD,YAAalB,EAAqBjC,GAGlCoD,IAAyB,WAiCvB,MAhCA,GAAaC,MAAAA,KAAAA,WAAAA,QAAQ,SAACC,GACpBA,EAAK,CACHvB,MAAOiB,EACPO,UAFG,SAEQC,GACTxD,EAAQyD,KACNC,EAAAA,WACAC,EAAAA,UAAU,SAAEC,GAAAA,IAAUC,EAAeD,EAAAA,GAAAA,OAAfC,EAAAA,KAA4BA,EAAWC,EAAAA,GAAGD,GAAYE,EAAlEA,KAAA,IACVnC,UAAU,SAACoC,GAAD,OAASR,EAACR,EAAV,EACb,EACDiB,iBAAkBC,SAAAA,EAAuBV,GACvCxD,EAAQyD,KACNC,EAAAA,WACAC,EAAAA,UAAU,SAAAQ,GAAA,IAAYN,EAAZM,EAAA,GAAA,OAAAA,EAAA,KAAwCN,EAAWC,EAAAA,GAAGD,GAAYE,EAAAA,KAAlE,GACVK,EAAoBA,qBAAC,SAAC1B,EAAMD,GAC1B,IAAW4B,GAAG,EAYd,OAXAH,EAAMb,QAAQ,SAACiB,GACTD,GAAqC,iBAAf5B,EAAC6B,GACrB3B,KAAKC,UAAUF,EAAK4B,MAAe3B,KAAKC,UAAUH,EAAK6B,MACzDD,GAAU,GAGRA,GAAW3B,EAAK4B,KAAc7B,EAAK6B,KACrCD,GAAU,EAGf,GAEFA,CAAA,IACDzC,UAAU,SAACoC,GAAD,OAASR,EAACR,EAAV,EACb,GAEJ,GAEFuB,IAAA,GAKH,OACDtB,CAAA"}
|
|
1
|
+
{"version":3,"file":"cervello.umd.js","sources":["../src/lib/helpers/proxify-store.ts","../src/lib/utils/subscribe-for-react.ts","../src/lib/helpers/create-use-store.ts","../src/lib/helpers/create-use-selector.ts","../src/lib/store/index.ts"],"sourcesContent":["\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nconst NESTED_ATTRIBUTES_SYMBOL = '$$nested-attributes'\nconst nestedAttrs = Symbol(NESTED_ATTRIBUTES_SYMBOL)\n\nfunction assignNestedProperty (obj: any, keyPath: Array<string>, prop: string, value: unknown): any {\n keyPath.forEach((key) => { obj = obj[key] })\n obj[prop] = value\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 = target 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 proxied object for nested reactivity\n if (currentStore[prop]\n && typeof currentStore[prop] === 'object'\n && !Array.isArray(currentStore[prop])\n && typeof prop !== 'symbol') {\n const currentNestedAttrs = target?.[nestedAttrs]\n const nestedAttrsPrefix = currentNestedAttrs ? `${currentNestedAttrs as string}.` : ''\n return proxifyStore(\n store$$,\n Object.defineProperty({\n ...currentStore[prop],\n },\n nestedAttrs,\n {\n value: `${nestedAttrsPrefix}${prop}`,\n enumerable: false,\n writable: false,\n configurable: false,\n },\n ),\n )\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$$.getValue() as any\n const isNestedProp = Boolean(target[nestedAttrs]?.length)\n\n\n const clonedStore = Object.assign({}, currentStore)\n\n if (isNestedProp) {\n const nestedAttributes = (target[nestedAttrs] as string).split('.')\n assignNestedProperty(clonedStore, nestedAttributes, prop as string, value)\n } else {\n clonedStore[prop] = value\n }\n\n store$$.next(clonedStore)\n\n return Reflect.set(target, prop, value)\n },\n },\n )\n}\n","import type { BehaviorSubject } from 'rxjs'\n\n\n\nexport const subscribeForReactHook = <T>(store$$: BehaviorSubject<T>): typeof subscribe => {\n const subscribe = (onStoreChange: () => void): () => void => {\n const subscription = store$$.subscribe(onStoreChange)\n return () => {\n subscription.unsubscribe()\n }\n }\n return subscribe\n}\n","\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { BehaviorSubject } from 'rxjs'\n\n\n\nexport function createUseStore <T> (store$$: BehaviorSubject<T>): () => T {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n\n // USE STORE HOOK -------------------------------------------------\n const useStore = (): T => {\n const store = useSyncExternalStore(subscribe, getValue, getValue)\n\n return proxifyStore(store$$, store)\n }\n\n\n return useStore\n}\n","\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector'\n\n\nimport { subscribeForReactHook } from '../utils/subscribe-for-react'\nimport { proxifyStore } from './proxify-store'\n\nimport type { ObjectFromAttributes, WithoutType } 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\nexport type UseSelector<T> = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ) => ObjectFromAttributes<T, Attributes>\n\n\n\nexport function createUseSelector <T> (store$$: BehaviorSubject<T>): UseSelector<T> {\n const subscribe = subscribeForReactHook(store$$)\n const getValue = store$$.getValue.bind(store$$)\n\n // USE SELECTOR HOOK -------------------------------------------------\n const useSelector = <Attributes extends Array< keyof WithoutType<T, Function> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n ): ObjectFromAttributes<T, Attributes> => {\n const store = useSyncExternalStoreWithSelector<T, ObjectFromAttributes<T, Attributes>>(\n subscribe,\n getValue,\n getValue,\n (store) => getPartialObjectFromAttributes(selectors, store),\n (prev, curr) => isEqualFunction\n ? isEqualFunction(prev, curr)\n : JSON.stringify(prev) === JSON.stringify(curr),\n\n )\n\n return proxifyStore(store$$ as any, store)\n }\n\n return useSelector\n}\n","import { BehaviorSubject, distinctUntilChanged, NEVER, of, pairwise, switchMap } from 'rxjs'\n\nimport { createUseSelector, createUseStore, proxifyStore } from '../helpers'\n\nimport type { WithoutType } from '../../types/shared'\nimport type { UseSelector } from '../helpers'\n\n\n\n// const STORE_SYMBOL = '__cervello-store__'\n\n\ninterface CervelloStoreUseParam<StoreType> {\n onChange: (cb: (store: StoreType) => void) => void\n onPartialChange: <\n Attributes extends Array< keyof WithoutType<StoreType, Function>>\n > (selectors: Attributes, cb: (store: StoreType) => void) => void\n}\n\n/**\n * Use function which allows you to listen for changes in the store.\n */\nexport type CervelloUseFunction<StoreType> = (param: CervelloStoreUseParam<StoreType>) => void\n\n\ninterface CervelloStore<StoreType> {\n /** Reactive store */\n store: StoreType\n /** Hook to react to all changes done to 'store' */\n useStore: () => StoreType\n /** Hook to react to changes done to 'store' in all the attributes provided */\n useSelector: UseSelector<StoreType>\n /** Functions to be attached to changes in a general way (tracking, loggers, ... etc) */\n use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreType>) => void>) => CervelloStore<StoreType>\n}\n\n/**\n * @note Currently not working\n */\nexport interface CervelloOptions {\n persist?:\n | boolean\n // | {\n // getItem: (key: string) => any\n // }\n}\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Object with the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T extends Record<any, unknown>> (initialValue: T, options?: CervelloOptions): CervelloStore<T>\n\n\n/**\n * Creates a store that is reactive and can be used inside and outside of React components.\n * @param initialValue Function which returns the default values for the store\n *\n * @returns - { store, useStore, useSelector }\n */\nexport function cervello <T> (initialValue: () => T, options?: CervelloOptions): CervelloStore<T>\n\n\n\n\n\n\n\n/** @internal */\nexport function cervello <T> (initialValue: T | (() => T), options?: CervelloOptions): CervelloStore<T> {\n const defaultValue = (typeof initialValue === 'function' ? (initialValue as any)() : initialValue) as T\n const store$$ = new BehaviorSubject<T>(defaultValue)\n\n const proxiedStore = proxifyStore<T>(store$$, { ...defaultValue })\n\n const cervelloStore = {\n store: proxiedStore,\n\n // TO BE SEPARATED IN cervello/react package ---------------------\n useStore: createUseStore<T>(store$$),\n useSelector: createUseSelector<T>(store$$),\n // ---------------------------------------------------------------\n\n use (...functionList: any) {\n functionList.forEach((func: any) => {\n func({\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 (isEqual && typeof curr[selector] === 'object') {\n if (JSON.stringify(prev[selector]) !== JSON.stringify(curr[selector])) {\n isEqual = false\n }\n } else {\n if (isEqual && prev[selector] !== curr[selector]) {\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<T>\n}\n"],"names":["Symbol","proxifyStore","store$$","storeObject","Error","get","target","prop","currentStore","bind","Array","isArray","currentNestedAttrs","nestedAttrs","nestedAttrsPrefix","Object","defineProperty","_extends","value","enumerable","writable","configurable","set","_target$nestedAttrs","getValue","isNestedProp","Boolean","length","clonedStore","assign","obj","keyPath","forEach","key","assignNestedProperty","split","next","subscribeForReactHook","onStoreChange","subscription","subscribe","unsubscribe","createUseStore","store","useSyncExternalStore","createUseSelector","selectors","isEqualFunction","useSyncExternalStoreWithSelector","getPartialObjectFromAttributes","attributes","reduce","acc","curr","prev","JSON","stringify","initialValue","options","defaultValue","proxiedStore","cervelloStore","useStore","useSelector","use","slice","call","arguments","func","onChange","cb","pipe","pairwise","switchMap","oldValue","newValue","of","NEVER","_","onPartialChange","attrs","_ref2","distinctUntilChanged","isEqual","selector","this"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cervello/react",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Simplest and truly reactive state manager for React",
|
|
3
|
+
"version": "0.10.0",
|
|
4
|
+
"description": "🤯 Simplest and truly reactive state manager for React",
|
|
5
5
|
"main": "./dist/cervello.cjs",
|
|
6
6
|
"module": "./dist/cervello.esm.js",
|
|
7
7
|
"unpkg": "./dist/cervello.umd.js",
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import type { WithoutType } from '../../types/shared';
|
|
2
2
|
import type { UseSelector } from '../helpers';
|
|
3
3
|
interface CervelloStoreUseParam<StoreType> {
|
|
4
|
-
store: StoreType;
|
|
5
|
-
|
|
6
|
-
$onPartialChange: <Attributes extends Array<keyof WithoutType<StoreType, Function>>>(selectors: Attributes, cb: (store: StoreType) => void) => void;
|
|
4
|
+
onChange: (cb: (store: StoreType) => void) => void;
|
|
5
|
+
onPartialChange: <Attributes extends Array<keyof WithoutType<StoreType, Function>>>(selectors: Attributes, cb: (store: StoreType) => void) => void;
|
|
7
6
|
}
|
|
8
7
|
/**
|
|
9
8
|
* Use function which allows you to listen for changes in the store.
|
|
10
9
|
*/
|
|
11
10
|
export declare type CervelloUseFunction<StoreType> = (param: CervelloStoreUseParam<StoreType>) => void;
|
|
12
11
|
interface CervelloStore<StoreType> {
|
|
12
|
+
/** Reactive store */
|
|
13
13
|
store: StoreType;
|
|
14
|
+
/** Hook to react to all changes done to 'store' */
|
|
14
15
|
useStore: () => StoreType;
|
|
16
|
+
/** Hook to react to changes done to 'store' in all the attributes provided */
|
|
15
17
|
useSelector: UseSelector<StoreType>;
|
|
18
|
+
/** Functions to be attached to changes in a general way (tracking, loggers, ... etc) */
|
|
16
19
|
use: (...functions: Array<(useObj: CervelloStoreUseParam<StoreType>) => void>) => CervelloStore<StoreType>;
|
|
17
20
|
}
|
|
18
21
|
/**
|