@lomray/react-mobx-manager 2.0.0-beta.1 → 2.0.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -37,8 +37,8 @@
37
37
  - [Manager](#manager)
38
38
  - [withStores](#withstores)
39
39
  - [StoreManagerProvider](#storemanagerprovider)
40
- - [useStoreManagerContext](#usestoremanagercontext)
41
- - [useStoreManagerParentContext](#usestoremanagerparentcontext)
40
+ - [useStoreManagerContext](#usestoremanager)
41
+ - [useStoreManagerParentContext](#usestoremanagerparent)
42
42
  - [Store](#store)
43
43
  - [React Native Debug Plugin](#react-native-debug-plugin)
44
44
  - [Bugs and feature requests](#bugs-and-feature-requests)
@@ -253,10 +253,13 @@ const storeManager = new Manager({
253
253
  */
254
254
  shouldRemoveInitState: true,
255
255
  /**
256
- * Enable this option if your application support server-side rendering (on both side, client and server)
257
- * Default: false
256
+ * Configure store destroy timers
258
257
  */
259
- isSSR: false,
258
+ destroyTimers: {
259
+ init: 500,
260
+ touched: 10000, // NOTE: set to max request timeout
261
+ unused: 1000,
262
+ },
260
263
  }
261
264
  });
262
265
 
@@ -285,16 +288,11 @@ const store2 = storeManager.getStore(SomeStore, { contextId: 'necessary-context-
285
288
  */
286
289
  const relations = storeManager.getStoresRelations();
287
290
 
288
- /**
289
- * Generate unique context id
290
- */
291
- const contextId = storeManager.createContextId();
292
-
293
291
  /**
294
292
  * Manually create stores for component
295
293
  * NOTE: 'withStores' wrapper use this method, probably you won't need it
296
294
  */
297
- const stores = storeManager.createStores(['someStore', MyStore], 'parent-id', 'context-id', 'HomePage');
295
+ const stores = storeManager.createStores(['someStore', MyStore], 'parent-id', 'context-id', 'suspense-id', 'HomePage', { componentProp: 'test' });
298
296
 
299
297
  /**
300
298
  * Mount/Unmount simple stores to component
@@ -338,10 +336,10 @@ const storeClass = Manager.persistStore(class MyStore {}, 'my-store');
338
336
  import { withStores } from '@lomray/react-mobx-manager';
339
337
 
340
338
  /**
341
- * Create and connect 'stores' to component
339
+ * Create and connect 'stores' to component with custom context id
342
340
  * NOTE: In most cases, you don't need to pass a third argument (contextId).
343
341
  */
344
- withStores(Component, stores, 'optional-context-id');
342
+ withStores(Component, stores, { customContextId: 'optional-context-id' });
345
343
 
346
344
  const stores = { myStore: MyStore, anotherStore: AnotherStore };
347
345
  ```
@@ -361,27 +359,27 @@ import { StoreManagerProvider } from '@lomray/react-mobx-manager';
361
359
  </StoreManagerProvider>
362
360
  ```
363
361
 
364
- ### useStoreManagerContext
362
+ ### useStoreManager
365
363
  ```typescript jsx
366
- import { useStoreManagerContext } from '@lomray/react-mobx-manager';
364
+ import { useStoreManager } from '@lomray/react-mobx-manager';
367
365
 
368
366
  const MyComponent: FC = () => {
369
367
  /**
370
368
  * Get store manager inside your function component
371
369
  */
372
- const storeManager = useStoreManagerContext();
370
+ const storeManager = useStoreManager();
373
371
  }
374
372
  ```
375
373
 
376
- ### useStoreManagerParentContext
374
+ ### useStoreManagerParent
377
375
  ```typescript jsx
378
- import { useStoreManagerParentContext } from '@lomray/react-mobx-manager';
376
+ import { useStoreManagerParent } from '@lomray/react-mobx-manager';
379
377
 
380
378
  const MyComponent: FC = () => {
381
379
  /**
382
380
  * Get parent context id
383
381
  */
384
- const { parentId } = useStoreManagerParentContext();
382
+ const { parentId } = useStoreManagerParent();
385
383
  }
386
384
  ```
387
385
 
@@ -414,7 +412,7 @@ class MyStore {
414
412
  /**
415
413
  * @private
416
414
  */
417
- private someParentStore: ClassReturnType<typeof SomeParentStore>;
415
+ private readonly someParentStore: ClassReturnType<typeof SomeParentStore>;
418
416
 
419
417
  /**
420
418
  * @constructor
@@ -445,14 +443,6 @@ class MyStore {
445
443
  // do something
446
444
  }
447
445
 
448
- /**
449
- * Define this method if you want to do something when a component with this store is mount
450
- * @private
451
- */
452
- private onMount(): void {
453
- // do something
454
- }
455
-
456
446
  /**
457
447
  * Define this method if you want to do something when a component with this store is unmount
458
448
  * @private
@@ -476,7 +466,6 @@ Lifecycles:
476
466
  - constructor
477
467
  - wakeup (restore state from persisted store)
478
468
  - init
479
- - onMount
480
469
  - onDestroy
481
470
 
482
471
  ## React Native debug plugin
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-9745a837.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-9745a837.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,4 +1,5 @@
1
- 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-9745a837.js";
2
3
  /**
3
4
  * Mobx stores manager
4
5
  */
@@ -48,6 +49,11 @@ declare class Manager {
48
49
  * Manager options
49
50
  */
50
51
  readonly options: IManagerOptions;
52
+ /**
53
+ * Suspense stores relations
54
+ * @see withStores
55
+ */
56
+ protected suspenseRelations: Map<string, Set<string>>;
51
57
  /**
52
58
  * @constructor
53
59
  */
@@ -83,6 +89,13 @@ declare class Manager {
83
89
  * Get stores relations
84
90
  */
85
91
  getStoresRelations(): Manager['storesRelations'];
92
+ /**
93
+ * Get suspense relations with stores
94
+ */
95
+ /**
96
+ * Get suspense relations with stores
97
+ */
98
+ getSuspenseRelations(): Manager['suspenseRelations'];
86
99
  /**
87
100
  * Get persisted stores ids
88
101
  */
@@ -104,13 +117,6 @@ declare class Manager {
104
117
  * @protected
105
118
  */
106
119
  protected getStoreId<T>(store: IConstructableStore<T> | TInitStore, params?: IStoreParams): string;
107
- /**
108
- * Generate new context id
109
- */
110
- /**
111
- * Generate new context id
112
- */
113
- createContextId(id?: string): string;
114
120
  /**
115
121
  * Get exist store
116
122
  */
@@ -142,25 +148,21 @@ declare class Manager {
142
148
  /**
143
149
  * Create stores for component
144
150
  */
145
- 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;
146
152
  /**
147
153
  * Prepare store before usage
148
- * @protected
149
154
  */
150
155
  /**
151
156
  * Prepare store before usage
152
- * @protected
153
157
  */
154
158
  protected prepareStore(store: TStores[string]): void;
155
159
  /**
156
- * Prepare store before mount to component
157
- * @protected
160
+ * Remove store
158
161
  */
159
162
  /**
160
- * Prepare store before mount to component
161
- * @protected
163
+ * Remove store
162
164
  */
163
- protected prepareMount(store: TStores[string]): Required<IStoreLifecycle>['onDestroy'][];
165
+ protected removeStore(store: TStores[string]): void;
164
166
  /**
165
167
  * Mount stores to component
166
168
  */
@@ -168,6 +170,20 @@ declare class Manager {
168
170
  * Mount stores to component
169
171
  */
170
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;
171
187
  /**
172
188
  * Get store's state
173
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,"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=1e4,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-9745a837.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-9745a837.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-9745a837.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-9745a837.js";
2
2
  interface IPromise<TReturn> extends Promise<TReturn> {
3
3
  status?: 'fulfilled' | 'pending' | 'rejected';
4
4
  value?: TReturn;
@@ -1 +1 @@
1
- "use strict";var e=require("mobx");class r{constructor(t,{fieldName:i="isSuspenseDone",...s}={}){Object.defineProperty(this,"promise",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"error",{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:e=>{const{fieldName:t}=this.params;if(!this.store[t])return this.promise||(this.promise=e(),this.promise.then((()=>{this.store[t]=!0}),(e=>{this.store[t]=!0,this.error=e}))),r.run(this.promise)}}),this.store=t,this.params={...s,fieldName:i},e.extendObservable(t,{[i]:!1},{[i]:e.observable})}}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;
1
+ "use strict";var e=require("mobx");class r{constructor(t,{fieldName:i="isSuspenseDone",...s}={}){Object.defineProperty(this,"promise",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"error",{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.store[i])return this.promise||(this.promise=t(),this.promise.then((()=>{e.runInAction((()=>{this.store[i]=!0}))}),(r=>{e.runInAction((()=>{this.store[i]=!0,this.error=r}))}))),r.run(this.promise)}}),this.store=t,this.params={...s,fieldName:i},e.extendObservable(t,{[i]:!1},{[i]:e.observable})}}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;
@@ -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-9745a837.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-9745a837.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,9 +1,21 @@
1
1
  {
2
2
  "name": "@lomray/react-mobx-manager",
3
- "version": "2.0.0-beta.1",
3
+ "version": "2.0.0-beta.10",
4
4
  "description": "This package provides Mobx stores manager for react.",
5
5
  "main": "lib/index.js",
6
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
+ },
7
19
  "repository": {
8
20
  "type": "git",
9
21
  "url": "https://github.com/Lomray-Software/react-mobx-manager"
@@ -39,15 +51,15 @@
39
51
  "prepare": "husky install"
40
52
  },
41
53
  "dependencies": {
54
+ "@lomray/consistent-suspense": "^1.2.2",
42
55
  "@lomray/event-manager": "^1.2.2"
43
56
  },
44
57
  "devDependencies": {
45
- "@commitlint/cli": "^17.6.3",
46
- "@commitlint/config-conventional": "^17.6.3",
58
+ "@commitlint/cli": "^17.6.6",
59
+ "@commitlint/config-conventional": "^17.6.6",
47
60
  "@lomray/eslint-config-react": "^3.0.0",
48
61
  "@lomray/prettier-config": "^1.2.0",
49
62
  "@rollup/plugin-terser": "^0.4.3",
50
- "@types/express": "^4.17.17",
51
63
  "@types/hoist-non-react-statics": "^3.3.1",
52
64
  "@types/react": "^18.2.7",
53
65
  "eslint": "^8.41.0",
package/.nvmrc DELETED
@@ -1 +0,0 @@
1
- 18.13.0
@@ -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,72 +0,0 @@
1
- import { Response } from 'express';
2
- import Manager from "./manager.js";
3
- /**
4
- * Stream mobx manager stores
5
- * NOTE: use with renderToPipeableStream
6
- */
7
- declare class StreamStores {
8
- /**
9
- * Obtained suspensions from application shell
10
- * @protected
11
- */
12
- protected suspendIds: Record<string, {
13
- contextId: string;
14
- count: number;
15
- }>;
16
- /**
17
- * Mobx store manager instance
18
- * @protected
19
- */
20
- protected readonly manager: Manager;
21
- /**
22
- * @constructor
23
- * @protected
24
- */
25
- /**
26
- * @constructor
27
- * @protected
28
- */
29
- protected constructor(manager: Manager);
30
- /**
31
- * Listen react stream and push suspense stores state to client
32
- */
33
- /**
34
- * Listen react stream and push suspense stores state to client
35
- */
36
- static stream(res: Response, manager: Manager): StreamStores;
37
- /**
38
- * Begin listen stream
39
- */
40
- /**
41
- * Begin listen stream
42
- */
43
- protected beginStream(res: Response): void;
44
- /**
45
- * Parse suspensions and related stores context id from application shell
46
- * @protected
47
- */
48
- /**
49
- * Parse suspensions and related stores context id from application shell
50
- * @protected
51
- */
52
- protected obtainSuspensions(html: string): void;
53
- /**
54
- * Replace suspend id
55
- * @protected
56
- */
57
- /**
58
- * Replace suspend id
59
- * @protected
60
- */
61
- protected replaceSuspendIds(formId: string, toId: string): string | undefined;
62
- /**
63
- * Parse complete suspense chunk
64
- * @protected
65
- */
66
- /**
67
- * Parse complete suspense chunk
68
- * @protected
69
- */
70
- protected obtainCompleteSuspense(html: string): Uint8Array | undefined;
71
- }
72
- 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 stream(e,s){const n=new t(s);return n.beginStream(e),n}beginStream(t){const e=t.write.bind(t);t.write=(t,...s)=>{const n=Buffer.from(t).toString();this.obtainSuspensions(n);const r=this.obtainCompleteSuspense(n);return r?e(Buffer.concat([r,t]),...s):e(t,...s)}}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=e.reduce(((t,{groups:e})=>{const{templateId:s,contextId:n,count:r}=null!=e?e:{};return s?{...t,[s]:{contextId:n,count:Number(r)}}:t}),{}))}replaceSuspendIds(t,e){if(t)return this.suspendIds[e]=this.suspendIds[t],delete this.suspendIds[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:u,count:d}=null!==(n=this.suspendIds[o])&&void 0!==n?n:{};if(!u||!d)return;const a=this.manager.getStoresRelations(),c=this.manager.createContextId(u),l=[...Array(d)].reduce(((t,e,s)=>{const n=`${c}${s}`;return a.has(n)&&t.push(...a.get(n).ids),t}),[]);if(!l.length)return;const p=JSON.stringify(this.manager.toJSON(l));return Buffer.from(`<script>window.mobxManager.pushInit(${p});<\/script>`,"utf8")}}module.exports=t;
@@ -1,6 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "include": [
4
- "src/**/*"
5
- ]
6
- }