@cervello/react 5.4.0-beta.1 → 5.4.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cervello.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=require("react"),n=Symbol("nonReactiveObject");function t(){return t=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},t.apply(this,arguments)}function r(e){if(!e||"object"!=typeof e)return e;var n={};return Array.isArray(e)?n=e.map(function(e){return r(e)}):function(e){if(!u(e))return!1;if(o(e))return!0;var n=Object.keys(e);return n.includes("tag")&&n.includes("containerInfo")||n.some(function(e){return e.startsWith("__reactContainer")})||n.includes("tag")&&n.includes("stateNode")}(e)?n=e:(Object.entries(e).forEach(function(e){n[e[0]]=r(e[1])}),Object.getOwnPropertySymbols(e).forEach(function(t){n[t]=e[t]})),n}var u=function(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)},o=function(e){return!!u(e)&&!!e.$$typeof};function i(e){return u(e)&&!o(e)&&!e[n]}"hasOwn"in Object||(Object.hasOwn=Object.call.bind(Object.hasOwnProperty));var l=Symbol("value");function a(e,n,u){var o,s;void 0===u&&(u={});var h=null!=(o=u.nestedFieldPath)?o:"root",p=((s={})[l]=n,s),v="root"===h?Object.fromEntries(Object.entries(n).filter(function(e){return"function"==typeof e[1]})):{};return new Proxy(p,{get:function(n,t,o){if("_$fieldPath"===t)return h;var c=Object.hasOwn(n,l)?n[l]:n;if("toJSON"===t)return function(){return f(c)};if("$value"===t)return r(c);var s=Reflect.get(c,t,o);if("symbol"==typeof t)return s;if("function"==typeof s)return s.bind(o);if(i(s)&&s!==c){var p;if(s._$fieldPath)return s;var v=a(e,s,{nestedFieldPath:h+"."+t,parentObjectToProxify:null!=(p=u.parentObjectToProxify)?p:c,afterChange:u.afterChange});return c[t]=v}return s},set:function(n,r,o,a){var f,s;if("symbol"==typeof r)return!0;var p=o,b=Object.hasOwn(n,l);if(b&&"$$value"===r){var y=n[l];return n[l]=p.newValue,e.next({storeValue:p.newValue,change:{fieldPath:"root",newValue:p.newValue,previousValue:y}},p.id),!0}if(b&&"$value"===r){var d=n[l];return p===d||c(p)===c(d)||("root"!==h?n[l]=p:(n[l]=t({},v,p),e.next({storeValue:n[l],change:{fieldPath:"root",newValue:p,previousValue:d}}))),!0}var g=b?n[l]:n,O=Reflect.get(g,r,a);if(O===p)return!0;i(p)&&null!=O&&O._$fieldPath?O.$value=p:Reflect.set(g,r,p,g);var j={storeValue:null!=(f=null==(s=u)?void 0:s.parentObjectToProxify)?f:g,change:{fieldPath:(h+"."+r).replace("root.",""),newValue:p,previousValue:O}};return e.next(j),null==u.afterChange||u.afterChange([j]),!0},has:function(e,n){return Reflect.has(e[l],n)},ownKeys:function(e){return Reflect.ownKeys(e[l])},getOwnPropertyDescriptor:function(e,n){return Reflect.getOwnPropertyDescriptor(e[l],n)}})}function c(e){return JSON.stringify(e,function(e,n){return Array.isArray(n)?n.map(function(e){return c(e)}):o(n)?{props:c(n.props),type:"string"==typeof n.type?n.type:""}:null!=globalThis&&globalThis.HTMLElement&&n instanceof globalThis.HTMLElement?{type:"[HTMLElement]",content:n.innerHTML}:n})}function f(e){var n={};return"object"!=typeof e||null==e?e:Array.isArray(e)?e.map(function(e){return f(e)}):o(e)?{props:f(e.props),type:"string"==typeof e.type?e.type:""}:null!=globalThis&&globalThis.HTMLElement&&e instanceof globalThis.HTMLElement?{type:"[HTMLElement]",content:e.innerHTML}:(Object.entries(e).forEach(function(e){n[e[0]]=f(e[1])}),n)}exports.cervello=function(n,t){var u,o,i,l=(null!=t?t:{}).afterChange,c=(u=!1,o=[],i=[],{next:function(e,n){o.push({newValue:e,subscriberId:n}),u||(u=!0,Promise.resolve().then(function(){i.forEach(function(e){var n=o.filter(function(n){return n.subscriberId!==e.id});n.length&&e.next(n.map(function(e){return e.newValue}))}),o=[],u=!1}))},subscribe:function(e){return i.push(e),{unsubscribe:function(){i=i.filter(function(n){return n!==e})}}}}),f=r(n),s=a(c,f,{afterChange:l});return{store:s,reset:function(){s.$value=r(n)},useStore:function(n){var t,r=e.useId(),u=null==n||null==n.initialValue?void 0:n.initialValue(s.$value),o=e.useRef(!1),i=e.useState(0)[1];!o.current&&u&&u!==s&&(o.current=!0,s.$$value={id:r,newValue:u});var l=e.useRef(null!=(t="function"==typeof(null==n?void 0:n.select)?null==n||null==n.select?void 0:n.select():null==n?void 0:n.select)?t:[]),a=e.useRef(l.current.filter(function(e){return e.includes(".*")}).map(function(e){return e.replace(".*","")})),f=function(){i(function(e){return e+1})};return e.useEffect(function(){null!=n&&n.setValueOnMount&&n.setValueOnMount(s.$value).then(function(e){s.$value=e}).catch(function(e){console.error("Error setting initial value on mount",e)})},[]),e.useEffect(function(){var e=c.subscribe({id:r,next:function(e){var t=Array.isArray(e)?e:[e];if(null==n||!n.select)return f(),void(null==n||null==n.onChange||n.onChange(t));t.some(function(e){return"root"===e.change.fieldPath||l.current.includes(e.change.fieldPath)||a.current.find(function(n){return e.change.fieldPath.startsWith(n)})})&&(f(),null==n||null==n.onChange||n.onChange(t))}});return function(){e.unsubscribe()}},[null==n?void 0:n.select,null==n?void 0:n.onChange]),s}}},exports.nonReactive=function(e){return Object.defineProperty(e,n,{value:!0,enumerable:!1,writable:!1,configurable:!1}),e};
1
+ var e=require("react"),n=Symbol("nonReactiveObject");function t(){return t=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},t.apply(this,arguments)}function r(e){if(!e||"object"!=typeof e)return e;var n={};return Array.isArray(e)?n=e.map(function(e){return r(e)}):function(e){if(!u(e))return!1;if(i(e))return!0;var n=Object.keys(e);return n.includes("tag")&&n.includes("containerInfo")||n.some(function(e){return e.startsWith("__reactContainer")})||n.includes("tag")&&n.includes("stateNode")}(e)?n=e:(Object.entries(e).forEach(function(e){n[e[0]]=r(e[1])}),Object.getOwnPropertySymbols(e).forEach(function(t){n[t]=e[t]})),n}var u=function(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)},i=function(e){return!!u(e)&&!!e.$$typeof};function o(e){return u(e)&&!i(e)&&!e[n]}"hasOwn"in Object||(Object.hasOwn=Object.call.bind(Object.hasOwnProperty));var a=Symbol("value");function l(e,n,u){var i,f;void 0===u&&(u={});var s=null!=(i=u.nestedFieldPath)?i:"root",v=((f={})[a]=n,f),h="root"===s?Object.fromEntries(Object.entries(n).filter(function(e){return"function"==typeof e[1]})):{};return new Proxy(v,{get:function(n,t,i){if("_$fieldPath"===t)return s;var f=Object.hasOwn(n,a)?n[a]:n;if("toJSON"===t)return function(){return c(f)};if("$value"===t)return r(f);var v=Reflect.get(f,t,i);if("symbol"==typeof t)return v;if("function"==typeof v)return v.bind(i);if(o(v)&&v!==f){var h;if(v._$fieldPath)return v;var b=l(e,v,{nestedFieldPath:s+"."+t,parentObjectToProxify:null!=(h=u.parentObjectToProxify)?h:f,afterChange:u.afterChange});return f[t]=b}return v},set:function(n,r,i,l){var f,v;if("symbol"==typeof r)return!0;var b=i,p=Object.hasOwn(n,a);if(p&&"$$value"===r){var y=n[a];return n[a]=b.newValue,e.next({storeValue:b.newValue,change:{fieldPath:"root",newValue:b.newValue,previousValue:y}},b.id),!0}if(p&&"$value"===r){var d=n[a];return b===d||JSON.stringify(c(b))===JSON.stringify(c(d))||("root"!==s?n[a]=b:(n[a]=t({},h,b),e.next({storeValue:n[a],change:{fieldPath:"root",newValue:b,previousValue:d}}))),!0}var g=p?n[a]:n,O=Reflect.get(g,r,l);if(O===b)return!0;o(b)&&null!=O&&O._$fieldPath?O.$value=b:Reflect.set(g,r,b,g);var j={storeValue:null!=(f=null==(v=u)?void 0:v.parentObjectToProxify)?f:g,change:{fieldPath:(s+"."+r).replace("root.",""),newValue:b,previousValue:O}};return e.next(j),null==u.afterChange||u.afterChange([j]),!0},has:function(e,n){return Reflect.has(e[a],n)},ownKeys:function(e){return Reflect.ownKeys(e[a])},getOwnPropertyDescriptor:function(e,n){return Reflect.getOwnPropertyDescriptor(e[a],n)}})}function c(e){var n={};return"object"!=typeof e||null==e?e:Array.isArray(e)?e.map(function(e){return c(e)}):i(e)?{props:c(e.props),type:"string"==typeof e.type?e.type:""}:null!=globalThis&&globalThis.HTMLElement&&e instanceof globalThis.HTMLElement?{type:"[HTMLElement]",content:e.innerHTML}:(Object.entries(e).forEach(function(e){n[e[0]]=c(e[1])}),n)}exports.cervello=function(n,t){var u,i,o,a=(null!=t?t:{}).afterChange,c=r(n),f=(u=!1,i=[],o=[],{next:function(e,n){i.push({newValue:e,subscriberId:n}),u||(u=!0,Promise.resolve().then(function(){o.forEach(function(e){var n=i.filter(function(n){return n.subscriberId!==e.id});n.length&&e.next(n.map(function(e){return e.newValue}))}),i=[],u=!1}))},subscribe:function(e){return o.push(e),{unsubscribe:function(){o=o.filter(function(n){return n!==e})}}}}),s=l(f,c,{afterChange:a});return{store:s,reset:function(){s.$value=r(n)},useStore:function(n){var t,r=e.useId(),u=null==n||null==n.initialValue?void 0:n.initialValue(s.$value),i=e.useRef(!1),o=e.useState(0)[1];!i.current&&u&&u!==s&&(i.current=!0,s.$$value={id:r,newValue:u});var a=e.useRef(null!=(t="function"==typeof(null==n?void 0:n.select)?null==n||null==n.select?void 0:n.select():null==n?void 0:n.select)?t:[]),l=e.useRef(a.current.filter(function(e){return e.includes(".*")}).map(function(e){return e.replace(".*","")})),c=function(){o(function(e){return e+1})};return e.useEffect(function(){null!=n&&n.setValueOnMount&&n.setValueOnMount(s.$value).then(function(e){s.$value=e}).catch(function(e){console.error("Error setting initial value on mount",e)})},[]),e.useEffect(function(){var e=f.subscribe({id:r,next:function(e){var t=Array.isArray(e)?e:[e];if(null==n||!n.select)return c(),void(null==n||null==n.onChange||n.onChange(t));t.some(function(e){return"root"===e.change.fieldPath||a.current.includes(e.change.fieldPath)||l.current.find(function(n){return e.change.fieldPath.startsWith(n)})})&&(c(),null==n||null==n.onChange||n.onChange(t))}});return function(){e.unsubscribe()}},[null==n?void 0:n.select,null==n?void 0:n.onChange]),s}}},exports.nonReactive=function(e){return Object.defineProperty(e,n,{value:!0,enumerable:!1,writable:!1,configurable:!1}),e};
2
2
  //# sourceMappingURL=cervello.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cervello.cjs","sources":["../src/types/shared.ts","../src/lib/utils/object.ts","../src/lib/helpers/new-proxify-store.ts","../src/lib/store/new-index.ts","../src/lib/utils/subject.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\nexport type WithoutType<T, V, WithNever = {\n [K in keyof T]: Exclude<T[K], undefined> extends V\n ? never\n : (T[K] extends Record<string, unknown>\n ? WithoutType<T[K], V>\n : T[K])\n}> = Pick<WithNever, {\n [K in keyof WithNever]: WithNever[K] extends never ? never : K\n}[keyof WithNever]>\n\n\n\nexport type ObjectFromAttributes<T, Attributes extends Array< keyof WithoutType<T, Function> > > = {\n [k in Attributes[number]]: T[k]\n}\n\nexport type Maybe<T> = T | undefined\n\n\n\nexport type UseSelector<T> = <Attributes extends Array< Exclude<keyof WithoutType<T, Function>, '$value'> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n) => T\n\nexport type FieldPath<T extends Record<string, any>> = {\n [K in keyof Required<T>]: T[K] extends Record<string, any>\n ? K extends string\n\n ? T[K] extends Function\n ? never\n : T[K] extends Array<any>\n ? K\n : `${K}.*` | `${K}.${FieldPath<T[K]>}`\n : never\n : K extends string\n ? K\n : never\n}[keyof T]\n\nexport const nonReactiveObjectSymbol = Symbol('nonReactiveObject')\nexport type StoreChange<T extends Record<string, any>> = {\n change: {\n fieldPath: FieldPath<T>\n newValue: any\n previousValue: any\n }\n storeValue: T\n}\n// fromInit?: boolean\n","/* eslint-disable no-cond-assign */\n\nimport { nonReactiveObjectSymbol } from '../../types/shared'\nimport { INTERNAL_VALUE_PROP } from '../helpers/constants'\n\n\n/**\n * Clones all the provided object and nested properties and it also\n * iterates nested arrays to deepClone them\n *\n * @param obj - base object to be cloned\n * @returns new cloned object with new reference\n */\nexport function deepClone <T> (obj: T): T {\n if (!obj || typeof obj !== 'object')\n return obj\n\n let newObj = {} as any\n\n if (Array.isArray(obj)) {\n newObj = obj.map(item => deepClone(item))\n } else if (!isReactObjectLikeNode(obj)) {\n Object.entries(obj).forEach(([key, value]) => {\n newObj[key] = deepClone(value)\n })\n Object.getOwnPropertySymbols(obj).forEach((symbol) => {\n newObj[symbol] = (obj as any)[symbol]\n })\n } else {\n newObj = obj\n }\n\n return newObj as T\n}\n\n// function copyBuffer (cur: ArrayBufferView) {\n// if (cur instanceof Buffer)\n// return Buffer.from(cur)\n//\n//\n// return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)\n// }\n\n\n// INFO: From `rfdc` (really-fast-deep-clone) package for faster cloning taking care of circular references\nexport function deepClone2 <T> (obj: T): T {\n const refs: Array<any> = []\n const refsNew: Array<any> = []\n\n const constructorHandlers = new Map()\n\n constructorHandlers.set(Date, (o: string | number | Date) => new Date(o))\n constructorHandlers.set(Map, (o: Iterable<unknown> | ArrayLike<unknown>, fn: any) => new Map(cloneArray(Array.from(o), fn)))\n constructorHandlers.set(Set, (o: Iterable<unknown> | ArrayLike<unknown>, fn: any) => new Set(cloneArray(Array.from(o), fn)))\n\n let handler = null\n\n return clone(obj)\n\n function cloneArray (a: any, fn: any): any {\n const keys = Object.keys(a)\n const a2 = new Array(keys.length) as any\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i]\n const cur = a[k]\n\n if (typeof cur !== 'object' || cur === null) {\n a2[k] = cur\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n a2[k] = handler(cur, fn)\n // } else if (ArrayBuffer.isView(cur)) {\n // a2[k] = copyBuffer(cur)\n } else {\n const index = refs.indexOf(cur)\n\n if (index !== -1)\n a2[k] = refsNew[index]\n else\n a2[k] = fn(cur)\n }\n }\n\n return a2\n }\n\n function clone (o: any): any {\n if (typeof o !== 'object' || o === null) return o\n if (Array.isArray(o)) return cloneArray(o, clone)\n if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor)))\n return handler(o, clone)\n\n const o2 = {} as any\n\n refs.push(o)\n refsNew.push(o2)\n\n\n Object.getOwnPropertySymbols(o).forEach((symbol) => {\n o2[symbol] = (o)[symbol]\n })\n\n for (const k in o) {\n if (!Object.hasOwnProperty.call(o, k)) continue\n const cur = o[k]\n\n\n if (typeof cur !== 'object' || cur === null) {\n o2[k] = cur\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n o2[k] = handler(cur, clone)\n // } else if (ArrayBuffer.isView(cur)) {\n // o2[k] = copyBuffer(cur)\n } else {\n const i = refs.indexOf(cur)\n\n if (i !== -1)\n o2[k] = refsNew[i]\n else\n o2[k] = clone(cur)\n }\n }\n refs.pop()\n refsNew.pop()\n\n\n return o2\n }\n}\n\n/**\n * Guard to check is variable is an object\n * @param obj - variable to be checked\n * @returns boolean\n */\nexport const isObject = (obj: unknown): obj is Record<string | symbol, unknown> => (\n obj !== null\n && typeof obj === 'object'\n && !Array.isArray(obj)\n)\n\n\nexport const isReactElement = (obj: unknown): boolean => {\n if (!isObject(obj)) return false\n\n return !!(obj.$$typeof)\n}\n\n\nexport function isReactObjectLikeNode (obj: unknown): boolean {\n if (!isObject(obj)) return false\n if (isReactElement(obj)) return true\n\n const objKeys = Object.keys(obj)\n const isReactObjNode = (objKeys.includes('tag') && objKeys.includes('containerInfo'))\n || objKeys.some(k => k.startsWith('__reactContainer'))\n || (objKeys.includes('tag') && objKeys.includes('stateNode'))\n\n return isReactObjNode\n}\n\n\nexport function isValidReactiveObject <T extends Record<string, any>> (value: T): boolean {\n return isObject(value) && !isReactElement(value) && !(value as any)[nonReactiveObjectSymbol]\n}\n\n\n\n/**\n * Returns the actual target value instead of root\n * object with internals props like $$value$$\n *\n * @param target - object from subscription or proxy\n * @returns actual value\n */\nexport const okTarget = (target: any): any => target[INTERNAL_VALUE_PROP] ?? target\n\n\n\n\n/**\n * Gets an object with just the properties requested\n * instead of the full object\n *\n * @param properties - object properties\n * @param obj - target to get the properties\n * @returns New object with just the requested properties\n */\nexport function getPartialObjectFromProperties<T> (properties: Array<keyof T>, obj: T): any {\n return properties.reduce<any>((acc, curr) => {\n acc[curr] = obj[curr]\n\n return acc\n }, {})\n}\n\n\n\nconst stringify = (obj: any): string => JSON.stringify(obj)\n\n/**\n * Compare 2 provided objects by stringing them\n * @param a - first object\n * @param b - second object\n * @returns boolean\n */\nexport const contentComparer = (a: any, b: any): boolean => stringify(a) === stringify(b)\n","\nimport { deepClone, isReactElement, isValidReactiveObject } from '../utils/object'\n\nimport type { StoreChange } from '../../types/shared'\nimport type { CacheableSubject } from '../utils/subject'\n\n\n\n// @ts-expect-error - Object.hasOwn is not defined in older Safari's browsers\n('hasOwn' in Object) || (Object.hasOwn = Object.call.bind(Object.hasOwnProperty))\n\nconst ROOT_VALUE = Symbol('value')\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (\n store$$: CacheableSubject<StoreChange<T>>,\n objectToProxify: T,\n opts: {\n nestedFieldPath?: string\n parentObjectToProxify?: any\n // beforeChange?: (storeChange: StoreChange<T>) => any\n afterChange?: (storeChange: Array<StoreChange<T>>) => void\n } = {},\n): T {\n const fieldPath = opts.nestedFieldPath ?? 'root'\n\n const objectWithRootValue = {\n [ROOT_VALUE]: objectToProxify,\n } as unknown as T\n\n const rootFunctions = fieldPath === 'root'\n ? Object.fromEntries(Object.entries(objectToProxify).filter(([,v]) => typeof v === 'function'))\n : {}\n\n return new Proxy(objectWithRootValue, {\n get (targetObject, propName, receiver) {\n // INFO: !Internal only.\n // Used to get the fieldPath of the object (it means it's a proxified object)\n if (propName === '_$fieldPath') return fieldPath\n\n const isRootTarget = Object.hasOwn(targetObject, ROOT_VALUE)\n const target = isRootTarget ? targetObject[ROOT_VALUE] : targetObject\n\n\n // Called when the object is converted to JSON or string (i.e. JSON.stringify)\n if (propName === 'toJSON') {\n return () => {\n // Remove react-elements with circular which have circular references\n // before stringifying to prevent JSON.stringify(storeProxy) from failing\n return safeToJson(target)\n // return removeCircularReferences(target)\n }\n }\n\n // Get the whole store value without proxies\n if (propName === '$value')\n return deepClone(target)\n // return target\n\n\n\n const propertyValue = Reflect.get(target, propName, receiver)\n\n if (typeof propName === 'symbol') return propertyValue\n\n if (typeof propertyValue === 'function')\n return (propertyValue as () => any).bind(receiver)\n\n\n // Check if it's correct to be a reactive object\n // & is not a circular reference or the same object\n if (isValidReactiveObject(propertyValue) && propertyValue !== target) {\n // const newNestedFieldPath = `${fieldPath}.${propName}`\n\n // If it's already a proxified object, return it\n // if (propertyValue._$fieldPath === newNestedFieldPath) return propertyValue\n if (propertyValue._$fieldPath) return propertyValue\n\n // Create a new proxified object\n const proxiedNestedObject = proxifyStore(\n store$$ as any,\n propertyValue,\n {\n nestedFieldPath: `${fieldPath}.${propName}`,\n parentObjectToProxify: opts.parentObjectToProxify ?? target,\n // beforeChange: opts.beforeChange,\n afterChange: opts.afterChange,\n },\n )\n\n return target[propName] = proxiedNestedObject\n }\n\n return propertyValue\n },\n\n\n set (parentObject, key, newValue, receiver) {\n if (typeof key === 'symbol') return true\n\n const value = newValue\n const isRootTarget = Object.hasOwn(parentObject, ROOT_VALUE)\n\n // INFO: !Internal only.\n // Used to set the value of the store without notifying the store\n if (isRootTarget && key === '$$value') {\n const previousValue = parentObject[ROOT_VALUE];\n\n (parentObject as any)[ROOT_VALUE] = value.newValue\n\n store$$.next({\n // fromInit: true,\n storeValue: value.newValue,\n change: {\n fieldPath: 'root' as any,\n newValue: value.newValue,\n previousValue,\n },\n }, value.id)\n\n return true\n }\n\n if (isRootTarget && key === '$value') {\n const previousValue = parentObject[ROOT_VALUE]\n\n if (value === previousValue) return true\n\n if (safeStringify(value) === safeStringify(previousValue)) return true\n // if (JSON.stringify(value) === JSON.stringify(previousValue)) return true\n\n if (fieldPath !== 'root') {\n (parentObject as any)[ROOT_VALUE] = value\n } else {\n (parentObject as any)[ROOT_VALUE] = {\n ...rootFunctions,\n ...value,\n }\n store$$.next({\n // To be disabled for performance and send same store reference\n // storeValue: JSON.parse(JSON.stringify(targetObject[ROOT_VALUE])),\n storeValue: parentObject[ROOT_VALUE],\n change: {\n fieldPath: 'root' as any,\n newValue: value,\n previousValue,\n },\n })\n }\n\n return true\n }\n\n const realInnerObject = isRootTarget ? parentObject[ROOT_VALUE] : parentObject\n const previousValue = Reflect.get(realInnerObject, key, receiver)\n\n\n if (previousValue === value) return true\n\n\n // New object values, check if the field has already a proxy created to use it instead of reacreating a new instance\n if (isValidReactiveObject(value) && previousValue?._$fieldPath)\n previousValue.$value = value\n else\n Reflect.set(realInnerObject, key, value, realInnerObject)\n\n\n const nextStoreChange = {\n // To be disabled for performance and send same store reference\n // storeValue: JSON.parse(JSON.stringify(opts?.parentObjectToProxify ?? target)),\n storeValue: opts?.parentObjectToProxify ?? realInnerObject,\n change: {\n fieldPath: `${fieldPath}.${key}`.replace('root.', '') as any,\n newValue: value,\n previousValue,\n },\n }\n\n store$$.next(nextStoreChange)\n opts.afterChange?.([nextStoreChange])\n\n return true\n },\n\n has (t, p) {\n return Reflect.has(t[ROOT_VALUE], p)\n },\n\n ownKeys (t) {\n return Reflect.ownKeys(t[ROOT_VALUE])\n },\n\n getOwnPropertyDescriptor (t, p) {\n return Reflect.getOwnPropertyDescriptor(t[ROOT_VALUE], p)\n },\n\n })\n}\n\n\n// function getDeepUnproxiedObject (obj: any): any {\n// if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n// if (obj[ROOT_VALUE]?.[ROOT_VALUE]) {\n// console.warn('Circular reference detected in getDeepUnproxiedObject')\n//\n// return '[Circular reference]'\n// }\n//\n//\n// const r = Object.fromEntries(\n// Object.entries(obj).map(([key, value]) => {\n// // console.log('____________________getDeepUnproxiedObject', key, value, value.constructor.name)\n// if (value && typeof value === 'object' && !Array.isArray(value)) {\n// if (key === 'links') console.log('getDeepUnproxiedObject', key, value)\n//\n// // If it's a proxied object, get the unproxied value\n// return [key, getDeepUnproxiedObject(value)]\n// }\n//\n// return [key, value]\n// }),\n// )\n//\n//\n// return r\n// }\n//\n// return obj\n// }\n\nexport function safeStringify (obj: any): string {\n // use removeCircularReferences to avoid circular references\n // const cleanedObj = removeCircularReferences(obj)\n\n return JSON.stringify(\n obj,\n (_key, value) => {\n if (Array.isArray(value)) return value.map(i => safeStringify(i))\n\n if (isReactElement(value)) {\n // console.log('React element detected', value)\n\n return { props: safeStringify(value.props), type: typeof value.type === 'string' ? value.type : '' }\n }\n\n if (globalThis?.HTMLElement && value instanceof globalThis.HTMLElement) return { type: '[HTMLElement]', content: value.innerHTML }\n\n // console.log('Value', value)\n\n return value\n })\n}\n\n\nfunction safeToJson (obj: any): Record<string, any> {\n const o: Record<string, any> = {}\n\n if (typeof obj !== 'object' || obj == null)\n return obj\n\n if (Array.isArray(obj))\n return obj.map(item => safeToJson(item))\n\n if (isReactElement(obj))\n return { props: safeToJson(obj.props), type: typeof obj.type === 'string' ? obj.type : '' }\n\n if (globalThis?.HTMLElement && obj instanceof globalThis.HTMLElement) return { type: '[HTMLElement]', content: obj.innerHTML }\n\n Object.entries(obj).forEach(([key, v]) => {\n o[key] = safeToJson(v)\n })\n\n return o\n}\n\n\n// function removeCircularReferences (obj: any): any {\n// const seen = new WeakSet()\n//\n// function traverse (value: any): any {\n// if (value && typeof value === 'object') {\n// // If the object has already been seen, it's a circular reference\n// if (seen.has(value))\n// return null\n//\n// seen.add(value)\n//\n// if (Array.isArray(value))\n// return value.map(traverse)\n//\n//\n// const result: any = {}\n//\n// for (const key in value) {\n// if (Object.prototype.hasOwnProperty.call(value, key)) {\n// if (key === '_owner' && value.$$typeof) continue\n//\n// result[key] = traverse(value[key])\n// }\n// }\n//\n// return result\n// }\n//\n// // Return primitive values as-is\n// return value\n// }\n//\n// return traverse(obj)\n// }\n","\nimport { useEffect, useId, useRef, useState } from 'react'\n\nimport { nonReactiveObjectSymbol } from '../../types/shared'\nimport { proxifyStore } from '../helpers/new-proxify-store'\nimport { deepClone } from '../utils/object'\nimport { createCacheableSubject } from '../utils/subject'\n\nimport type { FieldPath, StoreChange } from '../../types/shared'\n\n\n\n\n// export type CervelloOptions<StoreValue extends Record<string, any>> = {\n// beforeChange?: (storeChange: StoreChange<StoreValue>) => unknown | undefined\n// afterChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n// }\n\nexport type CervelloOptions<StoreValue extends Record<string, any>> = {\n afterChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n}\n\nexport type CervelloUseStoreOptions<StoreValue extends Record<string, any>> = {\n initialValue?: (currentStore: StoreValue) => StoreValue | null,\n setValueOnMount?: (currentStore: StoreValue) => Promise<StoreValue>,\n select?:\n | Array<FieldPath<StoreValue>>\n | (() => Array<FieldPath<StoreValue>>)\n onChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n}\n\ntype MutableStoreValue<T extends Record<string, any>> = {\n $value: T\n} & T\n\n\n\n\n\n\n\n\nexport function nonReactive <T extends Record<string, any>> (initialValue: T): T {\n Object.defineProperty(initialValue, nonReactiveObjectSymbol, {\n value: true,\n enumerable: false,\n writable: false,\n configurable: false,\n })\n\n return initialValue\n}\n\n\nexport function cervello <StoreValue extends Record<PropertyKey, any>> (\n initialValue: StoreValue,\n options?: CervelloOptions<StoreValue>,\n): {\n store: MutableStoreValue<StoreValue>,\n reset: () => void,\n useStore: (options?: CervelloUseStoreOptions<StoreValue>) => MutableStoreValue<StoreValue>\n } {\n const {\n // beforeChange,\n afterChange,\n } = options ?? {}\n\n // const store$$ = createCacheableSubject<StoreChange<StoreValue>>(clonedInitialValue as any)\n const store$$ = createCacheableSubject<StoreChange<StoreValue>>()\n const clonedInitialValue = deepClone(initialValue)\n\n const proxiedStore = proxifyStore(\n store$$ as any,\n clonedInitialValue,\n // { beforeChange, afterChange },\n { afterChange },\n ) as MutableStoreValue<StoreValue>\n\n\n return {\n store: proxiedStore,\n reset: () => {\n proxiedStore.$value = deepClone(initialValue)\n },\n useStore: (options) => {\n const subscriberId = useId()\n const initialValue = options?.initialValue?.(proxiedStore.$value)\n const isInitialValueSet = useRef(false)\n const [, setRenderCount] = useState(0)\n\n if (!isInitialValueSet.current && initialValue && initialValue !== proxiedStore) {\n isInitialValueSet.current = true;\n (proxiedStore as any).$$value = { id: subscriberId, newValue: initialValue }\n }\n\n const selectFieldPaths = useRef(\n (typeof options?.select === 'function'\n ? options?.select?.()\n : options?.select)\n ?? [],\n )\n\n\n const selectedFieldPathsForNestedObjects = useRef(\n selectFieldPaths.current\n .filter(fp => fp.includes('.*'))\n .map(fp => fp.replace('.*', '')),\n )\n\n const reRender = (): void => {\n setRenderCount(p => p + 1)\n }\n\n\n useEffect(() => {\n if (options?.setValueOnMount) {\n void options.setValueOnMount(proxiedStore.$value).then((value) => {\n proxiedStore.$value = value\n }).catch((err) => {\n console.error('Error setting initial value on mount', err)\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n\n // Same implementation as useSyncExternalStore but with useEffect\n useEffect(() => {\n const subscription = store$$.subscribe({\n id: subscriberId,\n next: (sc) => {\n const storeChanges = Array.isArray(sc)\n ? sc as Array<StoreChange<StoreValue>>\n : [sc]\n\n if (!options?.select) {\n reRender()\n options?.onChange?.(storeChanges)\n\n return\n }\n\n if (storeChanges.some(nextChange => (\n nextChange.change.fieldPath === 'root'\n || selectFieldPaths.current.includes(nextChange.change.fieldPath))\n || selectedFieldPathsForNestedObjects.current.find(fp => nextChange.change.fieldPath.startsWith(fp)),\n )) {\n reRender()\n options?.onChange?.(storeChanges)\n }\n },\n })\n\n return () => {\n subscription.unsubscribe()\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options?.select, options?.onChange])\n\n return proxiedStore\n },\n }\n}\n","\ntype Noop = () => void\n\n\ntype Observer<T> = {\n id: string\n next: (value: T, subscriberId?: string) => void\n}\n\ntype Subscription = {\n unsubscribe: Noop\n}\n\nexport type CacheableSubject<T> = {\n // getValue: () => T\n subscribe: (value: Observer<T>) => Subscription\n // unSubscribeAll: Noop\n} & Omit<Observer<T>, 'id'>\n\n\n\nexport function createCacheableSubject<T> (/* defaultValue: T/*, getValueOnSubscribe = false */): CacheableSubject<T> {\n let isFlushing = false\n let itemsToFlush: Array<{ newValue: T, subscriberId?: string }> = []\n\n let observerList: Array<Observer<T>> = []\n // let value = defaultValue\n\n // const getValue = (): T => value\n\n const next = (newValue: T, subscriberId?: string): void => {\n // value = newValue\n\n itemsToFlush.push({ newValue, subscriberId })\n\n if (!isFlushing) {\n isFlushing = true\n\n void Promise.resolve().then(() => {\n observerList.forEach((o) => {\n // Filter changes that were sent by the same subscriberId (initialValue function call)\n const nonInitiallySentBySubscriber = itemsToFlush.filter(item => item.subscriberId !== o.id)\n\n if (!nonInitiallySentBySubscriber.length) return\n\n o.next(nonInitiallySentBySubscriber.map(i => i.newValue) as T)\n })\n itemsToFlush = []\n isFlushing = false\n })\n\n // void Promise.resolve(subscriberId).then((subscriberId) => {\n // console.log('//// promise.resolve then', { subscriberId: s.id })\n // observerList.forEach((o) => {\n // console.log('//// CacheableSubject (forEach) flushing', { observerId: o.id, subscriberId: s.id })\n // if (o.id === subscriberId) return\n //\n // o.next(itemsToFlush as T)\n // })\n // itemsToFlush = []\n // isFlushing = false\n // })\n\n // void Promise.resolve().then(() => {\n // console.log('//// promise.resolve then')\n // observerList.forEach((o) => {\n // const nonInitiallySentBySubscriber = itemsToFlush.filter(item => item.subscriberId !== o.id)\n //\n // if (nonInitiallySentBySubscriber.length === 0) return\n //\n // o.next(nonInitiallySentBySubscriber.map(i => i.newValue) as T)\n // })\n // itemsToFlush = []\n // isFlushing = false\n // })\n }\n }\n\n const subscribe = (observer: Observer<T>): Subscription => {\n // Push cached value on subscribe\n // if (getValueOnSubscribe) observer.next(value)\n\n // Store the observer to be notified\n observerList.push(observer)\n\n return {\n unsubscribe: () => {\n observerList = observerList.filter(o => o !== observer)\n },\n }\n }\n\n // const unSubscribeAll = (): void => {\n // observerList = []\n // }\n\n return {\n // getValue,\n next,\n subscribe,\n // unSubscribeAll,\n }\n}\n"],"names":["nonReactiveObjectSymbol","Symbol","obj","newObj","Array","isArray","map","item","deepClone","isReactObjectLikeNode","isObject","isReactElement","objKeys","Object","keys","includes","some","k","startsWith","entries","forEach","_ref","getOwnPropertySymbols","symbol","$$typeof","isValidReactiveObject","value","hasOwn","call","bind","hasOwnProperty","ROOT_VALUE","proxifyStore","store$$","objectToProxify","opts","_opts$nestedFieldPath","_objectWithRootValue","fieldPath","nestedFieldPath","objectWithRootValue","rootFunctions","fromEntries","filter","Proxy","get","targetObject","propName","receiver","target","safeToJson","propertyValue","Reflect","_opts$parentObjectToP","_$fieldPath","proxiedNestedObject","parentObjectToProxify","afterChange","set","parentObject","key","newValue","isRootTarget","_previousValue","next","storeValue","change","previousValue","id","_previousValue2","safeStringify","realInnerObject","$value","nextStoreChange","_opts","_opts$parentObjectToP2","replace","has","t","p","ownKeys","getOwnPropertyDescriptor","JSON","stringify","_key","i","props","type","globalThis","HTMLElement","content","innerHTML","_ref2","o","cervello","initialValue","options","isFlushing","itemsToFlush","observerList","subscriberId","push","Promise","resolve","then","nonInitiallySentBySubscriber","length","subscribe","observer","unsubscribe","clonedInitialValue","proxiedStore","store","reset","useStore","useId","isInitialValueSet","useRef","setRenderCount","useState","current","$$value","selectFieldPaths","select","selectedFieldPathsForNestedObjects","fp","reRender","useEffect","setValueOnMount","err","console","error","subscription","sc","storeChanges","onChange","nextChange","find","nonReactive","defineProperty","enumerable","writable","configurable"],"mappings":"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"}
