@lomray/react-mobx-manager 2.0.0-beta.6 → 2.0.0-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/context.d.ts CHANGED
@@ -1,20 +1,20 @@
1
1
  /// <reference types="react" />
2
+ import { IConsistentSuspense } from '@lomray/consistent-suspense';
2
3
  import React from 'react';
3
4
  import { FC, ReactElement } from "react";
4
5
  import Manager from "./manager.js";
6
+ import { TStores } from "./types-0ce7ddf0.js";
5
7
  interface IStoreManagerProvider {
6
8
  storeManager: Manager;
7
9
  shouldInit?: boolean;
8
10
  fallback?: ReactElement;
9
11
  children?: React.ReactNode;
12
+ suspenseProvider?: Partial<IConsistentSuspense>;
10
13
  }
11
14
  interface IStoreManagerParentProvider {
12
- children?: React.ReactNode;
13
15
  parentId: string;
14
- }
15
- interface IStoreManagerSuspenseProvider {
16
16
  children?: React.ReactNode;
17
- id: string | null;
17
+ initStores?: TStores;
18
18
  }
19
19
  /**
20
20
  * Mobx store manager context
@@ -24,15 +24,6 @@ declare const StoreManagerContext: React.Context<Manager>;
24
24
  * To spread relationships
25
25
  */
26
26
  declare const StoreManagerParentContext: React.Context<string>;
27
- /**
28
- * Generate id for suspended component stores
29
- */
30
- declare const StoreManagerSuspenseContext: React.Context<string | null>;
31
- /**
32
- * Mobx store manager parent provider
33
- * @constructor
34
- */
35
- declare const StoreManagerSuspenseProvider: FC<IStoreManagerSuspenseProvider>;
36
27
  /**
37
28
  * Mobx store manager parent provider
38
29
  * @constructor
@@ -43,7 +34,6 @@ declare const StoreManagerParentProvider: FC<Omit<IStoreManagerParentProvider, '
43
34
  * @constructor
44
35
  */
45
36
  declare const StoreManagerProvider: FC<IStoreManagerProvider>;
46
- declare const useStoreManagerContext: () => Manager;
47
- declare const useStoreManagerParentContext: () => IStoreManagerParentProvider['parentId'];
48
- declare const useStoreManagerSuspenseContext: () => IStoreManagerSuspenseProvider['id'];
49
- export { StoreManagerContext, StoreManagerParentContext, StoreManagerSuspenseContext, StoreManagerProvider, StoreManagerParentProvider, StoreManagerSuspenseProvider, useStoreManagerContext, useStoreManagerParentContext, useStoreManagerSuspenseContext };
37
+ declare const useStoreManager: () => Manager;
38
+ declare const useStoreManagerParent: () => IStoreManagerParentProvider['parentId'];
39
+ export { StoreManagerContext, StoreManagerParentContext, StoreManagerProvider, StoreManagerParentProvider, useStoreManager, useStoreManagerParent };
package/lib/context.js CHANGED
@@ -1 +1 @@
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({}),n=r.default.createContext("root"),o=r.default.createContext(null),s=({children:e,parentId:t})=>r.default.createElement(n.Provider,{value:t,children:e});exports.StoreManagerContext=a,exports.StoreManagerParentContext=n,exports.StoreManagerParentProvider=s,exports.StoreManagerProvider=({children:t,storeManager:n,fallback:o,shouldInit:u=!1})=>{const[l,d]=e.useState(!u);return e.useEffect((()=>{u&&n.init().then((()=>d(!0))).catch((e=>{console.error("Failed initialized store manager: ",e)}))}),[u,n]),r.default.createElement(a.Provider,{value:n},r.default.createElement(s,{parentId:"root"},l?t:o||t))},exports.StoreManagerSuspenseContext=o,exports.StoreManagerSuspenseProvider=({children:e,id:t})=>r.default.createElement(o.Provider,{value:t,children:e}),exports.useStoreManagerContext=()=>e.useContext(a),exports.useStoreManagerParentContext=()=>e.useContext(n),exports.useStoreManagerSuspenseContext=()=>e.useContext(o);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@lomray/consistent-suspense"),t=require("react");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=r(t);const o=n.default.createContext({}),a=n.default.createContext("root"),s=({parentId:e,children:t,initStores:r})=>{const o=u();return r&&o.touchedStores(r),n.default.createElement(a.Provider,{value:e,children:t})},u=()=>t.useContext(o);exports.StoreManagerContext=o,exports.StoreManagerParentContext=a,exports.StoreManagerParentProvider=s,exports.StoreManagerProvider=({children:r,storeManager:a,fallback:u,suspenseProvider:i={},shouldInit:l=!1})=>{const[d,c]=t.useState(!l);return t.useEffect((()=>{l&&a.init().then((()=>c(!0))).catch((e=>{console.error("Failed initialized store manager: ",e)}))}),[l,a]),n.default.createElement(e.ConsistentSuspenseProvider,{...i},n.default.createElement(o.Provider,{value:a},n.default.createElement(s,{parentId:"root"},d?r:u||r)))},exports.useStoreManager=u,exports.useStoreManagerParent=()=>t.useContext(a);
package/lib/index.d.ts CHANGED
@@ -1,8 +1,7 @@
1
- export * from "./types-abd34741.js";
1
+ export * from "./types-0ce7ddf0.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
7
  export { default as Events } from "./events.js";
