@tramvai/module-child-app 4.18.4 → 4.19.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 (41) hide show
  1. package/lib/browser/child/singletonProviders.browser.js +7 -9
  2. package/lib/browser/providers.browser.js +17 -2
  3. package/lib/contracts/contractManager.base.browser.js +46 -0
  4. package/lib/contracts/contractManager.base.d.ts +16 -0
  5. package/lib/contracts/contractManager.base.es.js +46 -0
  6. package/lib/contracts/contractManager.base.js +54 -0
  7. package/lib/contracts/contractManager.browser.browser.js +22 -0
  8. package/lib/contracts/contractManager.browser.d.ts +15 -0
  9. package/lib/contracts/contractManager.server.d.ts +24 -0
  10. package/lib/contracts/contractManager.server.es.js +25 -0
  11. package/lib/contracts/contractManager.server.js +33 -0
  12. package/lib/server/providers.es.js +14 -3
  13. package/lib/server/providers.js +11 -0
  14. package/lib/server/stateManager.es.js +5 -6
  15. package/lib/server/stateManager.js +5 -6
  16. package/lib/shared/child/extractorProviders.es.js +2 -1
  17. package/lib/shared/child/extractorProviders.js +1 -0
  18. package/lib/shared/child/singletonProviders.browser.js +79 -4
  19. package/lib/shared/child/singletonProviders.d.ts +2 -1
  20. package/lib/shared/child/singletonProviders.es.js +79 -4
  21. package/lib/shared/child/singletonProviders.js +76 -1
  22. package/lib/shared/di.browser.js +4 -7
  23. package/lib/shared/di.d.ts +1 -1
  24. package/lib/shared/di.es.js +4 -7
  25. package/lib/shared/di.js +4 -7
  26. package/lib/shared/providers.browser.js +18 -2
  27. package/lib/shared/providers.es.js +18 -2
  28. package/lib/shared/providers.js +16 -0
  29. package/lib/shared/singletonDi.browser.js +6 -7
  30. package/lib/shared/singletonDi.d.ts +5 -2
  31. package/lib/shared/singletonDi.es.js +7 -8
  32. package/lib/shared/singletonDi.js +7 -8
  33. package/package.json +12 -12
  34. package/lib/shared/child/providers.browser.js +0 -54
  35. package/lib/shared/child/providers.d.ts +0 -5
  36. package/lib/shared/child/providers.es.js +0 -54
  37. package/lib/shared/child/providers.js +0 -62
  38. package/lib/shared/child/stubs.browser.js +0 -18
  39. package/lib/shared/child/stubs.d.ts +0 -5
  40. package/lib/shared/child/stubs.es.js +0 -18
  41. package/lib/shared/child/stubs.js +0 -22
@@ -1,12 +1,16 @@
1
1
  import flatten from '@tinkoff/utils/array/flatten';
2
- import { provide, Scope } from '@tramvai/core';
2
+ import { provide, Scope, APP_INFO_TOKEN, optional } from '@tramvai/core';
3
3
  import { ActionRegistry } from '@tramvai/module-common';
4
- import { LOGGER_TOKEN } from '@tramvai/tokens-common';
4
+ import { LOGGER_TOKEN, COMPONENT_REGISTRY_TOKEN, LIMIT_ACTION_GLOBAL_TIME_RUN, ACTION_CONDITIONALS, DEFERRED_ACTIONS_MAP_TOKEN, EXECUTION_CONTEXT_MANAGER_TOKEN, COMMAND_LINE_EXECUTION_CONTEXT_TOKEN, PUBSUB_TOKEN, PUBSUB_FACTORY_TOKEN, DISPATCHER_CONTEXT_TOKEN, ASYNC_LOCAL_STORAGE_TOKEN, DISPATCHER_TOKEN, STORE_MIDDLEWARE, INITIAL_APP_STATE_TOKEN } from '@tramvai/tokens-common';
5
5
  import { RENDER_SLOTS } from '@tramvai/tokens-render';
6
- import { CHILD_APP_ACTIONS_REGISTRY_TOKEN, CHILD_APP_INTERNAL_ACTION_TOKEN } from '@tramvai/tokens-child-app';
6
+ import { CHILD_APP_ACTIONS_REGISTRY_TOKEN, CHILD_APP_INTERNAL_ACTION_TOKEN, CHILD_REQUIRED_CONTRACTS, CHILD_APP_INTERNAL_ROOT_DI_BORROW_TOKEN, CHILD_APP_INTERNAL_ROOT_STATE_ALLOWED_STORE_TOKEN, CHILD_APP_PAGE_SERVICE_TOKEN, CHILD_APP_INTERNAL_CONFIG_TOKEN, CHILD_APP_PAGE_COMPONENTS_TOKEN } from '@tramvai/tokens-child-app';
7
+ import { ROUTER_TOKEN, PAGE_SERVICE_TOKEN, LINK_PREFETCH_MANAGER_TOKEN, ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN } from '@tramvai/tokens-router';
8
+ import { ChildDispatcherContext } from '@tramvai/state';
7
9
  import { getChildProviders as getChildProviders$1 } from '../../server/child/singletonProviders.es.js';
10
+ import { extractorProviders } from './extractorProviders.es.js';
11
+ import { ChildAppPageService } from '../pageService.es.js';
8
12
 