1
+ {"version":3,"file":"cervello.cjs","sources":["../src/types/shared.ts","../src/lib/utils/object.ts","../src/lib/helpers/new-proxify-store.ts","../src/lib/store/new-index.ts","../src/lib/utils/subject.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\nexport type WithoutType<T, V, WithNever = {\n [K in keyof T]: Exclude<T[K], undefined> extends V\n ? never\n : (T[K] extends Record<string, unknown>\n ? WithoutType<T[K], V>\n : T[K])\n}> = Pick<WithNever, {\n [K in keyof WithNever]: WithNever[K] extends never ? never : K\n}[keyof WithNever]>\n\n\n\nexport type ObjectFromAttributes<T, Attributes extends Array< keyof WithoutType<T, Function> > > = {\n [k in Attributes[number]]: T[k]\n}\n\nexport type Maybe<T> = T | undefined\n\n\n\nexport type UseSelector<T> = <Attributes extends Array< Exclude<keyof WithoutType<T, Function>, '$value'> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n) => T\n\nexport type FieldPath<T extends Record<string, any>> = {\n [K in keyof Required<T>]: T[K] extends Record<string, any>\n ? K extends string\n\n ? T[K] extends Function\n ? never\n : T[K] extends Array<any>\n ? K\n : `${K}.*` | `${K}.${FieldPath<T[K]>}`\n : never\n : K extends string\n ? K\n : never\n}[keyof T]\n\nexport const nonReactiveObjectSymbol = Symbol('nonReactiveObject')\nexport type StoreChange<T extends Record<string, any>> = {\n change: {\n fieldPath: FieldPath<T>\n newValue: any\n previousValue: any\n }\n storeValue: T\n}\n// fromInit?: boolean\n","/* eslint-disable no-cond-assign */\n\nimport { nonReactiveObjectSymbol } from '../../types/shared'\nimport { INTERNAL_VALUE_PROP } from '../helpers/constants'\n\n\n/**\n * Clones all the provided object and nested properties and it also\n * iterates nested arrays to deepClone them\n *\n * @param obj - base object to be cloned\n * @returns new cloned object with new reference\n */\nexport function deepClone <T> (obj: T): T {\n if (!obj || typeof obj !== 'object')\n return obj\n\n let newObj = {} as any\n\n if (Array.isArray(obj)) {\n newObj = obj.map(item => deepClone(item))\n } else if (!isReactObjectLikeNode(obj)) {\n Object.entries(obj).forEach(([key, value]) => {\n newObj[key] = deepClone(value)\n })\n Object.getOwnPropertySymbols(obj).forEach((symbol) => {\n newObj[symbol] = (obj as any)[symbol]\n })\n } else {\n newObj = obj\n }\n\n return newObj as T\n}\n\n// function copyBuffer (cur: ArrayBufferView) {\n// if (cur instanceof Buffer)\n// return Buffer.from(cur)\n//\n//\n// return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)\n// }\n\n\n// INFO: From `rfdc` (really-fast-deep-clone) package for faster cloning taking care of circular references\nexport function deepClone2 <T> (obj: T): T {\n const refs: Array<any> = []\n const refsNew: Array<any> = []\n\n const constructorHandlers = new Map()\n\n constructorHandlers.set(Date, (o: string | number | Date) => new Date(o))\n constructorHandlers.set(Map, (o: Iterable<unknown> | ArrayLike<unknown>, fn: any) => new Map(cloneArray(Array.from(o), fn)))\n constructorHandlers.set(Set, (o: Iterable<unknown> | ArrayLike<unknown>, fn: any) => new Set(cloneArray(Array.from(o), fn)))\n\n let handler = null\n\n return clone(obj)\n\n function cloneArray (a: any, fn: any): any {\n const keys = Object.keys(a)\n const a2 = new Array(keys.length) as any\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i]\n const cur = a[k]\n\n if (typeof cur !== 'object' || cur === null) {\n a2[k] = cur\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n a2[k] = handler(cur, fn)\n // } else if (ArrayBuffer.isView(cur)) {\n // a2[k] = copyBuffer(cur)\n } else {\n const index = refs.indexOf(cur)\n\n if (index !== -1)\n a2[k] = refsNew[index]\n else\n a2[k] = fn(cur)\n }\n }\n\n return a2\n }\n\n function clone (o: any): any {\n if (typeof o !== 'object' || o === null) return o\n if (Array.isArray(o)) return cloneArray(o, clone)\n if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor)))\n return handler(o, clone)\n\n const o2 = {} as any\n\n refs.push(o)\n refsNew.push(o2)\n\n\n Object.getOwnPropertySymbols(o).forEach((symbol) => {\n o2[symbol] = (o)[symbol]\n })\n\n for (const k in o) {\n if (!Object.hasOwnProperty.call(o, k)) continue\n const cur = o[k]\n\n\n if (typeof cur !== 'object' || cur === null) {\n o2[k] = cur\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n o2[k] = handler(cur, clone)\n // } else if (ArrayBuffer.isView(cur)) {\n // o2[k] = copyBuffer(cur)\n } else {\n const i = refs.indexOf(cur)\n\n if (i !== -1)\n o2[k] = refsNew[i]\n else\n o2[k] = clone(cur)\n }\n }\n refs.pop()\n refsNew.pop()\n\n\n return o2\n }\n}\n\n/**\n * Guard to check is variable is an object\n * @param obj - variable to be checked\n * @returns boolean\n */\nexport const isObject = (obj: unknown): obj is Record<string | symbol, unknown> => (\n obj !== null\n && typeof obj === 'object'\n && !Array.isArray(obj)\n)\n\n\nexport const isReactElement = (obj: unknown): boolean => {\n if (!isObject(obj)) return false\n\n return !!(obj.$$typeof)\n}\n\n\nexport function isReactObjectLikeNode (obj: unknown): boolean {\n if (!isObject(obj)) return false\n if (isReactElement(obj)) return true\n\n const objKeys = Object.keys(obj)\n const isReactObjNode = (objKeys.includes('tag') && objKeys.includes('containerInfo'))\n || objKeys.some(k => k.startsWith('__reactContainer'))\n || (objKeys.includes('tag') && objKeys.includes('stateNode'))\n\n return isReactObjNode\n}\n\n\nexport function isValidReactiveObject <T extends Record<string, any>> (value: T): boolean {\n return isObject(value) && !isReactElement(value) && !(value as any)[nonReactiveObjectSymbol]\n}\n\n\n\n/**\n * Returns the actual target value instead of root\n * object with internals props like $$value$$\n *\n * @param target - object from subscription or proxy\n * @returns actual value\n */\nexport const okTarget = (target: any): any => target[INTERNAL_VALUE_PROP] ?? target\n\n\n\n\n/**\n * Gets an object with just the properties requested\n * instead of the full object\n *\n * @param properties - object properties\n * @param obj - target to get the properties\n * @returns New object with just the requested properties\n */\nexport function getPartialObjectFromProperties<T> (properties: Array<keyof T>, obj: T): any {\n return properties.reduce<any>((acc, curr) => {\n acc[curr] = obj[curr]\n\n return acc\n }, {})\n}\n\n\n\nconst stringify = (obj: any): string => JSON.stringify(obj)\n\n/**\n * Compare 2 provided objects by stringing them\n * @param a - first object\n * @param b - second object\n * @returns boolean\n */\nexport const contentComparer = (a: any, b: any): boolean => stringify(a) === stringify(b)\n","\nimport { deepClone, isReactElement, isValidReactiveObject } from '../utils/object'\n\nimport type { StoreChange } from '../../types/shared'\nimport type { CacheableSubject } from '../utils/subject'\n\n\n\n// @ts-expect-error - Object.hasOwn is not defined in older Safari's browsers\n('hasOwn' in Object) || (Object.hasOwn = Object.call.bind(Object.hasOwnProperty))\n\nconst ROOT_VALUE = Symbol('value')\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (\n store$$: CacheableSubject<StoreChange<T>>,\n objectToProxify: T,\n opts: {\n nestedFieldPath?: string\n parentObjectToProxify?: any\n // beforeChange?: (storeChange: StoreChange<T>) => any\n afterChange?: (storeChange: Array<StoreChange<T>>) => void\n } = {},\n): T {\n const fieldPath = opts.nestedFieldPath ?? 'root'\n\n const objectWithRootValue = {\n [ROOT_VALUE]: objectToProxify,\n } as unknown as T\n\n const rootFunctions = fieldPath === 'root'\n ? Object.fromEntries(Object.entries(objectToProxify).filter(([,v]) => typeof v === 'function'))\n : {}\n\n return new Proxy(objectWithRootValue, {\n get (targetObject, propName, receiver) {\n // INFO: !Internal only.\n // Used to get the fieldPath of the object (it means it's a proxified object)\n if (propName === '_$fieldPath') return fieldPath\n\n const isRootTarget = Object.hasOwn(targetObject, ROOT_VALUE)\n const target = isRootTarget ? targetObject[ROOT_VALUE] : targetObject\n\n\n // Called when the object is converted to JSON or string (i.e. JSON.stringify)\n if (propName === 'toJSON') {\n return () => {\n // Remove react-elements with circular which have circular references\n // before stringifying to prevent JSON.stringify(storeProxy) from failing\n return safeToJson(target)\n // return removeCircularReferences(target)\n }\n }\n\n // Get the whole store value without proxies\n if (propName === '$value')\n return deepClone(target)\n // return target\n\n\n\n const propertyValue = Reflect.get(target, propName, receiver)\n\n if (typeof propName === 'symbol') return propertyValue\n\n if (typeof propertyValue === 'function')\n return (propertyValue as () => any).bind(receiver)\n\n\n // Check if it's correct to be a reactive object\n // & is not a circular reference or the same object\n if (isValidReactiveObject(propertyValue) && propertyValue !== target) {\n // const newNestedFieldPath = `${fieldPath}.${propName}`\n\n // If it's already a proxified object, return it\n // if (propertyValue._$fieldPath === newNestedFieldPath) return propertyValue\n if (propertyValue._$fieldPath) return propertyValue\n\n // Create a new proxified object\n const proxiedNestedObject = proxifyStore(\n store$$ as any,\n propertyValue,\n {\n nestedFieldPath: `${fieldPath}.${propName}`,\n parentObjectToProxify: opts.parentObjectToProxify ?? target,\n // beforeChange: opts.beforeChange,\n afterChange: opts.afterChange,\n },\n )\n\n return target[propName] = proxiedNestedObject\n }\n\n return propertyValue\n },\n\n\n set (parentObject, key, newValue, receiver) {\n if (typeof key === 'symbol') return true\n\n const value = newValue\n const isRootTarget = Object.hasOwn(parentObject, ROOT_VALUE)\n\n // INFO: !Internal only.\n // Used to set the value of the store without notifying the store\n if (isRootTarget && key === '$$value') {\n const previousValue = parentObject[ROOT_VALUE];\n\n (parentObject as any)[ROOT_VALUE] = value.newValue\n\n store$$.next({\n storeValue: value.newValue,\n change: {\n fieldPath: 'root' as any,\n newValue: value.newValue,\n previousValue,\n },\n }, value.id)\n\n return true\n }\n\n if (isRootTarget && key === '$value') {\n const previousValue = parentObject[ROOT_VALUE]\n\n if (value === previousValue) return true\n\n if (JSON.stringify(safeToJson(value)) === JSON.stringify(safeToJson(previousValue))) return true\n // if (safeStringify(value) === safeStringify(previousValue)) return true\n\n if (fieldPath !== 'root') {\n (parentObject as any)[ROOT_VALUE] = value\n } else {\n (parentObject as any)[ROOT_VALUE] = {\n ...rootFunctions,\n ...value,\n }\n store$$.next({\n // To be disabled for performance and send same store reference\n // storeValue: JSON.parse(JSON.stringify(targetObject[ROOT_VALUE])),\n storeValue: parentObject[ROOT_VALUE],\n change: {\n fieldPath: 'root' as any,\n newValue: value,\n previousValue,\n },\n })\n }\n\n return true\n }\n\n const realInnerObject = isRootTarget ? parentObject[ROOT_VALUE] : parentObject\n const previousValue = Reflect.get(realInnerObject, key, receiver)\n\n\n if (previousValue === value) return true\n\n\n // New object values, check if the field has already a proxy created to use it instead of reacreating a new instance\n if (isValidReactiveObject(value) && previousValue?._$fieldPath)\n previousValue.$value = value\n else\n Reflect.set(realInnerObject, key, value, realInnerObject)\n\n\n const nextStoreChange = {\n // To be disabled for performance and send same store reference\n // storeValue: JSON.parse(JSON.stringify(opts?.parentObjectToProxify ?? target)),\n storeValue: opts?.parentObjectToProxify ?? realInnerObject,\n change: {\n fieldPath: `${fieldPath}.${key}`.replace('root.', '') as any,\n newValue: value,\n previousValue,\n },\n }\n\n store$$.next(nextStoreChange)\n opts.afterChange?.([nextStoreChange])\n\n return true\n },\n\n has (t, p) {\n return Reflect.has(t[ROOT_VALUE], p)\n },\n\n ownKeys (t) {\n return Reflect.ownKeys(t[ROOT_VALUE])\n },\n\n getOwnPropertyDescriptor (t, p) {\n return Reflect.getOwnPropertyDescriptor(t[ROOT_VALUE], p)\n },\n\n })\n}\n\n\n// function getDeepUnproxiedObject (obj: any): any {\n// if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n// if (obj[ROOT_VALUE]?.[ROOT_VALUE]) {\n// console.warn('Circular reference detected in getDeepUnproxiedObject')\n//\n// return '[Circular reference]'\n// }\n//\n//\n// const r = Object.fromEntries(\n// Object.entries(obj).map(([key, value]) => {\n// // console.log('____________________getDeepUnproxiedObject', key, value, value.constructor.name)\n// if (value && typeof value === 'object' && !Array.isArray(value)) {\n// if (key === 'links') console.log('getDeepUnproxiedObject', key, value)\n//\n// // If it's a proxied object, get the unproxied value\n// return [key, getDeepUnproxiedObject(value)]\n// }\n//\n// return [key, value]\n// }),\n// )\n//\n//\n// return r\n// }\n//\n// return obj\n// }\n\n// function safeStringify (obj: any): string {\n// // use removeCircularReferences to avoid circular references\n// // const cleanedObj = removeCircularReferences(obj)\n// return JSON.stringify(safeToJson(obj))\n// //\n// // return JSON.stringify(\n// // obj,\n// // (_key, value) => {\n// // if (Array.isArray(value)) return value.map(i => safeStringify(i))\n// //\n// // if (isReactElement(value)) {\n// // // console.log('React element detected', value)\n// //\n// // return { props: safeStringify(value.props), type: typeof value.type === 'string' ? value.type : '' }\n// // }\n// //\n// // if (globalThis?.HTMLElement && value instanceof globalThis.HTMLElement) return { type: '[HTMLElement]', content: value.innerHTML }\n// //\n// // // console.log('Value', value)\n// //\n// // return value\n// // })\n// }\n\n\nfunction safeToJson (obj: any): Record<string, any> {\n const o: Record<string, any> = {}\n\n if (typeof obj !== 'object' || obj == null)\n return obj\n\n if (Array.isArray(obj))\n return obj.map(item => safeToJson(item))\n\n if (isReactElement(obj))\n return { props: safeToJson(obj.props), type: typeof obj.type === 'string' ? obj.type : '' }\n\n if (globalThis?.HTMLElement && obj instanceof globalThis.HTMLElement) return { type: '[HTMLElement]', content: obj.innerHTML }\n\n Object.entries(obj).forEach(([key, v]) => {\n o[key] = safeToJson(v)\n })\n\n return o\n}\n\n\n// function removeCircularReferences (obj: any): any {\n// const seen = new WeakSet()\n//\n// function traverse (value: any): any {\n// if (value && typeof value === 'object') {\n// // If the object has already been seen, it's a circular reference\n// if (seen.has(value))\n// return null\n//\n// seen.add(value)\n//\n// if (Array.isArray(value))\n// return value.map(traverse)\n//\n//\n// const result: any = {}\n//\n// for (const key in value) {\n// if (Object.prototype.hasOwnProperty.call(value, key)) {\n// if (key === '_owner' && value.$$typeof) continue\n//\n// result[key] = traverse(value[key])\n// }\n// }\n//\n// return result\n// }\n//\n// // Return primitive values as-is\n// return value\n// }\n//\n// return traverse(obj)\n// }\n","\nimport { useEffect, useId, useRef, useState } from 'react'\n\nimport { nonReactiveObjectSymbol } from '../../types/shared'\nimport { proxifyStore } from '../helpers/new-proxify-store'\nimport { deepClone } from '../utils/object'\nimport { createCacheableSubject } from '../utils/subject'\n\nimport type { FieldPath, StoreChange } from '../../types/shared'\n\n\n\n\n// export type CervelloOptions<StoreValue extends Record<string, any>> = {\n// beforeChange?: (storeChange: StoreChange<StoreValue>) => unknown | undefined\n// afterChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n// }\n\nexport type CervelloOptions<StoreValue extends Record<string, any>> = {\n afterChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n}\n\nexport type CervelloUseStoreOptions<StoreValue extends Record<string, any>> = {\n initialValue?: (currentStore: StoreValue) => StoreValue | null,\n setValueOnMount?: (currentStore: StoreValue) => Promise<StoreValue>,\n select?:\n | Array<FieldPath<StoreValue>>\n | (() => Array<FieldPath<StoreValue>>)\n onChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n}\n\ntype MutableStoreValue<T extends Record<string, any>> = {\n $value: T\n} & T\n\n\n\n\n\n\n\n\nexport function nonReactive <T extends Record<string, any>> (initialValue: T): T {\n Object.defineProperty(initialValue, nonReactiveObjectSymbol, {\n value: true,\n enumerable: false,\n writable: false,\n configurable: false,\n })\n\n return initialValue\n}\n\n\nexport function cervello <StoreValue extends Record<PropertyKey, any>> (\n initialValue: StoreValue,\n options?: CervelloOptions<StoreValue>,\n): {\n store: MutableStoreValue<StoreValue>,\n reset: () => void,\n useStore: (options?: CervelloUseStoreOptions<StoreValue>) => MutableStoreValue<StoreValue>\n } {\n const {\n // beforeChange,\n afterChange,\n } = options ?? {}\n\n // const store$$ = createCacheableSubject<StoreChange<StoreValue>>(clonedInitialValue as any)\n const clonedInitialValue = deepClone(initialValue)\n\n const store$$ = createCacheableSubject<StoreChange<StoreValue>>()\n\n const proxiedStore = proxifyStore(\n store$$ as any,\n clonedInitialValue,\n // { beforeChange, afterChange },\n { afterChange },\n ) as MutableStoreValue<StoreValue>\n\n\n return {\n store: proxiedStore,\n reset: () => {\n proxiedStore.$value = deepClone(initialValue)\n },\n useStore: (options) => {\n const subscriberId = useId()\n const initialValue = options?.initialValue?.(proxiedStore.$value)\n const isInitialValueSet = useRef(false)\n const [, setRenderCount] = useState(0)\n\n if (!isInitialValueSet.current && initialValue && initialValue !== proxiedStore) {\n isInitialValueSet.current = true;\n (proxiedStore as any).$$value = { id: subscriberId, newValue: initialValue }\n }\n\n const selectFieldPaths = useRef(\n (typeof options?.select === 'function'\n ? options?.select?.()\n : options?.select)\n ?? [],\n )\n\n\n const selectedFieldPathsForNestedObjects = useRef(\n selectFieldPaths.current\n .filter(fp => fp.includes('.*'))\n .map(fp => fp.replace('.*', '')),\n )\n\n const reRender = (): void => {\n setRenderCount(p => p + 1)\n }\n\n\n useEffect(() => {\n if (options?.setValueOnMount) {\n void options.setValueOnMount(proxiedStore.$value).then((value) => {\n proxiedStore.$value = value\n }).catch((err) => {\n console.error('Error setting initial value on mount', err)\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n\n // Same implementation as useSyncExternalStore but with useEffect\n useEffect(() => {\n const subscription = store$$.subscribe({\n id: subscriberId,\n next: (sc) => {\n const storeChanges = Array.isArray(sc)\n ? sc as Array<StoreChange<StoreValue>>\n : [sc]\n\n if (!options?.select) {\n reRender()\n options?.onChange?.(storeChanges)\n\n return\n }\n\n if (storeChanges.some(nextChange => (\n nextChange.change.fieldPath === 'root'\n || selectFieldPaths.current.includes(nextChange.change.fieldPath))\n || selectedFieldPathsForNestedObjects.current.find(fp => nextChange.change.fieldPath.startsWith(fp)),\n )) {\n reRender()\n options?.onChange?.(storeChanges)\n }\n },\n })\n\n return () => {\n subscription.unsubscribe()\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options?.select, options?.onChange])\n\n return proxiedStore\n },\n }\n}\n","\ntype Noop = () => void\n\n\ntype Observer<T> = {\n id: string\n next: (value: T, subscriberId?: string) => void\n}\n\ntype Subscription = {\n unsubscribe: Noop\n}\n\nexport type CacheableSubject<T> = {\n // getValue: () => T\n subscribe: (value: Observer<T>) => Subscription\n // unSubscribeAll: Noop\n} & Omit<Observer<T>, 'id'>\n\n\n\nexport function createCacheableSubject<T> (/* defaultValue: T/*, getValueOnSubscribe = false */): CacheableSubject<T> {\n let isFlushing = false\n let itemsToFlush: Array<{ newValue: T, subscriberId?: string }> = []\n\n let observerList: Array<Observer<T>> = []\n // let value = defaultValue\n\n // const getValue = (): T => value\n\n const next = (newValue: T, subscriberId?: string): void => {\n // value = newValue\n\n itemsToFlush.push({ newValue, subscriberId })\n\n if (!isFlushing) {\n isFlushing = true\n\n void Promise.resolve().then(() => {\n observerList.forEach((o) => {\n // Filter changes that were sent by the same subscriberId (initialValue function call)\n const nonInitiallySentBySubscriber = itemsToFlush.filter(item => item.subscriberId !== o.id)\n\n if (!nonInitiallySentBySubscriber.length) return\n\n o.next(nonInitiallySentBySubscriber.map(i => i.newValue) as T)\n })\n itemsToFlush = []\n isFlushing = false\n })\n\n // void Promise.resolve(subscriberId).then((subscriberId) => {\n // console.log('//// promise.resolve then', { subscriberId: s.id })\n // observerList.forEach((o) => {\n // console.log('//// CacheableSubject (forEach) flushing', { observerId: o.id, subscriberId: s.id })\n // if (o.id === subscriberId) return\n //\n // o.next(itemsToFlush as T)\n // })\n // itemsToFlush = []\n // isFlushing = false\n // })\n\n // void Promise.resolve().then(() => {\n // console.log('//// promise.resolve then')\n // observerList.forEach((o) => {\n // const nonInitiallySentBySubscriber = itemsToFlush.filter(item => item.subscriberId !== o.id)\n //\n // if (nonInitiallySentBySubscriber.length === 0) return\n //\n // o.next(nonInitiallySentBySubscriber.map(i => i.newValue) as T)\n // })\n // itemsToFlush = []\n // isFlushing = false\n // })\n }\n }\n\n const subscribe = (observer: Observer<T>): Subscription => {\n // Push cached value on subscribe\n // if (getValueOnSubscribe) observer.next(value)\n\n // Store the observer to be notified\n observerList.push(observer)\n\n return {\n unsubscribe: () => {\n observerList = observerList.filter(o => o !== observer)\n },\n }\n }\n\n // const unSubscribeAll = (): void => {\n // observerList = []\n // }\n\n return {\n // getValue,\n next,\n subscribe,\n // unSubscribeAll,\n }\n}\n"],"names":["nonReactiveObjectSymbol","Symbol","obj","newObj","Array","isArray","map","item","deepClone","isReactObjectLikeNode","isObject","isReactElement","objKeys","Object","keys","includes","some","k","startsWith","entries","forEach","_ref","getOwnPropertySymbols","symbol","$$typeof","isValidReactiveObject","value","hasOwn","call","bind","hasOwnProperty","store$$","objectToProxify","opts","fieldPath","_opts$nestedFieldPath","nestedFieldPath","objectWithRootValue","_objectWithRootValue","ROOT_VALUE","rootFunctions","fromEntries","filter","Proxy","get","targetObject","propName","receiver","target","propertyValue","Reflect","_$fieldPath","proxiedNestedObject","proxifyStore","parentObjectToProxify","afterChange","set","parentObject","key","newValue","_opts$parentObjectToP2","_opts","isRootTarget","previousValue","next","storeValue","change","id","_previousValue2","JSON","stringify","safeToJson","realInnerObject","$value","nextStoreChange","replace","has","t","p","ownKeys","getOwnPropertyDescriptor","o","props","type","globalThis","HTMLElement","content","innerHTML","_ref2","cervello","initialValue","options","isFlushing","itemsToFlush","observerList","clonedInitialValue","subscriberId","push","Promise","resolve","then","nonInitiallySentBySubscriber","length","i","subscribe","observer","unsubscribe","proxiedStore","store","reset","useStore","useId","isInitialValueSet","useRef","setRenderCount","useState","current","$$value","selectFieldPaths","select","selectedFieldPathsForNestedObjects","fp","reRender","useEffect","setValueOnMount","err","console","error","subscription","sc","storeChanges","onChange","nextChange","find","nonReactive","defineProperty","enumerable","writable","configurable"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{useId as e,useRef as n,useState as t,useEffect as r}from"react";var u=Symbol("nonReactiveObject");function o(){return o=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},o.apply(this,arguments)}function i(e){if(!e||"object"!=typeof e)return e;var n={};return Array.isArray(e)?n=e.map(function(e){return i(e)}):function(e){if(!l(e))return!1;if(a(e))return!0;var n=Object.keys(e);return n.includes("tag")&&n.includes("containerInfo")||n.some(function(e){return e.startsWith("__reactContainer")})||n.includes("tag")&&n.includes("stateNode")}(e)?n=e:(Object.entries(e).forEach(function(e){n[e[0]]=i(e[1])}),Object.getOwnPropertySymbols(e).forEach(function(t){n[t]=e[t]})),n}var l=function(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)},a=function(e){return!!l(e)&&!!e.$$typeof};function c(e){return l(e)&&!a(e)&&!e[u]}"hasOwn"in Object||(Object.hasOwn=Object.call.bind(Object.hasOwnProperty));var f=Symbol("value");function s(e,n,t){var r,u;void 0===t&&(t={});var l=null!=(r=t.nestedFieldPath)?r:"root",a=((u={})[f]=n,u),v="root"===l?Object.fromEntries(Object.entries(n).filter(function(e){return"function"==typeof e[1]})):{};return new Proxy(a,{get:function(n,r,u){if("_$fieldPath"===r)return l;var o=Object.hasOwn(n,f)?n[f]:n;if("toJSON"===r)return function(){return p(o)};if("$value"===r)return i(o);var a=Reflect.get(o,r,u);if("symbol"==typeof r)return a;if("function"==typeof a)return a.bind(u);if(c(a)&&a!==o){var h;if(a._$fieldPath)return a;var v=s(e,a,{nestedFieldPath:l+"."+r,parentObjectToProxify:null!=(h=t.parentObjectToProxify)?h:o,afterChange:t.afterChange});return o[r]=v}return a},set:function(n,r,u,i){var a,s;if("symbol"==typeof r)return!0;var p=u,b=Object.hasOwn(n,f);if(b&&"$$value"===r){var y=n[f];return n[f]=p.newValue,e.next({storeValue:p.newValue,change:{fieldPath:"root",newValue:p.newValue,previousValue:y}},p.id),!0}if(b&&"$value"===r){var d=n[f];return p===d||h(p)===h(d)||("root"!==l?n[f]=p:(n[f]=o({},v,p),e.next({storeValue:n[f],change:{fieldPath:"root",newValue:p,previousValue:d}}))),!0}var g=b?n[f]:n,O=Reflect.get(g,r,i);if(O===p)return!0;c(p)&&null!=O&&O._$fieldPath?O.$value=p:Reflect.set(g,r,p,g);var m={storeValue:null!=(a=null==(s=t)?void 0:s.parentObjectToProxify)?a:g,change:{fieldPath:(l+"."+r).replace("root.",""),newValue:p,previousValue:O}};return e.next(m),null==t.afterChange||t.afterChange([m]),!0},has:function(e,n){return Reflect.has(e[f],n)},ownKeys:function(e){return Reflect.ownKeys(e[f])},getOwnPropertyDescriptor:function(e,n){return Reflect.getOwnPropertyDescriptor(e[f],n)}})}function h(e){return JSON.stringify(e,function(e,n){return Array.isArray(n)?n.map(function(e){return h(e)}):a(n)?{props:h(n.props),type:"string"==typeof n.type?n.type:""}:null!=globalThis&&globalThis.HTMLElement&&n instanceof globalThis.HTMLElement?{type:"[HTMLElement]",content:n.innerHTML}:n})}function p(e){var n={};return"object"!=typeof e||null==e?e:Array.isArray(e)?e.map(function(e){return p(e)}):a(e)?{props:p(e.props),type:"string"==typeof e.type?e.type:""}:null!=globalThis&&globalThis.HTMLElement&&e instanceof globalThis.HTMLElement?{type:"[HTMLElement]",content:e.innerHTML}:(Object.entries(e).forEach(function(e){n[e[0]]=p(e[1])}),n)}function v(e){return Object.defineProperty(e,u,{value:!0,enumerable:!1,writable:!1,configurable:!1}),e}function b(u,o){var l,a,c,f=(null!=o?o:{}).afterChange,h=(l=!1,a=[],c=[],{next:function(e,n){a.push({newValue:e,subscriberId:n}),l||(l=!0,Promise.resolve().then(function(){c.forEach(function(e){var n=a.filter(function(n){return n.subscriberId!==e.id});n.length&&e.next(n.map(function(e){return e.newValue}))}),a=[],l=!1}))},subscribe:function(e){return c.push(e),{unsubscribe:function(){c=c.filter(function(n){return n!==e})}}}}),p=i(u),v=s(h,p,{afterChange:f});return{store:v,reset:function(){v.$value=i(u)},useStore:function(u){var o,i=e(),l=null==u||null==u.initialValue?void 0:u.initialValue(v.$value),a=n(!1),c=t(0)[1];!a.current&&l&&l!==v&&(a.current=!0,v.$$value={id:i,newValue:l});var f=n(null!=(o="function"==typeof(null==u?void 0:u.select)?null==u||null==u.select?void 0:u.select():null==u?void 0:u.select)?o:[]),s=n(f.current.filter(function(e){return e.includes(".*")}).map(function(e){return e.replace(".*","")})),p=function(){c(function(e){return e+1})};return r(function(){null!=u&&u.setValueOnMount&&u.setValueOnMount(v.$value).then(function(e){v.$value=e}).catch(function(e){console.error("Error setting initial value on mount",e)})},[]),r(function(){var e=h.subscribe({id:i,next:function(e){var n=Array.isArray(e)?e:[e];if(null==u||!u.select)return p(),void(null==u||null==u.onChange||u.onChange(n));n.some(function(e){return"root"===e.change.fieldPath||f.current.includes(e.change.fieldPath)||s.current.find(function(n){return e.change.fieldPath.startsWith(n)})})&&(p(),null==u||null==u.onChange||u.onChange(n))}});return function(){e.unsubscribe()}},[null==u?void 0:u.select,null==u?void 0:u.onChange]),v}}}export{b as cervello,v as nonReactive};
1
+ import{useId as e,useRef as n,useState as t,useEffect as r}from"react";var u=Symbol("nonReactiveObject");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)}function o(e){if(!e||"object"!=typeof e)return e;var n={};return Array.isArray(e)?n=e.map(function(e){return o(e)}):function(e){if(!a(e))return!1;if(l(e))return!0;var n=Object.keys(e);return n.includes("tag")&&n.includes("containerInfo")||n.some(function(e){return e.startsWith("__reactContainer")})||n.includes("tag")&&n.includes("stateNode")}(e)?n=e:(Object.entries(e).forEach(function(e){n[e[0]]=o(e[1])}),Object.getOwnPropertySymbols(e).forEach(function(t){n[t]=e[t]})),n}var a=function(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)},l=function(e){return!!a(e)&&!!e.$$typeof};function c(e){return a(e)&&!l(e)&&!e[u]}"hasOwn"in Object||(Object.hasOwn=Object.call.bind(Object.hasOwnProperty));var f=Symbol("value");function s(e,n,t){var r,u;void 0===t&&(t={});var a=null!=(r=t.nestedFieldPath)?r:"root",l=((u={})[f]=n,u),v="root"===a?Object.fromEntries(Object.entries(n).filter(function(e){return"function"==typeof e[1]})):{};return new Proxy(l,{get:function(n,r,u){if("_$fieldPath"===r)return a;var i=Object.hasOwn(n,f)?n[f]:n;if("toJSON"===r)return function(){return h(i)};if("$value"===r)return o(i);var l=Reflect.get(i,r,u);if("symbol"==typeof r)return l;if("function"==typeof l)return l.bind(u);if(c(l)&&l!==i){var v;if(l._$fieldPath)return l;var b=s(e,l,{nestedFieldPath:a+"."+r,parentObjectToProxify:null!=(v=t.parentObjectToProxify)?v:i,afterChange:t.afterChange});return i[r]=b}return l},set:function(n,r,u,o){var l,s;if("symbol"==typeof r)return!0;var b=u,p=Object.hasOwn(n,f);if(p&&"$$value"===r){var y=n[f];return n[f]=b.newValue,e.next({storeValue:b.newValue,change:{fieldPath:"root",newValue:b.newValue,previousValue:y}},b.id),!0}if(p&&"$value"===r){var d=n[f];return b===d||JSON.stringify(h(b))===JSON.stringify(h(d))||("root"!==a?n[f]=b:(n[f]=i({},v,b),e.next({storeValue:n[f],change:{fieldPath:"root",newValue:b,previousValue:d}}))),!0}var g=p?n[f]:n,O=Reflect.get(g,r,o);if(O===b)return!0;c(b)&&null!=O&&O._$fieldPath?O.$value=b:Reflect.set(g,r,b,g);var j={storeValue:null!=(l=null==(s=t)?void 0:s.parentObjectToProxify)?l:g,change:{fieldPath:(a+"."+r).replace("root.",""),newValue:b,previousValue:O}};return e.next(j),null==t.afterChange||t.afterChange([j]),!0},has:function(e,n){return Reflect.has(e[f],n)},ownKeys:function(e){return Reflect.ownKeys(e[f])},getOwnPropertyDescriptor:function(e,n){return Reflect.getOwnPropertyDescriptor(e[f],n)}})}function h(e){var n={};return"object"!=typeof e||null==e?e:Array.isArray(e)?e.map(function(e){return h(e)}):l(e)?{props:h(e.props),type:"string"==typeof e.type?e.type:""}:null!=globalThis&&globalThis.HTMLElement&&e instanceof globalThis.HTMLElement?{type:"[HTMLElement]",content:e.innerHTML}:(Object.entries(e).forEach(function(e){n[e[0]]=h(e[1])}),n)}function v(e){return Object.defineProperty(e,u,{value:!0,enumerable:!1,writable:!1,configurable:!1}),e}function b(u,i){var a,l,c,f=(null!=i?i:{}).afterChange,h=o(u),v=(a=!1,l=[],c=[],{next:function(e,n){l.push({newValue:e,subscriberId:n}),a||(a=!0,Promise.resolve().then(function(){c.forEach(function(e){var n=l.filter(function(n){return n.subscriberId!==e.id});n.length&&e.next(n.map(function(e){return e.newValue}))}),l=[],a=!1}))},subscribe:function(e){return c.push(e),{unsubscribe:function(){c=c.filter(function(n){return n!==e})}}}}),b=s(v,h,{afterChange:f});return{store:b,reset:function(){b.$value=o(u)},useStore:function(u){var i,o=e(),a=null==u||null==u.initialValue?void 0:u.initialValue(b.$value),l=n(!1),c=t(0)[1];!l.current&&a&&a!==b&&(l.current=!0,b.$$value={id:o,newValue:a});var f=n(null!=(i="function"==typeof(null==u?void 0:u.select)?null==u||null==u.select?void 0:u.select():null==u?void 0:u.select)?i:[]),s=n(f.current.filter(function(e){return e.includes(".*")}).map(function(e){return e.replace(".*","")})),h=function(){c(function(e){return e+1})};return r(function(){null!=u&&u.setValueOnMount&&u.setValueOnMount(b.$value).then(function(e){b.$value=e}).catch(function(e){console.error("Error setting initial value on mount",e)})},[]),r(function(){var e=v.subscribe({id:o,next:function(e){var n=Array.isArray(e)?e:[e];if(null==u||!u.select)return h(),void(null==u||null==u.onChange||u.onChange(n));n.some(function(e){return"root"===e.change.fieldPath||f.current.includes(e.change.fieldPath)||s.current.find(function(n){return e.change.fieldPath.startsWith(n)})})&&(h(),null==u||null==u.onChange||u.onChange(n))}});return function(){e.unsubscribe()}},[null==u?void 0:u.select,null==u?void 0:u.onChange]),b}}}export{b as cervello,v as nonReactive};
2
2
  //# sourceMappingURL=cervello.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cervello.esm.js","sources":["../src/types/shared.ts","../src/lib/utils/object.ts","../src/lib/helpers/new-proxify-store.ts","../src/lib/store/new-index.ts","../src/lib/utils/subject.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\nexport type WithoutType<T, V, WithNever = {\n [K in keyof T]: Exclude<T[K], undefined> extends V\n ? never\n : (T[K] extends Record<string, unknown>\n ? WithoutType<T[K], V>\n : T[K])\n}> = Pick<WithNever, {\n [K in keyof WithNever]: WithNever[K] extends never ? never : K\n}[keyof WithNever]>\n\n\n\nexport type ObjectFromAttributes<T, Attributes extends Array< keyof WithoutType<T, Function> > > = {\n [k in Attributes[number]]: T[k]\n}\n\nexport type Maybe<T> = T | undefined\n\n\n\nexport type UseSelector<T> = <Attributes extends Array< Exclude<keyof WithoutType<T, Function>, '$value'> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n) => T\n\nexport type FieldPath<T extends Record<string, any>> = {\n [K in keyof Required<T>]: T[K] extends Record<string, any>\n ? K extends string\n\n ? T[K] extends Function\n ? never\n : T[K] extends Array<any>\n ? K\n : `${K}.*` | `${K}.${FieldPath<T[K]>}`\n : never\n : K extends string\n ? K\n : never\n}[keyof T]\n\nexport const nonReactiveObjectSymbol = Symbol('nonReactiveObject')\nexport type StoreChange<T extends Record<string, any>> = {\n change: {\n fieldPath: FieldPath<T>\n newValue: any\n previousValue: any\n }\n storeValue: T\n}\n// fromInit?: boolean\n","/* eslint-disable no-cond-assign */\n\nimport { nonReactiveObjectSymbol } from '../../types/shared'\nimport { INTERNAL_VALUE_PROP } from '../helpers/constants'\n\n\n/**\n * Clones all the provided object and nested properties and it also\n * iterates nested arrays to deepClone them\n *\n * @param obj - base object to be cloned\n * @returns new cloned object with new reference\n */\nexport function deepClone <T> (obj: T): T {\n if (!obj || typeof obj !== 'object')\n return obj\n\n let newObj = {} as any\n\n if (Array.isArray(obj)) {\n newObj = obj.map(item => deepClone(item))\n } else if (!isReactObjectLikeNode(obj)) {\n Object.entries(obj).forEach(([key, value]) => {\n newObj[key] = deepClone(value)\n })\n Object.getOwnPropertySymbols(obj).forEach((symbol) => {\n newObj[symbol] = (obj as any)[symbol]\n })\n } else {\n newObj = obj\n }\n\n return newObj as T\n}\n\n// function copyBuffer (cur: ArrayBufferView) {\n// if (cur instanceof Buffer)\n// return Buffer.from(cur)\n//\n//\n// return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)\n// }\n\n\n// INFO: From `rfdc` (really-fast-deep-clone) package for faster cloning taking care of circular references\nexport function deepClone2 <T> (obj: T): T {\n const refs: Array<any> = []\n const refsNew: Array<any> = []\n\n const constructorHandlers = new Map()\n\n constructorHandlers.set(Date, (o: string | number | Date) => new Date(o))\n constructorHandlers.set(Map, (o: Iterable<unknown> | ArrayLike<unknown>, fn: any) => new Map(cloneArray(Array.from(o), fn)))\n constructorHandlers.set(Set, (o: Iterable<unknown> | ArrayLike<unknown>, fn: any) => new Set(cloneArray(Array.from(o), fn)))\n\n let handler = null\n\n return clone(obj)\n\n function cloneArray (a: any, fn: any): any {\n const keys = Object.keys(a)\n const a2 = new Array(keys.length) as any\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i]\n const cur = a[k]\n\n if (typeof cur !== 'object' || cur === null) {\n a2[k] = cur\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n a2[k] = handler(cur, fn)\n // } else if (ArrayBuffer.isView(cur)) {\n // a2[k] = copyBuffer(cur)\n } else {\n const index = refs.indexOf(cur)\n\n if (index !== -1)\n a2[k] = refsNew[index]\n else\n a2[k] = fn(cur)\n }\n }\n\n return a2\n }\n\n function clone (o: any): any {\n if (typeof o !== 'object' || o === null) return o\n if (Array.isArray(o)) return cloneArray(o, clone)\n if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor)))\n return handler(o, clone)\n\n const o2 = {} as any\n\n refs.push(o)\n refsNew.push(o2)\n\n\n Object.getOwnPropertySymbols(o).forEach((symbol) => {\n o2[symbol] = (o)[symbol]\n })\n\n for (const k in o) {\n if (!Object.hasOwnProperty.call(o, k)) continue\n const cur = o[k]\n\n\n if (typeof cur !== 'object' || cur === null) {\n o2[k] = cur\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n o2[k] = handler(cur, clone)\n // } else if (ArrayBuffer.isView(cur)) {\n // o2[k] = copyBuffer(cur)\n } else {\n const i = refs.indexOf(cur)\n\n if (i !== -1)\n o2[k] = refsNew[i]\n else\n o2[k] = clone(cur)\n }\n }\n refs.pop()\n refsNew.pop()\n\n\n return o2\n }\n}\n\n/**\n * Guard to check is variable is an object\n * @param obj - variable to be checked\n * @returns boolean\n */\nexport const isObject = (obj: unknown): obj is Record<string | symbol, unknown> => (\n obj !== null\n && typeof obj === 'object'\n && !Array.isArray(obj)\n)\n\n\nexport const isReactElement = (obj: unknown): boolean => {\n if (!isObject(obj)) return false\n\n return !!(obj.$$typeof)\n}\n\n\nexport function isReactObjectLikeNode (obj: unknown): boolean {\n if (!isObject(obj)) return false\n if (isReactElement(obj)) return true\n\n const objKeys = Object.keys(obj)\n const isReactObjNode = (objKeys.includes('tag') && objKeys.includes('containerInfo'))\n || objKeys.some(k => k.startsWith('__reactContainer'))\n || (objKeys.includes('tag') && objKeys.includes('stateNode'))\n\n return isReactObjNode\n}\n\n\nexport function isValidReactiveObject <T extends Record<string, any>> (value: T): boolean {\n return isObject(value) && !isReactElement(value) && !(value as any)[nonReactiveObjectSymbol]\n}\n\n\n\n/**\n * Returns the actual target value instead of root\n * object with internals props like $$value$$\n *\n * @param target - object from subscription or proxy\n * @returns actual value\n */\nexport const okTarget = (target: any): any => target[INTERNAL_VALUE_PROP] ?? target\n\n\n\n\n/**\n * Gets an object with just the properties requested\n * instead of the full object\n *\n * @param properties - object properties\n * @param obj - target to get the properties\n * @returns New object with just the requested properties\n */\nexport function getPartialObjectFromProperties<T> (properties: Array<keyof T>, obj: T): any {\n return properties.reduce<any>((acc, curr) => {\n acc[curr] = obj[curr]\n\n return acc\n }, {})\n}\n\n\n\nconst stringify = (obj: any): string => JSON.stringify(obj)\n\n/**\n * Compare 2 provided objects by stringing them\n * @param a - first object\n * @param b - second object\n * @returns boolean\n */\nexport const contentComparer = (a: any, b: any): boolean => stringify(a) === stringify(b)\n","\nimport { deepClone, isReactElement, isValidReactiveObject } from '../utils/object'\n\nimport type { StoreChange } from '../../types/shared'\nimport type { CacheableSubject } from '../utils/subject'\n\n\n\n// @ts-expect-error - Object.hasOwn is not defined in older Safari's browsers\n('hasOwn' in Object) || (Object.hasOwn = Object.call.bind(Object.hasOwnProperty))\n\nconst ROOT_VALUE = Symbol('value')\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (\n store$$: CacheableSubject<StoreChange<T>>,\n objectToProxify: T,\n opts: {\n nestedFieldPath?: string\n parentObjectToProxify?: any\n // beforeChange?: (storeChange: StoreChange<T>) => any\n afterChange?: (storeChange: Array<StoreChange<T>>) => void\n } = {},\n): T {\n const fieldPath = opts.nestedFieldPath ?? 'root'\n\n const objectWithRootValue = {\n [ROOT_VALUE]: objectToProxify,\n } as unknown as T\n\n const rootFunctions = fieldPath === 'root'\n ? Object.fromEntries(Object.entries(objectToProxify).filter(([,v]) => typeof v === 'function'))\n : {}\n\n return new Proxy(objectWithRootValue, {\n get (targetObject, propName, receiver) {\n // INFO: !Internal only.\n // Used to get the fieldPath of the object (it means it's a proxified object)\n if (propName === '_$fieldPath') return fieldPath\n\n const isRootTarget = Object.hasOwn(targetObject, ROOT_VALUE)\n const target = isRootTarget ? targetObject[ROOT_VALUE] : targetObject\n\n\n // Called when the object is converted to JSON or string (i.e. JSON.stringify)\n if (propName === 'toJSON') {\n return () => {\n // Remove react-elements with circular which have circular references\n // before stringifying to prevent JSON.stringify(storeProxy) from failing\n return safeToJson(target)\n // return removeCircularReferences(target)\n }\n }\n\n // Get the whole store value without proxies\n if (propName === '$value')\n return deepClone(target)\n // return target\n\n\n\n const propertyValue = Reflect.get(target, propName, receiver)\n\n if (typeof propName === 'symbol') return propertyValue\n\n if (typeof propertyValue === 'function')\n return (propertyValue as () => any).bind(receiver)\n\n\n // Check if it's correct to be a reactive object\n // & is not a circular reference or the same object\n if (isValidReactiveObject(propertyValue) && propertyValue !== target) {\n // const newNestedFieldPath = `${fieldPath}.${propName}`\n\n // If it's already a proxified object, return it\n // if (propertyValue._$fieldPath === newNestedFieldPath) return propertyValue\n if (propertyValue._$fieldPath) return propertyValue\n\n // Create a new proxified object\n const proxiedNestedObject = proxifyStore(\n store$$ as any,\n propertyValue,\n {\n nestedFieldPath: `${fieldPath}.${propName}`,\n parentObjectToProxify: opts.parentObjectToProxify ?? target,\n // beforeChange: opts.beforeChange,\n afterChange: opts.afterChange,\n },\n )\n\n return target[propName] = proxiedNestedObject\n }\n\n return propertyValue\n },\n\n\n set (parentObject, key, newValue, receiver) {\n if (typeof key === 'symbol') return true\n\n const value = newValue\n const isRootTarget = Object.hasOwn(parentObject, ROOT_VALUE)\n\n // INFO: !Internal only.\n // Used to set the value of the store without notifying the store\n if (isRootTarget && key === '$$value') {\n const previousValue = parentObject[ROOT_VALUE];\n\n (parentObject as any)[ROOT_VALUE] = value.newValue\n\n store$$.next({\n // fromInit: true,\n storeValue: value.newValue,\n change: {\n fieldPath: 'root' as any,\n newValue: value.newValue,\n previousValue,\n },\n }, value.id)\n\n return true\n }\n\n if (isRootTarget && key === '$value') {\n const previousValue = parentObject[ROOT_VALUE]\n\n if (value === previousValue) return true\n\n if (safeStringify(value) === safeStringify(previousValue)) return true\n // if (JSON.stringify(value) === JSON.stringify(previousValue)) return true\n\n if (fieldPath !== 'root') {\n (parentObject as any)[ROOT_VALUE] = value\n } else {\n (parentObject as any)[ROOT_VALUE] = {\n ...rootFunctions,\n ...value,\n }\n store$$.next({\n // To be disabled for performance and send same store reference\n // storeValue: JSON.parse(JSON.stringify(targetObject[ROOT_VALUE])),\n storeValue: parentObject[ROOT_VALUE],\n change: {\n fieldPath: 'root' as any,\n newValue: value,\n previousValue,\n },\n })\n }\n\n return true\n }\n\n const realInnerObject = isRootTarget ? parentObject[ROOT_VALUE] : parentObject\n const previousValue = Reflect.get(realInnerObject, key, receiver)\n\n\n if (previousValue === value) return true\n\n\n // New object values, check if the field has already a proxy created to use it instead of reacreating a new instance\n if (isValidReactiveObject(value) && previousValue?._$fieldPath)\n previousValue.$value = value\n else\n Reflect.set(realInnerObject, key, value, realInnerObject)\n\n\n const nextStoreChange = {\n // To be disabled for performance and send same store reference\n // storeValue: JSON.parse(JSON.stringify(opts?.parentObjectToProxify ?? target)),\n storeValue: opts?.parentObjectToProxify ?? realInnerObject,\n change: {\n fieldPath: `${fieldPath}.${key}`.replace('root.', '') as any,\n newValue: value,\n previousValue,\n },\n }\n\n store$$.next(nextStoreChange)\n opts.afterChange?.([nextStoreChange])\n\n return true\n },\n\n has (t, p) {\n return Reflect.has(t[ROOT_VALUE], p)\n },\n\n ownKeys (t) {\n return Reflect.ownKeys(t[ROOT_VALUE])\n },\n\n getOwnPropertyDescriptor (t, p) {\n return Reflect.getOwnPropertyDescriptor(t[ROOT_VALUE], p)\n },\n\n })\n}\n\n\n// function getDeepUnproxiedObject (obj: any): any {\n// if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n// if (obj[ROOT_VALUE]?.[ROOT_VALUE]) {\n// console.warn('Circular reference detected in getDeepUnproxiedObject')\n//\n// return '[Circular reference]'\n// }\n//\n//\n// const r = Object.fromEntries(\n// Object.entries(obj).map(([key, value]) => {\n// // console.log('____________________getDeepUnproxiedObject', key, value, value.constructor.name)\n// if (value && typeof value === 'object' && !Array.isArray(value)) {\n// if (key === 'links') console.log('getDeepUnproxiedObject', key, value)\n//\n// // If it's a proxied object, get the unproxied value\n// return [key, getDeepUnproxiedObject(value)]\n// }\n//\n// return [key, value]\n// }),\n// )\n//\n//\n// return r\n// }\n//\n// return obj\n// }\n\nexport function safeStringify (obj: any): string {\n // use removeCircularReferences to avoid circular references\n // const cleanedObj = removeCircularReferences(obj)\n\n return JSON.stringify(\n obj,\n (_key, value) => {\n if (Array.isArray(value)) return value.map(i => safeStringify(i))\n\n if (isReactElement(value)) {\n // console.log('React element detected', value)\n\n return { props: safeStringify(value.props), type: typeof value.type === 'string' ? value.type : '' }\n }\n\n if (globalThis?.HTMLElement && value instanceof globalThis.HTMLElement) return { type: '[HTMLElement]', content: value.innerHTML }\n\n // console.log('Value', value)\n\n return value\n })\n}\n\n\nfunction safeToJson (obj: any): Record<string, any> {\n const o: Record<string, any> = {}\n\n if (typeof obj !== 'object' || obj == null)\n return obj\n\n if (Array.isArray(obj))\n return obj.map(item => safeToJson(item))\n\n if (isReactElement(obj))\n return { props: safeToJson(obj.props), type: typeof obj.type === 'string' ? obj.type : '' }\n\n if (globalThis?.HTMLElement && obj instanceof globalThis.HTMLElement) return { type: '[HTMLElement]', content: obj.innerHTML }\n\n Object.entries(obj).forEach(([key, v]) => {\n o[key] = safeToJson(v)\n })\n\n return o\n}\n\n\n// function removeCircularReferences (obj: any): any {\n// const seen = new WeakSet()\n//\n// function traverse (value: any): any {\n// if (value && typeof value === 'object') {\n// // If the object has already been seen, it's a circular reference\n// if (seen.has(value))\n// return null\n//\n// seen.add(value)\n//\n// if (Array.isArray(value))\n// return value.map(traverse)\n//\n//\n// const result: any = {}\n//\n// for (const key in value) {\n// if (Object.prototype.hasOwnProperty.call(value, key)) {\n// if (key === '_owner' && value.$$typeof) continue\n//\n// result[key] = traverse(value[key])\n// }\n// }\n//\n// return result\n// }\n//\n// // Return primitive values as-is\n// return value\n// }\n//\n// return traverse(obj)\n// }\n","\nimport { useEffect, useId, useRef, useState } from 'react'\n\nimport { nonReactiveObjectSymbol } from '../../types/shared'\nimport { proxifyStore } from '../helpers/new-proxify-store'\nimport { deepClone } from '../utils/object'\nimport { createCacheableSubject } from '../utils/subject'\n\nimport type { FieldPath, StoreChange } from '../../types/shared'\n\n\n\n\n// export type CervelloOptions<StoreValue extends Record<string, any>> = {\n// beforeChange?: (storeChange: StoreChange<StoreValue>) => unknown | undefined\n// afterChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n// }\n\nexport type CervelloOptions<StoreValue extends Record<string, any>> = {\n afterChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n}\n\nexport type CervelloUseStoreOptions<StoreValue extends Record<string, any>> = {\n initialValue?: (currentStore: StoreValue) => StoreValue | null,\n setValueOnMount?: (currentStore: StoreValue) => Promise<StoreValue>,\n select?:\n | Array<FieldPath<StoreValue>>\n | (() => Array<FieldPath<StoreValue>>)\n onChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n}\n\ntype MutableStoreValue<T extends Record<string, any>> = {\n $value: T\n} & T\n\n\n\n\n\n\n\n\nexport function nonReactive <T extends Record<string, any>> (initialValue: T): T {\n Object.defineProperty(initialValue, nonReactiveObjectSymbol, {\n value: true,\n enumerable: false,\n writable: false,\n configurable: false,\n })\n\n return initialValue\n}\n\n\nexport function cervello <StoreValue extends Record<PropertyKey, any>> (\n initialValue: StoreValue,\n options?: CervelloOptions<StoreValue>,\n): {\n store: MutableStoreValue<StoreValue>,\n reset: () => void,\n useStore: (options?: CervelloUseStoreOptions<StoreValue>) => MutableStoreValue<StoreValue>\n } {\n const {\n // beforeChange,\n afterChange,\n } = options ?? {}\n\n // const store$$ = createCacheableSubject<StoreChange<StoreValue>>(clonedInitialValue as any)\n const store$$ = createCacheableSubject<StoreChange<StoreValue>>()\n const clonedInitialValue = deepClone(initialValue)\n\n const proxiedStore = proxifyStore(\n store$$ as any,\n clonedInitialValue,\n // { beforeChange, afterChange },\n { afterChange },\n ) as MutableStoreValue<StoreValue>\n\n\n return {\n store: proxiedStore,\n reset: () => {\n proxiedStore.$value = deepClone(initialValue)\n },\n useStore: (options) => {\n const subscriberId = useId()\n const initialValue = options?.initialValue?.(proxiedStore.$value)\n const isInitialValueSet = useRef(false)\n const [, setRenderCount] = useState(0)\n\n if (!isInitialValueSet.current && initialValue && initialValue !== proxiedStore) {\n isInitialValueSet.current = true;\n (proxiedStore as any).$$value = { id: subscriberId, newValue: initialValue }\n }\n\n const selectFieldPaths = useRef(\n (typeof options?.select === 'function'\n ? options?.select?.()\n : options?.select)\n ?? [],\n )\n\n\n const selectedFieldPathsForNestedObjects = useRef(\n selectFieldPaths.current\n .filter(fp => fp.includes('.*'))\n .map(fp => fp.replace('.*', '')),\n )\n\n const reRender = (): void => {\n setRenderCount(p => p + 1)\n }\n\n\n useEffect(() => {\n if (options?.setValueOnMount) {\n void options.setValueOnMount(proxiedStore.$value).then((value) => {\n proxiedStore.$value = value\n }).catch((err) => {\n console.error('Error setting initial value on mount', err)\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n\n // Same implementation as useSyncExternalStore but with useEffect\n useEffect(() => {\n const subscription = store$$.subscribe({\n id: subscriberId,\n next: (sc) => {\n const storeChanges = Array.isArray(sc)\n ? sc as Array<StoreChange<StoreValue>>\n : [sc]\n\n if (!options?.select) {\n reRender()\n options?.onChange?.(storeChanges)\n\n return\n }\n\n if (storeChanges.some(nextChange => (\n nextChange.change.fieldPath === 'root'\n || selectFieldPaths.current.includes(nextChange.change.fieldPath))\n || selectedFieldPathsForNestedObjects.current.find(fp => nextChange.change.fieldPath.startsWith(fp)),\n )) {\n reRender()\n options?.onChange?.(storeChanges)\n }\n },\n })\n\n return () => {\n subscription.unsubscribe()\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options?.select, options?.onChange])\n\n return proxiedStore\n },\n }\n}\n","\ntype Noop = () => void\n\n\ntype Observer<T> = {\n id: string\n next: (value: T, subscriberId?: string) => void\n}\n\ntype Subscription = {\n unsubscribe: Noop\n}\n\nexport type CacheableSubject<T> = {\n // getValue: () => T\n subscribe: (value: Observer<T>) => Subscription\n // unSubscribeAll: Noop\n} & Omit<Observer<T>, 'id'>\n\n\n\nexport function createCacheableSubject<T> (/* defaultValue: T/*, getValueOnSubscribe = false */): CacheableSubject<T> {\n let isFlushing = false\n let itemsToFlush: Array<{ newValue: T, subscriberId?: string }> = []\n\n let observerList: Array<Observer<T>> = []\n // let value = defaultValue\n\n // const getValue = (): T => value\n\n const next = (newValue: T, subscriberId?: string): void => {\n // value = newValue\n\n itemsToFlush.push({ newValue, subscriberId })\n\n if (!isFlushing) {\n isFlushing = true\n\n void Promise.resolve().then(() => {\n observerList.forEach((o) => {\n // Filter changes that were sent by the same subscriberId (initialValue function call)\n const nonInitiallySentBySubscriber = itemsToFlush.filter(item => item.subscriberId !== o.id)\n\n if (!nonInitiallySentBySubscriber.length) return\n\n o.next(nonInitiallySentBySubscriber.map(i => i.newValue) as T)\n })\n itemsToFlush = []\n isFlushing = false\n })\n\n // void Promise.resolve(subscriberId).then((subscriberId) => {\n // console.log('//// promise.resolve then', { subscriberId: s.id })\n // observerList.forEach((o) => {\n // console.log('//// CacheableSubject (forEach) flushing', { observerId: o.id, subscriberId: s.id })\n // if (o.id === subscriberId) return\n //\n // o.next(itemsToFlush as T)\n // })\n // itemsToFlush = []\n // isFlushing = false\n // })\n\n // void Promise.resolve().then(() => {\n // console.log('//// promise.resolve then')\n // observerList.forEach((o) => {\n // const nonInitiallySentBySubscriber = itemsToFlush.filter(item => item.subscriberId !== o.id)\n //\n // if (nonInitiallySentBySubscriber.length === 0) return\n //\n // o.next(nonInitiallySentBySubscriber.map(i => i.newValue) as T)\n // })\n // itemsToFlush = []\n // isFlushing = false\n // })\n }\n }\n\n const subscribe = (observer: Observer<T>): Subscription => {\n // Push cached value on subscribe\n // if (getValueOnSubscribe) observer.next(value)\n\n // Store the observer to be notified\n observerList.push(observer)\n\n return {\n unsubscribe: () => {\n observerList = observerList.filter(o => o !== observer)\n },\n }\n }\n\n // const unSubscribeAll = (): void => {\n // observerList = []\n // }\n\n return {\n // getValue,\n next,\n subscribe,\n // unSubscribeAll,\n }\n}\n"],"names":["nonReactiveObjectSymbol","Symbol","obj","newObj","Array","isArray","map","item","deepClone","isReactObjectLikeNode","isObject","isReactElement","objKeys","Object","keys","includes","some","k","startsWith","entries","forEach","_ref","getOwnPropertySymbols","symbol","$$typeof","isValidReactiveObject","value","hasOwn","call","bind","hasOwnProperty","ROOT_VALUE","proxifyStore","store$$","objectToProxify","opts","_opts$nestedFieldPath","_objectWithRootValue","fieldPath","nestedFieldPath","objectWithRootValue","rootFunctions","fromEntries","filter","Proxy","get","targetObject","propName","receiver","target","safeToJson","propertyValue","Reflect","_opts$parentObjectToP","_$fieldPath","proxiedNestedObject","parentObjectToProxify","afterChange","set","parentObject","key","newValue","isRootTarget","_previousValue","next","storeValue","change","previousValue","id","_previousValue2","safeStringify","realInnerObject","$value","nextStoreChange","_opts","_opts$parentObjectToP2","replace","has","t","p","ownKeys","getOwnPropertyDescriptor","JSON","stringify","_key","i","props","type","globalThis","HTMLElement","content","innerHTML","_ref2","o","nonReactive","initialValue","defineProperty","enumerable","writable","configurable","cervello","options","isFlushing","itemsToFlush","observerList","subscriberId","push","Promise","resolve","then","nonInitiallySentBySubscriber","length","subscribe","observer","unsubscribe","clonedInitialValue","proxiedStore","store","reset","useStore","useId","isInitialValueSet","useRef","setRenderCount","useState","current","$$value","selectFieldPaths","select","selectedFieldPathsForNestedObjects","fp","reRender","useEffect","setValueOnMount","err","console","error","subscription","sc","storeChanges","onChange","nextChange","find"],"mappings":"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"}