8
- export { default as MobxSuspense } from "./mobx-suspense.js";
package/lib/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./context.js"),r=require("./manager.js"),t=require("./on-change-listener.js"),o=require("./wakeup.js"),n=require("./with-stores.js"),s=require("./events.js"),a=require("./mobx-suspense.js");exports.StoreManagerContext=e.StoreManagerContext,exports.StoreManagerParentContext=e.StoreManagerParentContext,exports.StoreManagerParentProvider=e.StoreManagerParentProvider,exports.StoreManagerProvider=e.StoreManagerProvider,exports.StoreManagerSuspenseContext=e.StoreManagerSuspenseContext,exports.StoreManagerSuspenseProvider=e.StoreManagerSuspenseProvider,exports.useStoreManagerContext=e.useStoreManagerContext,exports.useStoreManagerParentContext=e.useStoreManagerParentContext,exports.useStoreManagerSuspenseContext=e.useStoreManagerSuspenseContext,exports.Manager=r,exports.onChangeListener=t,exports.wakeup=o,exports.withStores=n,exports.Events=s,exports.MobxSuspense=a;
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;
package/lib/manager.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import StreamStores from "./server/stream-stores.js";
2
- import { IConstructableStore, IManagerParams, IStorage, IStore, TStoreDefinition, IManagerOptions, TStores, IStoreLifecycle, TInitStore, IStoreParams } from "./types-abd34741.js";
1
+ import StoreStatus from "./store-status.js";
2
+ import { IConstructableStore, IManagerOptions, IManagerParams, IStorage, IStore, IStoreParams, TInitStore, TStoreDefinition, TStores } from "./types-0ce7ddf0.js";
3
3
  /**
4
4
  * Mobx stores manager
5
5
  */