9
- const getChildProviders = (appDi) => {
13
+ const getChildProviders = (appDi, loadableStats) => {
10
14
  const logger = appDi.get(LOGGER_TOKEN);
11
15
  return [
12
16
  provide({
@@ -30,7 +34,78 @@ const getChildProviders = (appDi) => {
30
34
  actionsList: CHILD_APP_INTERNAL_ACTION_TOKEN,
31
35
  },
32
36
  }),
37
+ provide({
38
+ provide: CHILD_REQUIRED_CONTRACTS,
39
+ useValue: [
40
+ ROUTER_TOKEN,
41
+ COMPONENT_REGISTRY_TOKEN,
42
+ PAGE_SERVICE_TOKEN,
43
+ LINK_PREFETCH_MANAGER_TOKEN,
44
+ ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN,
45
+ LIMIT_ACTION_GLOBAL_TIME_RUN,
46
+ ],
47
+ }),
48
+ // for backward compatibility, when:
49
+ // - host app is modern (with contracts)
50
+ // - child app is legacy (<= v3.x.x, without contracts)
51
+ // - DI is isolated
52
+ // in legacy tramvai versions, this tokens is not borrowed in CommonChildAppModule
53
+ provide({
54
+ provide: CHILD_APP_INTERNAL_ROOT_DI_BORROW_TOKEN,
55
+ multi: true,
56
+ useValue: [
57
+ APP_INFO_TOKEN,
58
+ ACTION_CONDITIONALS,
59
+ DEFERRED_ACTIONS_MAP_TOKEN,
60
+ EXECUTION_CONTEXT_MANAGER_TOKEN,
61
+ COMMAND_LINE_EXECUTION_CONTEXT_TOKEN,
62
+ PUBSUB_TOKEN,
63
+ PUBSUB_FACTORY_TOKEN,
64
+ ],
65
+ }),
33
66
  ...getChildProviders$1(),
67
+ ...extractorProviders(loadableStats),
68
+ provide({
69
+ provide: DISPATCHER_CONTEXT_TOKEN,
70
+ scope: Scope.REQUEST,
71
+ useFactory: ({ dispatcher, middlewares, initialState, parentAllowedStores }) => {
72
+ var _a, _b, _c, _d;
73
+ const parentDispatcherContext = (_d = (_c = (_b = (_a = appDi
74
+ .get(optional(ASYNC_LOCAL_STORAGE_TOKEN))) === null || _a === void 0 ? void 0 : _a.getStore()) === null || _b === void 0 ? void 0 : _b.tramvaiRequestDi) === null || _c === void 0 ? void 0 : _c.get(DISPATCHER_CONTEXT_TOKEN)) !== null && _d !== void 0 ? _d : appDi.get(DISPATCHER_CONTEXT_TOKEN);
75
+ return new ChildDispatcherContext({
76
+ dispatcher,
77
+ // context will be set later by the CONTEXT_TOKEN
78
+ context: {},
79
+ initialState: initialState !== null && initialState !== void 0 ? initialState : { stores: [] },
80
+ middlewares: flatten(middlewares || []),
81
+ parentDispatcherContext,
82
+ parentAllowedStores: flatten(parentAllowedStores || []),
83
+ });
84
+ },
85
+ deps: {
86
+ dispatcher: DISPATCHER_TOKEN,
87
+ middlewares: { token: STORE_MIDDLEWARE, optional: true },
88
+ initialState: { token: INITIAL_APP_STATE_TOKEN, optional: true },
89
+ parentAllowedStores: {
90
+ token: CHILD_APP_INTERNAL_ROOT_STATE_ALLOWED_STORE_TOKEN,
91
+ optional: true,
92
+ },
93
+ },
94
+ }),
95
+ provide({
96
+ provide: CHILD_APP_PAGE_SERVICE_TOKEN,
97
+ scope: Scope.REQUEST,
98
+ useFactory: (deps) => {
99
+ return new ChildAppPageService(deps);
100
+ },
101
+ deps: {
102
+ actionsRegistry: CHILD_APP_ACTIONS_REGISTRY_TOKEN,
103
+ config: CHILD_APP_INTERNAL_CONFIG_TOKEN,
104
+ componentRegistry: COMPONENT_REGISTRY_TOKEN,
105
+ pageService: PAGE_SERVICE_TOKEN,
106
+ pageComponents: optional(CHILD_APP_PAGE_COMPONENTS_TOKEN),
107
+ },
108
+ }),
34
109
  ];
35
110
  };
36
111
 
@@ -8,13 +8,17 @@ var moduleCommon = require('@tramvai/module-common');
8
8
  var tokensCommon = require('@tramvai/tokens-common');
9
9
  var tokensRender = require('@tramvai/tokens-render');
10
10
  var tokensChildApp = require('@tramvai/tokens-child-app');
11
+ var tokensRouter = require('@tramvai/tokens-router');
12
+ var state = require('@tramvai/state');
11
13
  var singletonProviders = require('../../server/child/singletonProviders.js');
14
+ var extractorProviders = require('./extractorProviders.js');
15
+ var pageService = require('../pageService.js');
12
16
 
13
17
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
14
18
 
15
19
  var flatten__default = /*#__PURE__*/_interopDefaultLegacy(flatten);
16
20
 
17
- const getChildProviders = (appDi) => {
21
+ const getChildProviders = (appDi, loadableStats) => {
18
22
  const logger = appDi.get(tokensCommon.LOGGER_TOKEN);
19
23
  return [
20
24
  core.provide({
@@ -38,7 +42,78 @@ const getChildProviders = (appDi) => {
38
42
  actionsList: tokensChildApp.CHILD_APP_INTERNAL_ACTION_TOKEN,
39
43
  },
40
44
  }),
45
+ core.provide({
46
+ provide: tokensChildApp.CHILD_REQUIRED_CONTRACTS,
47
+ useValue: [
48
+ tokensRouter.ROUTER_TOKEN,
49
+ tokensCommon.COMPONENT_REGISTRY_TOKEN,
50
+ tokensRouter.PAGE_SERVICE_TOKEN,
51
+ tokensRouter.LINK_PREFETCH_MANAGER_TOKEN,
52
+ tokensRouter.ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN,
53
+ tokensCommon.LIMIT_ACTION_GLOBAL_TIME_RUN,
54
+ ],
55
+ }),
56
+ // for backward compatibility, when:
57
+ // - host app is modern (with contracts)
58
+ // - child app is legacy (<= v3.x.x, without contracts)
59
+ // - DI is isolated
60
+ // in legacy tramvai versions, this tokens is not borrowed in CommonChildAppModule
61
+ core.provide({
62
+ provide: tokensChildApp.CHILD_APP_INTERNAL_ROOT_DI_BORROW_TOKEN,
63
+ multi: true,
64
+ useValue: [
65
+ core.APP_INFO_TOKEN,
66
+ tokensCommon.ACTION_CONDITIONALS,
67
+ tokensCommon.DEFERRED_ACTIONS_MAP_TOKEN,
68
+ tokensCommon.EXECUTION_CONTEXT_MANAGER_TOKEN,
69
+ tokensCommon.COMMAND_LINE_EXECUTION_CONTEXT_TOKEN,
70
+ tokensCommon.PUBSUB_TOKEN,
71
+ tokensCommon.PUBSUB_FACTORY_TOKEN,
72
+ ],
73
+ }),
41
74
  ...singletonProviders.getChildProviders(),
75
+ ...extractorProviders.extractorProviders(loadableStats),
76
+ core.provide({
77
+ provide: tokensCommon.DISPATCHER_CONTEXT_TOKEN,
78
+ scope: core.Scope.REQUEST,
79
+ useFactory: ({ dispatcher, middlewares, initialState, parentAllowedStores }) => {
80
+ var _a, _b, _c, _d;
81
+ const parentDispatcherContext = (_d = (_c = (_b = (_a = appDi
82
+ .get(core.optional(tokensCommon.ASYNC_LOCAL_STORAGE_TOKEN))) === null || _a === void 0 ? void 0 : _a.getStore()) === null || _b === void 0 ? void 0 : _b.tramvaiRequestDi) === null || _c === void 0 ? void 0 : _c.get(tokensCommon.DISPATCHER_CONTEXT_TOKEN)) !== null && _d !== void 0 ? _d : appDi.get(tokensCommon.DISPATCHER_CONTEXT_TOKEN);
83
+ return new state.ChildDispatcherContext({
84
+ dispatcher,
85
+ // context will be set later by the CONTEXT_TOKEN
86
+ context: {},
87
+ initialState: initialState !== null && initialState !== void 0 ? initialState : { stores: [] },
88
+ middlewares: flatten__default["default"](middlewares || []),
89
+ parentDispatcherContext,
90
+ parentAllowedStores: flatten__default["default"](parentAllowedStores || []),
91
+ });
92
+ },
93
+ deps: {
94
+ dispatcher: tokensCommon.DISPATCHER_TOKEN,
95
+ middlewares: { token: tokensCommon.STORE_MIDDLEWARE, optional: true },
96
+ initialState: { token: tokensCommon.INITIAL_APP_STATE_TOKEN, optional: true },
97
+ parentAllowedStores: {
98
+ token: tokensChildApp.CHILD_APP_INTERNAL_ROOT_STATE_ALLOWED_STORE_TOKEN,
99
+ optional: true,
100
+ },
101
+ },
102
+ }),
103
+ core.provide({
104
+ provide: tokensChildApp.CHILD_APP_PAGE_SERVICE_TOKEN,
105
+ scope: core.Scope.REQUEST,
106
+ useFactory: (deps) => {
107
+ return new pageService.ChildAppPageService(deps);
108
+ },
109
+ deps: {
110
+ actionsRegistry: tokensChildApp.CHILD_APP_ACTIONS_REGISTRY_TOKEN,
111
+ config: tokensChildApp.CHILD_APP_INTERNAL_CONFIG_TOKEN,
112
+ componentRegistry: tokensCommon.COMPONENT_REGISTRY_TOKEN,
113
+ pageService: tokensRouter.PAGE_SERVICE_TOKEN,
114
+ pageComponents: core.optional(tokensChildApp.CHILD_APP_PAGE_COMPONENTS_TOKEN),
115
+ },
116
+ }),
42
117
  ];
43
118
  };
44
119
 
@@ -1,5 +1,4 @@
1
1
  import { ChildContainer } from '@tinkoff/dippy';
2
- import { getChildProviders } from './child/providers.browser.js';
3
2
  import { shouldIsolateDi } from './isolatedDi.browser.js';
4
3
 
5
4
  class DiManager {
@@ -33,6 +32,10 @@ class DiManager {
33
32
  if (!singletonDi) {
34
33
  return;
35
34
  }
35
+ // everything is Singleton on client-side, provide the same behaviour as for Root DI - only one container per Child App
36
+ if (typeof window !== 'undefined') {
37
+ return singletonDi;
38
+ }
36
39
  const isolateDi = this.rootDiAccessMode
37
40
  ? shouldIsolateDi(config, this.rootDiAccessMode)
38
41
  : false;
@@ -43,12 +46,6 @@ class DiManager {
43
46
  else {
44
47
  di = new ChildContainer(singletonDi, this.appDi);
45
48
  }
46
- 'getLoadableStats' in this.loader ? this.loader.getLoadableStats(config) : undefined;
47
- // add providers on the Request Level to make it possible to reuse providers from the root-app ChildContainer
48
- const childProviders = getChildProviders(this.appDi);
49
- childProviders.forEach((provider) => {
50
- di.register(provider);
51
- });
52
49
  return di;
53
50
  }
54
51
  }
@@ -1,6 +1,6 @@
1
1
  import type { Container, ExtractDependencyType } from '@tinkoff/dippy';
2
2
  import { ChildContainer } from '@tinkoff/dippy';
3
- import type { ChildAppDiManager, ChildAppLoader, ChildAppFinalConfig, CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN } from '@tramvai/tokens-child-app';
3
+ import { type ChildAppDiManager, type ChildAppLoader, type ChildAppFinalConfig, type CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN } from '@tramvai/tokens-child-app';
4
4
  type RootDiAccessMode = ExtractDependencyType<typeof CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN>;
5
5
  export declare class DiManager implements ChildAppDiManager {
6
6
  private appDi;
@@ -1,5 +1,4 @@
1
1
  import { ChildContainer } from '@tinkoff/dippy';
2
- import { getChildProviders } from './child/providers.es.js';
3
2
  import { shouldIsolateDi } from './isolatedDi.es.js';
4
3
 
5
4
  class DiManager {
@@ -33,6 +32,10 @@ class DiManager {
33
32
  if (!singletonDi) {
34
33
  return;
35
34
  }
35
+ // everything is Singleton on client-side, provide the same behaviour as for Root DI - only one container per Child App
36
+ if (typeof window !== 'undefined') {
37
+ return singletonDi;
38
+ }
36
39
  const isolateDi = this.rootDiAccessMode
37
40
  ? shouldIsolateDi(config, this.rootDiAccessMode)
38
41
  : false;
@@ -43,12 +46,6 @@ class DiManager {
43
46
  else {
44
47
  di = new ChildContainer(singletonDi, this.appDi);
45
48
  }
46
- const statsLoadable = 'getLoadableStats' in this.loader ? this.loader.getLoadableStats(config) : undefined;
47
- // add providers on the Request Level to make it possible to reuse providers from the root-app ChildContainer
48
- const childProviders = getChildProviders(this.appDi, statsLoadable);
49
- childProviders.forEach((provider) => {
50
- di.register(provider);
51
- });
52
49
  return di;
53
50
  }
54
51
  }
package/lib/shared/di.js CHANGED
@@ -3,7 +3,6 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var dippy = require('@tinkoff/dippy');
6
- var providers = require('./child/providers.js');
7
6
  var isolatedDi = require('./isolatedDi.js');
8
7
 
9
8
  class DiManager {
@@ -37,6 +36,10 @@ class DiManager {
37
36
  if (!singletonDi) {
38
37
  return;
39
38
  }
39
+ // everything is Singleton on client-side, provide the same behaviour as for Root DI - only one container per Child App
40
+ if (typeof window !== 'undefined') {
41
+ return singletonDi;
42
+ }
40
43
  const isolateDi = this.rootDiAccessMode
41
44
  ? isolatedDi.shouldIsolateDi(config, this.rootDiAccessMode)
42
45
  : false;
@@ -47,12 +50,6 @@ class DiManager {
47
50
  else {
48
51
  di = new dippy.ChildContainer(singletonDi, this.appDi);
49
52
  }
50
- const statsLoadable = 'getLoadableStats' in this.loader ? this.loader.getLoadableStats(config) : undefined;
51
- // add providers on the Request Level to make it possible to reuse providers from the root-app ChildContainer
52
- const childProviders = providers.getChildProviders(this.appDi, statsLoadable);
53
- childProviders.forEach((provider) => {
54
- di.register(provider);
55
- });
56
53
  return di;
57
54
  }
58
55
  }
@@ -1,8 +1,9 @@
1
1
  import { Scope, DI_TOKEN, optional } from '@tinkoff/dippy';
2
2
  import { provide, commandLineListTokens, COMMAND_LINE_RUNNER_TOKEN } from '@tramvai/core';
3
- import { CHILD_APP_RESOLUTION_CONFIG_MANAGER_TOKEN, CHILD_APP_RESOLUTION_CONFIGS_TOKEN, CHILD_APP_RESOLVE_CONFIG_TOKEN, CHILD_APP_RESOLVE_BASE_URL_TOKEN, CHILD_APP_SINGLETON_DI_MANAGER_TOKEN, CHILD_APP_LOADER_TOKEN, CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN, CHILD_APP_DI_MANAGER_TOKEN, CHILD_APP_COMMAND_LINE_RUNNER_TOKEN, CHILD_APP_PRELOAD_MANAGER_TOKEN, CHILD_APP_RENDER_MANAGER_TOKEN } from '@tramvai/tokens-child-app';
4
- import { COMBINE_REDUCERS, LOGGER_TOKEN, ENV_MANAGER_TOKEN, REGISTER_CLEAR_CACHE_TOKEN, CLEAR_CACHE_TOKEN, ENV_USED_TOKEN } from '@tramvai/tokens-common';
3
+ import { CHILD_APP_RESOLUTION_CONFIG_MANAGER_TOKEN, CHILD_APP_RESOLUTION_CONFIGS_TOKEN, CHILD_APP_RESOLVE_CONFIG_TOKEN, CHILD_APP_RESOLVE_BASE_URL_TOKEN, CHILD_APP_SINGLETON_DI_MANAGER_TOKEN, CHILD_APP_LOADER_TOKEN, CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN, CHILD_APP_CONTRACT_MANAGER, CHILD_APP_DI_MANAGER_TOKEN, CHILD_APP_COMMAND_LINE_RUNNER_TOKEN, CHILD_APP_PRELOAD_MANAGER_TOKEN, CHILD_APP_RENDER_MANAGER_TOKEN, HOST_PROVIDED_CONTRACTS } from '@tramvai/tokens-child-app';
4
+ import { COMBINE_REDUCERS, LOGGER_TOKEN, ENV_MANAGER_TOKEN, REGISTER_CLEAR_CACHE_TOKEN, CLEAR_CACHE_TOKEN, ENV_USED_TOKEN, COMPONENT_REGISTRY_TOKEN, LIMIT_ACTION_GLOBAL_TIME_RUN } from '@tramvai/tokens-common';
5
5
  import { EXTEND_RENDER } from '@tramvai/tokens-render';
6
+ import { ROUTER_TOKEN, PAGE_SERVICE_TOKEN, LINK_PREFETCH_MANAGER_TOKEN, ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN } from '@tramvai/tokens-router';
6
7
  import { SingletonDiManager } from './singletonDi.browser.js';
7
8
  import { DiManager } from './di.browser.js';
8
9
  import { CommandLineRunner } from './command.browser.js';
@@ -118,10 +119,12 @@ const sharedProviders = [
118
119
  appDi: DI_TOKEN,
119
120
  loader: CHILD_APP_LOADER_TOKEN,
120
121
  rootDiAccessMode: optional(CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN),
122
+ contractManager: CHILD_APP_CONTRACT_MANAGER,
121
123
  },
122
124
  }),
123
125
  provide({
124
126
  provide: CHILD_APP_DI_MANAGER_TOKEN,
127
+ scope: Scope.REQUEST,
125
128
  useClass: DiManager,
126
129
  deps: {
127
130
  appDi: DI_TOKEN,
@@ -208,6 +211,19 @@ const sharedProviders = [
208
211
  },
209
212
  ],
210
213
  }),
214
+ provide({
215
+ provide: HOST_PROVIDED_CONTRACTS,
216
+ useValue: {
217
+ providedContracts: [
218
+ ROUTER_TOKEN,
219
+ COMPONENT_REGISTRY_TOKEN,
220
+ PAGE_SERVICE_TOKEN,
221
+ LINK_PREFETCH_MANAGER_TOKEN,
222
+ ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN,
223
+ LIMIT_ACTION_GLOBAL_TIME_RUN,
224
+ ],
225
+ },
226
+ }),
211
227
  ];
212
228
 
213
229
  export { sharedProviders };
@@ -1,8 +1,9 @@
1
1
  import { Scope, DI_TOKEN, optional } from '@tinkoff/dippy';
2
2
  import { provide, commandLineListTokens, COMMAND_LINE_RUNNER_TOKEN } from '@tramvai/core';
3
- import { CHILD_APP_RESOLUTION_CONFIG_MANAGER_TOKEN, CHILD_APP_RESOLUTION_CONFIGS_TOKEN, CHILD_APP_RESOLVE_CONFIG_TOKEN, CHILD_APP_RESOLVE_BASE_URL_TOKEN, CHILD_APP_SINGLETON_DI_MANAGER_TOKEN, CHILD_APP_LOADER_TOKEN, CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN, CHILD_APP_DI_MANAGER_TOKEN, CHILD_APP_COMMAND_LINE_RUNNER_TOKEN, CHILD_APP_PRELOAD_MANAGER_TOKEN, CHILD_APP_RENDER_MANAGER_TOKEN } from '@tramvai/tokens-child-app';
4
- import { COMBINE_REDUCERS, LOGGER_TOKEN, ENV_MANAGER_TOKEN, REGISTER_CLEAR_CACHE_TOKEN, CLEAR_CACHE_TOKEN, ENV_USED_TOKEN } from '@tramvai/tokens-common';
3
+ import { CHILD_APP_RESOLUTION_CONFIG_MANAGER_TOKEN, CHILD_APP_RESOLUTION_CONFIGS_TOKEN, CHILD_APP_RESOLVE_CONFIG_TOKEN, CHILD_APP_RESOLVE_BASE_URL_TOKEN, CHILD_APP_SINGLETON_DI_MANAGER_TOKEN, CHILD_APP_LOADER_TOKEN, CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN, CHILD_APP_CONTRACT_MANAGER, CHILD_APP_DI_MANAGER_TOKEN, CHILD_APP_COMMAND_LINE_RUNNER_TOKEN, CHILD_APP_PRELOAD_MANAGER_TOKEN, CHILD_APP_RENDER_MANAGER_TOKEN, HOST_PROVIDED_CONTRACTS } from '@tramvai/tokens-child-app';
4
+ import { COMBINE_REDUCERS, LOGGER_TOKEN, ENV_MANAGER_TOKEN, REGISTER_CLEAR_CACHE_TOKEN, CLEAR_CACHE_TOKEN, ENV_USED_TOKEN, COMPONENT_REGISTRY_TOKEN, LIMIT_ACTION_GLOBAL_TIME_RUN } from '@tramvai/tokens-common';
5
5
  import { EXTEND_RENDER } from '@tramvai/tokens-render';
6
+ import { ROUTER_TOKEN, PAGE_SERVICE_TOKEN, LINK_PREFETCH_MANAGER_TOKEN, ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN } from '@tramvai/tokens-router';
6
7
  import { SingletonDiManager } from './singletonDi.es.js';
7
8
  import { DiManager } from './di.es.js';
8
9
  import { CommandLineRunner } from './command.es.js';
@@ -118,10 +119,12 @@ const sharedProviders = [
118
119
  appDi: DI_TOKEN,
119
120
  loader: CHILD_APP_LOADER_TOKEN,
120
121
  rootDiAccessMode: optional(CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN),
122
+ contractManager: CHILD_APP_CONTRACT_MANAGER,
121
123
  },
122
124
  }),
123
125
  provide({
124
126
  provide: CHILD_APP_DI_MANAGER_TOKEN,
127
+ scope: Scope.REQUEST,
125
128
  useClass: DiManager,
126
129
  deps: {
127
130
  appDi: DI_TOKEN,
@@ -208,6 +211,19 @@ const sharedProviders = [
208
211
  },
209
212
  ],
210
213
  }),
214
+ provide({
215
+ provide: HOST_PROVIDED_CONTRACTS,
216
+ useValue: {
217
+ providedContracts: [
218
+ ROUTER_TOKEN,
219
+ COMPONENT_REGISTRY_TOKEN,
220
+ PAGE_SERVICE_TOKEN,
221
+ LINK_PREFETCH_MANAGER_TOKEN,
222
+ ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN,
223
+ LIMIT_ACTION_GLOBAL_TIME_RUN,
224
+ ],
225
+ },
226
+ }),
211
227
  ];