1
+ {"version":3,"file":"cervello.esm.js","sources":["../src/types/shared.ts","../src/lib/utils/object.ts","../src/lib/helpers/new-proxify-store.ts","../src/lib/store/new-index.ts","../src/lib/utils/subject.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\nexport type WithoutType<T, V, WithNever = {\n [K in keyof T]: Exclude<T[K], undefined> extends V\n ? never\n : (T[K] extends Record<string, unknown>\n ? WithoutType<T[K], V>\n : T[K])\n}> = Pick<WithNever, {\n [K in keyof WithNever]: WithNever[K] extends never ? never : K\n}[keyof WithNever]>\n\n\n\nexport type ObjectFromAttributes<T, Attributes extends Array< keyof WithoutType<T, Function> > > = {\n [k in Attributes[number]]: T[k]\n}\n\nexport type Maybe<T> = T | undefined\n\n\n\nexport type UseSelector<T> = <Attributes extends Array< Exclude<keyof WithoutType<T, Function>, '$value'> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n) => T\n\nexport type FieldPath<T extends Record<string, any>> = {\n [K in keyof Required<T>]: T[K] extends Record<string, any>\n ? K extends string\n\n ? T[K] extends Function\n ? never\n : T[K] extends Array<any>\n ? K\n : `${K}.*` | `${K}.${FieldPath<T[K]>}`\n : never\n : K extends string\n ? K\n : never\n}[keyof T]\n\nexport const nonReactiveObjectSymbol = Symbol('nonReactiveObject')\nexport type StoreChange<T extends Record<string, any>> = {\n change: {\n fieldPath: FieldPath<T>\n newValue: any\n previousValue: any\n }\n storeValue: T\n}\n// fromInit?: boolean\n","/* eslint-disable no-cond-assign */\n\nimport { nonReactiveObjectSymbol } from '../../types/shared'\nimport { INTERNAL_VALUE_PROP } from '../helpers/constants'\n\n\n/**\n * Clones all the provided object and nested properties and it also\n * iterates nested arrays to deepClone them\n *\n * @param obj - base object to be cloned\n * @returns new cloned object with new reference\n */\nexport function deepClone <T> (obj: T): T {\n if (!obj || typeof obj !== 'object')\n return obj\n\n let newObj = {} as any\n\n if (Array.isArray(obj)) {\n newObj = obj.map(item => deepClone(item))\n } else if (!isReactObjectLikeNode(obj)) {\n Object.entries(obj).forEach(([key, value]) => {\n newObj[key] = deepClone(value)\n })\n Object.getOwnPropertySymbols(obj).forEach((symbol) => {\n newObj[symbol] = (obj as any)[symbol]\n })\n } else {\n newObj = obj\n }\n\n return newObj as T\n}\n\n// function copyBuffer (cur: ArrayBufferView) {\n// if (cur instanceof Buffer)\n// return Buffer.from(cur)\n//\n//\n// return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)\n// }\n\n\n// INFO: From `rfdc` (really-fast-deep-clone) package for faster cloning taking care of circular references\nexport function deepClone2 <T> (obj: T): T {\n const refs: Array<any> = []\n const refsNew: Array<any> = []\n\n const constructorHandlers = new Map()\n\n constructorHandlers.set(Date, (o: string | number | Date) => new Date(o))\n constructorHandlers.set(Map, (o: Iterable<unknown> | ArrayLike<unknown>, fn: any) => new Map(cloneArray(Array.from(o), fn)))\n constructorHandlers.set(Set, (o: Iterable<unknown> | ArrayLike<unknown>, fn: any) => new Set(cloneArray(Array.from(o), fn)))\n\n let handler = null\n\n return clone(obj)\n\n function cloneArray (a: any, fn: any): any {\n const keys = Object.keys(a)\n const a2 = new Array(keys.length) as any\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i]\n const cur = a[k]\n\n if (typeof cur !== 'object' || cur === null) {\n a2[k] = cur\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n a2[k] = handler(cur, fn)\n // } else if (ArrayBuffer.isView(cur)) {\n // a2[k] = copyBuffer(cur)\n } else {\n const index = refs.indexOf(cur)\n\n if (index !== -1)\n a2[k] = refsNew[index]\n else\n a2[k] = fn(cur)\n }\n }\n\n return a2\n }\n\n function clone (o: any): any {\n if (typeof o !== 'object' || o === null) return o\n if (Array.isArray(o)) return cloneArray(o, clone)\n if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor)))\n return handler(o, clone)\n\n const o2 = {} as any\n\n refs.push(o)\n refsNew.push(o2)\n\n\n Object.getOwnPropertySymbols(o).forEach((symbol) => {\n o2[symbol] = (o)[symbol]\n })\n\n for (const k in o) {\n if (!Object.hasOwnProperty.call(o, k)) continue\n const cur = o[k]\n\n\n if (typeof cur !== 'object' || cur === null) {\n o2[k] = cur\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n o2[k] = handler(cur, clone)\n // } else if (ArrayBuffer.isView(cur)) {\n // o2[k] = copyBuffer(cur)\n } else {\n const i = refs.indexOf(cur)\n\n if (i !== -1)\n o2[k] = refsNew[i]\n else\n o2[k] = clone(cur)\n }\n }\n refs.pop()\n refsNew.pop()\n\n\n return o2\n }\n}\n\n/**\n * Guard to check is variable is an object\n * @param obj - variable to be checked\n * @returns boolean\n */\nexport const isObject = (obj: unknown): obj is Record<string | symbol, unknown> => (\n obj !== null\n && typeof obj === 'object'\n && !Array.isArray(obj)\n)\n\n\nexport const isReactElement = (obj: unknown): boolean => {\n if (!isObject(obj)) return false\n\n return !!(obj.$$typeof)\n}\n\n\nexport function isReactObjectLikeNode (obj: unknown): boolean {\n if (!isObject(obj)) return false\n if (isReactElement(obj)) return true\n\n const objKeys = Object.keys(obj)\n const isReactObjNode = (objKeys.includes('tag') && objKeys.includes('containerInfo'))\n || objKeys.some(k => k.startsWith('__reactContainer'))\n || (objKeys.includes('tag') && objKeys.includes('stateNode'))\n\n return isReactObjNode\n}\n\n\nexport function isValidReactiveObject <T extends Record<string, any>> (value: T): boolean {\n return isObject(value) && !isReactElement(value) && !(value as any)[nonReactiveObjectSymbol]\n}\n\n\n\n/**\n * Returns the actual target value instead of root\n * object with internals props like $$value$$\n *\n * @param target - object from subscription or proxy\n * @returns actual value\n */\nexport const okTarget = (target: any): any => target[INTERNAL_VALUE_PROP] ?? target\n\n\n\n\n/**\n * Gets an object with just the properties requested\n * instead of the full object\n *\n * @param properties - object properties\n * @param obj - target to get the properties\n * @returns New object with just the requested properties\n */\nexport function getPartialObjectFromProperties<T> (properties: Array<keyof T>, obj: T): any {\n return properties.reduce<any>((acc, curr) => {\n acc[curr] = obj[curr]\n\n return acc\n }, {})\n}\n\n\n\nconst stringify = (obj: any): string => JSON.stringify(obj)\n\n/**\n * Compare 2 provided objects by stringing them\n * @param a - first object\n * @param b - second object\n * @returns boolean\n */\nexport const contentComparer = (a: any, b: any): boolean => stringify(a) === stringify(b)\n","\nimport { deepClone, isReactElement, isValidReactiveObject } from '../utils/object'\n\nimport type { StoreChange } from '../../types/shared'\nimport type { CacheableSubject } from '../utils/subject'\n\n\n\n// @ts-expect-error - Object.hasOwn is not defined in older Safari's browsers\n('hasOwn' in Object) || (Object.hasOwn = Object.call.bind(Object.hasOwnProperty))\n\nconst ROOT_VALUE = Symbol('value')\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (\n store$$: CacheableSubject<StoreChange<T>>,\n objectToProxify: T,\n opts: {\n nestedFieldPath?: string\n parentObjectToProxify?: any\n // beforeChange?: (storeChange: StoreChange<T>) => any\n afterChange?: (storeChange: Array<StoreChange<T>>) => void\n } = {},\n): T {\n const fieldPath = opts.nestedFieldPath ?? 'root'\n\n const objectWithRootValue = {\n [ROOT_VALUE]: objectToProxify,\n } as unknown as T\n\n const rootFunctions = fieldPath === 'root'\n ? Object.fromEntries(Object.entries(objectToProxify).filter(([,v]) => typeof v === 'function'))\n : {}\n\n return new Proxy(objectWithRootValue, {\n get (targetObject, propName, receiver) {\n // INFO: !Internal only.\n // Used to get the fieldPath of the object (it means it's a proxified object)\n if (propName === '_$fieldPath') return fieldPath\n\n const isRootTarget = Object.hasOwn(targetObject, ROOT_VALUE)\n const target = isRootTarget ? targetObject[ROOT_VALUE] : targetObject\n\n\n // Called when the object is converted to JSON or string (i.e. JSON.stringify)\n if (propName === 'toJSON') {\n return () => {\n // Remove react-elements with circular which have circular references\n // before stringifying to prevent JSON.stringify(storeProxy) from failing\n return safeToJson(target)\n // return removeCircularReferences(target)\n }\n }\n\n // Get the whole store value without proxies\n if (propName === '$value')\n return deepClone(target)\n // return target\n\n\n\n const propertyValue = Reflect.get(target, propName, receiver)\n\n if (typeof propName === 'symbol') return propertyValue\n\n if (typeof propertyValue === 'function')\n return (propertyValue as () => any).bind(receiver)\n\n\n // Check if it's correct to be a reactive object\n // & is not a circular reference or the same object\n if (isValidReactiveObject(propertyValue) && propertyValue !== target) {\n // const newNestedFieldPath = `${fieldPath}.${propName}`\n\n // If it's already a proxified object, return it\n // if (propertyValue._$fieldPath === newNestedFieldPath) return propertyValue\n if (propertyValue._$fieldPath) return propertyValue\n\n // Create a new proxified object\n const proxiedNestedObject = proxifyStore(\n store$$ as any,\n propertyValue,\n {\n nestedFieldPath: `${fieldPath}.${propName}`,\n parentObjectToProxify: opts.parentObjectToProxify ?? target,\n // beforeChange: opts.beforeChange,\n afterChange: opts.afterChange,\n },\n )\n\n return target[propName] = proxiedNestedObject\n }\n\n return propertyValue\n },\n\n\n set (parentObject, key, newValue, receiver) {\n if (typeof key === 'symbol') return true\n\n const value = newValue\n const isRootTarget = Object.hasOwn(parentObject, ROOT_VALUE)\n\n // INFO: !Internal only.\n // Used to set the value of the store without notifying the store\n if (isRootTarget && key === '$$value') {\n const previousValue = parentObject[ROOT_VALUE];\n\n (parentObject as any)[ROOT_VALUE] = value.newValue\n\n store$$.next({\n storeValue: value.newValue,\n change: {\n fieldPath: 'root' as any,\n newValue: value.newValue,\n previousValue,\n },\n }, value.id)\n\n return true\n }\n\n if (isRootTarget && key === '$value') {\n const previousValue = parentObject[ROOT_VALUE]\n\n if (value === previousValue) return true\n\n if (JSON.stringify(safeToJson(value)) === JSON.stringify(safeToJson(previousValue))) return true\n // if (safeStringify(value) === safeStringify(previousValue)) return true\n\n if (fieldPath !== 'root') {\n (parentObject as any)[ROOT_VALUE] = value\n } else {\n (parentObject as any)[ROOT_VALUE] = {\n ...rootFunctions,\n ...value,\n }\n store$$.next({\n // To be disabled for performance and send same store reference\n // storeValue: JSON.parse(JSON.stringify(targetObject[ROOT_VALUE])),\n storeValue: parentObject[ROOT_VALUE],\n change: {\n fieldPath: 'root' as any,\n newValue: value,\n previousValue,\n },\n })\n }\n\n return true\n }\n\n const realInnerObject = isRootTarget ? parentObject[ROOT_VALUE] : parentObject\n const previousValue = Reflect.get(realInnerObject, key, receiver)\n\n\n if (previousValue === value) return true\n\n\n // New object values, check if the field has already a proxy created to use it instead of reacreating a new instance\n if (isValidReactiveObject(value) && previousValue?._$fieldPath)\n previousValue.$value = value\n else\n Reflect.set(realInnerObject, key, value, realInnerObject)\n\n\n const nextStoreChange = {\n // To be disabled for performance and send same store reference\n // storeValue: JSON.parse(JSON.stringify(opts?.parentObjectToProxify ?? target)),\n storeValue: opts?.parentObjectToProxify ?? realInnerObject,\n change: {\n fieldPath: `${fieldPath}.${key}`.replace('root.', '') as any,\n newValue: value,\n previousValue,\n },\n }\n\n store$$.next(nextStoreChange)\n opts.afterChange?.([nextStoreChange])\n\n return true\n },\n\n has (t, p) {\n return Reflect.has(t[ROOT_VALUE], p)\n },\n\n ownKeys (t) {\n return Reflect.ownKeys(t[ROOT_VALUE])\n },\n\n getOwnPropertyDescriptor (t, p) {\n return Reflect.getOwnPropertyDescriptor(t[ROOT_VALUE], p)\n },\n\n })\n}\n\n\n// function getDeepUnproxiedObject (obj: any): any {\n// if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n// if (obj[ROOT_VALUE]?.[ROOT_VALUE]) {\n// console.warn('Circular reference detected in getDeepUnproxiedObject')\n//\n// return '[Circular reference]'\n// }\n//\n//\n// const r = Object.fromEntries(\n// Object.entries(obj).map(([key, value]) => {\n// // console.log('____________________getDeepUnproxiedObject', key, value, value.constructor.name)\n// if (value && typeof value === 'object' && !Array.isArray(value)) {\n// if (key === 'links') console.log('getDeepUnproxiedObject', key, value)\n//\n// // If it's a proxied object, get the unproxied value\n// return [key, getDeepUnproxiedObject(value)]\n// }\n//\n// return [key, value]\n// }),\n// )\n//\n//\n// return r\n// }\n//\n// return obj\n// }\n\n// function safeStringify (obj: any): string {\n// // use removeCircularReferences to avoid circular references\n// // const cleanedObj = removeCircularReferences(obj)\n// return JSON.stringify(safeToJson(obj))\n// //\n// // return JSON.stringify(\n// // obj,\n// // (_key, value) => {\n// // if (Array.isArray(value)) return value.map(i => safeStringify(i))\n// //\n// // if (isReactElement(value)) {\n// // // console.log('React element detected', value)\n// //\n// // return { props: safeStringify(value.props), type: typeof value.type === 'string' ? value.type : '' }\n// // }\n// //\n// // if (globalThis?.HTMLElement && value instanceof globalThis.HTMLElement) return { type: '[HTMLElement]', content: value.innerHTML }\n// //\n// // // console.log('Value', value)\n// //\n// // return value\n// // })\n// }\n\n\nfunction safeToJson (obj: any): Record<string, any> {\n const o: Record<string, any> = {}\n\n if (typeof obj !== 'object' || obj == null)\n return obj\n\n if (Array.isArray(obj))\n return obj.map(item => safeToJson(item))\n\n if (isReactElement(obj))\n return { props: safeToJson(obj.props), type: typeof obj.type === 'string' ? obj.type : '' }\n\n if (globalThis?.HTMLElement && obj instanceof globalThis.HTMLElement) return { type: '[HTMLElement]', content: obj.innerHTML }\n\n Object.entries(obj).forEach(([key, v]) => {\n o[key] = safeToJson(v)\n })\n\n return o\n}\n\n\n// function removeCircularReferences (obj: any): any {\n// const seen = new WeakSet()\n//\n// function traverse (value: any): any {\n// if (value && typeof value === 'object') {\n// // If the object has already been seen, it's a circular reference\n// if (seen.has(value))\n// return null\n//\n// seen.add(value)\n//\n// if (Array.isArray(value))\n// return value.map(traverse)\n//\n//\n// const result: any = {}\n//\n// for (const key in value) {\n// if (Object.prototype.hasOwnProperty.call(value, key)) {\n// if (key === '_owner' && value.$$typeof) continue\n//\n// result[key] = traverse(value[key])\n// }\n// }\n//\n// return result\n// }\n//\n// // Return primitive values as-is\n// return value\n// }\n//\n// return traverse(obj)\n// }\n","\nimport { useEffect, useId, useRef, useState } from 'react'\n\nimport { nonReactiveObjectSymbol } from '../../types/shared'\nimport { proxifyStore } from '../helpers/new-proxify-store'\nimport { deepClone } from '../utils/object'\nimport { createCacheableSubject } from '../utils/subject'\n\nimport type { FieldPath, StoreChange } from '../../types/shared'\n\n\n\n\n// export type CervelloOptions<StoreValue extends Record<string, any>> = {\n// beforeChange?: (storeChange: StoreChange<StoreValue>) => unknown | undefined\n// afterChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n// }\n\nexport type CervelloOptions<StoreValue extends Record<string, any>> = {\n afterChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n}\n\nexport type CervelloUseStoreOptions<StoreValue extends Record<string, any>> = {\n initialValue?: (currentStore: StoreValue) => StoreValue | null,\n setValueOnMount?: (currentStore: StoreValue) => Promise<StoreValue>,\n select?:\n | Array<FieldPath<StoreValue>>\n | (() => Array<FieldPath<StoreValue>>)\n onChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n}\n\ntype MutableStoreValue<T extends Record<string, any>> = {\n $value: T\n} & T\n\n\n\n\n\n\n\n\nexport function nonReactive <T extends Record<string, any>> (initialValue: T): T {\n Object.defineProperty(initialValue, nonReactiveObjectSymbol, {\n value: true,\n enumerable: false,\n writable: false,\n configurable: false,\n })\n\n return initialValue\n}\n\n\nexport function cervello <StoreValue extends Record<PropertyKey, any>> (\n initialValue: StoreValue,\n options?: CervelloOptions<StoreValue>,\n): {\n store: MutableStoreValue<StoreValue>,\n reset: () => void,\n useStore: (options?: CervelloUseStoreOptions<StoreValue>) => MutableStoreValue<StoreValue>\n } {\n const {\n // beforeChange,\n afterChange,\n } = options ?? {}\n\n // const store$$ = createCacheableSubject<StoreChange<StoreValue>>(clonedInitialValue as any)\n const clonedInitialValue = deepClone(initialValue)\n\n const store$$ = createCacheableSubject<StoreChange<StoreValue>>()\n\n const proxiedStore = proxifyStore(\n store$$ as any,\n clonedInitialValue,\n // { beforeChange, afterChange },\n { afterChange },\n ) as MutableStoreValue<StoreValue>\n\n\n return {\n store: proxiedStore,\n reset: () => {\n proxiedStore.$value = deepClone(initialValue)\n },\n useStore: (options) => {\n const subscriberId = useId()\n const initialValue = options?.initialValue?.(proxiedStore.$value)\n const isInitialValueSet = useRef(false)\n const [, setRenderCount] = useState(0)\n\n if (!isInitialValueSet.current && initialValue && initialValue !== proxiedStore) {\n isInitialValueSet.current = true;\n (proxiedStore as any).$$value = { id: subscriberId, newValue: initialValue }\n }\n\n const selectFieldPaths = useRef(\n (typeof options?.select === 'function'\n ? options?.select?.()\n : options?.select)\n ?? [],\n )\n\n\n const selectedFieldPathsForNestedObjects = useRef(\n selectFieldPaths.current\n .filter(fp => fp.includes('.*'))\n .map(fp => fp.replace('.*', '')),\n )\n\n const reRender = (): void => {\n setRenderCount(p => p + 1)\n }\n\n\n useEffect(() => {\n if (options?.setValueOnMount) {\n void options.setValueOnMount(proxiedStore.$value).then((value) => {\n proxiedStore.$value = value\n }).catch((err) => {\n console.error('Error setting initial value on mount', err)\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n\n // Same implementation as useSyncExternalStore but with useEffect\n useEffect(() => {\n const subscription = store$$.subscribe({\n id: subscriberId,\n next: (sc) => {\n const storeChanges = Array.isArray(sc)\n ? sc as Array<StoreChange<StoreValue>>\n : [sc]\n\n if (!options?.select) {\n reRender()\n options?.onChange?.(storeChanges)\n\n return\n }\n\n if (storeChanges.some(nextChange => (\n nextChange.change.fieldPath === 'root'\n || selectFieldPaths.current.includes(nextChange.change.fieldPath))\n || selectedFieldPathsForNestedObjects.current.find(fp => nextChange.change.fieldPath.startsWith(fp)),\n )) {\n reRender()\n options?.onChange?.(storeChanges)\n }\n },\n })\n\n return () => {\n subscription.unsubscribe()\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options?.select, options?.onChange])\n\n return proxiedStore\n },\n }\n}\n","\ntype Noop = () => void\n\n\ntype Observer<T> = {\n id: string\n next: (value: T, subscriberId?: string) => void\n}\n\ntype Subscription = {\n unsubscribe: Noop\n}\n\nexport type CacheableSubject<T> = {\n // getValue: () => T\n subscribe: (value: Observer<T>) => Subscription\n // unSubscribeAll: Noop\n} & Omit<Observer<T>, 'id'>\n\n\n\nexport function createCacheableSubject<T> (/* defaultValue: T/*, getValueOnSubscribe = false */): CacheableSubject<T> {\n let isFlushing = false\n let itemsToFlush: Array<{ newValue: T, subscriberId?: string }> = []\n\n let observerList: Array<Observer<T>> = []\n // let value = defaultValue\n\n // const getValue = (): T => value\n\n const next = (newValue: T, subscriberId?: string): void => {\n // value = newValue\n\n itemsToFlush.push({ newValue, subscriberId })\n\n if (!isFlushing) {\n isFlushing = true\n\n void Promise.resolve().then(() => {\n observerList.forEach((o) => {\n // Filter changes that were sent by the same subscriberId (initialValue function call)\n const nonInitiallySentBySubscriber = itemsToFlush.filter(item => item.subscriberId !== o.id)\n\n if (!nonInitiallySentBySubscriber.length) return\n\n o.next(nonInitiallySentBySubscriber.map(i => i.newValue) as T)\n })\n itemsToFlush = []\n isFlushing = false\n })\n\n // void Promise.resolve(subscriberId).then((subscriberId) => {\n // console.log('//// promise.resolve then', { subscriberId: s.id })\n // observerList.forEach((o) => {\n // console.log('//// CacheableSubject (forEach) flushing', { observerId: o.id, subscriberId: s.id })\n // if (o.id === subscriberId) return\n //\n // o.next(itemsToFlush as T)\n // })\n // itemsToFlush = []\n // isFlushing = false\n // })\n\n // void Promise.resolve().then(() => {\n // console.log('//// promise.resolve then')\n // observerList.forEach((o) => {\n // const nonInitiallySentBySubscriber = itemsToFlush.filter(item => item.subscriberId !== o.id)\n //\n // if (nonInitiallySentBySubscriber.length === 0) return\n //\n // o.next(nonInitiallySentBySubscriber.map(i => i.newValue) as T)\n // })\n // itemsToFlush = []\n // isFlushing = false\n // })\n }\n }\n\n const subscribe = (observer: Observer<T>): Subscription => {\n // Push cached value on subscribe\n // if (getValueOnSubscribe) observer.next(value)\n\n // Store the observer to be notified\n observerList.push(observer)\n\n return {\n unsubscribe: () => {\n observerList = observerList.filter(o => o !== observer)\n },\n }\n }\n\n // const unSubscribeAll = (): void => {\n // observerList = []\n // }\n\n return {\n // getValue,\n next,\n subscribe,\n // unSubscribeAll,\n }\n}\n"],"names":["nonReactiveObjectSymbol","Symbol","obj","newObj","Array","isArray","map","item","deepClone","isReactObjectLikeNode","isObject","isReactElement","objKeys","Object","keys","includes","some","k","startsWith","entries","forEach","_ref","getOwnPropertySymbols","symbol","$$typeof","isValidReactiveObject","value","hasOwn","call","bind","hasOwnProperty","store$$","objectToProxify","opts","fieldPath","_opts$nestedFieldPath","nestedFieldPath","objectWithRootValue","_objectWithRootValue","ROOT_VALUE","rootFunctions","fromEntries","filter","Proxy","get","targetObject","propName","receiver","target","propertyValue","Reflect","_$fieldPath","proxiedNestedObject","proxifyStore","parentObjectToProxify","afterChange","set","parentObject","key","newValue","_opts$parentObjectToP2","_opts","isRootTarget","previousValue","next","storeValue","change","id","_previousValue2","JSON","stringify","safeToJson","realInnerObject","$value","nextStoreChange","replace","has","t","p","ownKeys","getOwnPropertyDescriptor","o","props","type","globalThis","HTMLElement","content","innerHTML","_ref2","nonReactive","initialValue","defineProperty","enumerable","writable","configurable","cervello","options","isFlushing","itemsToFlush","observerList","clonedInitialValue","subscriberId","push","Promise","resolve","then","nonInitiallySentBySubscriber","length","i","subscribe","observer","unsubscribe","proxiedStore","store","reset","useStore","useId","isInitialValueSet","useRef","setRenderCount","useState","current","$$value","selectFieldPaths","select","selectedFieldPathsForNestedObjects","fp","reRender","useEffect","setValueOnMount","err","console","error","subscription","sc","storeChanges","onChange","nextChange","find"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],n):n((e||self).react={},e.react)}(this,function(e,n){var t=Symbol("nonReactiveObject");function r(){return r=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},r.apply(this,arguments)}function u(e){if(!e||"object"!=typeof e)return e;var n={};return Array.isArray(e)?n=e.map(function(e){return u(e)}):function(e){if(!o(e))return!1;if(i(e))return!0;var n=Object.keys(e);return n.includes("tag")&&n.includes("containerInfo")||n.some(function(e){return e.startsWith("__reactContainer")})||n.includes("tag")&&n.includes("stateNode")}(e)?n=e:(Object.entries(e).forEach(function(e){n[e[0]]=u(e[1])}),Object.getOwnPropertySymbols(e).forEach(function(t){n[t]=e[t]})),n}var o=function(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)},i=function(e){return!!o(e)&&!!e.$$typeof};function l(e){return o(e)&&!i(e)&&!e[t]}"hasOwn"in Object||(Object.hasOwn=Object.call.bind(Object.hasOwnProperty));var a=Symbol("value");function c(e,n,t){var o,i;void 0===t&&(t={});var p=null!=(o=t.nestedFieldPath)?o:"root",h=((i={})[a]=n,i),b="root"===p?Object.fromEntries(Object.entries(n).filter(function(e){return"function"==typeof e[1]})):{};return new Proxy(h,{get:function(n,r,o){if("_$fieldPath"===r)return p;var i=Object.hasOwn(n,a)?n[a]:n;if("toJSON"===r)return function(){return s(i)};if("$value"===r)return u(i);var f=Reflect.get(i,r,o);if("symbol"==typeof r)return f;if("function"==typeof f)return f.bind(o);if(l(f)&&f!==i){var h;if(f._$fieldPath)return f;var b=c(e,f,{nestedFieldPath:p+"."+r,parentObjectToProxify:null!=(h=t.parentObjectToProxify)?h:i,afterChange:t.afterChange});return i[r]=b}return f},set:function(n,u,o,i){var c,s;if("symbol"==typeof u)return!0;var h=o,v=Object.hasOwn(n,a);if(v&&"$$value"===u){var y=n[a];return n[a]=h.newValue,e.next({storeValue:h.newValue,change:{fieldPath:"root",newValue:h.newValue,previousValue:y}},h.id),!0}if(v&&"$value"===u){var d=n[a];return h===d||f(h)===f(d)||("root"!==p?n[a]=h:(n[a]=r({},b,h),e.next({storeValue:n[a],change:{fieldPath:"root",newValue:h,previousValue:d}}))),!0}var g=v?n[a]:n,O=Reflect.get(g,u,i);if(O===h)return!0;l(h)&&null!=O&&O._$fieldPath?O.$value=h:Reflect.set(g,u,h,g);var j={storeValue:null!=(c=null==(s=t)?void 0:s.parentObjectToProxify)?c:g,change:{fieldPath:(p+"."+u).replace("root.",""),newValue:h,previousValue:O}};return e.next(j),null==t.afterChange||t.afterChange([j]),!0},has:function(e,n){return Reflect.has(e[a],n)},ownKeys:function(e){return Reflect.ownKeys(e[a])},getOwnPropertyDescriptor:function(e,n){return Reflect.getOwnPropertyDescriptor(e[a],n)}})}function f(e){return JSON.stringify(e,function(e,n){return Array.isArray(n)?n.map(function(e){return f(e)}):i(n)?{props:f(n.props),type:"string"==typeof n.type?n.type:""}:null!=globalThis&&globalThis.HTMLElement&&n instanceof globalThis.HTMLElement?{type:"[HTMLElement]",content:n.innerHTML}:n})}function s(e){var n={};return"object"!=typeof e||null==e?e:Array.isArray(e)?e.map(function(e){return s(e)}):i(e)?{props:s(e.props),type:"string"==typeof e.type?e.type:""}:null!=globalThis&&globalThis.HTMLElement&&e instanceof globalThis.HTMLElement?{type:"[HTMLElement]",content:e.innerHTML}:(Object.entries(e).forEach(function(e){n[e[0]]=s(e[1])}),n)}e.cervello=function(e,t){var r,o,i,l=(null!=t?t:{}).afterChange,a=(r=!1,o=[],i=[],{next:function(e,n){o.push({newValue:e,subscriberId:n}),r||(r=!0,Promise.resolve().then(function(){i.forEach(function(e){var n=o.filter(function(n){return n.subscriberId!==e.id});n.length&&e.next(n.map(function(e){return e.newValue}))}),o=[],r=!1}))},subscribe:function(e){return i.push(e),{unsubscribe:function(){i=i.filter(function(n){return n!==e})}}}}),f=u(e),s=c(a,f,{afterChange:l});return{store:s,reset:function(){s.$value=u(e)},useStore:function(e){var t,r=n.useId(),u=null==e||null==e.initialValue?void 0:e.initialValue(s.$value),o=n.useRef(!1),i=n.useState(0)[1];!o.current&&u&&u!==s&&(o.current=!0,s.$$value={id:r,newValue:u});var l=n.useRef(null!=(t="function"==typeof(null==e?void 0:e.select)?null==e||null==e.select?void 0:e.select():null==e?void 0:e.select)?t:[]),c=n.useRef(l.current.filter(function(e){return e.includes(".*")}).map(function(e){return e.replace(".*","")})),f=function(){i(function(e){return e+1})};return n.useEffect(function(){null!=e&&e.setValueOnMount&&e.setValueOnMount(s.$value).then(function(e){s.$value=e}).catch(function(e){console.error("Error setting initial value on mount",e)})},[]),n.useEffect(function(){var n=a.subscribe({id:r,next:function(n){var t=Array.isArray(n)?n:[n];if(null==e||!e.select)return f(),void(null==e||null==e.onChange||e.onChange(t));t.some(function(e){return"root"===e.change.fieldPath||l.current.includes(e.change.fieldPath)||c.current.find(function(n){return e.change.fieldPath.startsWith(n)})})&&(f(),null==e||null==e.onChange||e.onChange(t))}});return function(){n.unsubscribe()}},[null==e?void 0:e.select,null==e?void 0:e.onChange]),s}}},e.nonReactive=function(e){return Object.defineProperty(e,t,{value:!0,enumerable:!1,writable:!1,configurable:!1}),e}});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],n):n((e||self).react={},e.react)}(this,function(e,n){var t=Symbol("nonReactiveObject");function r(){return r=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},r.apply(this,arguments)}function u(e){if(!e||"object"!=typeof e)return e;var n={};return Array.isArray(e)?n=e.map(function(e){return u(e)}):function(e){if(!i(e))return!1;if(o(e))return!0;var n=Object.keys(e);return n.includes("tag")&&n.includes("containerInfo")||n.some(function(e){return e.startsWith("__reactContainer")})||n.includes("tag")&&n.includes("stateNode")}(e)?n=e:(Object.entries(e).forEach(function(e){n[e[0]]=u(e[1])}),Object.getOwnPropertySymbols(e).forEach(function(t){n[t]=e[t]})),n}var i=function(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)},o=function(e){return!!i(e)&&!!e.$$typeof};function a(e){return i(e)&&!o(e)&&!e[t]}"hasOwn"in Object||(Object.hasOwn=Object.call.bind(Object.hasOwnProperty));var l=Symbol("value");function c(e,n,t){var i,o;void 0===t&&(t={});var s=null!=(i=t.nestedFieldPath)?i:"root",h=((o={})[l]=n,o),v="root"===s?Object.fromEntries(Object.entries(n).filter(function(e){return"function"==typeof e[1]})):{};return new Proxy(h,{get:function(n,r,i){if("_$fieldPath"===r)return s;var o=Object.hasOwn(n,l)?n[l]:n;if("toJSON"===r)return function(){return f(o)};if("$value"===r)return u(o);var h=Reflect.get(o,r,i);if("symbol"==typeof r)return h;if("function"==typeof h)return h.bind(i);if(a(h)&&h!==o){var v;if(h._$fieldPath)return h;var b=c(e,h,{nestedFieldPath:s+"."+r,parentObjectToProxify:null!=(v=t.parentObjectToProxify)?v:o,afterChange:t.afterChange});return o[r]=b}return h},set:function(n,u,i,o){var c,h;if("symbol"==typeof u)return!0;var b=i,p=Object.hasOwn(n,l);if(p&&"$$value"===u){var d=n[l];return n[l]=b.newValue,e.next({storeValue:b.newValue,change:{fieldPath:"root",newValue:b.newValue,previousValue:d}},b.id),!0}if(p&&"$value"===u){var y=n[l];return b===y||JSON.stringify(f(b))===JSON.stringify(f(y))||("root"!==s?n[l]=b:(n[l]=r({},v,b),e.next({storeValue:n[l],change:{fieldPath:"root",newValue:b,previousValue:y}}))),!0}var g=p?n[l]:n,O=Reflect.get(g,u,o);if(O===b)return!0;a(b)&&null!=O&&O._$fieldPath?O.$value=b:Reflect.set(g,u,b,g);var j={storeValue:null!=(c=null==(h=t)?void 0:h.parentObjectToProxify)?c:g,change:{fieldPath:(s+"."+u).replace("root.",""),newValue:b,previousValue:O}};return e.next(j),null==t.afterChange||t.afterChange([j]),!0},has:function(e,n){return Reflect.has(e[l],n)},ownKeys:function(e){return Reflect.ownKeys(e[l])},getOwnPropertyDescriptor:function(e,n){return Reflect.getOwnPropertyDescriptor(e[l],n)}})}function f(e){var n={};return"object"!=typeof e||null==e?e:Array.isArray(e)?e.map(function(e){return f(e)}):o(e)?{props:f(e.props),type:"string"==typeof e.type?e.type:""}:null!=globalThis&&globalThis.HTMLElement&&e instanceof globalThis.HTMLElement?{type:"[HTMLElement]",content:e.innerHTML}:(Object.entries(e).forEach(function(e){n[e[0]]=f(e[1])}),n)}e.cervello=function(e,t){var r,i,o,a=(null!=t?t:{}).afterChange,l=u(e),f=(r=!1,i=[],o=[],{next:function(e,n){i.push({newValue:e,subscriberId:n}),r||(r=!0,Promise.resolve().then(function(){o.forEach(function(e){var n=i.filter(function(n){return n.subscriberId!==e.id});n.length&&e.next(n.map(function(e){return e.newValue}))}),i=[],r=!1}))},subscribe:function(e){return o.push(e),{unsubscribe:function(){o=o.filter(function(n){return n!==e})}}}}),s=c(f,l,{afterChange:a});return{store:s,reset:function(){s.$value=u(e)},useStore:function(e){var t,r=n.useId(),u=null==e||null==e.initialValue?void 0:e.initialValue(s.$value),i=n.useRef(!1),o=n.useState(0)[1];!i.current&&u&&u!==s&&(i.current=!0,s.$$value={id:r,newValue:u});var a=n.useRef(null!=(t="function"==typeof(null==e?void 0:e.select)?null==e||null==e.select?void 0:e.select():null==e?void 0:e.select)?t:[]),l=n.useRef(a.current.filter(function(e){return e.includes(".*")}).map(function(e){return e.replace(".*","")})),c=function(){o(function(e){return e+1})};return n.useEffect(function(){null!=e&&e.setValueOnMount&&e.setValueOnMount(s.$value).then(function(e){s.$value=e}).catch(function(e){console.error("Error setting initial value on mount",e)})},[]),n.useEffect(function(){var n=f.subscribe({id:r,next:function(n){var t=Array.isArray(n)?n:[n];if(null==e||!e.select)return c(),void(null==e||null==e.onChange||e.onChange(t));t.some(function(e){return"root"===e.change.fieldPath||a.current.includes(e.change.fieldPath)||l.current.find(function(n){return e.change.fieldPath.startsWith(n)})})&&(c(),null==e||null==e.onChange||e.onChange(t))}});return function(){n.unsubscribe()}},[null==e?void 0:e.select,null==e?void 0:e.onChange]),s}}},e.nonReactive=function(e){return Object.defineProperty(e,t,{value:!0,enumerable:!1,writable:!1,configurable:!1}),e}});
2
2
  //# sourceMappingURL=cervello.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cervello.umd.js","sources":["../src/types/shared.ts","../src/lib/utils/object.ts","../src/lib/helpers/new-proxify-store.ts","../src/lib/store/new-index.ts","../src/lib/utils/subject.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\nexport type WithoutType<T, V, WithNever = {\n [K in keyof T]: Exclude<T[K], undefined> extends V\n ? never\n : (T[K] extends Record<string, unknown>\n ? WithoutType<T[K], V>\n : T[K])\n}> = Pick<WithNever, {\n [K in keyof WithNever]: WithNever[K] extends never ? never : K\n}[keyof WithNever]>\n\n\n\nexport type ObjectFromAttributes<T, Attributes extends Array< keyof WithoutType<T, Function> > > = {\n [k in Attributes[number]]: T[k]\n}\n\nexport type Maybe<T> = T | undefined\n\n\n\nexport type UseSelector<T> = <Attributes extends Array< Exclude<keyof WithoutType<T, Function>, '$value'> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n) => T\n\nexport type FieldPath<T extends Record<string, any>> = {\n [K in keyof Required<T>]: T[K] extends Record<string, any>\n ? K extends string\n\n ? T[K] extends Function\n ? never\n : T[K] extends Array<any>\n ? K\n : `${K}.*` | `${K}.${FieldPath<T[K]>}`\n : never\n : K extends string\n ? K\n : never\n}[keyof T]\n\nexport const nonReactiveObjectSymbol = Symbol('nonReactiveObject')\nexport type StoreChange<T extends Record<string, any>> = {\n change: {\n fieldPath: FieldPath<T>\n newValue: any\n previousValue: any\n }\n storeValue: T\n}\n// fromInit?: boolean\n","/* eslint-disable no-cond-assign */\n\nimport { nonReactiveObjectSymbol } from '../../types/shared'\nimport { INTERNAL_VALUE_PROP } from '../helpers/constants'\n\n\n/**\n * Clones all the provided object and nested properties and it also\n * iterates nested arrays to deepClone them\n *\n * @param obj - base object to be cloned\n * @returns new cloned object with new reference\n */\nexport function deepClone <T> (obj: T): T {\n if (!obj || typeof obj !== 'object')\n return obj\n\n let newObj = {} as any\n\n if (Array.isArray(obj)) {\n newObj = obj.map(item => deepClone(item))\n } else if (!isReactObjectLikeNode(obj)) {\n Object.entries(obj).forEach(([key, value]) => {\n newObj[key] = deepClone(value)\n })\n Object.getOwnPropertySymbols(obj).forEach((symbol) => {\n newObj[symbol] = (obj as any)[symbol]\n })\n } else {\n newObj = obj\n }\n\n return newObj as T\n}\n\n// function copyBuffer (cur: ArrayBufferView) {\n// if (cur instanceof Buffer)\n// return Buffer.from(cur)\n//\n//\n// return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)\n// }\n\n\n// INFO: From `rfdc` (really-fast-deep-clone) package for faster cloning taking care of circular references\nexport function deepClone2 <T> (obj: T): T {\n const refs: Array<any> = []\n const refsNew: Array<any> = []\n\n const constructorHandlers = new Map()\n\n constructorHandlers.set(Date, (o: string | number | Date) => new Date(o))\n constructorHandlers.set(Map, (o: Iterable<unknown> | ArrayLike<unknown>, fn: any) => new Map(cloneArray(Array.from(o), fn)))\n constructorHandlers.set(Set, (o: Iterable<unknown> | ArrayLike<unknown>, fn: any) => new Set(cloneArray(Array.from(o), fn)))\n\n let handler = null\n\n return clone(obj)\n\n function cloneArray (a: any, fn: any): any {\n const keys = Object.keys(a)\n const a2 = new Array(keys.length) as any\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i]\n const cur = a[k]\n\n if (typeof cur !== 'object' || cur === null) {\n a2[k] = cur\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n a2[k] = handler(cur, fn)\n // } else if (ArrayBuffer.isView(cur)) {\n // a2[k] = copyBuffer(cur)\n } else {\n const index = refs.indexOf(cur)\n\n if (index !== -1)\n a2[k] = refsNew[index]\n else\n a2[k] = fn(cur)\n }\n }\n\n return a2\n }\n\n function clone (o: any): any {\n if (typeof o !== 'object' || o === null) return o\n if (Array.isArray(o)) return cloneArray(o, clone)\n if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor)))\n return handler(o, clone)\n\n const o2 = {} as any\n\n refs.push(o)\n refsNew.push(o2)\n\n\n Object.getOwnPropertySymbols(o).forEach((symbol) => {\n o2[symbol] = (o)[symbol]\n })\n\n for (const k in o) {\n if (!Object.hasOwnProperty.call(o, k)) continue\n const cur = o[k]\n\n\n if (typeof cur !== 'object' || cur === null) {\n o2[k] = cur\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n o2[k] = handler(cur, clone)\n // } else if (ArrayBuffer.isView(cur)) {\n // o2[k] = copyBuffer(cur)\n } else {\n const i = refs.indexOf(cur)\n\n if (i !== -1)\n o2[k] = refsNew[i]\n else\n o2[k] = clone(cur)\n }\n }\n refs.pop()\n refsNew.pop()\n\n\n return o2\n }\n}\n\n/**\n * Guard to check is variable is an object\n * @param obj - variable to be checked\n * @returns boolean\n */\nexport const isObject = (obj: unknown): obj is Record<string | symbol, unknown> => (\n obj !== null\n && typeof obj === 'object'\n && !Array.isArray(obj)\n)\n\n\nexport const isReactElement = (obj: unknown): boolean => {\n if (!isObject(obj)) return false\n\n return !!(obj.$$typeof)\n}\n\n\nexport function isReactObjectLikeNode (obj: unknown): boolean {\n if (!isObject(obj)) return false\n if (isReactElement(obj)) return true\n\n const objKeys = Object.keys(obj)\n const isReactObjNode = (objKeys.includes('tag') && objKeys.includes('containerInfo'))\n || objKeys.some(k => k.startsWith('__reactContainer'))\n || (objKeys.includes('tag') && objKeys.includes('stateNode'))\n\n return isReactObjNode\n}\n\n\nexport function isValidReactiveObject <T extends Record<string, any>> (value: T): boolean {\n return isObject(value) && !isReactElement(value) && !(value as any)[nonReactiveObjectSymbol]\n}\n\n\n\n/**\n * Returns the actual target value instead of root\n * object with internals props like $$value$$\n *\n * @param target - object from subscription or proxy\n * @returns actual value\n */\nexport const okTarget = (target: any): any => target[INTERNAL_VALUE_PROP] ?? target\n\n\n\n\n/**\n * Gets an object with just the properties requested\n * instead of the full object\n *\n * @param properties - object properties\n * @param obj - target to get the properties\n * @returns New object with just the requested properties\n */\nexport function getPartialObjectFromProperties<T> (properties: Array<keyof T>, obj: T): any {\n return properties.reduce<any>((acc, curr) => {\n acc[curr] = obj[curr]\n\n return acc\n }, {})\n}\n\n\n\nconst stringify = (obj: any): string => JSON.stringify(obj)\n\n/**\n * Compare 2 provided objects by stringing them\n * @param a - first object\n * @param b - second object\n * @returns boolean\n */\nexport const contentComparer = (a: any, b: any): boolean => stringify(a) === stringify(b)\n","\nimport { deepClone, isReactElement, isValidReactiveObject } from '../utils/object'\n\nimport type { StoreChange } from '../../types/shared'\nimport type { CacheableSubject } from '../utils/subject'\n\n\n\n// @ts-expect-error - Object.hasOwn is not defined in older Safari's browsers\n('hasOwn' in Object) || (Object.hasOwn = Object.call.bind(Object.hasOwnProperty))\n\nconst ROOT_VALUE = Symbol('value')\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (\n store$$: CacheableSubject<StoreChange<T>>,\n objectToProxify: T,\n opts: {\n nestedFieldPath?: string\n parentObjectToProxify?: any\n // beforeChange?: (storeChange: StoreChange<T>) => any\n afterChange?: (storeChange: Array<StoreChange<T>>) => void\n } = {},\n): T {\n const fieldPath = opts.nestedFieldPath ?? 'root'\n\n const objectWithRootValue = {\n [ROOT_VALUE]: objectToProxify,\n } as unknown as T\n\n const rootFunctions = fieldPath === 'root'\n ? Object.fromEntries(Object.entries(objectToProxify).filter(([,v]) => typeof v === 'function'))\n : {}\n\n return new Proxy(objectWithRootValue, {\n get (targetObject, propName, receiver) {\n // INFO: !Internal only.\n // Used to get the fieldPath of the object (it means it's a proxified object)\n if (propName === '_$fieldPath') return fieldPath\n\n const isRootTarget = Object.hasOwn(targetObject, ROOT_VALUE)\n const target = isRootTarget ? targetObject[ROOT_VALUE] : targetObject\n\n\n // Called when the object is converted to JSON or string (i.e. JSON.stringify)\n if (propName === 'toJSON') {\n return () => {\n // Remove react-elements with circular which have circular references\n // before stringifying to prevent JSON.stringify(storeProxy) from failing\n return safeToJson(target)\n // return removeCircularReferences(target)\n }\n }\n\n // Get the whole store value without proxies\n if (propName === '$value')\n return deepClone(target)\n // return target\n\n\n\n const propertyValue = Reflect.get(target, propName, receiver)\n\n if (typeof propName === 'symbol') return propertyValue\n\n if (typeof propertyValue === 'function')\n return (propertyValue as () => any).bind(receiver)\n\n\n // Check if it's correct to be a reactive object\n // & is not a circular reference or the same object\n if (isValidReactiveObject(propertyValue) && propertyValue !== target) {\n // const newNestedFieldPath = `${fieldPath}.${propName}`\n\n // If it's already a proxified object, return it\n // if (propertyValue._$fieldPath === newNestedFieldPath) return propertyValue\n if (propertyValue._$fieldPath) return propertyValue\n\n // Create a new proxified object\n const proxiedNestedObject = proxifyStore(\n store$$ as any,\n propertyValue,\n {\n nestedFieldPath: `${fieldPath}.${propName}`,\n parentObjectToProxify: opts.parentObjectToProxify ?? target,\n // beforeChange: opts.beforeChange,\n afterChange: opts.afterChange,\n },\n )\n\n return target[propName] = proxiedNestedObject\n }\n\n return propertyValue\n },\n\n\n set (parentObject, key, newValue, receiver) {\n if (typeof key === 'symbol') return true\n\n const value = newValue\n const isRootTarget = Object.hasOwn(parentObject, ROOT_VALUE)\n\n // INFO: !Internal only.\n // Used to set the value of the store without notifying the store\n if (isRootTarget && key === '$$value') {\n const previousValue = parentObject[ROOT_VALUE];\n\n (parentObject as any)[ROOT_VALUE] = value.newValue\n\n store$$.next({\n // fromInit: true,\n storeValue: value.newValue,\n change: {\n fieldPath: 'root' as any,\n newValue: value.newValue,\n previousValue,\n },\n }, value.id)\n\n return true\n }\n\n if (isRootTarget && key === '$value') {\n const previousValue = parentObject[ROOT_VALUE]\n\n if (value === previousValue) return true\n\n if (safeStringify(value) === safeStringify(previousValue)) return true\n // if (JSON.stringify(value) === JSON.stringify(previousValue)) return true\n\n if (fieldPath !== 'root') {\n (parentObject as any)[ROOT_VALUE] = value\n } else {\n (parentObject as any)[ROOT_VALUE] = {\n ...rootFunctions,\n ...value,\n }\n store$$.next({\n // To be disabled for performance and send same store reference\n // storeValue: JSON.parse(JSON.stringify(targetObject[ROOT_VALUE])),\n storeValue: parentObject[ROOT_VALUE],\n change: {\n fieldPath: 'root' as any,\n newValue: value,\n previousValue,\n },\n })\n }\n\n return true\n }\n\n const realInnerObject = isRootTarget ? parentObject[ROOT_VALUE] : parentObject\n const previousValue = Reflect.get(realInnerObject, key, receiver)\n\n\n if (previousValue === value) return true\n\n\n // New object values, check if the field has already a proxy created to use it instead of reacreating a new instance\n if (isValidReactiveObject(value) && previousValue?._$fieldPath)\n previousValue.$value = value\n else\n Reflect.set(realInnerObject, key, value, realInnerObject)\n\n\n const nextStoreChange = {\n // To be disabled for performance and send same store reference\n // storeValue: JSON.parse(JSON.stringify(opts?.parentObjectToProxify ?? target)),\n storeValue: opts?.parentObjectToProxify ?? realInnerObject,\n change: {\n fieldPath: `${fieldPath}.${key}`.replace('root.', '') as any,\n newValue: value,\n previousValue,\n },\n }\n\n store$$.next(nextStoreChange)\n opts.afterChange?.([nextStoreChange])\n\n return true\n },\n\n has (t, p) {\n return Reflect.has(t[ROOT_VALUE], p)\n },\n\n ownKeys (t) {\n return Reflect.ownKeys(t[ROOT_VALUE])\n },\n\n getOwnPropertyDescriptor (t, p) {\n return Reflect.getOwnPropertyDescriptor(t[ROOT_VALUE], p)\n },\n\n })\n}\n\n\n// function getDeepUnproxiedObject (obj: any): any {\n// if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n// if (obj[ROOT_VALUE]?.[ROOT_VALUE]) {\n// console.warn('Circular reference detected in getDeepUnproxiedObject')\n//\n// return '[Circular reference]'\n// }\n//\n//\n// const r = Object.fromEntries(\n// Object.entries(obj).map(([key, value]) => {\n// // console.log('____________________getDeepUnproxiedObject', key, value, value.constructor.name)\n// if (value && typeof value === 'object' && !Array.isArray(value)) {\n// if (key === 'links') console.log('getDeepUnproxiedObject', key, value)\n//\n// // If it's a proxied object, get the unproxied value\n// return [key, getDeepUnproxiedObject(value)]\n// }\n//\n// return [key, value]\n// }),\n// )\n//\n//\n// return r\n// }\n//\n// return obj\n// }\n\nexport function safeStringify (obj: any): string {\n // use removeCircularReferences to avoid circular references\n // const cleanedObj = removeCircularReferences(obj)\n\n return JSON.stringify(\n obj,\n (_key, value) => {\n if (Array.isArray(value)) return value.map(i => safeStringify(i))\n\n if (isReactElement(value)) {\n // console.log('React element detected', value)\n\n return { props: safeStringify(value.props), type: typeof value.type === 'string' ? value.type : '' }\n }\n\n if (globalThis?.HTMLElement && value instanceof globalThis.HTMLElement) return { type: '[HTMLElement]', content: value.innerHTML }\n\n // console.log('Value', value)\n\n return value\n })\n}\n\n\nfunction safeToJson (obj: any): Record<string, any> {\n const o: Record<string, any> = {}\n\n if (typeof obj !== 'object' || obj == null)\n return obj\n\n if (Array.isArray(obj))\n return obj.map(item => safeToJson(item))\n\n if (isReactElement(obj))\n return { props: safeToJson(obj.props), type: typeof obj.type === 'string' ? obj.type : '' }\n\n if (globalThis?.HTMLElement && obj instanceof globalThis.HTMLElement) return { type: '[HTMLElement]', content: obj.innerHTML }\n\n Object.entries(obj).forEach(([key, v]) => {\n o[key] = safeToJson(v)\n })\n\n return o\n}\n\n\n// function removeCircularReferences (obj: any): any {\n// const seen = new WeakSet()\n//\n// function traverse (value: any): any {\n// if (value && typeof value === 'object') {\n// // If the object has already been seen, it's a circular reference\n// if (seen.has(value))\n// return null\n//\n// seen.add(value)\n//\n// if (Array.isArray(value))\n// return value.map(traverse)\n//\n//\n// const result: any = {}\n//\n// for (const key in value) {\n// if (Object.prototype.hasOwnProperty.call(value, key)) {\n// if (key === '_owner' && value.$$typeof) continue\n//\n// result[key] = traverse(value[key])\n// }\n// }\n//\n// return result\n// }\n//\n// // Return primitive values as-is\n// return value\n// }\n//\n// return traverse(obj)\n// }\n","\nimport { useEffect, useId, useRef, useState } from 'react'\n\nimport { nonReactiveObjectSymbol } from '../../types/shared'\nimport { proxifyStore } from '../helpers/new-proxify-store'\nimport { deepClone } from '../utils/object'\nimport { createCacheableSubject } from '../utils/subject'\n\nimport type { FieldPath, StoreChange } from '../../types/shared'\n\n\n\n\n// export type CervelloOptions<StoreValue extends Record<string, any>> = {\n// beforeChange?: (storeChange: StoreChange<StoreValue>) => unknown | undefined\n// afterChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n// }\n\nexport type CervelloOptions<StoreValue extends Record<string, any>> = {\n afterChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n}\n\nexport type CervelloUseStoreOptions<StoreValue extends Record<string, any>> = {\n initialValue?: (currentStore: StoreValue) => StoreValue | null,\n setValueOnMount?: (currentStore: StoreValue) => Promise<StoreValue>,\n select?:\n | Array<FieldPath<StoreValue>>\n | (() => Array<FieldPath<StoreValue>>)\n onChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n}\n\ntype MutableStoreValue<T extends Record<string, any>> = {\n $value: T\n} & T\n\n\n\n\n\n\n\n\nexport function nonReactive <T extends Record<string, any>> (initialValue: T): T {\n Object.defineProperty(initialValue, nonReactiveObjectSymbol, {\n value: true,\n enumerable: false,\n writable: false,\n configurable: false,\n })\n\n return initialValue\n}\n\n\nexport function cervello <StoreValue extends Record<PropertyKey, any>> (\n initialValue: StoreValue,\n options?: CervelloOptions<StoreValue>,\n): {\n store: MutableStoreValue<StoreValue>,\n reset: () => void,\n useStore: (options?: CervelloUseStoreOptions<StoreValue>) => MutableStoreValue<StoreValue>\n } {\n const {\n // beforeChange,\n afterChange,\n } = options ?? {}\n\n // const store$$ = createCacheableSubject<StoreChange<StoreValue>>(clonedInitialValue as any)\n const store$$ = createCacheableSubject<StoreChange<StoreValue>>()\n const clonedInitialValue = deepClone(initialValue)\n\n const proxiedStore = proxifyStore(\n store$$ as any,\n clonedInitialValue,\n // { beforeChange, afterChange },\n { afterChange },\n ) as MutableStoreValue<StoreValue>\n\n\n return {\n store: proxiedStore,\n reset: () => {\n proxiedStore.$value = deepClone(initialValue)\n },\n useStore: (options) => {\n const subscriberId = useId()\n const initialValue = options?.initialValue?.(proxiedStore.$value)\n const isInitialValueSet = useRef(false)\n const [, setRenderCount] = useState(0)\n\n if (!isInitialValueSet.current && initialValue && initialValue !== proxiedStore) {\n isInitialValueSet.current = true;\n (proxiedStore as any).$$value = { id: subscriberId, newValue: initialValue }\n }\n\n const selectFieldPaths = useRef(\n (typeof options?.select === 'function'\n ? options?.select?.()\n : options?.select)\n ?? [],\n )\n\n\n const selectedFieldPathsForNestedObjects = useRef(\n selectFieldPaths.current\n .filter(fp => fp.includes('.*'))\n .map(fp => fp.replace('.*', '')),\n )\n\n const reRender = (): void => {\n setRenderCount(p => p + 1)\n }\n\n\n useEffect(() => {\n if (options?.setValueOnMount) {\n void options.setValueOnMount(proxiedStore.$value).then((value) => {\n proxiedStore.$value = value\n }).catch((err) => {\n console.error('Error setting initial value on mount', err)\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n\n // Same implementation as useSyncExternalStore but with useEffect\n useEffect(() => {\n const subscription = store$$.subscribe({\n id: subscriberId,\n next: (sc) => {\n const storeChanges = Array.isArray(sc)\n ? sc as Array<StoreChange<StoreValue>>\n : [sc]\n\n if (!options?.select) {\n reRender()\n options?.onChange?.(storeChanges)\n\n return\n }\n\n if (storeChanges.some(nextChange => (\n nextChange.change.fieldPath === 'root'\n || selectFieldPaths.current.includes(nextChange.change.fieldPath))\n || selectedFieldPathsForNestedObjects.current.find(fp => nextChange.change.fieldPath.startsWith(fp)),\n )) {\n reRender()\n options?.onChange?.(storeChanges)\n }\n },\n })\n\n return () => {\n subscription.unsubscribe()\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options?.select, options?.onChange])\n\n return proxiedStore\n },\n }\n}\n","\ntype Noop = () => void\n\n\ntype Observer<T> = {\n id: string\n next: (value: T, subscriberId?: string) => void\n}\n\ntype Subscription = {\n unsubscribe: Noop\n}\n\nexport type CacheableSubject<T> = {\n // getValue: () => T\n subscribe: (value: Observer<T>) => Subscription\n // unSubscribeAll: Noop\n} & Omit<Observer<T>, 'id'>\n\n\n\nexport function createCacheableSubject<T> (/* defaultValue: T/*, getValueOnSubscribe = false */): CacheableSubject<T> {\n let isFlushing = false\n let itemsToFlush: Array<{ newValue: T, subscriberId?: string }> = []\n\n let observerList: Array<Observer<T>> = []\n // let value = defaultValue\n\n // const getValue = (): T => value\n\n const next = (newValue: T, subscriberId?: string): void => {\n // value = newValue\n\n itemsToFlush.push({ newValue, subscriberId })\n\n if (!isFlushing) {\n isFlushing = true\n\n void Promise.resolve().then(() => {\n observerList.forEach((o) => {\n // Filter changes that were sent by the same subscriberId (initialValue function call)\n const nonInitiallySentBySubscriber = itemsToFlush.filter(item => item.subscriberId !== o.id)\n\n if (!nonInitiallySentBySubscriber.length) return\n\n o.next(nonInitiallySentBySubscriber.map(i => i.newValue) as T)\n })\n itemsToFlush = []\n isFlushing = false\n })\n\n // void Promise.resolve(subscriberId).then((subscriberId) => {\n // console.log('//// promise.resolve then', { subscriberId: s.id })\n // observerList.forEach((o) => {\n // console.log('//// CacheableSubject (forEach) flushing', { observerId: o.id, subscriberId: s.id })\n // if (o.id === subscriberId) return\n //\n // o.next(itemsToFlush as T)\n // })\n // itemsToFlush = []\n // isFlushing = false\n // })\n\n // void Promise.resolve().then(() => {\n // console.log('//// promise.resolve then')\n // observerList.forEach((o) => {\n // const nonInitiallySentBySubscriber = itemsToFlush.filter(item => item.subscriberId !== o.id)\n //\n // if (nonInitiallySentBySubscriber.length === 0) return\n //\n // o.next(nonInitiallySentBySubscriber.map(i => i.newValue) as T)\n // })\n // itemsToFlush = []\n // isFlushing = false\n // })\n }\n }\n\n const subscribe = (observer: Observer<T>): Subscription => {\n // Push cached value on subscribe\n // if (getValueOnSubscribe) observer.next(value)\n\n // Store the observer to be notified\n observerList.push(observer)\n\n return {\n unsubscribe: () => {\n observerList = observerList.filter(o => o !== observer)\n },\n }\n }\n\n // const unSubscribeAll = (): void => {\n // observerList = []\n // }\n\n return {\n // getValue,\n next,\n subscribe,\n // unSubscribeAll,\n }\n}\n"],"names":["nonReactiveObjectSymbol","Symbol","obj","newObj","Array","isArray","map","item","deepClone","isReactObjectLikeNode","isObject","isReactElement","objKeys","Object","keys","includes","some","k","startsWith","entries","forEach","_ref","getOwnPropertySymbols","symbol","$$typeof","isValidReactiveObject","value","hasOwn","call","bind","hasOwnProperty","ROOT_VALUE","proxifyStore","store$$","objectToProxify","opts","_opts$nestedFieldPath","_objectWithRootValue","fieldPath","nestedFieldPath","objectWithRootValue","rootFunctions","fromEntries","filter","Proxy","get","targetObject","propName","receiver","target","safeToJson","propertyValue","Reflect","_opts$parentObjectToP","_$fieldPath","proxiedNestedObject","parentObjectToProxify","afterChange","set","parentObject","key","newValue","isRootTarget","_previousValue","next","storeValue","change","previousValue","id","_previousValue2","safeStringify","realInnerObject","$value","nextStoreChange","_opts","_opts$parentObjectToP2","replace","has","t","p","ownKeys","getOwnPropertyDescriptor","JSON","stringify","_key","i","props","type","globalThis","HTMLElement","content","innerHTML","_ref2","o","cervello","initialValue","options","isFlushing","itemsToFlush","observerList","subscriberId","push","Promise","resolve","then","nonInitiallySentBySubscriber","length","subscribe","observer","unsubscribe","clonedInitialValue","proxiedStore","store","reset","useStore","useId","isInitialValueSet","useRef","setRenderCount","useState","current","$$value","selectFieldPaths","select","selectedFieldPathsForNestedObjects","fp","reRender","useEffect","setValueOnMount","err","console","error","subscription","sc","storeChanges","onChange","nextChange","find","nonReactive","defineProperty","enumerable","writable","configurable"],"mappings":"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"}
