@lomray/react-mobx-manager 2.1.3 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/{lib/context.d.ts → context.d.ts} +1 -1
  2. package/context.js +2 -0
  3. package/context.js.map +1 -0
  4. package/deep-merge.d.ts +5 -0
  5. package/deep-merge.js +2 -0
  6. package/deep-merge.js.map +1 -0
  7. package/events.js +2 -0
  8. package/events.js.map +1 -0
  9. package/{lib/index.d.ts → index.d.ts} +2 -1
  10. package/index.js +2 -0
  11. package/index.js.map +1 -0
  12. package/make-exported.d.ts +15 -0
  13. package/make-exported.js +2 -0
  14. package/make-exported.js.map +1 -0
  15. package/manager-stream.js +2 -0
  16. package/manager-stream.js.map +1 -0
  17. package/{lib/manager.d.ts → manager.d.ts} +2 -2
  18. package/manager.js +2 -0
  19. package/manager.js.map +1 -0
  20. package/{lib/on-change-listener.d.ts → on-change-listener.d.ts} +1 -1
  21. package/on-change-listener.js +2 -0
  22. package/on-change-listener.js.map +1 -0
  23. package/package.json +21 -35
  24. package/plugins/dev-extension/index.js +2 -0
  25. package/plugins/dev-extension/index.js.map +1 -0
  26. package/plugins/dev-extension/state-listener.js +2 -0
  27. package/plugins/dev-extension/state-listener.js.map +1 -0
  28. package/plugins/helpers.js +2 -0
  29. package/plugins/helpers.js.map +1 -0
  30. package/plugins/vite/id-generator.js +2 -0
  31. package/plugins/vite/id-generator.js.map +1 -0
  32. package/plugins/vite/index.js +2 -0
  33. package/plugins/vite/index.js.map +1 -0
  34. package/{lib/storages → storages}/async-storage.d.ts +1 -1
  35. package/storages/async-storage.js +2 -0
  36. package/storages/async-storage.js.map +1 -0
  37. package/{lib/storages → storages}/local-storage.d.ts +1 -1
  38. package/storages/local-storage.js +2 -0
  39. package/storages/local-storage.js.map +1 -0
  40. package/store-status.js +2 -0
  41. package/store-status.js.map +1 -0
  42. package/{lib/suspense-query.d.ts → suspense-query.d.ts} +2 -3
  43. package/suspense-query.js +2 -0
  44. package/suspense-query.js.map +1 -0
  45. package/{lib/types-70019566.d.ts → types.d.ts} +1 -0
  46. package/types.js +2 -0
  47. package/types.js.map +1 -0
  48. package/{lib/wakeup.d.ts → wakeup.d.ts} +1 -1
  49. package/wakeup.js +2 -0
  50. package/wakeup.js.map +1 -0
  51. package/{lib/with-stores.d.ts → with-stores.d.ts} +1 -1
  52. package/with-stores.js +2 -0
  53. package/with-stores.js.map +1 -0
  54. package/lib/context.js +0 -1
  55. package/lib/events.js +0 -1
  56. package/lib/index.js +0 -1
  57. package/lib/manager-stream.js +0 -1
  58. package/lib/manager.js +0 -1
  59. package/lib/on-change-listener.js +0 -1
  60. package/lib/plugins/dev-extension/index.js +0 -1
  61. package/lib/plugins/dev-extension/state-listener.js +0 -1
  62. package/lib/plugins/helpers.js +0 -1
  63. package/lib/plugins/vite/id-generator.js +0 -1
  64. package/lib/plugins/vite/index.js +0 -1
  65. package/lib/storages/async-storage.js +0 -1
  66. package/lib/storages/local-storage.js +0 -1
  67. package/lib/store-status.js +0 -1
  68. package/lib/suspense-query.js +0 -1
  69. package/lib/wakeup.js +0 -1
  70. package/lib/with-stores.js +0 -1
  71. /package/{lib/events.d.ts → events.d.ts} +0 -0
  72. /package/{lib/manager-stream.d.ts → manager-stream.d.ts} +0 -0
  73. /package/{lib/plugins → plugins}/dev-extension/index.d.ts +0 -0
  74. /package/{lib/plugins → plugins}/dev-extension/state-listener.d.ts +0 -0
  75. /package/{lib/plugins → plugins}/helpers.d.ts +0 -0
  76. /package/{lib/plugins → plugins}/vite/id-generator.d.ts +0 -0
  77. /package/{lib/plugins → plugins}/vite/index.d.ts +0 -0
  78. /package/{lib/store-status.d.ts → store-status.d.ts} +0 -0
@@ -2,7 +2,7 @@
2
2
  import React from 'react';
3
3
  import { FC, ReactElement } from "react";
4
4
  import Manager from "./manager.js";