212
228
 
213
229
  export { sharedProviders };
@@ -7,6 +7,7 @@ var core = require('@tramvai/core');
7
7
  var tokensChildApp = require('@tramvai/tokens-child-app');
8
8
  var tokensCommon = require('@tramvai/tokens-common');
9
9
  var tokensRender = require('@tramvai/tokens-render');
10
+ var tokensRouter = require('@tramvai/tokens-router');
10
11
  var singletonDi = require('./singletonDi.js');
11
12
  var di = require('./di.js');
12
13
  var command = require('./command.js');
@@ -122,10 +123,12 @@ const sharedProviders = [
122
123
  appDi: dippy.DI_TOKEN,
123
124
  loader: tokensChildApp.CHILD_APP_LOADER_TOKEN,
124
125
  rootDiAccessMode: dippy.optional(tokensChildApp.CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN),
126
+ contractManager: tokensChildApp.CHILD_APP_CONTRACT_MANAGER,
125
127
  },
126
128
  }),
127
129
  core.provide({
128
130
  provide: tokensChildApp.CHILD_APP_DI_MANAGER_TOKEN,
131
+ scope: dippy.Scope.REQUEST,
129
132
  useClass: di.DiManager,
130
133
  deps: {
131
134
  appDi: dippy.DI_TOKEN,
@@ -212,6 +215,19 @@ const sharedProviders = [
212
215
  },
213
216
  ],
214
217
  }),