@@ -50,10 +50,10 @@ declare class Manager {
50
50
  */
51
51
  readonly options: IManagerOptions;
52
52
  /**
53
- * Attached stream store service
54
- * @see StreamStores.create
53
+ * Suspense stores relations
54
+ * @see withStores
55
55
  */
56
- streamStores?: StreamStores;
56
+ protected suspenseRelations: Map<string, Set<string>>;
57
57
  /**
58
58
  * @constructor
59
59
  */
@@ -89,6 +89,13 @@ declare class Manager {
89
89
  * Get stores relations
90
90
  */
91
91
  getStoresRelations(): Manager['storesRelations'];
92
+ /**
93
+ * Get suspense relations with stores
94
+ */
95
+ /**
96
+ * Get suspense relations with stores
97
+ */
98
+ getSuspenseRelations(): Manager['suspenseRelations'];
92
99
  /**
93
100
  * Get persisted stores ids
94
101
  */
@@ -110,13 +117,6 @@ declare class Manager {
110
117
  * @protected
111
118
  */
112
119
  protected getStoreId<T>(store: IConstructableStore<T> | TInitStore, params?: IStoreParams): string;
113
- /**
114
- * Generate new context id
115
- */
116
- /**
117
- * Generate new context id
118
- */
119
- createContextId(id?: string): string;
120
120
  /**
121
121
  * Get exist store
122
122
  */
@@ -148,25 +148,21 @@ declare class Manager {
148
148
  /**
149
149
  * Create stores for component
150
150
  */
151
- createStores(map: [string, TStoreDefinition][], parentId: string, contextId: string, componentName: string, componentProps?: Record<string, any>): TStores;
151
+ createStores(map: [string, TStoreDefinition][], parentId: string, contextId: string, suspenseId: string, componentName: string, componentProps?: Record<string, any>): TStores;
152
152
  /**
153
153
  * Prepare store before usage
154
- * @protected
155
154
  */
156
155
  /**
157
156
  * Prepare store before usage
158
- * @protected
159
157
  */
160
158
  protected prepareStore(store: TStores[string]): void;
161
159
  /**
162
- * Prepare store before mount to component
163
- * @protected
160
+ * Remove store
164
161
  */
165
162
  /**
166
- * Prepare store before mount to component
167
- * @protected
163
+ * Remove store
168
164
  */
169
- protected prepareMount(store: TStores[string]): Required<IStoreLifecycle>['onDestroy'][];
165
+ protected removeStore(store: TStores[string]): void;
170
166
  /**
171
167
  * Mount stores to component
172
168
  */
@@ -174,6 +170,20 @@ declare class Manager {
174
170
  * Mount stores to component
175
171
  */
176
172
  mountStores(stores: TStores): () => void;
173
+ /**
174
+ * Change the stores status to touched
175
+ */
176
+ /**
177
+ * Change the stores status to touched
178
+ */
179
+ touchedStores(stores: TStores): void;
180
+ /**
181
+ * Change store status
182
+ */
183
+ /**
184
+ * Change store status
185
+ */
186
+ protected setStoreStatus(store: TStores[string], status: StoreStatus): void;
177
187
  /**
178
188
  * Get store's state
179
189
  */
package/lib/manager.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e=require("@lomray/event-manager"),t=require("mobx"),s=require("./events.js"),r=require("./on-change-listener.js"),o=require("./wakeup.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=i(e);class a{constructor({initState:e,storesParams:t,storage:s,options:r}={}){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,isSSR:!1}}),Object.defineProperty(this,"streamStores",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),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||{}),a.instance=this,"undefined"==typeof window||window.mobxManager||(window.mobxManager={pushInit:this.pushInitState})}async init(){return this.storage&&(this.persistData=await this.storage.get()||{}),this}static get(){if(!a.instance)throw new Error("Store manager is not initialized.");return a.instance}getStores(){return this.stores}getStoresRelations(){return this.storesRelations}static getPersistedStoresIds(){return a.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.name||e.constructor.name;return e.isSingleton?i:(i=`${i}--${r}`,o?`${i}--${o}`:i)}createContextId(e){return`ctx${e||this.storesRelations.size+1}`}getStore(e,t={}){const s=this.getStoreId(e,t);return this.stores.has(s)?this.stores.get(s):e.isSingleton?this.createStore(e,{id:s,contextId:"singleton",parentId:"root",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},d=[...a].filter((e=>e.startsWith(`${n}--`)));if(1===d.length)return this.stores.get(d[0]);if(d.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:l})}createStore(e,t){var r,o;const{isSSR:i}=this.options,{id:l,contextId:d,parentId:u,componentName:p,componentProps:c}=t;if((e.isSingleton||i)&&this.stores.has(l))return this.stores.get(l);const h=new e({...this.storesParams,storeManager:this,getStore:(e,t={contextId:d,parentId:u})=>this.getStore(e,t),componentProps:c});h.libStoreId=l,h.isSingleton=e.isSingleton,h.libStoreContextId=e.isSingleton?"singleton":d,h.libStoreParentId=e.isSingleton||!u||u===d?"root":u,h.libStoreComponentName=p;const S=this.initState[l],b=this.persistData[l];return S&&Object.assign(h,S),n.default.publish(s.CREATE_STORE,{store:e}),"wakeup"in h&&a.persistedStores.has(l)&&(null===(r=h.wakeup)||void 0===r||r.call(h,h,{initState:S,persistedState:b})),null===(o=h.init)||void 0===o||o.call(h),this.prepareStore(h),(h.isSingleton||i)&&this.prepareMount(h),h}createStores(e,t,s,r,o={}){return e.reduce(((e,[i,n])=>{const[a,l]="store"in n?[n.store,n.id]:[n,this.getStoreId(n,{key:i,contextId:s})];return{...e,[i]:this.createStore(a,{id:l,contextId:s,parentId:t,componentName:r,componentProps:o})}}),{})}prepareStore(e){const t=e.libStoreId,r=e.libStoreContextId;this.storesRelations.has(r)||this.storesRelations.set(r,{ids:new Set,parentId:e.libStoreParentId&&e.libStoreParentId!==r?e.libStoreParentId:"root",componentName:e.libStoreComponentName});const{ids:o}=this.storesRelations.get(r);this.stores.has(t)||(this.stores.set(t,e),o.add(t),n.default.publish(s.ADD_STORE,{store:e}))}prepareMount(e){const{shouldRemoveInitState:t}=this.options,s=e.libStoreId,r=[];return a.persistedStores.has(s)&&"addOnChangeListener"in e&&r.push(e.addOnChangeListener(e,this)),t&&this.initState[s]&&delete this.initState[s],r}mountStores(e){const t=[];return Object.values(e).forEach((e=>{var r;if(this.prepareStore(e),t.push(...this.prepareMount(e)),n.default.publish(s.MOUNT_STORE,{store:e}),"onMount"in e){const s=null===(r=e.onMount)||void 0===r?void 0:r.call(e);"function"==typeof s&&t.push(s)}"onDestroy"in e&&t.push((()=>{var t;return null===(t=e.onDestroy)||void 0===t?void 0:t.call(e)}))})),()=>{t.forEach((e=>e())),Object.values(e).forEach((e=>{var t;const r=e.libStoreId;if(n.default.publish(s.UNMOUNT_STORE,{store:e}),!e.isSingleton){const{ids:o}=null!==(t=this.storesRelations.get(e.libStoreContextId))&&void 0!==t?t:{ids:new Set};this.stores.delete(r),o.delete(r),n.default.publish(s.DELETE_STORE,{store:e}),o.size||this.storesRelations.delete(e.libStoreContextId)}}))}}toJSON(e){var t,s,r;const o={},i=null!==(t=null==e?void 0:e.reduce(((e,t)=>(this.stores.has(t)&&e.set(t,this.stores.get(t)),e)),new Map))&&void 0!==t?t:this.stores;for(const[e,t]of i.entries())o[e]=null!==(r=null===(s=t.toJSON)||void 0===s?void 0:s.call(t))&&void 0!==r?r:a.getObservableProps(t);return o}toPersistedJSON(){var e,t;const s={};for(const r of a.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:a.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 a.persistedStores.has(t)?(console.warn(`Duplicate serializable store key: ${t}`),e):(a.persistedStores.add(t),e.libStoreId=t,"wakeup"in e.prototype||(e.prototype.wakeup=o),"addOnChangeListener"in e.prototype||(e.prototype.addOnChangeListener=r),e)}}Object.defineProperty(a,"persistedStores",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),module.exports=a;
1
+ "use strict";var e=require("@lomray/event-manager"),t=require("mobx"),s=require("./events.js"),o=require("./on-change-listener.js"),r=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:o}={}){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,o||{}),l.instance=this,"undefined"==typeof window||window.mobxManager||(window.mobxManager={pushInit: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:o,key:r}=t;if(s)return s;if(e.libStoreId)return e.libStoreId;let i=e.name||e.constructor.name;return e.isSingleton?i:(i=`${i}--${o}`,r?`${i}--${r}`:i)}getStore(e,t={}){const s=this.getStoreId(e,t);return this.stores.has(s)?this.stores.get(s):e.isSingleton?this.createStore(e,{id:s,contextId:"singleton",parentId:"root",suspenseId:"",componentName:"root-app",componentProps:{}}):this.lookupStore(s,t)}lookupStore(e,t){var s,o;const{contextId:r,parentId:i}=t,n=null===(s=e.split("--"))||void 0===s?void 0:s[0],{ids:a,parentId:l}=null!==(o=this.storesRelations.get(r))&&void 0!==o?o:{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:l})}createStore(e,t){const{id:o,contextId:i,parentId:n,suspenseId:l,componentName:u,componentProps:d}=t;if(this.stores.has(o))return this.stores.get(o);const h=new e({...this.storesParams,storeManager:this,getStore:(e,t={contextId:i,parentId:n})=>this.getStore(e,t),componentProps:d});return h.libStoreId=o,h.isSingleton=e.isSingleton,h.libStoreContextId=e.isSingleton?"singleton":i,h.libStoreParentId=e.isSingleton||!n||n===i?"root":n,h.libStoreSuspenseId=l,h.libStoreComponentName=u,this.setStoreStatus(h,e.isSingleton?r.inUse:r.init),this.prepareStore(h),a.default.publish(s.CREATE_STORE,{store:e}),h}createStores(e,t,s,o,r,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:o,componentName:r,componentProps:i})}}),{})}prepareStore(e){var t,o,r;const i=e.libStoreId,n=e.libStoreContextId,u=e.libStoreSuspenseId,d=this.initState[i],h=this.persistData[i];if(this.stores.has(i))return;if(d&&Object.assign(e,d),"wakeup"in e&&l.persistedStores.has(i)&&(null===(t=e.wakeup)||void 0===t||t.call(e,{initState:d,persistedState:h})),l.persistedStores.has(i)&&"addOnChangeListener"in e){const t=null===(o=e.onDestroy)||void 0===o?void 0:o.bind(e),s=e.addOnChangeListener(e,this);e.onDestroy=()=>{null==s||s(),null==t||t()}}null===(r=e.init)||void 0===r||r.call(e),this.storesRelations.has(n)||this.storesRelations.set(n,{ids:new Set,parentId:e.libStoreParentId&&e.libStoreParentId!==n?e.libStoreParentId:"root",componentName:e.libStoreComponentName}),this.suspenseRelations.has(u)||this.suspenseRelations.set(u,new Set);const{ids:c}=this.storesRelations.get(n);this.stores.set(i,e),c.add(i),this.suspenseRelations.get(u).add(i),a.default.publish(s.ADD_STORE,{store:e})}removeStore(e){var t,o,r;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===(o=this.suspenseRelations.get(n))||void 0===o?void 0:o.has(i))&&this.suspenseRelations.get(n).delete(i),l.size||this.storesRelations.delete(e.libStoreContextId),"onDestroy"in e&&(null===(r=e.onDestroy)||void 0===r||r.call(e)),a.default.publish(s.DELETE_STORE,{store:e}))}mountStores(e){const{shouldRemoveInitState:t}=this.options;return Object.values(e).forEach((e=>{const o=e.libStoreId;t&&this.initState[o]&&delete this.initState[o],this.setStoreStatus(e,r.inUse),a.default.publish(s.MOUNT_STORE,{store:e})})),()=>{Object.values(e).forEach((e=>{e.isSingleton||(this.setStoreStatus(e,r.unused),a.default.publish(s.UNMOUNT_STORE,{store:e}))}))}}touchedStores(e){Object.values(e).forEach((e=>{e.libStoreStatus!==r.init||e.isSingleton||this.setStoreStatus(e,r.touched)}))}setStoreStatus(e,t){const{destroyTimers:{init:s=500,touched:o=3e3,unused:i=1e3}={}}=this.options;e.libStoreStatus=t,clearTimeout(e.libDestroyTimer);let n=0;switch(t){case r.init:n=s;break;case r.touched:n=o;break;case r.unused:n=i}n&&(e.libDestroyTimer=setTimeout((()=>this.removeStore(e)),n))}toJSON(e){var t,s,o;const r={},i=null!==(t=null==e?void 0:e.reduce(((e,t)=>(this.stores.has(t)&&e.set(t,this.stores.get(t)),e)),new Map))&&void 0!==t?t:this.stores;for(const[e,t]of i.entries())r[e]=null!==(o=null===(s=t.toJSON)||void 0===s?void 0:s.call(t))&&void 0!==o?o:l.getObservableProps(t);return r}toPersistedJSON(){var e,t;const s={};for(const o of l.persistedStores){const r=this.stores.get(o);r&&(s[o]=null!==(t=null===(e=r.toJSON)||void 0===e?void 0:e.call(r))&&void 0!==t?t:l.getObservableProps(r))}return s}static getObservableProps(e){const s=t.toJS(e);return Object.entries(s).reduce(((s,[o,r])=>({...s,...t.isObservableProp(e,o)?{[o]:r}:{}})),{})}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.bind(e)),"addOnChangeListener"in e.prototype||(e.prototype.addOnChangeListener=o),e)}}Object.defineProperty(l,"persistedStores",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),module.exports=l;
@@ -1,4 +1,4 @@
1
- import { IStorePersisted } from "./types-abd34741.js";
1
+ import { IStorePersisted } from "./types-0ce7ddf0.js";
2
2
  /**
3
3
  * Listen persist store changes
4
4
  */