5
- import { TStores } from "./types-70019566.js";
5
+ import { TStores } from "./types.js";
6
6
  interface IStoreManagerProvider {
7
7
  storeManager: Manager;
8
8
  shouldInit?: boolean;
package/context.js ADDED
@@ -0,0 +1,2 @@
1
+ import e,{useState as t,useEffect as r,useContext as n}from"react";const o=e.createContext({}),a=e.createContext("root"),c=({parentId:t,children:r,initStores:n})=>{const o=l();return n&&o.touchedStores(n),e.createElement(a.Provider,{value:t,children:r})},i=({children:n,storeManager:a,fallback:i,shouldInit:l=!1})=>{const[d,s]=t(!l);return r((()=>{l&&a.init().then((()=>s(!0))).catch((e=>{console.error("Failed initialized store manager: ",e)}))}),[l,a]),e.createElement(o.Provider,{value:a},e.createElement(c,{parentId:"root"},d?n:i||n))},l=()=>n(o),d=()=>n(a);export{o as StoreManagerContext,a as StoreManagerParentContext,c as StoreManagerParentProvider,i as StoreManagerProvider,l as useStoreManager,d as useStoreManagerParent};
2
+ //# sourceMappingURL=context.js.map
package/context.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sources":["../src/context.tsx"],"sourcesContent":["import type { FC, ReactElement } from 'react';\nimport React, { useContext, useEffect, useState } from 'react';\nimport type Manager from './manager';\nimport type { TStores } from './types';\n\ninterface IStoreManagerProvider {\n storeManager: Manager;\n shouldInit?: boolean;\n fallback?: ReactElement;\n children?: React.ReactNode;\n}\n\ninterface IStoreManagerParentProvider {\n parentId: string;\n children?: React.ReactNode;\n initStores?: TStores;\n}\n\n/**\n * Mobx store manager context\n */\nconst StoreManagerContext = React.createContext<Manager>({} as Manager);\n\n/**\n * To spread relationships\n */\nconst StoreManagerParentContext =\n React.createContext<IStoreManagerParentProvider['parentId']>('root');\n\n/**\n * Mobx store manager parent provider\n * @constructor\n */\nconst StoreManagerParentProvider: FC<Omit<IStoreManagerParentProvider, 'contextId'>> = ({\n parentId,\n children,\n initStores,\n}) => {\n const storeManager = useStoreManager();\n\n if (initStores) {\n storeManager.touchedStores(initStores);\n }\n\n return <StoreManagerParentContext.Provider value={parentId} children={children} />;\n};\n\n/**\n * Mobx store manager provider\n * @constructor\n */\nconst StoreManagerProvider: FC<IStoreManagerProvider> = ({\n children,\n storeManager,\n fallback,\n shouldInit = false,\n}) => {\n const [isInit, setInit] = useState(!shouldInit);\n\n useEffect(() => {\n if (!shouldInit) {\n return;\n }\n\n storeManager\n .init()\n .then(() => setInit(true))\n .catch((e: Error) => {\n console.error('Failed initialized store manager: ', e);\n });\n }, [shouldInit, storeManager]);\n\n return (\n <StoreManagerContext.Provider value={storeManager}>\n <StoreManagerParentProvider parentId=\"root\">\n {isInit ? children : fallback || children}\n </StoreManagerParentProvider>\n </StoreManagerContext.Provider>\n );\n};\n\nconst useStoreManager = (): Manager => useContext(StoreManagerContext);\n\nconst useStoreManagerParent = (): IStoreManagerParentProvider['parentId'] =>\n useContext(StoreManagerParentContext);\n\nexport {\n StoreManagerContext,\n StoreManagerParentContext,\n StoreManagerProvider,\n StoreManagerParentProvider,\n useStoreManager,\n useStoreManagerParent,\n};\n"],"names":["StoreManagerContext","React","createContext","StoreManagerParentContext","StoreManagerParentProvider","parentId","children","initStores","storeManager","useStoreManager","touchedStores","createElement","Provider","value","StoreManagerProvider","fallback","shouldInit","isInit","setInit","useState","useEffect","init","then","catch","e","console","error","useContext","useStoreManagerParent"],"mappings":"mEAqBM,MAAAA,EAAsBC,EAAMC,cAAuB,IAKnDC,EACJF,EAAMC,cAAuD,QAMzDE,EAAiF,EACrFC,WACAC,WACAC,iBAEA,MAAMC,EAAeC,IAMrB,OAJIF,GACFC,EAAaE,cAAcH,GAGtBN,EAACU,cAAAR,EAA0BS,SAAS,CAAAC,MAAOR,EAAUC,SAAUA,GAAY,EAO9EQ,EAAkD,EACtDR,WACAE,eACAO,WACAC,cAAa,MAEb,MAAOC,EAAQC,GAAWC,GAAUH,GAepC,OAbAI,GAAU,KACHJ,GAILR,EACGa,OACAC,MAAK,IAAMJ,GAAQ,KACnBK,OAAOC,IACNC,QAAQC,MAAM,qCAAsCF,EAAE,GACtD,GACH,CAACR,EAAYR,IAGdP,gBAACD,EAAoBY,SAAS,CAAAC,MAAOL,GACnCP,EAACU,cAAAP,GAA2BC,SAAS,QAClCY,EAASX,EAAWS,GAAYT,GAGrC,EAGEG,EAAkB,IAAekB,EAAW3B,GAE5C4B,EAAwB,IAC5BD,EAAWxB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Custom small deep merge function for restore store state
3
+ */
4
+ declare const deepMerge: (target: any, source: any) => void;
5
+ export { deepMerge as default };
package/deep-merge.js ADDED
@@ -0,0 +1,2 @@
1
+ const o=o=>null!==o&&"object"==typeof o,t=(e,n)=>{if(o(e)&&o(n))for(const f in n)e.hasOwnProperty(f)&&o(e[f])&&o(n[f])?t(e[f],n[f]):e[f]=n[f]};export{t as default};
2
+ //# sourceMappingURL=deep-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-merge.js","sources":["../src/deep-merge.ts"],"sourcesContent":["/**\n * Helper function to check if a variable is an object\n */\nconst isObject = (obj: any) => obj !== null && typeof obj === 'object';\n\n/**\n * Custom small deep merge function for restore store state\n */\nconst deepMerge = (target: any, source: any) => {\n if (!isObject(target) || !isObject(source)) {\n return;\n }\n\n for (const key in source) {\n if (target.hasOwnProperty(key)) {\n if (isObject(target[key]) && isObject(source[key])) {\n deepMerge(target[key] as Record<string, any>, source[key] as Record<string, any>);\n } else {\n target[key] = source[key];\n }\n } else {\n target[key] = source[key];\n }\n }\n};\n\nexport default deepMerge;\n"],"names":["isObject","obj","deepMerge","target","source","key","hasOwnProperty"],"mappings":"AAGA,MAAMA,EAAYC,GAAqB,OAARA,GAA+B,iBAARA,EAKhDC,EAAY,CAACC,EAAaC,KAC9B,GAAKJ,EAASG,IAAYH,EAASI,GAInC,IAAK,MAAMC,KAAOD,EACZD,EAAOG,eAAeD,IACpBL,EAASG,EAAOE,KAASL,EAASI,EAAOC,IAC3CH,EAAUC,EAAOE,GAA6BD,EAAOC,IAKvDF,EAAOE,GAAOD,EAAOC,EAExB"}
package/events.js ADDED
@@ -0,0 +1,2 @@
1
+ var e;!function(e){e.CREATE_STORE="mobx-manager:store-create",e.MOUNT_STORE="mobx-manager:store-mount",e.UNMOUNT_STORE="mobx-manager:store-unmount",e.DELETE_STORE="mobx-manager:store-delete"}(e||(e={}));var a=e;export{a as default};
2
+ //# sourceMappingURL=events.js.map
package/events.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sources":["../src/events.ts"],"sourcesContent":["/**\n * Store manager events\n */\nenum Events {\n CREATE_STORE = 'mobx-manager:store-create',\n MOUNT_STORE = 'mobx-manager:store-mount',\n UNMOUNT_STORE = 'mobx-manager:store-unmount',\n DELETE_STORE = 'mobx-manager:store-delete',\n}\n\nexport default Events;\n"],"names":["Events","Events$1"],"mappings":"AAGA,IAAKA,GAAL,SAAKA,GACHA,EAAA,aAAA,4BACAA,EAAA,YAAA,2BACAA,EAAA,cAAA,6BACAA,EAAA,aAAA,2BACD,CALD,CAAKA,IAAAA,EAKJ,CAAA,IAED,IAAAC,EAAeD"}
@@ -1,7 +1,8 @@
1
- export * from "./types-70019566.js";
1
+ export * from "./types.js";
2
2
  export * from "./context.js";
3
3
  export { default as Manager } from "./manager.js";
4
4
  export { default as onChangeListener } from "./on-change-listener.js";
5
5
  export { default as wakeup } from "./wakeup.js";
6
6
  export { default as withStores } from "./with-stores.js";
7
+ export * from "./make-exported.js";
7
8
  export { default as Events } from "./events.js";
package/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export{StoreManagerContext,StoreManagerParentContext,StoreManagerParentProvider,StoreManagerProvider,useStoreManager,useStoreManagerParent}from"./context.js";export{default as Manager}from"./manager.js";export{default as onChangeListener}from"./on-change-listener.js";export{default as wakeup}from"./wakeup.js";export{default as withStores}from"./with-stores.js";export{isPropObservableExported,isPropSimpleExported,makeExported}from"./make-exported.js";export{default as Events}from"./events.js";
2
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { TAnyStore } from "./types.js";
2
+ /**
3
+ * Make store props exported for Manager.toJSON
4
+ * @see Manager.toJSON
5
+ */
6
+ declare const makeExported: <T extends object>(store: T, props: { [P in Exclude<keyof T, "toString">]?: "observable" | "simple" | undefined; }) => void;
7
+ /**
8
+ * Check if store prop is observable exported
9
+ */
10
+ declare const isPropObservableExported: (store: TAnyStore, prop: string) => boolean;
11
+ /**
12
+ * Check if store prop is simple exported
13
+ */
14
+ declare const isPropSimpleExported: (store: TAnyStore, prop: string) => boolean;
15
+ export { makeExported, isPropObservableExported, isPropSimpleExported };
@@ -0,0 +1,2 @@
1
+ const e="libExported",o=(o,b)=>{o[e]=b},b=(o,b)=>"observable"===o?.[e]?.[b],l=(o,b)=>"simple"===o?.[e]?.[b];export{b as isPropObservableExported,l as isPropSimpleExported,o as makeExported};
2
+ //# sourceMappingURL=make-exported.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-exported.js","sources":["../src/make-exported.ts"],"sourcesContent":["import type { TAnyStore } from '@src/types';\n\nconst exportedPropName = 'libExported';\n\n/**\n * Make store props exported for Manager.toJSON\n * @see Manager.toJSON\n */\nconst makeExported = <T extends object>(\n store: T,\n props: {\n [P in Exclude<keyof T, 'toString'>]?: 'observable' | 'simple';\n },\n): void => {\n store[exportedPropName] = props;\n};\n\n/**\n * Check if store prop is observable exported\n */\nconst isPropObservableExported = (store: TAnyStore, prop: string): boolean =>\n store?.[exportedPropName]?.[prop] === 'observable';\n\n/**\n * Check if store prop is simple exported\n */\nconst isPropSimpleExported = (store: TAnyStore, prop: string): boolean =>\n store?.[exportedPropName]?.[prop] === 'simple';\n\nexport { makeExported, isPropObservableExported, isPropSimpleExported };\n"],"names":["exportedPropName","makeExported","store","props","isPropObservableExported","prop","isPropSimpleExported"],"mappings":"AAEA,MAAMA,EAAmB,cAMnBC,EAAe,CACnBC,EACAC,KAIAD,EAAMF,GAAoBG,CAAK,EAM3BC,EAA2B,CAACF,EAAkBG,IACZ,eAAtCH,IAAQF,KAAoBK,GAKxBC,EAAuB,CAACJ,EAAkBG,IACR,WAAtCH,IAAQF,KAAoBK"}
@@ -0,0 +1,2 @@
1
+ class s{isPreamblePushed=!1;manager;constructor(s){this.manager=s}take(s){const e=this.manager.getSuspenseRelations().get(s);if(!e?.size)return;const t=JSON.stringify(this.manager.toJSON([...e])),i=this.isPreamblePushed?"":"<script>!window.mbxM && (window.mbxM = []);<\/script>";return this.isPreamblePushed||(this.isPreamblePushed=!0),`${i}<script>window.mbxM.push(${t});<\/script>`}}export{s as default};
2
+ //# sourceMappingURL=manager-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager-stream.js","sources":["../src/manager-stream.ts"],"sourcesContent":["import type Manager from './manager';\n\n/**\n * Stream mobx manager stores\n */\nclass ManagerStream {\n /**\n * Already pushed preamble\n */\n protected isPreamblePushed = false;\n\n /**\n * Mobx store manager\n */\n protected manager: Manager;\n\n /**\n * @constructor\n */\n public constructor(manager: Manager) {\n this.manager = manager;\n }\n\n /**\n * Return script with suspense stores to push on stream\n */\n public take(suspenseId: string): string | void {\n const storesIds = this.manager.getSuspenseRelations().get(suspenseId);\n\n if (!storesIds?.size) {\n return;\n }\n\n const storesState = JSON.stringify(this.manager.toJSON([...storesIds]));\n const chunk = this.isPreamblePushed\n ? ''\n : '<script>!window.mbxM && (window.mbxM = []);</script>';\n\n if (!this.isPreamblePushed) {\n this.isPreamblePushed = true;\n }\n\n return `${chunk}<script>window.mbxM.push(${storesState});</script>`;\n }\n}\n\nexport default ManagerStream;\n"],"names":["ManagerStream","isPreamblePushed","manager","constructor","this","take","suspenseId","storesIds","getSuspenseRelations","get","size","storesState","JSON","stringify","toJSON","chunk"],"mappings":"AAKA,MAAMA,EAIMC,kBAAmB,EAKnBC,QAKVC,YAAmBD,GACjBE,KAAKF,QAAUA,CAChB,CAKMG,KAAKC,GACV,MAAMC,EAAYH,KAAKF,QAAQM,uBAAuBC,IAAIH,GAE1D,IAAKC,GAAWG,KACd,OAGF,MAAMC,EAAcC,KAAKC,UAAUT,KAAKF,QAAQY,OAAO,IAAIP,KACrDQ,EAAQX,KAAKH,iBACf,GACA,wDAMJ,OAJKG,KAAKH,mBACRG,KAAKH,kBAAmB,GAGnB,GAAGc,6BAAiCJ,eAC5C"}
@@ -1,5 +1,5 @@
1
1
  import StoreStatus from "./store-status.js";
2
- import { IConstructableStore, IManagerOptions, IManagerParams, IStorage, IStoreParams, TAnyStore, TInitStore, TStoreDefinition, TStores } from "./types-70019566.js";
2
+ import { IConstructableStore, IManagerOptions, IManagerParams, IStorage, IStoreParams, TAnyStore, TInitStore, TStoreDefinition, TStores } from "./types.js";
3
3
  /**
4
4
  * Mobx stores manager
5
5
  */
@@ -11,7 +11,7 @@ declare class Manager {
11
11
  /**
12
12
  * Created stores
13
13
  */
14
- protected readonly stores: Map<string, TInitStore<import("./types-70019566.js").IStore>>;
14
+ protected readonly stores: Map<string, TInitStore<import("./types.js").IStore>>;
15
15
  /**
16
16
  * Relations between stores
17
17
  * @protected
package/manager.js ADDED
@@ -0,0 +1,2 @@
1
+ import t from"@lomray/event-manager";import{toJS as e,isObservableProp as s}from"mobx";import{isPropSimpleExported as o,isPropObservableExported as r}from"./make-exported.js";import i from"./deep-merge.js";import n from"./events.js";import a from"./on-change-listener.js";import p from"./store-status.js";import l from"./wakeup.js";class d{static instance;stores=new Map;storesRelations=new Map;static persistedStores=new Set;initState;storage;persistData={};storesParams;options={shouldDisablePersist:!1,shouldRemoveInitState:!0};suspenseRelations=new Map;constructor({initState:t,storesParams:e,storage:s,options:o}={}){if(this.initState=t||{},this.storesParams=e||{},this.storage=s,Object.assign(this.options,o||{}),d.instance=this,"undefined"!=typeof window){const t=window.mbxM;window.mbxM={push:this.pushInitState},(Array.isArray(t)?t:[]).forEach(this.pushInitState)}}async init(){return this.storage&&(this.persistData=await this.storage.get()||{}),this}static get(){if(!d.instance)throw new Error("Store manager is not initialized.");return d.instance}getStores(){return this.stores}getStoresRelations(){return this.storesRelations}getSuspenseRelations(){return this.suspenseRelations}static getPersistedStoresIds(){return d.persistedStores}pushInitState=(t={})=>{for(const[e,s]of Object.entries(t))this.initState[e]=s};getStoreId(t,e={}){const{id:s,contextId:o,key:r}=e;if(s)return s;if(t.libStoreId)return t.libStoreId;let i=t.id||t.name||t.constructor.name;return t.isGlobal?i:(i=`${i}--${o}`,r?`${i}--${r}`:i)}getStore(t,e={}){const s=this.getStoreId(t,e);return this.stores.has(s)?this.stores.get(s):t.isGlobal?this.createStore(t,{id:s,contextId:"global",parentId:"root",suspenseId:"",componentName:"root-app",componentProps:{}}):this.lookupStore(s,e)}lookupStore(t,e){const{contextId:s,parentId:o}=e,r=t.split("--")?.[0],{ids:i,parentId:n}=this.storesRelations.get(s)??{ids:new Set,parentId:o},a=[...i].filter((t=>t.startsWith(`${r}--`)));if(1===a.length)return this.stores.get(a[0]);if(a.length>1)console.error("Parent context has multiple stores with the same id, please pass key to getStore function.");else if(n&&"root"!==n)return this.lookupStore(t,{contextId:this.getBiggerContext(n,o)})}getBiggerContext(t,e){if(!t)return e;if(!e)return t;const s=/[^a-zA-Z]/g;return t.replace(s,"")>e.replace(s,"")?t:e}createStore(e,s){const{id:o,contextId:r,parentId:i,suspenseId:a,componentName:l,componentProps:d}=s;if(this.stores.has(o))return this.stores.get(o);const h=new e({...this.storesParams,storeManager:this,getStore:(t,e={contextId:r,parentId:i})=>this.getStore(t,e),componentProps:d,initState:this.initState[o]});return h.libStoreId=o,h.isGlobal=e.isGlobal,h.libStoreContextId=e.isGlobal?"global":r,h.libStoreParentId=e.isGlobal||!i||i===r?"root":i,h.libStoreSuspenseId=a,h.libStoreComponentName=l,this.setStoreStatus(h,e.isGlobal?p.inUse:p.init),this.prepareStore(h),t.publish(n.CREATE_STORE,{store:e}),h}createStores(t,e,s,o,r,i={}){return t.reduce(((t,[n,a])=>{const[p,l]="store"in a?[a.store,a.id]:[a,this.getStoreId(a,{key:n,contextId:s})];return{...t,[n]:this.createStore(p,{id:l,contextId:s,parentId:e,suspenseId:o,componentName:r,componentProps:i})}}),{})}prepareStore(t){const e=t.libStoreId,s=t.libStoreContextId,o=t.libStoreSuspenseId,r=this.initState[e],n=this.persistData[e];if(this.stores.has(e))return;if(r&&i(t,r),"wakeup"in t&&d.persistedStores.has(e)&&t.wakeup?.({initState:r,persistedState:n}),d.persistedStores.has(e)&&"addOnChangeListener"in t){const e=t.onDestroy?.bind(t),s=t.addOnChangeListener(t,this);t.onDestroy=()=>{s?.(),e?.()}}t.init?.(),this.storesRelations.has(s)||this.storesRelations.set(s,{ids:new Set,parentId:t.libStoreParentId&&t.libStoreParentId!==s?t.libStoreParentId:"root",componentName:t.libStoreComponentName}),this.suspenseRelations.has(o)||this.suspenseRelations.set(o,new Set);const{ids:a}=this.storesRelations.get(s);this.stores.set(e,t),a.add(e),this.suspenseRelations.get(o).add(e)}removeStore(e){const s=e.libStoreId,o=e.libStoreSuspenseId,{ids:r}=this.storesRelations.get(e.libStoreContextId)??{ids:new Set};this.stores.has(s)&&(this.stores.delete(s),r.delete(s),o&&this.suspenseRelations.get(o)?.has(s)&&this.suspenseRelations.get(o).delete(s),r.size||this.storesRelations.delete(e.libStoreContextId),"onDestroy"in e&&e.onDestroy?.(),t.publish(n.DELETE_STORE,{store:e}))}mountStores(e){const{shouldRemoveInitState:s}=this.options;return Object.values(e).forEach((e=>{const o=e.libStoreId;s&&this.initState[o]&&delete this.initState[o],this.setStoreStatus(e,p.inUse),t.publish(n.MOUNT_STORE,{store:e})})),()=>{Object.values(e).forEach((e=>{e.isGlobal||(this.setStoreStatus(e,p.unused),t.publish(n.UNMOUNT_STORE,{store:e}))}))}}touchedStores(t){Object.values(t).forEach((t=>{t.libStoreStatus!==p.init||t.isGlobal||this.setStoreStatus(t,p.touched)}))}setStoreStatus(t,e){const{destroyTimers:{init:s=500,touched:o=1e4,unused:r=1e3}={}}=this.options;t.libStoreStatus=e,clearTimeout(t.libDestroyTimer);let i=0;switch(e){case p.init:i=s;break;case p.touched:i=o;break;case p.unused:i=r}i&&(t.libDestroyTimer=setTimeout((()=>this.removeStore(t)),i))}toJSON(t){const e={},s=Array.isArray(t)?t.reduce(((t,e)=>(this.stores.has(e)&&t.set(e,this.stores.get(e)),t)),new Map):this.stores;for(const[t,o]of s.entries())e[t]=o.toJSON?.()??d.getObservableProps(o);return e}toPersistedJSON(){const t={};for(const e of d.persistedStores){const s=this.stores.get(e);s&&(t[e]=s.toJSON?.()??d.getObservableProps(s))}return t}static getObservableProps(t){const i=e(t);return Object.entries(i).reduce(((e,[i,n])=>({...e,...s(t,i)||o(t,i)?{[i]:n}:{},...r(t,i)?{[i]:d.getObservableProps(t[i])}:{}})),{})}static persistStore(t,e){return d.persistedStores.has(e)?(console.warn(`Duplicate serializable store key: ${e}`),t):(d.persistedStores.add(e),t.libStoreId=e,"wakeup"in t.prototype||(t.prototype.wakeup=l),"addOnChangeListener"in t.prototype||(t.prototype.addOnChangeListener=a),t)}}export{d as default};
2
+ //# sourceMappingURL=manager.js.map
package/manager.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sources":["../src/manager.ts"],"sourcesContent":["import EventManager from '@lomray/event-manager';\nimport { isObservableProp, toJS } from 'mobx';\nimport { isPropObservableExported, isPropSimpleExported } from '@src/make-exported';\nimport deepMerge from './deep-merge';\nimport Events from './events';\nimport onChangeListener from './on-change-listener';\nimport StoreStatus from './store-status';\nimport type {\n IConstructableStore,\n IManagerOptions,\n IManagerParams,\n IStorage,\n IStoreParams,\n TAnyStore,\n TInitStore,\n TStoreDefinition,\n TStores,\n} from './types';\nimport wakeup from './wakeup';\n\n/**\n * Mobx stores manager\n */\nclass Manager {\n /**\n * Manger instance\n */\n protected static instance: Manager;\n\n /**\n * Created stores\n */\n protected readonly stores = new Map<string, TInitStore>();\n\n /**\n * Relations between stores\n * @protected\n */\n protected readonly storesRelations = new Map<\n string, // contextId\n { ids: Set<string>; parentId: string | null; componentName?: string }\n >();\n\n /**\n * Save persisted stores identities\n * @private\n */\n protected static readonly persistedStores = new Set<string>();\n\n /**\n * Initial stores state (local storage, custom etc.)\n * @private\n */\n protected readonly initState: Record<string, any>;\n\n /**\n * Storage for persisted stores\n */\n public readonly storage: IStorage | undefined;\n\n /**\n * Restored persist storage data\n * @protected\n */\n protected persistData: Record<string, any> = {};\n\n /**\n * Additional store's constructor params\n * @private\n */\n protected readonly storesParams: IManagerParams['storesParams'];\n\n /**\n * Manager options\n */\n public readonly options: IManagerOptions = {\n shouldDisablePersist: false,\n shouldRemoveInitState: true,\n };\n\n /**\n * Suspense stores relations\n * @see withStores\n */\n protected suspenseRelations: Map<string, Set<string>> = new Map();\n\n /**\n * @constructor\n */\n public constructor({ initState, storesParams, storage, options }: IManagerParams = {}) {\n this.initState = initState || {};\n this.storesParams = storesParams || {};\n this.storage = storage;\n\n Object.assign(this.options, options || {});\n\n Manager.instance = this;\n\n // only client side\n if (typeof window !== 'undefined') {\n const state = window.mbxM;\n\n window.mbxM = { push: this.pushInitState };\n\n (Array.isArray(state) ? state : []).forEach(this.pushInitState);\n }\n }\n\n /**\n * Init store manager\n */\n public async init(): Promise<Manager> {\n if (this.storage) {\n this.persistData = (await this.storage.get()) || {};\n }\n\n return this;\n }\n\n /**\n * Get manager instance\n */\n public static get(): Manager {\n if (!Manager.instance) {\n throw new Error('Store manager is not initialized.');\n }\n\n return Manager.instance;\n }\n\n /**\n * Get all stores\n */\n public getStores(): Manager['stores'] {\n return this.stores;\n }\n\n /**\n * Get stores relations\n */\n public getStoresRelations(): Manager['storesRelations'] {\n return this.storesRelations;\n }\n\n /**\n * Get suspense relations with stores\n */\n public getSuspenseRelations(): Manager['suspenseRelations'] {\n return this.suspenseRelations;\n }\n\n /**\n * Get persisted stores ids\n */\n public static getPersistedStoresIds(): Set<string> {\n return Manager.persistedStores;\n }\n\n /**\n * Push initial state dynamically\n * E.g. when stream html\n */\n public pushInitState = (storesState: Record<string, any> = {}): void => {\n for (const [storeId, state] of Object.entries(storesState)) {\n this.initState[storeId] = state;\n }\n };\n\n /**\n * Get store identity\n * @protected\n */\n protected getStoreId<T extends TAnyStore>(\n store: IConstructableStore<T> | TInitStore,\n params: IStoreParams = {},\n ): string {\n const { id, contextId, key } = params;\n\n if (id) {\n return id;\n }\n\n if (store.libStoreId) {\n return store.libStoreId;\n }\n\n let storeId = (store['id'] as string) || (store['name'] as string) || store.constructor.name;\n\n if (store.isGlobal) {\n return storeId;\n }\n\n storeId = `${storeId}--${contextId!}`;\n\n return key ? `${storeId}--${key}` : storeId;\n }\n\n /**\n * Get exist store\n */\n public getStore<T>(store: IConstructableStore<T>, params: IStoreParams = {}): T | undefined {\n const storeId = this.getStoreId(store, params);\n\n // full match\n if (this.stores.has(storeId)) {\n return this.stores.get(storeId) as T;\n }\n\n // in case with global store (create if not exist)\n if (store.isGlobal) {\n return this.createStore(store, {\n id: storeId,\n contextId: 'global',\n parentId: 'root',\n suspenseId: '',\n componentName: 'root-app',\n componentProps: {},\n });\n }\n\n // try to look up store in current or parent context\n return this.lookupStore(storeId, params) as T;\n }\n\n /**\n * Lookup store\n */\n protected lookupStore(id: string, params: IStoreParams): TInitStore<TAnyStore> | undefined {\n const { contextId, parentId: defaultParentId } = params;\n const clearId = id.split('--')?.[0];\n const { ids, parentId } = this.storesRelations.get(contextId!) ?? {\n ids: new Set(),\n parentId: defaultParentId,\n };\n\n const matchedIds = [...ids].filter((storeId) => storeId.startsWith(`${clearId}--`));\n\n if (matchedIds.length === 1) {\n return this.stores.get(matchedIds[0]);\n } else if (matchedIds.length > 1) {\n console.error(\n 'Parent context has multiple stores with the same id, please pass key to getStore function.',\n );\n\n return undefined;\n }\n\n if (!parentId || parentId === 'root') {\n return undefined;\n }\n\n return this.lookupStore(id, { contextId: this.getBiggerContext(parentId, defaultParentId) });\n }\n\n /**\n * Get bigger context from two\n */\n protected getBiggerContext(ctx1?: string, ctx2?: string): string | undefined {\n if (!ctx1) {\n return ctx2;\n } else if (!ctx2) {\n return ctx1;\n }\n\n const regexp = /[^a-zA-Z]/g;\n\n return ctx1.replace(regexp, '') > ctx2.replace(regexp, '') ? ctx1 : ctx2;\n }\n\n /**\n * Create new store instance\n */\n protected createStore<T>(\n store: IConstructableStore<T>,\n params: Omit<Required<IStoreParams>, 'key'>,\n ): T {\n const { id, contextId, parentId, suspenseId, componentName, componentProps } = params;\n\n // only for global store\n if (this.stores.has(id)) {\n return this.stores.get(id) as T;\n }\n\n const newStore = new store({\n ...this.storesParams,\n storeManager: this,\n getStore: <TS>(\n targetStore: IConstructableStore<TS>,\n targetParams = { contextId, parentId },\n ) => this.getStore(targetStore, targetParams),\n componentProps,\n initState: this.initState[id],\n });\n\n // assign params to new store\n newStore.libStoreId = id;\n newStore.isGlobal = store.isGlobal;\n newStore.libStoreContextId = store.isGlobal ? 'global' : contextId;\n newStore.libStoreParentId =\n store.isGlobal || !parentId || parentId === contextId ? 'root' : parentId;\n newStore.libStoreSuspenseId = suspenseId;\n newStore.libStoreComponentName = componentName;\n\n this.setStoreStatus(newStore, store.isGlobal ? StoreStatus.inUse : StoreStatus.init);\n this.prepareStore(newStore);\n EventManager.publish(Events.CREATE_STORE, { store });\n\n return newStore as T;\n }\n\n /**\n * Create stores for component\n */\n public createStores(\n map: [string, TStoreDefinition][],\n parentId: string,\n contextId: string,\n suspenseId: string,\n componentName: string,\n componentProps: Record<string, any> = {},\n ): TStores {\n return map.reduce((res, [key, store]) => {\n const [s, id] =\n 'store' in store\n ? [store.store, store.id!]\n : [store, this.getStoreId(store, { key, contextId })];\n\n return {\n ...res,\n [key]: this.createStore(s, {\n id,\n contextId,\n parentId,\n suspenseId,\n componentName,\n componentProps,\n }),\n };\n }, {});\n }\n\n /**\n * Prepare store before usage\n */\n protected prepareStore(store: TStores[string]): void {\n const storeId = store.libStoreId!;\n const contextId = store.libStoreContextId!;\n const suspenseId = store.libStoreSuspenseId!;\n\n // restore initial state from server\n const initState = this.initState[storeId];\n const persistedState = this.persistData[storeId];\n\n if (this.stores.has(storeId)) {\n return;\n }\n\n if (initState) {\n deepMerge(store, initState);\n }\n\n // restore persisted state\n if ('wakeup' in store && Manager.persistedStores.has(storeId)) {\n store.wakeup?.({ initState, persistedState });\n }\n\n // track changes in persisted store\n if (Manager.persistedStores.has(storeId) && 'addOnChangeListener' in store) {\n const onDestroyDefault = store.onDestroy?.bind(store);\n const removeListener = store.addOnChangeListener!(store, this);\n\n store.onDestroy = () => {\n removeListener?.();\n onDestroyDefault?.();\n };\n }\n\n store.init?.();\n\n if (!this.storesRelations.has(contextId)) {\n this.storesRelations.set(contextId, {\n ids: new Set(),\n parentId:\n !store.libStoreParentId || store.libStoreParentId === contextId\n ? 'root'\n : store.libStoreParentId,\n componentName: store.libStoreComponentName,\n });\n }\n\n if (!this.suspenseRelations.has(suspenseId)) {\n this.suspenseRelations.set(suspenseId, new Set());\n }\n\n const { ids } = this.storesRelations.get(contextId)!;\n\n // add store to manager\n this.stores.set(storeId, store);\n ids.add(storeId);\n // add store relation with suspense\n this.suspenseRelations.get(suspenseId)!.add(storeId);\n }\n\n /**\n * Remove store\n */\n protected removeStore(store: TStores[string]): void {\n const storeId = store.libStoreId!;\n const suspenseId = store.libStoreSuspenseId!;\n const { ids } = this.storesRelations.get(store.libStoreContextId!) ?? { ids: new Set() };\n\n if (!this.stores.has(storeId)) {\n return;\n }\n\n this.stores.delete(storeId);\n ids.delete(storeId);\n\n if (suspenseId && this.suspenseRelations.get(suspenseId)?.has(storeId)) {\n this.suspenseRelations.get(suspenseId)!.delete(storeId);\n }\n\n // cleanup store relations\n if (!ids.size) {\n this.storesRelations.delete(store.libStoreContextId!);\n }\n\n if ('onDestroy' in store) {\n store.onDestroy?.();\n }\n\n EventManager.publish(Events.DELETE_STORE, { store });\n }\n\n /**\n * Mount stores to component\n */\n public mountStores(stores: TStores): () => void {\n const { shouldRemoveInitState } = this.options;\n\n Object.values(stores).forEach((store) => {\n const storeId = store.libStoreId!;\n\n // cleanup init state\n if (shouldRemoveInitState && this.initState[storeId]) {\n delete this.initState[storeId];\n }\n\n this.setStoreStatus(store, StoreStatus.inUse);\n EventManager.publish(Events.MOUNT_STORE, { store });\n });\n\n return () => {\n Object.values(stores).forEach((store) => {\n if (store.isGlobal) {\n return;\n }\n\n this.setStoreStatus(store, StoreStatus.unused);\n EventManager.publish(Events.UNMOUNT_STORE, { store });\n });\n };\n }\n\n /**\n * Change the stores status to touched\n */\n public touchedStores(stores: TStores): void {\n Object.values(stores).forEach((store) => {\n if (store.libStoreStatus !== StoreStatus.init || store.isGlobal) {\n return;\n }\n\n this.setStoreStatus(store, StoreStatus.touched);\n });\n }\n\n /**\n * Change store status\n */\n protected setStoreStatus(store: TStores[string], status: StoreStatus): void {\n const { destroyTimers: { init = 500, touched = 10000, unused = 1000 } = {} } = this.options;\n\n store.libStoreStatus = status;\n\n clearTimeout(store.libDestroyTimer);\n\n let destroyTime = 0;\n\n switch (status) {\n case StoreStatus.init:\n destroyTime = init;\n break;\n\n case StoreStatus.touched:\n destroyTime = touched;\n break;\n\n case StoreStatus.unused:\n destroyTime = unused;\n break;\n }\n\n if (!destroyTime) {\n return;\n }\n\n store.libDestroyTimer = setTimeout(() => this.removeStore(store), destroyTime);\n }\n\n /**\n * Get store's state\n */\n public toJSON(ids?: string[]): Record<string, any> {\n const result = {};\n const stores = Array.isArray(ids)\n ? ids.reduce((res, id) => {\n if (this.stores.has(id)) {\n res.set(id, this.stores.get(id)!);\n }\n\n return res;\n }, new Map<string, TInitStore>())\n : this.stores;\n\n for (const [storeId, store] of stores.entries()) {\n result[storeId] = store.toJSON?.() ?? Manager.getObservableProps(store);\n }\n\n return result;\n }\n\n /**\n * Get persisted store's data\n */\n public toPersistedJSON(): Record<string, any> {\n const result = {};\n\n for (const storeKey of Manager.persistedStores) {\n const store = this.stores.get(storeKey);\n\n if (!store) {\n continue;\n }\n\n result[storeKey] = store['toJSON']?.() ?? Manager.getObservableProps(store);\n }\n\n return result;\n }\n\n /**\n * Get observable store props (fields)\n */\n public static getObservableProps(store: TAnyStore): Record<string, any> {\n const props = toJS(store);\n\n return Object.entries(props).reduce(\n (res, [prop, value]) => ({\n ...res,\n ...(isObservableProp(store, prop) || isPropSimpleExported(store, prop)\n ? { [prop]: value }\n : {}),\n ...(isPropObservableExported(store, prop)\n ? { [prop]: Manager.getObservableProps(store[prop] as TAnyStore) }\n : {}),\n }),\n {},\n );\n }\n\n /**\n * Persist store\n */\n public static persistStore<TSt>(\n store: IConstructableStore<TSt>,\n id: string,\n ): IConstructableStore<TSt> {\n if (Manager.persistedStores.has(id)) {\n console.warn(`Duplicate serializable store key: ${id}`);\n\n return store;\n }\n\n Manager.persistedStores.add(id);\n\n store.libStoreId = id;\n\n // add default wakeup handler\n if (!('wakeup' in store.prototype)) {\n store.prototype.wakeup = wakeup;\n }\n\n // add default changes listener\n if (!('addOnChangeListener' in store.prototype)) {\n store.prototype.addOnChangeListener = onChangeListener;\n }\n\n return store;\n }\n}\n\nexport default Manager;\n"],"names":["Manager","static","stores","Map","storesRelations","Set","initState","storage","persistData","storesParams","options","shouldDisablePersist","shouldRemoveInitState","suspenseRelations","constructor","this","Object","assign","instance","window","state","mbxM","push","pushInitState","Array","isArray","forEach","async","get","Error","getStores","getStoresRelations","getSuspenseRelations","persistedStores","storesState","storeId","entries","getStoreId","store","params","id","contextId","key","libStoreId","name","isGlobal","getStore","has","createStore","parentId","suspenseId","componentName","componentProps","lookupStore","defaultParentId","clearId","split","ids","matchedIds","filter","startsWith","length","console","error","getBiggerContext","ctx1","ctx2","regexp","replace","newStore","storeManager","targetStore","targetParams","libStoreContextId","libStoreParentId","libStoreSuspenseId","libStoreComponentName","setStoreStatus","StoreStatus","inUse","init","prepareStore","EventManager","publish","Events","CREATE_STORE","createStores","map","reduce","res","s","persistedState","deepMerge","wakeup","onDestroyDefault","onDestroy","bind","removeListener","addOnChangeListener","set","add","removeStore","delete","size","DELETE_STORE","mountStores","values","MOUNT_STORE","unused","UNMOUNT_STORE","touchedStores","libStoreStatus","touched","status","destroyTimers","clearTimeout","libDestroyTimer","destroyTime","setTimeout","toJSON","result","getObservableProps","toPersistedJSON","storeKey","props","toJS","prop","value","isObservableProp","isPropSimpleExported","isPropObservableExported","warn","prototype","onChangeListener"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { IStorePersisted } from "./types-70019566.js";
1
+ import { IStorePersisted } from "./types.js";
2
2
  /**
3
3
  * Listen persist store changes
4
4
  */
@@ -0,0 +1,2 @@
1
+ import{reaction as o,toJS as s}from"mobx";const t=(t,e)=>{const{shouldDisablePersist:r}=e.options;if(!r&&e.storage)return o((()=>t.toJSON?.()??s(t)),(()=>{try{e.storage?.set(e.toPersistedJSON())?.catch((o=>{console.error("Failed to persist stores #1: ",o)}))}catch(o){console.error("Failed to persist stores #2: ",o)}}))};export{t as default};
2
+ //# sourceMappingURL=on-change-listener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-change-listener.js","sources":["../src/on-change-listener.ts"],"sourcesContent":["import { reaction, toJS } from 'mobx';\nimport type { IStorePersisted } from './types';\n\n/**\n * Listen persist store changes\n */\nconst onChangeListener: IStorePersisted['addOnChangeListener'] = (store, manager) => {\n const { shouldDisablePersist } = manager.options;\n\n if (shouldDisablePersist || !manager.storage) {\n return;\n }\n\n return reaction(\n () => store.toJSON?.() ?? toJS(store),\n () => {\n try {\n manager.storage?.set(manager.toPersistedJSON())?.catch((e: Error) => {\n console.error('Failed to persist stores #1: ', e);\n });\n } catch (e) {\n console.error('Failed to persist stores #2: ', e);\n }\n },\n );\n};\n\nexport default onChangeListener;\n"],"names":["onChangeListener","store","manager","shouldDisablePersist","options","storage","reaction","toJSON","toJS","set","toPersistedJSON","catch","e","console","error"],"mappings":"0CAMA,MAAMA,EAA2D,CAACC,EAAOC,KACvE,MAAMC,qBAAEA,GAAyBD,EAAQE,QAEzC,IAAID,GAAyBD,EAAQG,QAIrC,OAAOC,GACL,IAAML,EAAMM,YAAcC,EAAKP,KAC/B,KACE,IACEC,EAAQG,SAASI,IAAIP,EAAQQ,oBAAoBC,OAAOC,IACtDC,QAAQC,MAAM,gCAAiCF,EAAE,GAEpD,CAAC,MAAOA,GACPC,QAAQC,MAAM,gCAAiCF,EAChD,IAEJ"}
package/package.json CHANGED
@@ -1,21 +1,9 @@
1
1
  {
2
2
  "name": "@lomray/react-mobx-manager",
3
- "version": "2.1.3",
3
+ "version": "3.0.0",
4
4
  "description": "This package provides Mobx stores manager for react.",
5
- "main": "lib/index.js",
6
- "types": "lib/index.d.ts",
7
- "exports": {
8
- ".": "./lib/index.js",
9
- "./*": "./lib/*.js"
10
- },
11
- "typesVersions": {
12
- "*": {
13
- "./*": [
14
- "lib/*",
15
- "lib/storages/*"
16
- ]
17
- }
18
- },
5
+ "type": "module",
6
+ "main": "index.js",
19
7
  "repository": {
20
8
  "type": "git",
21
9
  "url": "https://github.com/Lomray-Software/react-mobx-manager"
@@ -49,48 +37,46 @@
49
37
  "lint:format": "eslint --fix --ext \".ts,.tsx\" \"src/**/*.{ts,tsx,*.ts,*tsx}\"",
50
38
  "ts:check": "tsc --project ./tsconfig.checks.json --skipLibCheck --noemit",
51
39
  "test": "mocha --no-warnings __tests__ --recursive --unhandled-rejections=strict --exit",
52
- "test:watch": "mocha --no-warnings __tests__ --recursive --unhandled-rejections=strict",
53
- "prepare": "husky install"
54
- },
55
- "dependencies": {
56
- "@lomray/consistent-suspense": "^1.3.1",
57
- "@lomray/event-manager": "^2.0.2"
40
+ "test:watch": "mocha --no-warnings __tests__ --recursive --unhandled-rejections=strict"
58
41
  },
59
42
  "devDependencies": {
60
- "@commitlint/cli": "^18.4.3",
61
- "@commitlint/config-conventional": "^18.4.3",
43
+ "@commitlint/cli": "^18.4.4",
44
+ "@commitlint/config-conventional": "^18.4.4",
62
45
  "@lomray/eslint-config-react": "^3.0.0",
63
- "@lomray/prettier-config": "^1.2.0",
46
+ "@lomray/prettier-config": "^2.0.1",
64
47
  "@rollup/plugin-terser": "^0.4.4",
65
48
  "@types/chai": "^4.3.11",
66
49
  "@types/hoist-non-react-statics": "^3.3.5",
67
50
  "@types/lodash": "^4.14.202",
68
51
  "@types/mocha": "^10.0.6",
69
- "@types/react": "^18.2.42",
70
- "@types/sinon": "^17.0.2",
52
+ "@types/react": "^18.2.47",
53
+ "@types/sinon": "^17.0.3",
71
54
  "@types/sinon-chai": "^3.2.12",
72
- "c8": "^8.0.1",
73
- "chai": "^4.3.10",
74
- "eslint": "^8.55.0",
55
+ "c8": "^9.0.0",
56
+ "chai": "^4.4.0",
57
+ "eslint": "^8.56.0",
75
58
  "eslint-config-prettier": "^9.1.0",
76
59
  "eslint-plugin-jsx-a11y": "^6.8.0",
77
- "eslint-plugin-prettier": "^5.0.1",
60
+ "eslint-plugin-prettier": "^5.1.3",
78
61
  "husky": "^8.0.3",
79
62
  "lint-staged": "^15.2.0",
80
63
  "mocha": "^10.2.0",
81
- "prettier": "^3.1.0",
82
- "rollup": "2.79.1",
64
+ "prettier": "^3.1.1",
65
+ "rollup": "^4.9.4",
66
+ "rollup-plugin-copy": "^3.5.0",
67
+ "rollup-plugin-folder-input": "^1.0.1",
83
68
  "rollup-plugin-ts": "^3.4.5",
84
69
  "semantic-release": "^21.1.2",
85
70
  "sinon": "^17.0.1",
86
71
  "sinon-chai": "^3.7.0",
87
- "ts-node": "^10.9.1",
72
+ "ts-node": "^10.9.2",
88
73
  "tsconfig-paths": "^4.2.0",
89
- "ttypescript": "^1.5.15",
90
74
  "typescript": "^4.9.5",
91
- "vite": "^5.0.6"
75
+ "vite": "^5.0.11"
92
76
  },
93
77
  "peerDependencies": {
78
+ "@lomray/consistent-suspense": ">=2.0.1",
79
+ "@lomray/event-manager": ">=2.0.2",
94
80
  "hoist-non-react-statics": ">=3.3.2",
95
81
  "lodash": ">=4.17.21",
96
82
  "mobx": ">=6.9.0",
@@ -0,0 +1,2 @@
1
+ import e from"./state-listener.js";function t(t){window.__MOBX_STORE_MANAGER__=new e(t).subscribe()}export{t as default};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/plugins/dev-extension/index.ts"],"sourcesContent":["import type Manager from '../../manager';\nimport StateListener from './state-listener';\n\nfunction connectDevExtension(storeManager: Manager): void {\n window['__MOBX_STORE_MANAGER__'] = new StateListener(storeManager).subscribe();\n}\n\nexport default connectDevExtension;\n"],"names":["connectDevExtension","storeManager","window","StateListener","subscribe"],"mappings":"mCAGA,SAASA,EAAoBC,GAC3BC,OAA+B,uBAAI,IAAIC,EAAcF,GAAcG,WACrE"}
@@ -0,0 +1,2 @@
1
+ import t from"lodash";import{spy as e}from"mobx";import r from"../../manager.js";var o;!function(t){t.SPY="spy"}(o||(o={}));class s{manager;static listeners={};constructor(t){this.manager=t,Object.values(s.listeners).forEach((t=>{t()}))}getContextKey(t,e){if("root"===t)return t;const{parentId:r}=this.manager.getStoresRelations().get(t)??{};return r&&"root"!==r?this.getContextKey(r,`${r}.${e??t}`):`${r??"root"}.${e??t}`}getStoresState(){const e={root:{}};try{const o=this.manager.getStores();this.manager.getStoresRelations().forEach((({ids:s,componentName:n},a)=>{const i=this.getContextKey(a);s.forEach((s=>{const a=o.get(s);if(a){const o=a?.toJSON?.()??r.getObservableProps(a);t.set(e,`${i}.stores.${s}`,o),t.set(e,`${i}.componentName`,n)}}))}))}catch(t){}return e}subscribe(){return s.listeners[o.SPY]=e((e=>{["report-end","reaction"].includes(e.type)||this.manager?.__devOnChange?.({event:t.cloneDeep(e),storesState:this.getStoresState()})})),this.manager}}export{s as default};
2
+ //# sourceMappingURL=state-listener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-listener.js","sources":["../../../src/plugins/dev-extension/state-listener.ts"],"sourcesContent":["import _ from 'lodash';\nimport { spy } from 'mobx';\nimport Manager from '../../manager';\n\nenum Listeners {\n SPY = 'spy',\n}\n\n/**\n * State listener\n */\nclass StateListener {\n /**\n * @protected\n */\n protected manager: Manager;\n\n /**\n * Store global listeners\n * @protected\n */\n protected static listeners: Record<Listeners | string, () => void> = {} as never;\n\n /**\n * @constructor\n */\n public constructor(manager: Manager) {\n this.manager = manager;\n\n Object.values(StateListener.listeners).forEach((unsubscribe) => {\n unsubscribe();\n });\n }\n\n /**\n * Get context tree key\n * @protected\n */\n protected getContextKey(contextId: string, nestedKey?: string): string {\n if (contextId === 'root') {\n return contextId;\n }\n\n const { parentId } = this.manager.getStoresRelations().get(contextId) ?? {};\n\n if (!parentId || parentId === 'root') {\n return `${parentId ?? 'root'}.${nestedKey ?? contextId}`;\n }\n\n return this.getContextKey(parentId, `${parentId}.${nestedKey ?? contextId}`);\n }\n\n /**\n * Get stores state\n * @protected\n */\n protected getStoresState(): { root: Record<string, any> } {\n const state: { root: Record<string, any> } = { root: {} };\n\n try {\n const stores = this.manager.getStores();\n\n this.manager.getStoresRelations().forEach(({ ids, componentName }, contextId) => {\n const key = this.getContextKey(contextId);\n\n ids.forEach((id) => {\n const store = stores.get(id);\n\n if (store) {\n const storeState = store?.toJSON?.() ?? Manager.getObservableProps(store);\n\n _.set(state, `${key}.stores.${id}`, storeState);\n _.set(state, `${key}.componentName`, componentName);\n }\n });\n });\n } catch (e) {\n // manager has not initialized yet\n }\n\n return state;\n }\n\n /**\n * Subscribe on stores changes\n * @protected\n */\n public subscribe(): Manager {\n StateListener.listeners[Listeners.SPY] = spy((event) => {\n if (['report-end', 'reaction'].includes(event.type)) {\n return;\n }\n\n this.manager?.['__devOnChange']?.({\n event: _.cloneDeep(event),\n storesState: this.getStoresState(),\n });\n });\n\n return this.manager;\n }\n}\n\nexport default StateListener;\n"],"names":["Listeners","StateListener","manager","static","constructor","this","Object","values","listeners","forEach","unsubscribe","getContextKey","contextId","nestedKey","parentId","getStoresRelations","get","getStoresState","state","root","stores","getStores","ids","componentName","key","id","store","storeState","toJSON","Manager","getObservableProps","_","set","e","subscribe","SPY","spy","event","includes","type","cloneDeep","storesState"],"mappings":"iFAIA,IAAKA,GAAL,SAAKA,GACHA,EAAA,IAAA,KACD,CAFD,CAAKA,IAAAA,EAEJ,CAAA,IAKD,MAAMC,EAIMC,QAMAC,iBAA2D,CAAA,EAKrEC,YAAmBF,GACjBG,KAAKH,QAAUA,EAEfI,OAAOC,OAAON,EAAcO,WAAWC,SAASC,IAC9CA,GAAa,GAEhB,CAMSC,cAAcC,EAAmBC,GACzC,GAAkB,SAAdD,EACF,OAAOA,EAGT,MAAME,SAAEA,GAAaT,KAAKH,QAAQa,qBAAqBC,IAAIJ,IAAc,GAEzE,OAAKE,GAAyB,SAAbA,EAIVT,KAAKM,cAAcG,EAAU,GAAGA,KAAYD,GAAaD,KAHvD,GAAGE,GAAY,UAAUD,GAAaD,GAIhD,CAMSK,iBACR,MAAMC,EAAuC,CAAEC,KAAM,CAAA,GAErD,IACE,MAAMC,EAASf,KAAKH,QAAQmB,YAE5BhB,KAAKH,QAAQa,qBAAqBN,SAAQ,EAAGa,MAAKC,iBAAiBX,KACjE,MAAMY,EAAMnB,KAAKM,cAAcC,GAE/BU,EAAIb,SAASgB,IACX,MAAMC,EAAQN,EAAOJ,IAAIS,GAEzB,GAAIC,EAAO,CACT,MAAMC,EAAaD,GAAOE,YAAcC,EAAQC,mBAAmBJ,GAEnEK,EAAEC,IAAId,EAAO,GAAGM,YAAcC,IAAME,GACpCI,EAAEC,IAAId,EAAO,GAAGM,kBAAqBD,EACtC,IACD,GAEL,CAAC,MAAOU,GAER,CAED,OAAOf,CACR,CAMMgB,YAYL,OAXAjC,EAAcO,UAAUR,EAAUmC,KAAOC,GAAKC,IACxC,CAAC,aAAc,YAAYC,SAASD,EAAME,OAI9ClC,KAAKH,SAAyB,gBAAI,CAChCmC,MAAON,EAAES,UAAUH,GACnBI,YAAapC,KAAKY,kBAClB,IAGGZ,KAAKH,OACb"}
@@ -0,0 +1,2 @@
1
+ import s from"node:fs";import e from"node:path";import{fileURLToPath as t}from"node:url";const r=t(import.meta.url),o=`${e.dirname(r).split("node_modules")[0]}node_modules/.cache/@lomray/react-mobx-manager`,n=`${o}/store-ids.json`,a=(e=!1)=>{if(e&&s.existsSync(n)){const e=JSON.parse(s.readFileSync(n,{encoding:"utf-8"}));return new Map(e)}return new Map},i=e=>{s.existsSync(o)||s.mkdirSync(o,{recursive:!0}),s.writeFileSync(n,JSON.stringify([...e.entries()],null,2),{encoding:"utf-8"})},c=(s="")=>{const e=s.split(""),t=e.pop()??"`";if("z"===t)return[...e,"A"].join("");if("Z"===t){const s=e.pop();return s?[c([...e,s].join("")),"a"].join(""):"aa"}return[...e,String.fromCharCode(t.charCodeAt(0)+1)].join("")};class l{cache;root;lastId;constructor(s,e=!1){this.root=s,this.cache=a(e)}injectId=(s,e)=>{const{classname:t,storeId:r}=this.cache.get(e),o=new RegExp(`(class\\s${t}\\s+?{)`);return s.replace(o,`$1static id = '${r}';`)};getDevId=(s,e)=>`${s.replace(this.root,"").replace(/\/index.(js|ts|tsx)/,"").split("/").filter(Boolean).join("-")}-${e}`;getProdId=()=>{const s=c(this.lastId),e=`S${s}`;return this.lastId=s,e};matchMobxStore=s=>{const{classname:e}=s.match(/class\s(?<classname>\w+)\s+?{(?!.*static\sid\s*=.*).+(makeObservable|makeAutoObservable)(?!.*persistStore\(\1.*)/s)?.groups??{};if(e)return e;const{classname:t}=s.match(/(@mobx-store).+class\s(?<classname>\w+)\s+?{(?!.*static\sid\s*=.*).+}(?!.*persistStore.*)/s)?.groups??{};return t}}export{l as Generator,c as getNextLetter,a as loadCache,i as saveCache};
2
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sources":["../../src/plugins/helpers.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\ntype ICache = Map<string, { storeId: string; classname: string }>;\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst cacheFolder = `${\n __dirname.split('node_modules')[0]\n}node_modules/.cache/@lomray/react-mobx-manager`;\nconst cacheFile = `${cacheFolder}/store-ids.json`;\n\n/**\n * Load cached store id's by file name\n */\nconst loadCache = (isProd = false): ICache => {\n if (isProd && fs.existsSync(cacheFile)) {\n const cache = JSON.parse(fs.readFileSync(cacheFile, { encoding: 'utf-8' }));\n\n return new Map(cache as any[]);\n }\n\n return new Map();\n};\n\n/**\n * Save store id's cache\n */\nconst saveCache = (cache: ICache): void => {\n if (!fs.existsSync(cacheFolder)) {\n fs.mkdirSync(cacheFolder, { recursive: true });\n }\n\n fs.writeFileSync(cacheFile, JSON.stringify([...cache.entries()], null, 2), { encoding: 'utf-8' });\n};\n\n/**\n * Get next letter\n */\nconst getNextLetter = (str = ''): string => {\n const letters = str.split('');\n const letter = letters.pop() ?? '`'; // default char code is '`' and next is 'a'\n\n if (letter === 'z') {\n return [...letters, 'A'].join('');\n } else if (letter === 'Z') {\n const prevLetter = letters.pop();\n\n if (!prevLetter) {\n return 'aa';\n }\n\n return [getNextLetter([...letters, prevLetter].join('')), 'a'].join('');\n }\n\n return [...letters, String.fromCharCode(letter.charCodeAt(0) + 1)].join('');\n};\n\n/**\n * Store is generator\n */\nclass Generator {\n public cache: ICache;\n protected root: string; // project root\n protected lastId: string; // keep last generated production store id (letter)\n\n constructor(root: string, isProd = false) {\n this.root = root;\n this.cache = loadCache(isProd);\n }\n\n /**\n * Inject store id\n */\n public injectId = (code: string, fileId: string): string => {\n const { classname, storeId } = this.cache.get(fileId)!;\n const regexp = new RegExp(`(class\\\\s${classname}\\\\s+?{)`);\n\n return code.replace(regexp, `$1static id = '${storeId}';`);\n };\n\n /**\n * Get development id\n */\n public getDevId = (id: string, classname: string): string => {\n const cleanPath = id\n .replace(this.root, '')\n .replace(/\\/index.(js|ts|tsx)/, '')\n .split('/')\n .filter(Boolean)\n .join('-');\n\n return `${cleanPath}-${classname}`;\n };\n\n /**\n * Get production store id\n */\n public getProdId = (): string => {\n const nextLetter = getNextLetter(this.lastId);\n const id = `S${nextLetter}`;\n\n this.lastId = nextLetter;\n\n return id;\n };\n\n /**\n * Try to find mobx store\n */\n public matchMobxStore = (code: string): string | undefined => {\n /**\n * Match store pattern 1\n *\n * 1. Match 'class Classname' (capture Classname)\n * 2. Except 'static id ='\n * 3. Include makeObservable or makeAutoObservable\n * 4. Except persistStore(Classname\n */\n const { classname } =\n code.match(\n /class\\s(?<classname>\\w+)\\s+?{(?!.*static\\sid\\s*=.*).+(makeObservable|makeAutoObservable)(?!.*persistStore\\(\\1.*)/s,\n )?.groups ?? {};\n\n if (classname) {\n return classname;\n }\n\n /**\n * Match store pattern 2\n *\n * 1. Match '@mobx-store' in jsdoc before class\n * 2. Match 'class Classname' (capture Classname)\n * 3. Except 'static id ='\n * 4. Except persistStore(Classname\n */\n const { classname: classnameSecond } =\n code.match(\n /(@mobx-store).+class\\s(?<classname>\\w+)\\s+?{(?!.*static\\sid\\s*=.*).+}(?!.*persistStore.*)/s,\n )?.groups ?? {};\n\n return classnameSecond;\n };\n}\n\nexport { saveCache, loadCache, getNextLetter, Generator };\n"],"names":["__filename","fileURLToPath","url","cacheFolder","path","dirname","split","cacheFile","loadCache","isProd","fs","existsSync","cache","JSON","parse","readFileSync","encoding","Map","saveCache","mkdirSync","recursive","writeFileSync","stringify","entries","getNextLetter","str","letters","letter","pop","join","prevLetter","String","fromCharCode","charCodeAt","Generator","root","lastId","constructor","this","injectId","code","fileId","classname","storeId","get","regexp","RegExp","replace","getDevId","id","filter","Boolean","getProdId","nextLetter","matchMobxStore","match","groups","classnameSecond"],"mappings":"yFAMA,MAAMA,EAAaC,cAA0BC,KAGvCC,EAAc,GAFFC,EAAKC,QAAQL,GAGnBM,MAAM,gBAAgB,mDAE5BC,EAAY,GAAGJ,mBAKfK,EAAY,CAACC,GAAS,KAC1B,GAAIA,GAAUC,EAAGC,WAAWJ,GAAY,CACtC,MAAMK,EAAQC,KAAKC,MAAMJ,EAAGK,aAAaR,EAAW,CAAES,SAAU,WAEhE,OAAO,IAAIC,IAAIL,EAChB,CAED,OAAO,IAAIK,GAAK,EAMZC,EAAaN,IACZF,EAAGC,WAAWR,IACjBO,EAAGS,UAAUhB,EAAa,CAAEiB,WAAW,IAGzCV,EAAGW,cAAcd,EAAWM,KAAKS,UAAU,IAAIV,EAAMW,WAAY,KAAM,GAAI,CAAEP,SAAU,SAAU,EAM7FQ,EAAgB,CAACC,EAAM,MAC3B,MAAMC,EAAUD,EAAInB,MAAM,IACpBqB,EAASD,EAAQE,OAAS,IAEhC,GAAe,MAAXD,EACF,MAAO,IAAID,EAAS,KAAKG,KAAK,IACzB,GAAe,MAAXF,EAAgB,CACzB,MAAMG,EAAaJ,EAAQE,MAE3B,OAAKE,EAIE,CAACN,EAAc,IAAIE,EAASI,GAAYD,KAAK,KAAM,KAAKA,KAAK,IAH3D,IAIV,CAED,MAAO,IAAIH,EAASK,OAAOC,aAAaL,EAAOM,WAAW,GAAK,IAAIJ,KAAK,GAAG,EAM7E,MAAMK,EACGtB,MACGuB,KACAC,OAEVC,YAAYF,EAAc1B,GAAS,GACjC6B,KAAKH,KAAOA,EACZG,KAAK1B,MAAQJ,EAAUC,EACxB,CAKM8B,SAAW,CAACC,EAAcC,KAC/B,MAAMC,UAAEA,EAASC,QAAEA,GAAYL,KAAK1B,MAAMgC,IAAIH,GACxCI,EAAS,IAAIC,OAAO,YAAYJ,YAEtC,OAAOF,EAAKO,QAAQF,EAAQ,kBAAkBF,MAAY,EAMrDK,SAAW,CAACC,EAAYP,IAQtB,GAPWO,EACfF,QAAQT,KAAKH,KAAM,IACnBY,QAAQ,sBAAuB,IAC/BzC,MAAM,KACN4C,OAAOC,SACPtB,KAAK,QAEea,IAMlBU,UAAY,KACjB,MAAMC,EAAa7B,EAAcc,KAAKF,QAChCa,EAAK,IAAII,IAIf,OAFAf,KAAKF,OAASiB,EAEPJ,CAAE,EAMJK,eAAkBd,IASvB,MAAME,UAAEA,GACNF,EAAKe,MACH,sHACCC,QAAU,GAEf,GAAId,EACF,OAAOA,EAWT,MAAQA,UAAWe,GACjBjB,EAAKe,MACH,+FACCC,QAAU,GAEf,OAAOC,CAAe"}
@@ -0,0 +1,2 @@
1
+ import{extname as e}from"node:path";import{cwd as t}from"node:process";import{Generator as o,saveCache as r}from"../helpers.js";function s({root:s=t(),isProd:a=!1}={}){const n=new o(s,a);return{name:"@lomray/react-mobx-manager-id-generator",transform(t,o){const r=e(o).split("?")[0];if(o.includes("node_modules")||![".js",".ts",".tsx"].includes(r)||!/(makeObservable|makeAutoObservable)\(/.test(t))return;if(n.cache.has(o))return{code:n.injectId(t,o),map:{mappings:""}};const s=n.matchMobxStore(t);if(s){if(!n.cache.has(o)){const e=a?n.getProdId():n.getDevId(o,s);n.cache.set(o,{classname:s,storeId:e})}return{code:n.injectId(t,o),map:{mappings:""}}}},buildEnd(){a&&r(n.cache)}}}export{s as default};
2
+ //# sourceMappingURL=id-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-generator.js","sources":["../../../src/plugins/vite/id-generator.ts"],"sourcesContent":["import { extname } from 'node:path';\nimport { cwd } from 'node:process';\nimport type { Plugin } from 'vite';\nimport { Generator, saveCache } from '../helpers';\n\nexport interface IPluginOptions {\n root?: string; // default: process.cwd()\n isProd?: boolean;\n}\n\n/**\n * Generate unique store id's\n *\n * Detect mobx store:\n * - by makeObservable or makeAutoObservable\n * - by @mobx-store jsdoc before class\n * @constructor\n */\nfunction IdGenerator({ root = cwd(), isProd = false }: IPluginOptions = {}): Plugin {\n const service = new Generator(root, isProd);\n\n return {\n name: '@lomray/react-mobx-manager-id-generator',\n transform(code, id) {\n const extName = extname(id).split('?')[0]!;\n\n if (\n id.includes('node_modules') ||\n !['.js', '.ts', '.tsx'].includes(extName) ||\n !/(makeObservable|makeAutoObservable)\\(/.test(code)\n ) {\n return;\n }\n\n if (service.cache.has(id)) {\n return {\n code: service.injectId(code, id),\n map: { mappings: '' },\n };\n }\n\n const classname = service.matchMobxStore(code);\n\n if (!classname) {\n return;\n }\n\n if (!service.cache.has(id)) {\n const storeId = isProd ? service.getProdId() : service.getDevId(id, classname);\n\n service.cache.set(id, { classname, storeId });\n }\n\n return {\n code: service.injectId(code, id),\n map: { mappings: '' },\n };\n },\n buildEnd() {\n if (!isProd) {\n return;\n }\n\n saveCache(service.cache);\n },\n };\n}\n\nexport default IdGenerator;\n"],"names":["IdGenerator","root","cwd","isProd","service","Generator","name","transform","code","id","extName","extname","split","includes","test","cache","has","injectId","map","mappings","classname","matchMobxStore","storeId","getProdId","getDevId","set","buildEnd","saveCache"],"mappings":"gIAkBA,SAASA,GAAYC,KAAEA,EAAOC,IAAKC,OAAEA,GAAS,GAA0B,IACtE,MAAMC,EAAU,IAAIC,EAAUJ,EAAME,GAEpC,MAAO,CACLG,KAAM,0CACNC,UAAUC,EAAMC,GACd,MAAMC,EAAUC,EAAQF,GAAIG,MAAM,KAAK,GAEvC,GACEH,EAAGI,SAAS,kBACX,CAAC,MAAO,MAAO,QAAQA,SAASH,KAChC,wCAAwCI,KAAKN,GAE9C,OAGF,GAAIJ,EAAQW,MAAMC,IAAIP,GACpB,MAAO,CACLD,KAAMJ,EAAQa,SAAST,EAAMC,GAC7BS,IAAK,CAAEC,SAAU,KAIrB,MAAMC,EAAYhB,EAAQiB,eAAeb,GAEzC,GAAKY,EAAL,CAIA,IAAKhB,EAAQW,MAAMC,IAAIP,GAAK,CAC1B,MAAMa,EAAUnB,EAASC,EAAQmB,YAAcnB,EAAQoB,SAASf,EAAIW,GAEpEhB,EAAQW,MAAMU,IAAIhB,EAAI,CAAEW,YAAWE,WACpC,CAED,MAAO,CACLd,KAAMJ,EAAQa,SAAST,EAAMC,GAC7BS,IAAK,CAAEC,SAAU,IAVlB,CAYF,EACDO,WACOvB,GAILwB,EAAUvB,EAAQW,MACnB,EAEL"}
@@ -0,0 +1,2 @@
1
+ import*as o from"node:process";import r from"./id-generator.js";function t(){let t;return[{name:r().name,configResolved({root:n}){var e;t=r({root:n,isProd:"production"===e||"production"===o.env.NODE_ENV})},transform(...o){return t.transform?.call(this,...o)},buildEnd(...o){t.buildEnd?.call(this,...o)}}]}export{t as default};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/plugins/vite/index.ts"],"sourcesContent":["import * as process from 'node:process';\nimport type { Plugin, TransformResult } from 'vite';\nimport IdGenerator from './id-generator';\n\nconst isProduction = (mode?: string): boolean =>\n mode === 'production' || process.env.NODE_ENV === 'production';\n\n/**\n * Mobx manager vite plugins\n * @constructor\n */\nfunction ViteReactMobxManager(): Plugin[] {\n let idGeneratorPlugin: Plugin;\n\n return [\n {\n name: IdGenerator().name,\n configResolved({ root }) {\n idGeneratorPlugin = IdGenerator({ root, isProd: isProduction() });\n },\n transform(...args) {\n return idGeneratorPlugin.transform?.['call'](this, ...args) as TransformResult | undefined;\n },\n buildEnd(...args) {\n idGeneratorPlugin.buildEnd?.['call'](this, ...args);\n },\n },\n ];\n}\n\nexport default ViteReactMobxManager;\n"],"names":["ViteReactMobxManager","idGeneratorPlugin","name","IdGenerator","configResolved","root","mode","isProd","process","env","NODE_ENV","transform","args","this","buildEnd"],"mappings":"gEAWA,SAASA,IACP,IAAIC,EAEJ,MAAO,CACL,CACEC,KAAMC,IAAcD,KACpBE,gBAAeC,KAAEA,IAbF,IAACC,EAcdL,EAAoBE,EAAY,CAAEE,OAAME,OAbrC,eAATD,GAAkD,eAAzBE,EAAQC,IAAIC,UAchC,EACDC,aAAaC,GACX,OAAOX,EAAkBU,WAAkB,KAAEE,QAASD,EACvD,EACDE,YAAYF,GACVX,EAAkBa,UAAiB,KAAED,QAASD,EAC/C,GAGP"}
@@ -1,4 +1,4 @@
1
- import { IStorage } from "../types-70019566.js";
1
+ import { IStorage } from "../types.js";
2
2
  interface IAsyncStorage {
3
3
  getItem: (key: string) => Promise<string | null>;
4
4
  setItem: (key: string, value: string) => Promise<void>;
@@ -0,0 +1,2 @@
1
+ class t{globalKey="stores";storage;constructor(t){this.storage=t}async get(){try{return JSON.parse(await this.storage.getItem(this.globalKey)||"{}")}catch(t){return{}}}flush(){return this.storage.removeItem(this.globalKey)}set(t){return this.storage.setItem(this.globalKey,JSON.stringify(t||"{}"))}}export{t as default};
2
+ //# sourceMappingURL=async-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-storage.js","sources":["../../src/storages/async-storage.ts"],"sourcesContent":["import type { IStorage } from '../types';\n\ninterface IAsyncStorage {\n getItem: (key: string) => Promise<string | null>;\n setItem: (key: string, value: string) => Promise<void>;\n removeItem: (key: string) => Promise<void>;\n}\n\n/**\n * Async storage for mobx store manager\n */\nclass AsyncStorage implements IStorage {\n globalKey = 'stores';\n\n /**\n * @protected\n */\n protected storage: IAsyncStorage;\n\n /**\n * @constructor\n */\n constructor(AsyncStoragePackage: IAsyncStorage) {\n this.storage = AsyncStoragePackage;\n }\n\n /**\n * @inheritDoc\n */\n async get(): Promise<Record<string, any> | undefined> {\n try {\n return JSON.parse((await this.storage.getItem(this.globalKey)) || '{}') as Record<\n string,\n any\n >;\n } catch (e) {\n return {};\n }\n }\n\n /**\n * @inheritDoc\n */\n flush(): Promise<any> {\n return this.storage.removeItem(this.globalKey);\n }\n\n /**\n * @inheritDoc\n */\n set(value: Record<string, any> | undefined): Promise<void> {\n return this.storage.setItem(this.globalKey, JSON.stringify(value || '{}'));\n }\n}\n\nexport default AsyncStorage;\n"],"names":["AsyncStorage","globalKey","storage","constructor","AsyncStoragePackage","this","async","JSON","parse","getItem","e","flush","removeItem","set","value","setItem","stringify"],"mappings":"AAWA,MAAMA,EACJC,UAAY,SAKFC,QAKVC,YAAYC,GACVC,KAAKH,QAAUE,CAChB,CAKDE,YACE,IACE,OAAOC,KAAKC,YAAaH,KAAKH,QAAQO,QAAQJ,KAAKJ,YAAe,KAInE,CAAC,MAAOS,GACP,MAAO,EACR,CACF,CAKDC,QACE,OAAON,KAAKH,QAAQU,WAAWP,KAAKJ,UACrC,CAKDY,IAAIC,GACF,OAAOT,KAAKH,QAAQa,QAAQV,KAAKJ,UAAWM,KAAKS,UAAUF,GAAS,MACrE"}
@@ -1,4 +1,4 @@
1
- import { IStorage } from "../types-70019566.js";
1
+ import { IStorage } from "../types.js";
2
2
  /**
3
3
  * Local storage for mobx store manager
4
4
  */
@@ -0,0 +1,2 @@
1
+ class e{globalKey="stores";get(){try{return JSON.parse(localStorage.getItem(this.globalKey)||"{}")}catch(e){return{}}}flush(){return localStorage.removeItem(this.globalKey)}set(e){return localStorage.setItem(this.globalKey,JSON.stringify(e||"{}"))}}export{e as default};
2
+ //# sourceMappingURL=local-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-storage.js","sources":["../../src/storages/local-storage.ts"],"sourcesContent":["import type { IStorage } from '../types';\n\n/**\n * Local storage for mobx store manager\n */\nclass LocalStorage implements IStorage {\n globalKey = 'stores';\n\n /**\n * @inheritDoc\n */\n get(): Record<string, any> | Promise<Record<string, any> | undefined> {\n try {\n return JSON.parse(localStorage.getItem(this.globalKey) || '{}') as Record<string, any>;\n } catch (e) {\n return {};\n }\n }\n\n /**\n * @inheritDoc\n */\n flush(): void | Promise<any> {\n return localStorage.removeItem(this.globalKey);\n }\n\n /**\n * @inheritDoc\n */\n set(value: Record<string, any> | undefined): void {\n return localStorage.setItem(this.globalKey, JSON.stringify(value || '{}'));\n }\n}\n\nexport default LocalStorage;\n"],"names":["LocalStorage","globalKey","get","JSON","parse","localStorage","getItem","this","e","flush","removeItem","set","value","setItem","stringify"],"mappings":"AAKA,MAAMA,EACJC,UAAY,SAKZC,MACE,IACE,OAAOC,KAAKC,MAAMC,aAAaC,QAAQC,KAAKN,YAAc,KAC3D,CAAC,MAAOO,GACP,MAAO,EACR,CACF,CAKDC,QACE,OAAOJ,aAAaK,WAAWH,KAAKN,UACrC,CAKDU,IAAIC,GACF,OAAOP,aAAaQ,QAAQN,KAAKN,UAAWE,KAAKW,UAAUF,GAAS,MACrE"}
@@ -0,0 +1,2 @@
1
+ var u;!function(u){u.init="init",u.touched="touched",u.inUse="in-use",u.unused="unused"}(u||(u={}));var e=u;export{e as default};
2
+ //# sourceMappingURL=store-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-status.js","sources":["../src/store-status.ts"],"sourcesContent":["enum StoreStatus {\n init = 'init', // created, but never used and was not passed to the children components\n touched = 'touched', // store was passed to the children component\n inUse = 'in-use',\n unused = 'unused',\n}\n\nexport default StoreStatus;\n"],"names":["StoreStatus","StoreStatus$1"],"mappings":"AAAA,IAAKA,GAAL,SAAKA,GACHA,EAAA,KAAA,OACAA,EAAA,QAAA,UACAA,EAAA,MAAA,SACAA,EAAA,OAAA,QACD,CALD,CAAKA,IAAAA,EAKJ,CAAA,IAED,IAAAC,EAAeD"}
@@ -1,4 +1,4 @@
1
- import { TInitStore } from "./types-70019566.js";
1
+ import { TInitStore } from "./types.js";
2
2
  interface IPromise<TReturn> extends Promise<TReturn> {
3
3
  status?: 'fulfilled' | 'pending' | 'rejected';
4
4
  value?: TReturn;
@@ -14,12 +14,11 @@ interface ISuspenseQueryParams {
14
14
  */
15
15
  declare class SuspenseQuery {
16
16
  /**
17
- * @private
17
+ * @protected
18
18
  */
19
19
  protected promise: Promise<any> | undefined;
20
20
  /**
21
21
  * Target store
22
- * @private
23
22
  */
24
23
  protected readonly store: TInitStore;
25
24
  /**
@@ -0,0 +1,2 @@
1
+ import{extendObservable as e,observable as s,runInAction as r}from"mobx";class t{promise;store;params;constructor(r,{fieldName:t="sR",errorFields:i=["name","message"]}={}){this.store=r,this.params={fieldName:t,errorFields:i};const o=r.init?.bind(r);r.init=()=>{this.isComplete(),o?.()},e(r,{[t]:!1},{[t]:s})}errorJson(e){e.toJSON=()=>this.params.errorFields.reduce(((s,r)=>({...s,[r]:e?.[r]})),{})}jsonToError(e,s){return this.params.errorFields.forEach((r=>{e[r]=s?.[r]})),e}isComplete(){const e=this.store[this.params.fieldName];if("boolean"!==typeof e)throw this.jsonToError(new Error(e?.message??e?.name),e);return!0===e}query=e=>{const{fieldName:s}=this.params;if(!this.isComplete())return this.promise||(this.promise=e(),this.promise.then((()=>{r((()=>{this.store[s]=!0}))}),(e=>{r((()=>{this.errorJson(e),this.store[s]=e}))}))),t.run(this.promise)};static run=e=>{if(e){switch(e.status){case"fulfilled":return e.value;case"pending":throw e;case"rejected":throw e.reason;default:e.status="pending",e.then((s=>{e.status="fulfilled",e.value=s}),(s=>{e.status="rejected",e.reason=s}))}throw e}}}export{t as default};
2
+ //# sourceMappingURL=suspense-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suspense-query.js","sources":["../src/suspense-query.ts"],"sourcesContent":["import { extendObservable, observable, runInAction } from 'mobx';\nimport type { TInitStore } from './types';\n\nexport interface IPromise<TReturn> extends Promise<TReturn> {\n status?: 'fulfilled' | 'pending' | 'rejected';\n value?: TReturn;\n reason?: any;\n}\n\ninterface ISuspenseQueryParams {\n fieldName?: string; // field name in target store for save suspense state\n errorFields?: string[];\n}\n\n/**\n * Run request and cache promise\n * Sync suspense status between server and client\n */\nclass SuspenseQuery {\n /**\n * @protected\n */\n protected promise: Promise<any> | undefined;\n\n /**\n * Target store\n */\n protected readonly store: TInitStore;\n\n /**\n * @protected\n */\n protected readonly params: Required<ISuspenseQueryParams>;\n\n /**\n * @constructor\n */\n constructor(\n store: TInitStore,\n { fieldName = 'sR', errorFields = ['name', 'message'] }: ISuspenseQueryParams = {},\n ) {\n this.store = store;\n this.params = { fieldName, errorFields };\n\n const defaultInit = store.init?.bind(store);\n\n store.init = () => {\n this.isComplete(); // throw error immediately from server side if exist\n defaultInit?.();\n };\n\n extendObservable(\n store,\n { [fieldName]: false },\n {\n [fieldName]: observable,\n },\n );\n }\n\n /**\n * Error to json\n */\n protected errorJson(e: any): void {\n e.toJSON = () =>\n this.params.errorFields.reduce(\n (res, name) => ({\n ...res,\n [name]: e?.[name],\n }),\n {},\n );\n }\n\n /**\n * Assign custom error fields to error\n */\n protected jsonToError(e: Error, values: Record<string, any>): Error {\n this.params.errorFields.forEach((name) => {\n e[name] = values?.[name];\n });\n\n return e;\n }\n\n /**\n * Detect if suspense is restored from server side:\n * - throw error if exist\n * - skip run suspense if already completed\n */\n protected isComplete(): boolean {\n const value = this.store[this.params.fieldName];\n const valueType = typeof value;\n\n // pass error to error boundary\n if (valueType !== 'boolean') {\n throw this.jsonToError(\n new Error((value?.message ?? value?.name) as string),\n value as Record<string, any>,\n );\n }\n\n return value === true;\n }\n\n /**\n * Run request\n * Save request resolve status\n */\n public query = <TReturn>(promise: () => Promise<TReturn>): TReturn | undefined => {\n const { fieldName } = this.params;\n\n if (this.isComplete()) {\n return;\n }\n\n if (!this.promise) {\n this.promise = promise();\n\n this.promise.then(\n () => {\n runInAction(() => {\n this.store[fieldName] = true;\n });\n },\n (e) => {\n runInAction(() => {\n this.errorJson(e);\n\n this.store[fieldName] = e;\n });\n },\n );\n }\n\n return SuspenseQuery.run<TReturn>(this.promise);\n };\n\n /**\n * Change status of promise.\n * Throw promise to react suspense\n */\n public static run = <TReturn>(promise: IPromise<TReturn> | undefined): TReturn | undefined => {\n if (!promise) {\n return;\n }\n\n switch (promise.status) {\n case 'fulfilled':\n return promise.value;\n\n case 'pending':\n throw promise;\n\n case 'rejected':\n throw promise.reason;\n\n default:\n promise.status = 'pending';\n\n promise.then(\n (result) => {\n promise.status = 'fulfilled';\n promise.value = result;\n },\n (reason) => {\n promise.status = 'rejected';\n promise.reason = reason;\n },\n );\n }\n\n throw promise;\n };\n}\n\nexport default SuspenseQuery;\n"],"names":["SuspenseQuery","promise","store","params","constructor","fieldName","errorFields","this","defaultInit","init","bind","isComplete","extendObservable","observable","errorJson","e","toJSON","reduce","res","name","jsonToError","values","forEach","value","Error","message","query","then","runInAction","run","static","status","reason","result"],"mappings":"yEAkBA,MAAMA,EAIMC,QAKSC,MAKAC,OAKnBC,YACEF,GACAG,UAAEA,EAAY,KAAIC,YAAEA,EAAc,CAAC,OAAQ,YAAqC,IAEhFC,KAAKL,MAAQA,EACbK,KAAKJ,OAAS,CAAEE,YAAWC,eAE3B,MAAME,EAAcN,EAAMO,MAAMC,KAAKR,GAErCA,EAAMO,KAAO,KACXF,KAAKI,aACLH,KAAe,EAGjBI,EACEV,EACA,CAAEG,CAACA,IAAY,GACf,CACEA,CAACA,GAAYQ,GAGlB,CAKSC,UAAUC,GAClBA,EAAEC,OAAS,IACTT,KAAKJ,OAAOG,YAAYW,QACtB,CAACC,EAAKC,KAAU,IACXD,EACHC,CAACA,GAAOJ,IAAII,MAEd,CAAE,EAEP,CAKSC,YAAYL,EAAUM,GAK9B,OAJAd,KAAKJ,OAAOG,YAAYgB,SAASH,IAC/BJ,EAAEI,GAAQE,IAASF,EAAK,IAGnBJ,CACR,CAOSJ,aACR,MAAMY,EAAQhB,KAAKL,MAAMK,KAAKJ,OAAOE,WAIrC,GAAkB,mBAHOkB,EAIvB,MAAMhB,KAAKa,YACT,IAAII,MAAOD,GAAOE,SAAWF,GAAOJ,MACpCI,GAIJ,OAAiB,IAAVA,CACR,CAMMG,MAAkBzB,IACvB,MAAMI,UAAEA,GAAcE,KAAKJ,OAE3B,IAAII,KAAKI,aAuBT,OAnBKJ,KAAKN,UACRM,KAAKN,QAAUA,IAEfM,KAAKN,QAAQ0B,MACX,KACEC,GAAY,KACVrB,KAAKL,MAAMG,IAAa,CAAI,GAC5B,IAEHU,IACCa,GAAY,KACVrB,KAAKO,UAAUC,GAEfR,KAAKL,MAAMG,GAAaU,CAAC,GACzB,KAKDf,EAAc6B,IAAatB,KAAKN,QAAQ,EAO1C6B,WAAuB7B,IAC5B,GAAKA,EAAL,CAIA,OAAQA,EAAQ8B,QACd,IAAK,YACH,OAAO9B,EAAQsB,MAEjB,IAAK,UACH,MAAMtB,EAER,IAAK,WACH,MAAMA,EAAQ+B,OAEhB,QACE/B,EAAQ8B,OAAS,UAEjB9B,EAAQ0B,MACLM,IACChC,EAAQ8B,OAAS,YACjB9B,EAAQsB,MAAQU,CAAM,IAEvBD,IACC/B,EAAQ8B,OAAS,WACjB9B,EAAQ+B,OAASA,CAAM,IAK/B,MAAM/B,CA3BL,CA2BY"}
@@ -14,6 +14,7 @@ interface IConstructorParams<TProps = Record<string, any>> {
14
14
  storeManager: Manager;
15
15
  getStore: <T>(store: IConstructableStore<T>, params?: Partial<IStoreParams>) => T | undefined;
16
16
  componentProps: TProps;
17
+ initState?: Record<string, any>;
17
18
  }
18
19
  interface IStoreLifecycle {
19
20
  onDestroy?: () => void;
package/types.js ADDED
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=types.js.map
package/types.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,4 +1,4 @@
1
- import { TStores, TWakeup } from "./types-70019566.js";
1
+ import { TStores, TWakeup } from "./types.js";
2
2
  /**
3
3
  * Restore persisted store state
4
4
  */
package/wakeup.js ADDED
@@ -0,0 +1,2 @@
1
+ import e from"./deep-merge.js";function t({persistedState:t}){t&&e(this,t)}export{t as default};
2
+ //# sourceMappingURL=wakeup.js.map
package/wakeup.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wakeup.js","sources":["../src/wakeup.ts"],"sourcesContent":["import deepMerge from './deep-merge';\nimport type { TStores, TWakeup } from './types';\n\n/**\n * Restore persisted store state\n */\nfunction wakeup(this: TStores[string], { persistedState }: Parameters<TWakeup>[0]) {\n if (persistedState) {\n deepMerge(this, persistedState);\n }\n}\n\nexport default wakeup;\n"],"names":["wakeup","persistedState","deepMerge","this"],"mappings":"+BAMA,SAASA,GAA8BC,eAAEA,IACnCA,GACFC,EAAUC,KAAMF,EAEpB"}
@@ -1,5 +1,5 @@
1
1
  import { FC } from 'react';
2
- import { TMapStores, IWithStoreOptions } from "./types-70019566.js";
2
+ import { TMapStores, IWithStoreOptions } from "./types.js";
3
3
  /**
4
4
  * Make component observable and pass stores as props
5
5
  */
package/with-stores.js ADDED
@@ -0,0 +1,2 @@
1
+ import{useConsistentSuspense as t,useId as e}from"@lomray/consistent-suspense";import o from"hoist-non-react-statics";import{observer as r}from"mobx-react-lite";import n,{useState as s,useEffect as m}from"react";import{useStoreManager as a,useStoreManagerParent as i,StoreManagerParentProvider as c}from"./context.js";const p=(p,l,{customContextId:u}={})=>{const d=r(p),x=u||p.libStoreContextId,S=p.displayName||p.name,b=o=>{const r=a(),p=i(),{suspenseId:u}=t(),b=e(),[{contextId:f,initStores:I,mountStores:y}]=s((()=>{const t=x||b;return{contextId:t,initStores:r.createStores(Object.entries(l),p,t,u,S,o),mountStores:()=>r.mountStores(I)}}));return m(y,[y]),n.createElement(c,{parentId:f,initStores:I},n.createElement(d,{...o,...I}))};return o(b,p),b.displayName=`Mobx(${S})`,Object.defineProperty(b,"name",{value:b.displayName,writable:!1,enumerable:!1})};export{p as default};
2
+ //# sourceMappingURL=with-stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-stores.js","sources":["../src/with-stores.tsx"],"sourcesContent":["import { useConsistentSuspense, useId } from '@lomray/consistent-suspense';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport { observer } from 'mobx-react-lite';\nimport type { FC } from 'react';\nimport React, { useEffect, useState } from 'react';\nimport { useStoreManager, useStoreManagerParent, StoreManagerParentProvider } from './context';\nimport type { TMapStores, IWithStoreOptions } from './types';\n\n/**\n * Make component observable and pass stores as props\n */\nconst withStores = <T extends Record<string, any>, TS extends TMapStores>(\n Component: FC<T>,\n stores: TS,\n { customContextId }: IWithStoreOptions = {},\n): FC<Omit<T, keyof TS>> => {\n const ObservableComponent = observer(Component) as FC;\n const manualContextId = customContextId || (Component['libStoreContextId'] as string);\n const componentName = Component.displayName || Component.name;\n\n const Element: FC<Omit<T, keyof TS>> = (props) => {\n const storeManager = useStoreManager();\n const parentId = useStoreManagerParent();\n const { suspenseId } = useConsistentSuspense();\n const id = useId();\n const [{ contextId, initStores, mountStores }] = useState(() => {\n const ctxId = manualContextId || id;\n const initS = storeManager.createStores(\n Object.entries(stores),\n parentId,\n ctxId,\n suspenseId,\n componentName,\n props,\n );\n\n return {\n contextId: ctxId,\n initStores: initS,\n mountStores: () => storeManager.mountStores(initStores),\n };\n });\n\n useEffect(mountStores, [mountStores]);\n\n return (\n <StoreManagerParentProvider parentId={contextId} initStores={initStores}>\n <ObservableComponent {...props} {...initStores} />\n </StoreManagerParentProvider>\n );\n };\n\n hoistNonReactStatics(Element, Component);\n Element.displayName = `Mobx(${componentName})`;\n\n return Object.defineProperty(Element, 'name', {\n value: Element.displayName,\n writable: false,\n enumerable: false,\n });\n};\n\nexport default withStores;\n"],"names":["withStores","Component","stores","customContextId","ObservableComponent","observer","manualContextId","componentName","displayName","name","Element","props","storeManager","useStoreManager","parentId","useStoreManagerParent","suspenseId","useConsistentSuspense","id","useId","contextId","initStores","mountStores","useState","ctxId","createStores","Object","entries","useEffect","React","createElement","StoreManagerParentProvider","hoistNonReactStatics","defineProperty","value","writable","enumerable"],"mappings":"8TAWA,MAAMA,EAAa,CACjBC,EACAC,GACEC,mBAAuC,CAAA,KAEzC,MAAMC,EAAsBC,EAASJ,GAC/BK,EAAkBH,GAAoBF,EAA6B,kBACnEM,EAAgBN,EAAUO,aAAeP,EAAUQ,KAEnDC,EAAkCC,IACtC,MAAMC,EAAeC,IACfC,EAAWC,KACXC,WAAEA,GAAeC,IACjBC,EAAKC,MACJC,UAAEA,EAASC,WAAEA,EAAUC,YAAEA,IAAiBC,GAAS,KACxD,MAAMC,EAAQlB,GAAmBY,EAUjC,MAAO,CACLE,UAAWI,EACXH,WAXYT,EAAaa,aACzBC,OAAOC,QAAQzB,GACfY,EACAU,EACAR,EACAT,EACAI,GAMAW,YAAa,IAAMV,EAAaU,YAAYD,GAC7C,IAKH,OAFAO,EAAUN,EAAa,CAACA,IAGtBO,EAACC,cAAAC,EAA2B,CAAAjB,SAAUM,EAAWC,WAAYA,GAC3DQ,EAACC,cAAA1B,MAAwBO,KAAWU,IAEtC,EAMJ,OAHAW,EAAqBtB,EAAST,GAC9BS,EAAQF,YAAc,QAAQD,KAEvBmB,OAAOO,eAAevB,EAAS,OAAQ,CAC5CwB,MAAOxB,EAAQF,YACf2B,UAAU,EACVC,YAAY,GACZ"}
package/lib/context.js DELETED
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=t(e);const a=r.default.createContext({}),o=r.default.createContext("root"),n=({parentId:e,children:t,initStores:a})=>{const n=s();return a&&n.touchedStores(a),r.default.createElement(o.Provider,{value:e,children:t})},s=()=>e.useContext(a);exports.StoreManagerContext=a,exports.StoreManagerParentContext=o,exports.StoreManagerParentProvider=n,exports.StoreManagerProvider=({children:t,storeManager:o,fallback:s,shouldInit:u=!1})=>{const[l,c]=e.useState(!u);return e.useEffect((()=>{u&&o.init().then((()=>c(!0))).catch((e=>{console.error("Failed initialized store manager: ",e)}))}),[u,o]),r.default.createElement(a.Provider,{value:o},r.default.createElement(n,{parentId:"root"},l?t:s||t))},exports.useStoreManager=s,exports.useStoreManagerParent=()=>e.useContext(o);
package/lib/events.js DELETED
@@ -1 +0,0 @@
1
- "use strict";var e;!function(e){e.CREATE_STORE="mobx-manager:store-create",e.MOUNT_STORE="mobx-manager:store-mount",e.UNMOUNT_STORE="mobx-manager:store-unmount",e.DELETE_STORE="mobx-manager:store-delete"}(e||(e={}));var o=e;module.exports=o;
package/lib/index.js DELETED
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./context.js"),r=require("./manager.js"),t=require("./on-change-listener.js"),a=require("./wakeup.js"),o=require("./with-stores.js"),n=require("./events.js");exports.StoreManagerContext=e.StoreManagerContext,exports.StoreManagerParentContext=e.StoreManagerParentContext,exports.StoreManagerParentProvider=e.StoreManagerParentProvider,exports.StoreManagerProvider=e.StoreManagerProvider,exports.useStoreManager=e.useStoreManager,exports.useStoreManagerParent=e.useStoreManagerParent,exports.Manager=r,exports.onChangeListener=t,exports.wakeup=a,exports.withStores=o,exports.Events=n;
@@ -1 +0,0 @@
1
- "use strict";module.exports=class{constructor(e){Object.defineProperty(this,"isPreamblePushed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"manager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.manager=e}take(e){const s=this.manager.getSuspenseRelations().get(e);if(!(null==s?void 0:s.size))return;const i=JSON.stringify(this.manager.toJSON([...s])),t=this.isPreamblePushed?"":"<script>!window.mbxM && (window.mbxM = []);<\/script>";return this.isPreamblePushed||(this.isPreamblePushed=!0),`${t}<script>window.mbxM.push(${i});<\/script>`}};
package/lib/manager.js DELETED
@@ -1 +0,0 @@
1
- "use strict";var e=require("@lomray/event-manager"),t=require("mobx"),s=require("./events.js"),r=require("./on-change-listener.js"),o=require("./store-status.js"),i=require("./wakeup.js");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=n(e);class l{constructor({initState:e,storesParams:t,storage:s,options:r}={}){if(Object.defineProperty(this,"stores",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"storesRelations",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"initState",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"storage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"persistData",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"storesParams",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:{shouldDisablePersist:!1,shouldRemoveInitState:!0}}),Object.defineProperty(this,"suspenseRelations",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"pushInitState",{enumerable:!0,configurable:!0,writable:!0,value:(e={})=>{for(const[t,s]of Object.entries(e))this.initState[t]=s}}),this.initState=e||{},this.storesParams=t||{},this.storage=s,Object.assign(this.options,r||{}),l.instance=this,"undefined"!=typeof window){const e=window.mbxM;window.mbxM={push:this.pushInitState},(Array.isArray(e)?e:[]).forEach(this.pushInitState)}}async init(){return this.storage&&(this.persistData=await this.storage.get()||{}),this}static get(){if(!l.instance)throw new Error("Store manager is not initialized.");return l.instance}getStores(){return this.stores}getStoresRelations(){return this.storesRelations}getSuspenseRelations(){return this.suspenseRelations}static getPersistedStoresIds(){return l.persistedStores}getStoreId(e,t={}){const{id:s,contextId:r,key:o}=t;if(s)return s;if(e.libStoreId)return e.libStoreId;let i=e.id||e.name||e.constructor.name;return e.isGlobal?i:(i=`${i}--${r}`,o?`${i}--${o}`:i)}getStore(e,t={}){const s=this.getStoreId(e,t);return this.stores.has(s)?this.stores.get(s):e.isGlobal?this.createStore(e,{id:s,contextId:"global",parentId:"root",suspenseId:"",componentName:"root-app",componentProps:{}}):this.lookupStore(s,t)}lookupStore(e,t){var s,r;const{contextId:o,parentId:i}=t,n=null===(s=e.split("--"))||void 0===s?void 0:s[0],{ids:a,parentId:l}=null!==(r=this.storesRelations.get(o))&&void 0!==r?r:{ids:new Set,parentId:i},u=[...a].filter((e=>e.startsWith(`${n}--`)));if(1===u.length)return this.stores.get(u[0]);if(u.length>1)console.error("Parent context has multiple stores with the same id, please pass key to getStore function.");else if(l&&"root"!==l)return this.lookupStore(e,{contextId:this.getBiggerContext(l,i)})}getBiggerContext(e,t){if(!e)return t;if(!t)return e;const s=/[^a-zA-Z]/g;return e.replace(s,"")>t.replace(s,"")?e:t}createStore(e,t){const{id:r,contextId:i,parentId:n,suspenseId:l,componentName:u,componentProps:d}=t;if(this.stores.has(r))return this.stores.get(r);const c=new e({...this.storesParams,storeManager:this,getStore:(e,t={contextId:i,parentId:n})=>this.getStore(e,t),componentProps:d});return c.libStoreId=r,c.isGlobal=e.isGlobal,c.libStoreContextId=e.isGlobal?"global":i,c.libStoreParentId=e.isGlobal||!n||n===i?"root":n,c.libStoreSuspenseId=l,c.libStoreComponentName=u,this.setStoreStatus(c,e.isGlobal?o.inUse:o.init),this.prepareStore(c),a.default.publish(s.CREATE_STORE,{store:e}),c}createStores(e,t,s,r,o,i={}){return e.reduce(((e,[n,a])=>{const[l,u]="store"in a?[a.store,a.id]:[a,this.getStoreId(a,{key:n,contextId:s})];return{...e,[n]:this.createStore(l,{id:u,contextId:s,parentId:t,suspenseId:r,componentName:o,componentProps:i})}}),{})}prepareStore(e){var t,s,r;const o=e.libStoreId,i=e.libStoreContextId,n=e.libStoreSuspenseId,a=this.initState[o],u=this.persistData[o];if(this.stores.has(o))return;if(a&&Object.assign(e,a),"wakeup"in e&&l.persistedStores.has(o)&&(null===(t=e.wakeup)||void 0===t||t.call(e,{initState:a,persistedState:u})),l.persistedStores.has(o)&&"addOnChangeListener"in e){const t=null===(s=e.onDestroy)||void 0===s?void 0:s.bind(e),r=e.addOnChangeListener(e,this);e.onDestroy=()=>{null==r||r(),null==t||t()}}null===(r=e.init)||void 0===r||r.call(e),this.storesRelations.has(i)||this.storesRelations.set(i,{ids:new Set,parentId:e.libStoreParentId&&e.libStoreParentId!==i?e.libStoreParentId:"root",componentName:e.libStoreComponentName}),this.suspenseRelations.has(n)||this.suspenseRelations.set(n,new Set);const{ids:d}=this.storesRelations.get(i);this.stores.set(o,e),d.add(o),this.suspenseRelations.get(n).add(o)}removeStore(e){var t,r,o;const i=e.libStoreId,n=e.libStoreSuspenseId,{ids:l}=null!==(t=this.storesRelations.get(e.libStoreContextId))&&void 0!==t?t:{ids:new Set};this.stores.has(i)&&(this.stores.delete(i),l.delete(i),n&&(null===(r=this.suspenseRelations.get(n))||void 0===r?void 0:r.has(i))&&this.suspenseRelations.get(n).delete(i),l.size||this.storesRelations.delete(e.libStoreContextId),"onDestroy"in e&&(null===(o=e.onDestroy)||void 0===o||o.call(e)),a.default.publish(s.DELETE_STORE,{store:e}))}mountStores(e){const{shouldRemoveInitState:t}=this.options;return Object.values(e).forEach((e=>{const r=e.libStoreId;t&&this.initState[r]&&delete this.initState[r],this.setStoreStatus(e,o.inUse),a.default.publish(s.MOUNT_STORE,{store:e})})),()=>{Object.values(e).forEach((e=>{e.isGlobal||(this.setStoreStatus(e,o.unused),a.default.publish(s.UNMOUNT_STORE,{store:e}))}))}}touchedStores(e){Object.values(e).forEach((e=>{e.libStoreStatus!==o.init||e.isGlobal||this.setStoreStatus(e,o.touched)}))}setStoreStatus(e,t){const{destroyTimers:{init:s=500,touched:r=1e4,unused:i=1e3}={}}=this.options;e.libStoreStatus=t,clearTimeout(e.libDestroyTimer);let n=0;switch(t){case o.init:n=s;break;case o.touched:n=r;break;case o.unused:n=i}n&&(e.libDestroyTimer=setTimeout((()=>this.removeStore(e)),n))}toJSON(e){var t,s;const r={},o=Array.isArray(e)?e.reduce(((e,t)=>(this.stores.has(t)&&e.set(t,this.stores.get(t)),e)),new Map):this.stores;for(const[e,i]of o.entries())r[e]=null!==(s=null===(t=i.toJSON)||void 0===t?void 0:t.call(i))&&void 0!==s?s:l.getObservableProps(i);return r}toPersistedJSON(){var e,t;const s={};for(const r of l.persistedStores){const o=this.stores.get(r);o&&(s[r]=null!==(t=null===(e=o.toJSON)||void 0===e?void 0:e.call(o))&&void 0!==t?t:l.getObservableProps(o))}return s}static getObservableProps(e){const s=t.toJS(e);return Object.entries(s).reduce(((s,[r,o])=>({...s,...t.isObservableProp(e,r)?{[r]:o}:{}})),{})}static persistStore(e,t){return l.persistedStores.has(t)?(console.warn(`Duplicate serializable store key: ${t}`),e):(l.persistedStores.add(t),e.libStoreId=t,"wakeup"in e.prototype||(e.prototype.wakeup=i),"addOnChangeListener"in e.prototype||(e.prototype.addOnChangeListener=r),e)}}Object.defineProperty(l,"persistedStores",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),module.exports=l;
@@ -1 +0,0 @@
1
- "use strict";var o=require("mobx");module.exports=(r,e)=>{const{shouldDisablePersist:t}=e.options;if(!t&&e.storage)return o.reaction((()=>{var e,t;return null!==(t=null===(e=r.toJSON)||void 0===e?void 0:e.call(r))&&void 0!==t?t:o.toJS(r)}),(()=>{var o,r;try{null===(r=null===(o=e.storage)||void 0===o?void 0:o.set(e.toPersistedJSON()))||void 0===r||r.catch((o=>{console.error("Failed to persist stores #1: ",o)}))}catch(o){console.error("Failed to persist stores #2: ",o)}}))};
@@ -1 +0,0 @@
1
- "use strict";var e=require("./state-listener.js");module.exports=function(s){window.__MOBX_STORE_MANAGER__=new e(s).subscribe()};
@@ -1 +0,0 @@
1
- "use strict";var e=require("lodash"),t=require("mobx"),r=require("../../manager.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n,a=o(e);!function(e){e.SPY="spy"}(n||(n={}));class s{constructor(e){Object.defineProperty(this,"manager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.manager=e,Object.values(s.listeners).forEach((e=>{e()}))}getContextKey(e,t){var r;if("root"===e)return e;const{parentId:o}=null!==(r=this.manager.getStoresRelations().get(e))&&void 0!==r?r:{};return o&&"root"!==o?this.getContextKey(o,`${o}.${null!=t?t:e}`):`${null!=o?o:"root"}.${null!=t?t:e}`}getStoresState(){const e={root:{}};try{const t=this.manager.getStores();this.manager.getStoresRelations().forEach((({ids:o,componentName:n},s)=>{const l=this.getContextKey(s);o.forEach((o=>{var s,i;const u=t.get(o);if(u){const t=null!==(i=null===(s=null==u?void 0:u.toJSON)||void 0===s?void 0:s.call(u))&&void 0!==i?i:r.getObservableProps(u);a.default.set(e,`${l}.stores.${o}`,t),a.default.set(e,`${l}.componentName`,n)}}))}))}catch(e){}return e}subscribe(){return s.listeners[n.SPY]=t.spy((e=>{var t,r;["report-end","reaction"].includes(e.type)||null===(r=null===(t=this.manager)||void 0===t?void 0:t.__devOnChange)||void 0===r||r.call(t,{event:a.default.cloneDeep(e),storesState:this.getStoresState()})})),this.manager}}Object.defineProperty(s,"listeners",{enumerable:!0,configurable:!0,writable:!0,value:{}}),module.exports=s;
@@ -1 +0,0 @@
1
- "use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("node:fs"));const r=`${__dirname.split("node_modules")[0]}node_modules/.cache/@lomray/react-mobx-manager`,s=`${r}/store-ids.json`,a=(e=!1)=>{if(e&&t.default.existsSync(s)){const e=JSON.parse(t.default.readFileSync(s,{encoding:"utf-8"}));return new Map(e)}return new Map},i=(e="")=>{var t;const r=e.split(""),s=null!==(t=r.pop())&&void 0!==t?t:"`";if("z"===s)return[...r,"A"].join("");if("Z"===s){const e=r.pop();return e?[i([...r,e].join("")),"a"].join(""):"aa"}return[...r,String.fromCharCode(s.charCodeAt(0)+1)].join("")};exports.Generator=class{constructor(e,t=!1){Object.defineProperty(this,"cache",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"root",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"lastId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"injectId",{enumerable:!0,configurable:!0,writable:!0,value:(e,t)=>{const{classname:r,storeId:s}=this.cache.get(t),a=new RegExp(`(class\\s${r}\\s+?{)`);return e.replace(a,`$1static id = '${s}';`)}}),Object.defineProperty(this,"getDevId",{enumerable:!0,configurable:!0,writable:!0,value:(e,t)=>`${e.replace(this.root,"").replace(/\/index.(js|ts|tsx)/,"").split("/").filter(Boolean).join("-")}-${t}`}),Object.defineProperty(this,"getProdId",{enumerable:!0,configurable:!0,writable:!0,value:()=>{const e=i(this.lastId),t=`S${e}`;return this.lastId=e,t}}),Object.defineProperty(this,"matchMobxStore",{enumerable:!0,configurable:!0,writable:!0,value:e=>{var t,r,s,a;const{classname:i}=null!==(r=null===(t=e.match(/class\s(?<classname>\w+)\s+?{(?!.*static\sid\s*=.*).+(makeObservable|makeAutoObservable)(?!.*persistStore\(\1.*)/s))||void 0===t?void 0:t.groups)&&void 0!==r?r:{};if(i)return i;const{classname:o}=null!==(a=null===(s=e.match(/(@mobx-store).+class\s(?<classname>\w+)\s+?{(?!.*static\sid\s*=.*).+}(?!.*persistStore.*)/s))||void 0===s?void 0:s.groups)&&void 0!==a?a:{};return o}}),this.root=e,this.cache=a(t)}},exports.getNextLetter=i,exports.loadCache=a,exports.saveCache=e=>{t.default.existsSync(r)||t.default.mkdirSync(r,{recursive:!0}),t.default.writeFileSync(s,JSON.stringify([...e.entries()],null,2),{encoding:"utf-8"})};
@@ -1 +0,0 @@
1
- "use strict";var e=require("node:path"),r=require("node:process"),t=require("../helpers.js");module.exports=function({root:s=r.cwd(),isProd:a=!1}={}){const n=new t.Generator(s,a);return{name:"@lomray/react-mobx-manager-id-generator",transform(r,t){const s=e.extname(t).split("?")[0];if(t.includes("node_modules")||![".js",".ts",".tsx"].includes(s)||!/(makeObservable|makeAutoObservable)\(/.test(r))return;if(n.cache.has(t))return{code:n.injectId(r,t),map:{mappings:""}};const o=n.matchMobxStore(r);if(o){if(!n.cache.has(t)){const e=a?n.getProdId():n.getDevId(t,o);n.cache.set(t,{classname:o,storeId:e})}return{code:n.injectId(r,t),map:{mappings:""}}}},buildEnd(){a&&t.saveCache(n.cache)}}};
@@ -1 +0,0 @@
1
- "use strict";var e=require("node:process"),r=require("./id-generator.js");function t(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var n=t(e);module.exports=function(){let e;return[{name:r().name,configResolved({root:t}){var o;e=r({root:t,isProd:"production"===o||"production"===n.env.NODE_ENV})},transform(...r){var t;return null===(t=e.transform)||void 0===t?void 0:t.call(this,...r)},buildEnd(...r){var t;null===(t=e.buildEnd)||void 0===t||t.call(this,...r)}}]};
@@ -1 +0,0 @@
1
- "use strict";module.exports=class{constructor(e){Object.defineProperty(this,"globalKey",{enumerable:!0,configurable:!0,writable:!0,value:"stores"}),Object.defineProperty(this,"storage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.storage=e}async get(){try{return JSON.parse(await this.storage.getItem(this.globalKey)||"{}")}catch(e){return{}}}flush(){return this.storage.removeItem(this.globalKey)}set(e){return this.storage.setItem(this.globalKey,JSON.stringify(e||"{}"))}};
@@ -1 +0,0 @@
1
- "use strict";module.exports=class{constructor(){Object.defineProperty(this,"globalKey",{enumerable:!0,configurable:!0,writable:!0,value:"stores"})}get(){try{return JSON.parse(localStorage.getItem(this.globalKey)||"{}")}catch(e){return{}}}flush(){return localStorage.removeItem(this.globalKey)}set(e){return localStorage.setItem(this.globalKey,JSON.stringify(e||"{}"))}};
@@ -1 +0,0 @@
1
- "use strict";var u;!function(u){u.init="init",u.touched="touched",u.inUse="in-use",u.unused="unused"}(u||(u={}));var e=u;module.exports=e;
@@ -1 +0,0 @@
1
- "use strict";var e=require("mobx");class r{constructor(t,{fieldName:i="sR",errorFields:s=["name","message"]}={}){var o;Object.defineProperty(this,"promise",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"store",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"params",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"query",{enumerable:!0,configurable:!0,writable:!0,value:t=>{const{fieldName:i}=this.params;if(!this.isComplete())return this.promise||(this.promise=t(),this.promise.then((()=>{e.runInAction((()=>{this.store[i]=!0}))}),(r=>{e.runInAction((()=>{this.errorJson(r),this.store[i]=r}))}))),r.run(this.promise)}}),this.store=t,this.params={fieldName:i,errorFields:s};const a=null===(o=t.init)||void 0===o?void 0:o.bind(t);t.init=()=>{this.isComplete(),null==a||a()},e.extendObservable(t,{[i]:!1},{[i]:e.observable})}errorJson(e){e.toJSON=()=>this.params.errorFields.reduce(((r,t)=>({...r,[t]:null==e?void 0:e[t]})),{})}jsonToError(e,r){return this.params.errorFields.forEach((t=>{e[t]=null==r?void 0:r[t]})),e}isComplete(){var e;const r=this.store[this.params.fieldName];if("boolean"!==typeof r)throw this.jsonToError(new Error(null!==(e=null==r?void 0:r.message)&&void 0!==e?e:null==r?void 0:r.name),r);return!0===r}}Object.defineProperty(r,"run",{enumerable:!0,configurable:!0,writable:!0,value:e=>{if(e){switch(e.status){case"fulfilled":return e.value;case"pending":throw e;case"rejected":throw e.reason;default:e.status="pending",e.then((r=>{e.status="fulfilled",e.value=r}),(r=>{e.status="rejected",e.reason=r}))}throw e}}}),module.exports=r;
package/lib/wakeup.js DELETED
@@ -1 +0,0 @@
1
- "use strict";module.exports=function({persistedState:t}){t&&Object.assign(this,t)};
@@ -1 +0,0 @@
1
- "use strict";var e=require("@lomray/consistent-suspense"),t=require("hoist-non-react-statics"),r=require("mobx-react-lite"),n=require("react"),s=require("./context.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=o(t),u=o(n);module.exports=(t,o,{customContextId:i}={})=>{const c=r.observer(t),d=i||t.libStoreContextId,l=t.displayName||t.name,m=t=>{const r=s.useStoreManager(),a=s.useStoreManagerParent(),{suspenseId:i}=e.useConsistentSuspense(),m=e.useId(),[{contextId:S,initStores:f,mountStores:p}]=n.useState((()=>{const e=d||m;return{contextId:e,initStores:r.createStores(Object.entries(o),a,e,i,l,t),mountStores:()=>r.mountStores(f)}}));return n.useEffect(p,[p]),u.default.createElement(s.StoreManagerParentProvider,{parentId:S,initStores:f},u.default.createElement(c,{...t,...f}))};return a.default(m,t),m.displayName=`Mobx(${l})`,Object.defineProperty(m,"name",{value:m.displayName,writable:!1,enumerable:!1})};
File without changes
File without changes
File without changes
File without changes
File without changes