218
+ core.provide({
219
+ provide: tokensChildApp.HOST_PROVIDED_CONTRACTS,
220
+ useValue: {
221
+ providedContracts: [
222
+ tokensRouter.ROUTER_TOKEN,
223
+ tokensCommon.COMPONENT_REGISTRY_TOKEN,
224
+ tokensRouter.PAGE_SERVICE_TOKEN,
225
+ tokensRouter.LINK_PREFETCH_MANAGER_TOKEN,
226
+ tokensRouter.ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN,
227
+ tokensCommon.LIMIT_ACTION_GLOBAL_TIME_RUN,
228
+ ],
229
+ },
230
+ }),
215
231
  ];
216
232
 
217
233
  exports.sharedProviders = sharedProviders;
@@ -3,17 +3,17 @@ import { Container } from '@tinkoff/dippy';
3
3
  import { walkOfModules, getModuleParameters } from '@tramvai/core';
4
4
  import { CHILD_APP_INTERNAL_CONFIG_TOKEN, IS_CHILD_APP_DI_TOKEN, CHILD_APP_INTERNAL_ACTION_TOKEN, CHILD_APP_INTERNAL_ROOT_DI_BORROW_TOKEN } from '@tramvai/tokens-child-app';
5
5
  import { getChildProviders } from './child/singletonProviders.browser.js';