@@ -1,4 +1,4 @@
1
- import { IStorage } from "../types-abd34741.js";
1
+ import { IStorage } from "../types-0ce7ddf0.js";
2
2
  interface IAsyncStorage {
3
3
  getItem: (key: string) => Promise<string | null>;
4
4
  setItem: (key: string, value: string) => Promise<void>;
@@ -1,4 +1,4 @@
1
- import { IStorage } from "../types-abd34741.js";
1
+ import { IStorage } from "../types-0ce7ddf0.js";
2
2
  /**
3
3
  * Local storage for mobx store manager
4
4
  */
@@ -0,0 +1,7 @@
1
+ declare enum StoreStatus {
2
+ init = "init",
3
+ touched = "touched",
4
+ inUse = "in-use",
5
+ unused = "unused"
6
+ }
7
+ export { StoreStatus as default };
@@ -0,0 +1 @@
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,4 +1,4 @@
1
- import { TInitStore } from "./types-abd34741.js";
1
+ import { TInitStore } from "./types-0ce7ddf0.js";
2
2
  interface IPromise<TReturn> extends Promise<TReturn> {
3
3
  status?: 'fulfilled' | 'pending' | 'rejected';
4
4
  value?: TReturn;
@@ -1,4 +1,6 @@
1
+ /// <reference types="node" />
1
2
  import Manager from "./manager.js";
3
+ import StoreStatus from "./store-status.js";
2
4
  interface IWindowManager {
3
5
  pushInit: (state: Record<string, any>) => void;
4
6
  }
@@ -14,13 +16,15 @@ interface IConstructorParams<TProps = Record<string, any>> {
14
16
  }
15
17
  interface IStoreLifecycle {
16
18
  onDestroy?: () => void;
17
- onMount?: () => void | (() => void);
18
19
  }
19
20
  interface IStore extends IStoreLifecycle {
20
21
  libStoreId?: string;
21
22
  libStoreContextId?: string;
22
23
  libStoreParentId?: string;
24
+ libStoreSuspenseId?: string;
23
25
  libStoreComponentName?: string;
26
+ libStoreStatus?: StoreStatus;
27
+ libDestroyTimer?: NodeJS.Timeout;
24
28
  isSingleton?: boolean;
25
29
  init?: () => void;
26
30
  toJSON?: () => Record<string, any>;
@@ -47,7 +51,7 @@ interface IManagerParams {
47
51
  options?: IManagerOptions;
48
52
  initState?: Record<string, any>;
49
53
  }
50
- type TWakeup = (store: IStore, state: {
54
+ type TWakeup = (state: {
51
55
  initState?: Record<string, any>;
52
56
  persistedState?: Record<string, any>;
53
57
  }) => void;
@@ -59,7 +63,11 @@ interface IStorage {
59
63
  interface IManagerOptions {
60
64
  shouldDisablePersist?: boolean;
61
65
  shouldRemoveInitState?: boolean;
62
- isSSR?: boolean;
66
+ destroyTimers?: {
67
+ init?: number;
68
+ touched?: number;
69
+ unused?: number;
70
+ };
63
71
  }
64
72
  type TStores = {
65
73
  [storeKey: string]: IStore | IStorePersisted;
@@ -81,6 +89,7 @@ interface IStoreParams {
81
89
  key?: string;
82
90
  contextId?: string;
83
91
  parentId?: string;
92
+ suspenseId?: string;
84
93
  componentName?: string;
85
94
  componentProps?: Record<string, any>;
86
95
  }
package/lib/wakeup.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { IStorePersisted } from "./types-abd34741.js";
1
+ import { TStores, TWakeup } from "./types-0ce7ddf0.js";
2
2
  /**
3
- * Restore store state from initial state
3
+ * Restore persisted store state
4
4
  */
5
- declare const wakeup: IStorePersisted['wakeup'];
5
+ declare function wakeup(this: TStores[string], { persistedState }: Parameters<TWakeup>[0]): void;
6
6
  export { wakeup as default };
package/lib/wakeup.js CHANGED
@@ -1 +1 @@
1
- "use strict";module.exports=(e,{persistedState:s})=>{s&&Object.assign(e,s)};
1
+ "use strict";module.exports=function({persistedState:t}){t&&Object.assign(this,t)};
@@ -1,5 +1,5 @@
1
1
  import { FC } from 'react';
2
- import { TMapStores, IWithStoreOptions } from "./types-abd34741.js";
2
+ import { TMapStores, IWithStoreOptions } from "./types-0ce7ddf0.js";
3
3
  /**
4
4
  * Make component observable and pass stores as props
5
5
  */
@@ -1 +1 @@
1
- "use strict";var e=require("hoist-non-react-statics"),t=require("mobx-react-lite"),r=require("react"),n=require("./context.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=a(e),u=a(r);module.exports=(e,a,{customContextId:s}={})=>{const d=t.observer(e),i=s||e.libStoreContextId,c=e.displayName||e.name,l=e=>{var t;const o=n.useStoreManagerContext(),s=n.useStoreManagerParentContext(),l=n.useStoreManagerSuspenseContext(),S=null===(t=u.default.useId)||void 0===t?void 0:t.call(u.default),[{contextId:f,initStores:x}]=r.useState((()=>{const t=o.createContextId(i||l||S);return{contextId:t,initStores:o.createStores(Object.entries(a),s,t,c,e)}}));return r.useEffect((()=>o.mountStores(x)),[x,o]),u.default.createElement(n.StoreManagerSuspenseProvider,{id:null},u.default.createElement(n.StoreManagerParentProvider,{parentId:f},u.default.createElement(d,{...x,...e})))};return o.default(l,e),l.displayName=`Mobx(${c})`,l};
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})};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lomray/react-mobx-manager",
3
- "version": "2.0.0-beta.6",
3
+ "version": "2.0.0-beta.8",
4
4
  "description": "This package provides Mobx stores manager for react.",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -12,8 +12,7 @@
12
12
  "*": {
13
13
  "./*": [
14
14
  "lib/*",
15
- "lib/storages/*",
16
- "lib/server/*"
15
+ "lib/storages/*"
17
16
  ]
18
17
  }
19
18
  },
@@ -52,11 +51,12 @@
52
51
  "prepare": "husky install"
53
52
  },
54
53
  "dependencies": {
54
+ "@lomray/consistent-suspense": "^1.2.0",
55
55
  "@lomray/event-manager": "^1.2.2"
56
56
  },
57
57
  "devDependencies": {
58
- "@commitlint/cli": "^17.6.3",
59
- "@commitlint/config-conventional": "^17.6.3",
58
+ "@commitlint/cli": "^17.6.6",
59
+ "@commitlint/config-conventional": "^17.6.6",
60
60
  "@lomray/eslint-config-react": "^3.0.0",
61
61
  "@lomray/prettier-config": "^1.2.0",
62
62
  "@rollup/plugin-terser": "^0.4.3",
@@ -1,8 +0,0 @@
1
- import { FC, SuspenseProps } from 'react';
2
- /**
3
- * Wrapper around react suspense
4
- * Create unique id for each suspense (used for create/stream stores state)
5
- * @constructor
6
- */
7
- declare const MobxSuspense: FC<SuspenseProps>;
8
- export { MobxSuspense as default };
@@ -1 +0,0 @@
1
- "use strict";var e=require("react"),t=require("./context.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=a(e);module.exports=({children:a,fallback:l,...n})=>{var u;const d=e.useId(),c=e.Children.map(a,((e,a)=>r.default.createElement(t.StoreManagerSuspenseProvider,{id:`${d}${a}`},e))),i=r.default.createElement(r.default.Fragment,null,r.default.createElement("script",{"data-context-id":d,"data-count":null!==(u=null==c?void 0:c.length)&&void 0!==u?u:0}),l);return r.default.createElement(e.Suspense,{...n,children:c,fallback:i})};
@@ -1,71 +0,0 @@
1
- import Manager from "../manager.js";
2
- /**
3
- * Stream mobx manager stores
4
- * NOTE: use with renderToPipeableStream
5
- */
6
- declare class StreamStores {
7
- /**
8
- * Obtained suspensions from application shell
9
- * @protected
10
- */
11
- protected suspendIds: Map<string, {
12
- contextId: string;
13
- count: number;
14
- }>;
15
- /**
16
- * Mobx store manager instance
17
- * @protected
18
- */
19
- protected readonly manager: Manager;
20
- /**
21
- * @constructor
22
- * @protected
23
- */
24
- /**
25
- * @constructor
26
- * @protected
27
- */
28
- protected constructor(manager: Manager);
29
- /**
30
- * Create stream stores service
31
- */
32
- /**
33
- * Create stream stores service
34
- */
35
- static create(manager: Manager, isAttach?: boolean): StreamStores;
36
- /**
37
- * Listen react stream and return suspense stores state to client
38
- */
39
- /**
40
- * Listen react stream and return suspense stores state to client
41
- */
42
- getStreamState(html: string): string | undefined;
43
- /**
44
- * Parse suspensions and related stores context id from application shell
45
- * @protected
46
- */
47
- /**
48
- * Parse suspensions and related stores context id from application shell
49
- * @protected
50
- */
51
- protected obtainSuspensions(html: string): void;
52
- /**
53
- * Replace suspend id
54
- * @protected
55
- */
56
- /**
57
- * Replace suspend id
58
- * @protected
59
- */
60
- protected replaceSuspendIds(formId: string, toId: string): string | undefined;
61
- /**
62
- * Parse complete suspense chunk
63
- * @protected
64
- */
65
- /**
66
- * Parse complete suspense chunk
67
- * @protected
68
- */
69
- protected obtainCompleteSuspense(html: string): string | undefined;
70
- }
71
- export { StreamStores as default };
@@ -1 +0,0 @@
1
- "use strict";class t{constructor(t){Object.defineProperty(this,"suspendIds",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"manager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.manager=t}static create(e,s=!0){const n=new t(e);return s&&(e.streamStores=n),n}getStreamState(t){return this.obtainSuspensions(t),this.obtainCompleteSuspense(t)}obtainSuspensions(t){if(this.suspendIds)return;const e=[...t.matchAll(/<template id="(?<templateId>[^"]+)".+?<script data-context-id="(?<contextId>[^"]+)".+?data-count="(?<count>[^"]+)">/g)];e.length&&(this.suspendIds=new Map,e.forEach((({groups:t})=>{const{templateId:e,contextId:s,count:n}=null!=t?t:{};e&&this.suspendIds.set(e,{contextId:s,count:Number(n)})})))}replaceSuspendIds(t,e){if(t&&this.suspendIds.has(t))return this.suspendIds.set(e,this.suspendIds.get(t)),this.suspendIds.delete(t),e}obtainCompleteSuspense(t){var e,s,n;if(!t.startsWith("<div hidden id="))return;const{from:r,to:i}=null!==(s=null===(e=t.match(/\$RC\("(?<from>[^"]+)","(?<to>[^"]+)"\)/))||void 0===e?void 0:e.groups)&&void 0!==s?s:{},o=this.replaceSuspendIds(r,i);if(!o)return;const{contextId:a,count:d}=null!==(n=this.suspendIds.get(o))&&void 0!==n?n:{};if(!a||!d)return;const u=this.manager.getStoresRelations(),c=this.manager.createContextId(a),p=[...Array(d)].reduce(((t,e,s)=>{const n=`${c}${s}`;return u.has(n)&&t.push(...u.get(n).ids),t}),[]);if(!p.length)return;return`<script>window.mobxManager.pushInit(${JSON.stringify(this.manager.toJSON(p))});<\/script>`}}module.exports=t;