1
+ {"version":3,"file":"cervello.umd.js","sources":["../src/types/shared.ts","../src/lib/utils/object.ts","../src/lib/helpers/new-proxify-store.ts","../src/lib/store/new-index.ts","../src/lib/utils/subject.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\nexport type WithoutType<T, V, WithNever = {\n [K in keyof T]: Exclude<T[K], undefined> extends V\n ? never\n : (T[K] extends Record<string, unknown>\n ? WithoutType<T[K], V>\n : T[K])\n}> = Pick<WithNever, {\n [K in keyof WithNever]: WithNever[K] extends never ? never : K\n}[keyof WithNever]>\n\n\n\nexport type ObjectFromAttributes<T, Attributes extends Array< keyof WithoutType<T, Function> > > = {\n [k in Attributes[number]]: T[k]\n}\n\nexport type Maybe<T> = T | undefined\n\n\n\nexport type UseSelector<T> = <Attributes extends Array< Exclude<keyof WithoutType<T, Function>, '$value'> >>(\n selectors: Attributes,\n isEqualFunction?: (previousState: ObjectFromAttributes<T, Attributes>, currentState: ObjectFromAttributes<T, Attributes>) => boolean,\n) => T\n\nexport type FieldPath<T extends Record<string, any>> = {\n [K in keyof Required<T>]: T[K] extends Record<string, any>\n ? K extends string\n\n ? T[K] extends Function\n ? never\n : T[K] extends Array<any>\n ? K\n : `${K}.*` | `${K}.${FieldPath<T[K]>}`\n : never\n : K extends string\n ? K\n : never\n}[keyof T]\n\nexport const nonReactiveObjectSymbol = Symbol('nonReactiveObject')\nexport type StoreChange<T extends Record<string, any>> = {\n change: {\n fieldPath: FieldPath<T>\n newValue: any\n previousValue: any\n }\n storeValue: T\n}\n// fromInit?: boolean\n","/* eslint-disable no-cond-assign */\n\nimport { nonReactiveObjectSymbol } from '../../types/shared'\nimport { INTERNAL_VALUE_PROP } from '../helpers/constants'\n\n\n/**\n * Clones all the provided object and nested properties and it also\n * iterates nested arrays to deepClone them\n *\n * @param obj - base object to be cloned\n * @returns new cloned object with new reference\n */\nexport function deepClone <T> (obj: T): T {\n if (!obj || typeof obj !== 'object')\n return obj\n\n let newObj = {} as any\n\n if (Array.isArray(obj)) {\n newObj = obj.map(item => deepClone(item))\n } else if (!isReactObjectLikeNode(obj)) {\n Object.entries(obj).forEach(([key, value]) => {\n newObj[key] = deepClone(value)\n })\n Object.getOwnPropertySymbols(obj).forEach((symbol) => {\n newObj[symbol] = (obj as any)[symbol]\n })\n } else {\n newObj = obj\n }\n\n return newObj as T\n}\n\n// function copyBuffer (cur: ArrayBufferView) {\n// if (cur instanceof Buffer)\n// return Buffer.from(cur)\n//\n//\n// return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)\n// }\n\n\n// INFO: From `rfdc` (really-fast-deep-clone) package for faster cloning taking care of circular references\nexport function deepClone2 <T> (obj: T): T {\n const refs: Array<any> = []\n const refsNew: Array<any> = []\n\n const constructorHandlers = new Map()\n\n constructorHandlers.set(Date, (o: string | number | Date) => new Date(o))\n constructorHandlers.set(Map, (o: Iterable<unknown> | ArrayLike<unknown>, fn: any) => new Map(cloneArray(Array.from(o), fn)))\n constructorHandlers.set(Set, (o: Iterable<unknown> | ArrayLike<unknown>, fn: any) => new Set(cloneArray(Array.from(o), fn)))\n\n let handler = null\n\n return clone(obj)\n\n function cloneArray (a: any, fn: any): any {\n const keys = Object.keys(a)\n const a2 = new Array(keys.length) as any\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i]\n const cur = a[k]\n\n if (typeof cur !== 'object' || cur === null) {\n a2[k] = cur\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n a2[k] = handler(cur, fn)\n // } else if (ArrayBuffer.isView(cur)) {\n // a2[k] = copyBuffer(cur)\n } else {\n const index = refs.indexOf(cur)\n\n if (index !== -1)\n a2[k] = refsNew[index]\n else\n a2[k] = fn(cur)\n }\n }\n\n return a2\n }\n\n function clone (o: any): any {\n if (typeof o !== 'object' || o === null) return o\n if (Array.isArray(o)) return cloneArray(o, clone)\n if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor)))\n return handler(o, clone)\n\n const o2 = {} as any\n\n refs.push(o)\n refsNew.push(o2)\n\n\n Object.getOwnPropertySymbols(o).forEach((symbol) => {\n o2[symbol] = (o)[symbol]\n })\n\n for (const k in o) {\n if (!Object.hasOwnProperty.call(o, k)) continue\n const cur = o[k]\n\n\n if (typeof cur !== 'object' || cur === null) {\n o2[k] = cur\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n o2[k] = handler(cur, clone)\n // } else if (ArrayBuffer.isView(cur)) {\n // o2[k] = copyBuffer(cur)\n } else {\n const i = refs.indexOf(cur)\n\n if (i !== -1)\n o2[k] = refsNew[i]\n else\n o2[k] = clone(cur)\n }\n }\n refs.pop()\n refsNew.pop()\n\n\n return o2\n }\n}\n\n/**\n * Guard to check is variable is an object\n * @param obj - variable to be checked\n * @returns boolean\n */\nexport const isObject = (obj: unknown): obj is Record<string | symbol, unknown> => (\n obj !== null\n && typeof obj === 'object'\n && !Array.isArray(obj)\n)\n\n\nexport const isReactElement = (obj: unknown): boolean => {\n if (!isObject(obj)) return false\n\n return !!(obj.$$typeof)\n}\n\n\nexport function isReactObjectLikeNode (obj: unknown): boolean {\n if (!isObject(obj)) return false\n if (isReactElement(obj)) return true\n\n const objKeys = Object.keys(obj)\n const isReactObjNode = (objKeys.includes('tag') && objKeys.includes('containerInfo'))\n || objKeys.some(k => k.startsWith('__reactContainer'))\n || (objKeys.includes('tag') && objKeys.includes('stateNode'))\n\n return isReactObjNode\n}\n\n\nexport function isValidReactiveObject <T extends Record<string, any>> (value: T): boolean {\n return isObject(value) && !isReactElement(value) && !(value as any)[nonReactiveObjectSymbol]\n}\n\n\n\n/**\n * Returns the actual target value instead of root\n * object with internals props like $$value$$\n *\n * @param target - object from subscription or proxy\n * @returns actual value\n */\nexport const okTarget = (target: any): any => target[INTERNAL_VALUE_PROP] ?? target\n\n\n\n\n/**\n * Gets an object with just the properties requested\n * instead of the full object\n *\n * @param properties - object properties\n * @param obj - target to get the properties\n * @returns New object with just the requested properties\n */\nexport function getPartialObjectFromProperties<T> (properties: Array<keyof T>, obj: T): any {\n return properties.reduce<any>((acc, curr) => {\n acc[curr] = obj[curr]\n\n return acc\n }, {})\n}\n\n\n\nconst stringify = (obj: any): string => JSON.stringify(obj)\n\n/**\n * Compare 2 provided objects by stringing them\n * @param a - first object\n * @param b - second object\n * @returns boolean\n */\nexport const contentComparer = (a: any, b: any): boolean => stringify(a) === stringify(b)\n","\nimport { deepClone, isReactElement, isValidReactiveObject } from '../utils/object'\n\nimport type { StoreChange } from '../../types/shared'\nimport type { CacheableSubject } from '../utils/subject'\n\n\n\n// @ts-expect-error - Object.hasOwn is not defined in older Safari's browsers\n('hasOwn' in Object) || (Object.hasOwn = Object.call.bind(Object.hasOwnProperty))\n\nconst ROOT_VALUE = Symbol('value')\n\n\nexport function proxifyStore <T extends Record<string | symbol, any>> (\n store$$: CacheableSubject<StoreChange<T>>,\n objectToProxify: T,\n opts: {\n nestedFieldPath?: string\n parentObjectToProxify?: any\n // beforeChange?: (storeChange: StoreChange<T>) => any\n afterChange?: (storeChange: Array<StoreChange<T>>) => void\n } = {},\n): T {\n const fieldPath = opts.nestedFieldPath ?? 'root'\n\n const objectWithRootValue = {\n [ROOT_VALUE]: objectToProxify,\n } as unknown as T\n\n const rootFunctions = fieldPath === 'root'\n ? Object.fromEntries(Object.entries(objectToProxify).filter(([,v]) => typeof v === 'function'))\n : {}\n\n return new Proxy(objectWithRootValue, {\n get (targetObject, propName, receiver) {\n // INFO: !Internal only.\n // Used to get the fieldPath of the object (it means it's a proxified object)\n if (propName === '_$fieldPath') return fieldPath\n\n const isRootTarget = Object.hasOwn(targetObject, ROOT_VALUE)\n const target = isRootTarget ? targetObject[ROOT_VALUE] : targetObject\n\n\n // Called when the object is converted to JSON or string (i.e. JSON.stringify)\n if (propName === 'toJSON') {\n return () => {\n // Remove react-elements with circular which have circular references\n // before stringifying to prevent JSON.stringify(storeProxy) from failing\n return safeToJson(target)\n // return removeCircularReferences(target)\n }\n }\n\n // Get the whole store value without proxies\n if (propName === '$value')\n return deepClone(target)\n // return target\n\n\n\n const propertyValue = Reflect.get(target, propName, receiver)\n\n if (typeof propName === 'symbol') return propertyValue\n\n if (typeof propertyValue === 'function')\n return (propertyValue as () => any).bind(receiver)\n\n\n // Check if it's correct to be a reactive object\n // & is not a circular reference or the same object\n if (isValidReactiveObject(propertyValue) && propertyValue !== target) {\n // const newNestedFieldPath = `${fieldPath}.${propName}`\n\n // If it's already a proxified object, return it\n // if (propertyValue._$fieldPath === newNestedFieldPath) return propertyValue\n if (propertyValue._$fieldPath) return propertyValue\n\n // Create a new proxified object\n const proxiedNestedObject = proxifyStore(\n store$$ as any,\n propertyValue,\n {\n nestedFieldPath: `${fieldPath}.${propName}`,\n parentObjectToProxify: opts.parentObjectToProxify ?? target,\n // beforeChange: opts.beforeChange,\n afterChange: opts.afterChange,\n },\n )\n\n return target[propName] = proxiedNestedObject\n }\n\n return propertyValue\n },\n\n\n set (parentObject, key, newValue, receiver) {\n if (typeof key === 'symbol') return true\n\n const value = newValue\n const isRootTarget = Object.hasOwn(parentObject, ROOT_VALUE)\n\n // INFO: !Internal only.\n // Used to set the value of the store without notifying the store\n if (isRootTarget && key === '$$value') {\n const previousValue = parentObject[ROOT_VALUE];\n\n (parentObject as any)[ROOT_VALUE] = value.newValue\n\n store$$.next({\n storeValue: value.newValue,\n change: {\n fieldPath: 'root' as any,\n newValue: value.newValue,\n previousValue,\n },\n }, value.id)\n\n return true\n }\n\n if (isRootTarget && key === '$value') {\n const previousValue = parentObject[ROOT_VALUE]\n\n if (value === previousValue) return true\n\n if (JSON.stringify(safeToJson(value)) === JSON.stringify(safeToJson(previousValue))) return true\n // if (safeStringify(value) === safeStringify(previousValue)) return true\n\n if (fieldPath !== 'root') {\n (parentObject as any)[ROOT_VALUE] = value\n } else {\n (parentObject as any)[ROOT_VALUE] = {\n ...rootFunctions,\n ...value,\n }\n store$$.next({\n // To be disabled for performance and send same store reference\n // storeValue: JSON.parse(JSON.stringify(targetObject[ROOT_VALUE])),\n storeValue: parentObject[ROOT_VALUE],\n change: {\n fieldPath: 'root' as any,\n newValue: value,\n previousValue,\n },\n })\n }\n\n return true\n }\n\n const realInnerObject = isRootTarget ? parentObject[ROOT_VALUE] : parentObject\n const previousValue = Reflect.get(realInnerObject, key, receiver)\n\n\n if (previousValue === value) return true\n\n\n // New object values, check if the field has already a proxy created to use it instead of reacreating a new instance\n if (isValidReactiveObject(value) && previousValue?._$fieldPath)\n previousValue.$value = value\n else\n Reflect.set(realInnerObject, key, value, realInnerObject)\n\n\n const nextStoreChange = {\n // To be disabled for performance and send same store reference\n // storeValue: JSON.parse(JSON.stringify(opts?.parentObjectToProxify ?? target)),\n storeValue: opts?.parentObjectToProxify ?? realInnerObject,\n change: {\n fieldPath: `${fieldPath}.${key}`.replace('root.', '') as any,\n newValue: value,\n previousValue,\n },\n }\n\n store$$.next(nextStoreChange)\n opts.afterChange?.([nextStoreChange])\n\n return true\n },\n\n has (t, p) {\n return Reflect.has(t[ROOT_VALUE], p)\n },\n\n ownKeys (t) {\n return Reflect.ownKeys(t[ROOT_VALUE])\n },\n\n getOwnPropertyDescriptor (t, p) {\n return Reflect.getOwnPropertyDescriptor(t[ROOT_VALUE], p)\n },\n\n })\n}\n\n\n// function getDeepUnproxiedObject (obj: any): any {\n// if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n// if (obj[ROOT_VALUE]?.[ROOT_VALUE]) {\n// console.warn('Circular reference detected in getDeepUnproxiedObject')\n//\n// return '[Circular reference]'\n// }\n//\n//\n// const r = Object.fromEntries(\n// Object.entries(obj).map(([key, value]) => {\n// // console.log('____________________getDeepUnproxiedObject', key, value, value.constructor.name)\n// if (value && typeof value === 'object' && !Array.isArray(value)) {\n// if (key === 'links') console.log('getDeepUnproxiedObject', key, value)\n//\n// // If it's a proxied object, get the unproxied value\n// return [key, getDeepUnproxiedObject(value)]\n// }\n//\n// return [key, value]\n// }),\n// )\n//\n//\n// return r\n// }\n//\n// return obj\n// }\n\n// function safeStringify (obj: any): string {\n// // use removeCircularReferences to avoid circular references\n// // const cleanedObj = removeCircularReferences(obj)\n// return JSON.stringify(safeToJson(obj))\n// //\n// // return JSON.stringify(\n// // obj,\n// // (_key, value) => {\n// // if (Array.isArray(value)) return value.map(i => safeStringify(i))\n// //\n// // if (isReactElement(value)) {\n// // // console.log('React element detected', value)\n// //\n// // return { props: safeStringify(value.props), type: typeof value.type === 'string' ? value.type : '' }\n// // }\n// //\n// // if (globalThis?.HTMLElement && value instanceof globalThis.HTMLElement) return { type: '[HTMLElement]', content: value.innerHTML }\n// //\n// // // console.log('Value', value)\n// //\n// // return value\n// // })\n// }\n\n\nfunction safeToJson (obj: any): Record<string, any> {\n const o: Record<string, any> = {}\n\n if (typeof obj !== 'object' || obj == null)\n return obj\n\n if (Array.isArray(obj))\n return obj.map(item => safeToJson(item))\n\n if (isReactElement(obj))\n return { props: safeToJson(obj.props), type: typeof obj.type === 'string' ? obj.type : '' }\n\n if (globalThis?.HTMLElement && obj instanceof globalThis.HTMLElement) return { type: '[HTMLElement]', content: obj.innerHTML }\n\n Object.entries(obj).forEach(([key, v]) => {\n o[key] = safeToJson(v)\n })\n\n return o\n}\n\n\n// function removeCircularReferences (obj: any): any {\n// const seen = new WeakSet()\n//\n// function traverse (value: any): any {\n// if (value && typeof value === 'object') {\n// // If the object has already been seen, it's a circular reference\n// if (seen.has(value))\n// return null\n//\n// seen.add(value)\n//\n// if (Array.isArray(value))\n// return value.map(traverse)\n//\n//\n// const result: any = {}\n//\n// for (const key in value) {\n// if (Object.prototype.hasOwnProperty.call(value, key)) {\n// if (key === '_owner' && value.$$typeof) continue\n//\n// result[key] = traverse(value[key])\n// }\n// }\n//\n// return result\n// }\n//\n// // Return primitive values as-is\n// return value\n// }\n//\n// return traverse(obj)\n// }\n","\nimport { useEffect, useId, useRef, useState } from 'react'\n\nimport { nonReactiveObjectSymbol } from '../../types/shared'\nimport { proxifyStore } from '../helpers/new-proxify-store'\nimport { deepClone } from '../utils/object'\nimport { createCacheableSubject } from '../utils/subject'\n\nimport type { FieldPath, StoreChange } from '../../types/shared'\n\n\n\n\n// export type CervelloOptions<StoreValue extends Record<string, any>> = {\n// beforeChange?: (storeChange: StoreChange<StoreValue>) => unknown | undefined\n// afterChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n// }\n\nexport type CervelloOptions<StoreValue extends Record<string, any>> = {\n afterChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n}\n\nexport type CervelloUseStoreOptions<StoreValue extends Record<string, any>> = {\n initialValue?: (currentStore: StoreValue) => StoreValue | null,\n setValueOnMount?: (currentStore: StoreValue) => Promise<StoreValue>,\n select?:\n | Array<FieldPath<StoreValue>>\n | (() => Array<FieldPath<StoreValue>>)\n onChange?: (storeChange: Array<StoreChange<StoreValue>>) => void\n}\n\ntype MutableStoreValue<T extends Record<string, any>> = {\n $value: T\n} & T\n\n\n\n\n\n\n\n\nexport function nonReactive <T extends Record<string, any>> (initialValue: T): T {\n Object.defineProperty(initialValue, nonReactiveObjectSymbol, {\n value: true,\n enumerable: false,\n writable: false,\n configurable: false,\n })\n\n return initialValue\n}\n\n\nexport function cervello <StoreValue extends Record<PropertyKey, any>> (\n initialValue: StoreValue,\n options?: CervelloOptions<StoreValue>,\n): {\n store: MutableStoreValue<StoreValue>,\n reset: () => void,\n useStore: (options?: CervelloUseStoreOptions<StoreValue>) => MutableStoreValue<StoreValue>\n } {\n const {\n // beforeChange,\n afterChange,\n } = options ?? {}\n\n // const store$$ = createCacheableSubject<StoreChange<StoreValue>>(clonedInitialValue as any)\n const clonedInitialValue = deepClone(initialValue)\n\n const store$$ = createCacheableSubject<StoreChange<StoreValue>>()\n\n const proxiedStore = proxifyStore(\n store$$ as any,\n clonedInitialValue,\n // { beforeChange, afterChange },\n { afterChange },\n ) as MutableStoreValue<StoreValue>\n\n\n return {\n store: proxiedStore,\n reset: () => {\n proxiedStore.$value = deepClone(initialValue)\n },\n useStore: (options) => {\n const subscriberId = useId()\n const initialValue = options?.initialValue?.(proxiedStore.$value)\n const isInitialValueSet = useRef(false)\n const [, setRenderCount] = useState(0)\n\n if (!isInitialValueSet.current && initialValue && initialValue !== proxiedStore) {\n isInitialValueSet.current = true;\n (proxiedStore as any).$$value = { id: subscriberId, newValue: initialValue }\n }\n\n const selectFieldPaths = useRef(\n (typeof options?.select === 'function'\n ? options?.select?.()\n : options?.select)\n ?? [],\n )\n\n\n const selectedFieldPathsForNestedObjects = useRef(\n selectFieldPaths.current\n .filter(fp => fp.includes('.*'))\n .map(fp => fp.replace('.*', '')),\n )\n\n const reRender = (): void => {\n setRenderCount(p => p + 1)\n }\n\n\n useEffect(() => {\n if (options?.setValueOnMount) {\n void options.setValueOnMount(proxiedStore.$value).then((value) => {\n proxiedStore.$value = value\n }).catch((err) => {\n console.error('Error setting initial value on mount', err)\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n\n // Same implementation as useSyncExternalStore but with useEffect\n useEffect(() => {\n const subscription = store$$.subscribe({\n id: subscriberId,\n next: (sc) => {\n const storeChanges = Array.isArray(sc)\n ? sc as Array<StoreChange<StoreValue>>\n : [sc]\n\n if (!options?.select) {\n reRender()\n options?.onChange?.(storeChanges)\n\n return\n }\n\n if (storeChanges.some(nextChange => (\n nextChange.change.fieldPath === 'root'\n || selectFieldPaths.current.includes(nextChange.change.fieldPath))\n || selectedFieldPathsForNestedObjects.current.find(fp => nextChange.change.fieldPath.startsWith(fp)),\n )) {\n reRender()\n options?.onChange?.(storeChanges)\n }\n },\n })\n\n return () => {\n subscription.unsubscribe()\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options?.select, options?.onChange])\n\n return proxiedStore\n },\n }\n}\n","\ntype Noop = () => void\n\n\ntype Observer<T> = {\n id: string\n next: (value: T, subscriberId?: string) => void\n}\n\ntype Subscription = {\n unsubscribe: Noop\n}\n\nexport type CacheableSubject<T> = {\n // getValue: () => T\n subscribe: (value: Observer<T>) => Subscription\n // unSubscribeAll: Noop\n} & Omit<Observer<T>, 'id'>\n\n\n\nexport function createCacheableSubject<T> (/* defaultValue: T/*, getValueOnSubscribe = false */): CacheableSubject<T> {\n let isFlushing = false\n let itemsToFlush: Array<{ newValue: T, subscriberId?: string }> = []\n\n let observerList: Array<Observer<T>> = []\n // let value = defaultValue\n\n // const getValue = (): T => value\n\n const next = (newValue: T, subscriberId?: string): void => {\n // value = newValue\n\n itemsToFlush.push({ newValue, subscriberId })\n\n if (!isFlushing) {\n isFlushing = true\n\n void Promise.resolve().then(() => {\n observerList.forEach((o) => {\n // Filter changes that were sent by the same subscriberId (initialValue function call)\n const nonInitiallySentBySubscriber = itemsToFlush.filter(item => item.subscriberId !== o.id)\n\n if (!nonInitiallySentBySubscriber.length) return\n\n o.next(nonInitiallySentBySubscriber.map(i => i.newValue) as T)\n })\n itemsToFlush = []\n isFlushing = false\n })\n\n // void Promise.resolve(subscriberId).then((subscriberId) => {\n // console.log('//// promise.resolve then', { subscriberId: s.id })\n // observerList.forEach((o) => {\n // console.log('//// CacheableSubject (forEach) flushing', { observerId: o.id, subscriberId: s.id })\n // if (o.id === subscriberId) return\n //\n // o.next(itemsToFlush as T)\n // })\n // itemsToFlush = []\n // isFlushing = false\n // })\n\n // void Promise.resolve().then(() => {\n // console.log('//// promise.resolve then')\n // observerList.forEach((o) => {\n // const nonInitiallySentBySubscriber = itemsToFlush.filter(item => item.subscriberId !== o.id)\n //\n // if (nonInitiallySentBySubscriber.length === 0) return\n //\n // o.next(nonInitiallySentBySubscriber.map(i => i.newValue) as T)\n // })\n // itemsToFlush = []\n // isFlushing = false\n // })\n }\n }\n\n const subscribe = (observer: Observer<T>): Subscription => {\n // Push cached value on subscribe\n // if (getValueOnSubscribe) observer.next(value)\n\n // Store the observer to be notified\n observerList.push(observer)\n\n return {\n unsubscribe: () => {\n observerList = observerList.filter(o => o !== observer)\n },\n }\n }\n\n // const unSubscribeAll = (): void => {\n // observerList = []\n // }\n\n return {\n // getValue,\n next,\n subscribe,\n // unSubscribeAll,\n }\n}\n"],"names":["nonReactiveObjectSymbol","Symbol","obj","newObj","Array","isArray","map","item","deepClone","isReactObjectLikeNode","isObject","isReactElement","objKeys","Object","keys","includes","some","k","startsWith","entries","forEach","_ref","getOwnPropertySymbols","symbol","$$typeof","isValidReactiveObject","value","hasOwn","call","bind","hasOwnProperty","store$$","objectToProxify","opts","fieldPath","_opts$nestedFieldPath","nestedFieldPath","objectWithRootValue","_objectWithRootValue","ROOT_VALUE","rootFunctions","fromEntries","filter","Proxy","get","targetObject","propName","receiver","target","propertyValue","Reflect","_$fieldPath","proxiedNestedObject","proxifyStore","parentObjectToProxify","afterChange","set","parentObject","key","newValue","_opts$parentObjectToP2","_opts","isRootTarget","previousValue","next","storeValue","change","id","_previousValue2","JSON","stringify","safeToJson","realInnerObject","$value","nextStoreChange","replace","has","t","p","ownKeys","getOwnPropertyDescriptor","o","props","type","globalThis","HTMLElement","content","innerHTML","_ref2","cervello","initialValue","options","isFlushing","itemsToFlush","observerList","clonedInitialValue","subscriberId","push","Promise","resolve","then","nonInitiallySentBySubscriber","length","i","subscribe","observer","unsubscribe","proxiedStore","store","reset","useStore","useId","isInitialValueSet","useRef","setRenderCount","useState","current","$$value","selectFieldPaths","select","selectedFieldPathsForNestedObjects","fp","reRender","useEffect","setValueOnMount","err","console","error","subscription","sc","storeChanges","onChange","nextChange","find","nonReactive","defineProperty","enumerable","writable","configurable"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cervello/react",
3
3
  "type": "module",
4
- "version": "5.4.0-beta.1",
4
+ "version": "5.4.0-beta.3",
5
5
  "description": "🤯 Simple, reactive, tiny and performant state-management library",
6
6
  "author": "Chempo",
7
7
  "license": "MIT",
@@ -5,4 +5,3 @@ export declare function proxifyStore<T extends Record<string | symbol, any>>(sto
5
5
  parentObjectToProxify?: any;
6
6
  afterChange?: (storeChange: Array<StoreChange<T>>) => void;
7
7
  }): T;
8
- export declare function safeStringify(obj: any): string;