6
- import { commonModuleStubs } from './child/stubs.browser.js';
7
6
  import { validateChildAppProvider } from './child/validate.browser.js';
8
7
  import { shouldIsolateDi } from './isolatedDi.browser.js';
9
8
 
10
9
  class SingletonDiManager {
11
- constructor({ logger, appDi, loader, rootDiAccessMode, }) {
10
+ constructor({ logger, appDi, loader, rootDiAccessMode, contractManager, }) {
12
11
  this.cache = new Map();
13
12
  this.log = logger('child-app:singleton-di-manager');
14
13
  this.appDi = appDi;
15
14
  this.loader = loader;
16
15
  this.rootDiAccessMode = rootDiAccessMode;
16
+ this.contractManager = contractManager;
17
17
  }
18
18
  getChildDi(config) {
19
19
  const { key, tag } = config;
@@ -74,6 +74,7 @@ class SingletonDiManager {
74
74
  },
75
75
  ], this.appDi);
76
76
  }
77
+ 'getLoadableStats' in this.loader ? this.loader.getLoadableStats(config) : undefined;
77
78
  // add providers on the Singleton Level to make it possible to reuse providers from the root-app Container
78
79
  const childProviders = getChildProviders(this.appDi);
79
80
  childProviders.forEach((provider) => {
@@ -97,17 +98,15 @@ class SingletonDiManager {
97
98
  multi: true,
98
99
  useValue: actions,
99
100
  });
101
+ if (isolateDi) {
102
+ this.contractManager.registerChildContracts(di);
103
+ }
100
104
  const borrowTokens = di.get({ token: CHILD_APP_INTERNAL_ROOT_DI_BORROW_TOKEN, optional: true });
101
105
  if (borrowTokens) {
102
106
  flatten(borrowTokens).forEach((token) => {
103
107
  di.borrowToken(this.appDi, token);
104
108
  });
105
109
  }
106
- commonModuleStubs.forEach((stub) => {
107
- if (!di.has(stub.provide)) {
108
- di.register(stub);
109
- }
110
- });
111
110
  return di;
112
111
  }
113
112
  }
@@ -1,19 +1,22 @@
1
1
  import type { ExtractDependencyType } from '@tinkoff/dippy';
2
2
  import { Container } from '@tinkoff/dippy';
3
- import type { CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN, ChildAppDiManager, ChildAppFinalConfig, ChildAppLoader } from '@tramvai/tokens-child-app';
3
+ import type { CHILD_APP_CONTRACT_MANAGER, CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN, ChildAppDiManager, ChildAppFinalConfig, ChildAppLoader } from '@tramvai/tokens-child-app';
4
4
  import type { LOGGER_TOKEN } from '@tramvai/tokens-common';
5
5
  type RootDiAccessMode = ExtractDependencyType<typeof CHILD_APP_ROOT_DI_ACCESS_MODE_TOKEN>;
6
+ type ContractManager = ExtractDependencyType<typeof CHILD_APP_CONTRACT_MANAGER>;
6
7
  export declare class SingletonDiManager implements ChildAppDiManager {
7
8
  private readonly log;
8
9
  private appDi;
9
10
  private loader;
10
11
  private rootDiAccessMode?;
12
+ private contractManager;
11
13
  private cache;
12
- constructor({ logger, appDi, loader, rootDiAccessMode, }: {
14
+ constructor({ logger, appDi, loader, rootDiAccessMode, contractManager, }: {
13
15
  logger: typeof LOGGER_TOKEN;
14
16
  appDi: Container;
15
17
  loader: ChildAppLoader;
16
18
  rootDiAccessMode?: RootDiAccessMode | null;
19
+ contractManager: ContractManager;
17
20
  });
18
21
  getChildDi(config: ChildAppFinalConfig): Container | undefined;
19
22
  forEachChildDi(cb: (di: Container) => void): void;
@@ -3,17 +3,17 @@ import { Container } from '@tinkoff/dippy';
3
3
  import { walkOfModules, getModuleParameters } from '@tramvai/core';
4
4
  import { CHILD_APP_INTERNAL_CONFIG_TOKEN, IS_CHILD_APP_DI_TOKEN, CHILD_APP_INTERNAL_ACTION_TOKEN, CHILD_APP_INTERNAL_ROOT_DI_BORROW_TOKEN } from '@tramvai/tokens-child-app';
5
5
  import { getChildProviders } from './child/singletonProviders.es.js';
6
- import { commonModuleStubs } from './child/stubs.es.js';
7
6
  import { validateChildAppProvider } from './child/validate.es.js';
8
7
  import { shouldIsolateDi } from './isolatedDi.es.js';
9
8
 
10
9
  class SingletonDiManager {
11
- constructor({ logger, appDi, loader, rootDiAccessMode, }) {
10
+ constructor({ logger, appDi, loader, rootDiAccessMode, contractManager, }) {
12
11
  this.cache = new Map();
13
12
  this.log = logger('child-app:singleton-di-manager');
14
13
  this.appDi = appDi;
15
14
  this.loader = loader;
16
15
  this.rootDiAccessMode = rootDiAccessMode;
16
+ this.contractManager = contractManager;
17
17
  }
18
18
  getChildDi(config) {
19
19
  const { key, tag } = config;
@@ -74,8 +74,9 @@ class SingletonDiManager {
74
74
  },
75
75
  ], this.appDi);
76
76
  }
77
+ const statsLoadable = 'getLoadableStats' in this.loader ? this.loader.getLoadableStats(config) : undefined;
77
78
  // add providers on the Singleton Level to make it possible to reuse providers from the root-app Container
78
- const childProviders = getChildProviders(this.appDi);
79
+ const childProviders = getChildProviders(this.appDi, statsLoadable);
79
80
  childProviders.forEach((provider) => {
80
81
  di.register(provider);
81
82
  });
@@ -97,17 +98,15 @@ class SingletonDiManager {
97
98
  multi: true,
98
99
  useValue: actions,
99
100
  });
101
+ if (isolateDi) {
102
+ this.contractManager.registerChildContracts(di);
103
+ }
100
104
  const borrowTokens = di.get({ token: CHILD_APP_INTERNAL_ROOT_DI_BORROW_TOKEN, optional: true });
101
105
  if (borrowTokens) {
102
106
  flatten(borrowTokens).forEach((token) => {
103
107
  di.borrowToken(this.appDi, token);
104
108
  });
105
109
  }
106
- commonModuleStubs.forEach((stub) => {
107
- if (!di.has(stub.provide)) {
108
- di.register(stub);
109
- }
110
- });
111
110
  return di;
112
111
  }
113
112
  }
@@ -7,7 +7,6 @@ var dippy = require('@tinkoff/dippy');
7
7
  var core = require('@tramvai/core');
8
8
  var tokensChildApp = require('@tramvai/tokens-child-app');
9
9
  var singletonProviders = require('./child/singletonProviders.js');
10
- var stubs = require('./child/stubs.js');
11
10
  var validate = require('./child/validate.js');
12
11
  var isolatedDi = require('./isolatedDi.js');
13
12
 
@@ -16,12 +15,13 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
16
15
  var flatten__default = /*#__PURE__*/_interopDefaultLegacy(flatten);
17
16
 
18
17
  class SingletonDiManager {
19
- constructor({ logger, appDi, loader, rootDiAccessMode, }) {
18
+ constructor({ logger, appDi, loader, rootDiAccessMode, contractManager, }) {
20
19
  this.cache = new Map();
21
20
  this.log = logger('child-app:singleton-di-manager');
22
21
  this.appDi = appDi;
23
22
  this.loader = loader;
24
23
  this.rootDiAccessMode = rootDiAccessMode;
24
+ this.contractManager = contractManager;
25
25
  }
26
26
  getChildDi(config) {
27
27
  const { key, tag } = config;
@@ -82,8 +82,9 @@ class SingletonDiManager {
82
82
  },
83
83
  ], this.appDi);
84
84
  }
85
+ const statsLoadable = 'getLoadableStats' in this.loader ? this.loader.getLoadableStats(config) : undefined;
85
86
  // add providers on the Singleton Level to make it possible to reuse providers from the root-app Container
86
- const childProviders = singletonProviders.getChildProviders(this.appDi);
87
+ const childProviders = singletonProviders.getChildProviders(this.appDi, statsLoadable);
87
88
  childProviders.forEach((provider) => {
88
89
  di.register(provider);
89
90
  });
@@ -105,17 +106,15 @@ class SingletonDiManager {
105
106
  multi: true,
106
107
  useValue: actions,
107
108
  });
109
+ if (isolateDi) {
110
+ this.contractManager.registerChildContracts(di);
111
+ }
108
112
  const borrowTokens = di.get({ token: tokensChildApp.CHILD_APP_INTERNAL_ROOT_DI_BORROW_TOKEN, optional: true });
109
113
  if (borrowTokens) {
110
114
  flatten__default["default"](borrowTokens).forEach((token) => {
111
115
  di.borrowToken(this.appDi, token);
112
116
  });
113
117
  }
114
- stubs.commonModuleStubs.forEach((stub) => {
115
- if (!di.has(stub.provide)) {
116
- di.register(stub);
117
- }
118
- });
119
118
  return di;
120
119
  }
121
120
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/module-child-app",
3
- "version": "4.18.4",
3
+ "version": "4.19.0",
4
4
  "description": "Module for child apps",
5
5
  "browser": {
6
6
  "./lib/server.js": "./lib/browser.js",
@@ -33,23 +33,23 @@
33
33
  "@tinkoff/env-validators": "0.3.1",
34
34
  "@tinkoff/module-loader-client": "0.6.3",
35
35
  "@tinkoff/module-loader-server": "0.7.1",
36
- "@tramvai/module-common": "4.18.4",
36
+ "@tramvai/module-common": "4.19.0",
37
37
  "@tinkoff/url": "0.10.1",
38
- "@tramvai/child-app-core": "4.18.4",
38
+ "@tramvai/child-app-core": "4.19.0",
39
39
  "@tramvai/safe-strings": "0.7.1",
40
- "@tramvai/tokens-child-app": "4.18.4"
40
+ "@tramvai/tokens-child-app": "4.19.0"
41
41
  },
42
42
  "devDependencies": {},
43
43
  "peerDependencies": {
44
- "@tinkoff/dippy": "0.10.6",
45
- "@tinkoff/router": "0.4.56",
44
+ "@tinkoff/dippy": "0.10.7",
45
+ "@tinkoff/router": "0.4.58",
46
46
  "@tinkoff/utils": "^2.1.2",
47
- "@tramvai/core": "4.18.4",
48
- "@tramvai/state": "4.18.4",
49
- "@tramvai/react": "4.18.4",
50
- "@tramvai/tokens-common": "4.18.4",
51
- "@tramvai/tokens-render": "4.18.4",
52
- "@tramvai/tokens-router": "4.18.4",
47
+ "@tramvai/core": "4.19.0",
48
+ "@tramvai/state": "4.19.0",
49
+ "@tramvai/react": "4.19.0",
50
+ "@tramvai/tokens-common": "4.19.0",
51
+ "@tramvai/tokens-render": "4.19.0",
52
+ "@tramvai/tokens-router": "4.19.0",
53
53
  "react": ">=16.14.0",
54
54
  "react-dom": ">=16.14.0",
55
55
  "object-assign": "^4.1.1",