@tramvai/module-child-app 1.82.3 → 1.85.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.
@@ -1,4 +1,4 @@
1
- import type { ChildAppCommandLineRunner, ChildAppRequestConfig, ChildAppLoader, ChildAppPreloadManager, CHILD_APP_RESOLVE_CONFIG_TOKEN, CHILD_APP_RESOLUTION_CONFIG_MANAGER_TOKEN } from '@tramvai/tokens-child-app';
1
+ import type { ChildAppCommandLineRunner, ChildAppRequestConfig, ChildAppLoader, ChildAppPreloadManager, CHILD_APP_RESOLVE_CONFIG_TOKEN, ChildAppFinalConfig, CHILD_APP_RESOLUTION_CONFIG_MANAGER_TOKEN } from '@tramvai/tokens-child-app';
2
2
  import type { STORE_TOKEN } from '@tramvai/tokens-common';
3
3
  export declare class PreloadManager implements ChildAppPreloadManager {
4
4
  private loader;
@@ -8,8 +8,8 @@ export declare class PreloadManager implements ChildAppPreloadManager {
8
8
  private resolveExternalConfig;
9
9
  private pageHasRendered;
10
10
  private pageHasLoaded;
11
- private map;
12
- private serverPreloaded;
11
+ private currentlyPreloaded;
12
+ private hasPreloadBefore;
13
13
  private hasInitialized;
14
14
  constructor({ loader, runner, resolutionConfigManager, resolveExternalConfig, store, }: {
15
15
  loader: ChildAppLoader;
@@ -23,7 +23,7 @@ export declare class PreloadManager implements ChildAppPreloadManager {
23
23
  runPreloaded(): Promise<void>;
24
24
  pageRender(): void;
25
25
  clearPreloaded(): Promise<void>;
26
- getPreloadedList(): ChildAppRequestConfig[];
26
+ getPreloadedList(): ChildAppFinalConfig[];
27
27
  private initServerPreloaded;
28
28
  private init;
29
29
  private run;
@@ -6,8 +6,6 @@ export declare class RenderManager implements ChildAppRenderManager {
6
6
  private readonly diManager;
7
7
  private readonly resolveExternalConfig;
8
8
  private readonly log;
9
- private readonly hasRenderedSet;
10
- private readonly loadingInProgress;
11
9
  constructor({ logger, preloadManager, diManager, resolveExternalConfig, }: {
12
10
  logger: typeof LOGGER_TOKEN;
13
11
  preloadManager: ChildAppPreloadManager;
@@ -0,0 +1,6 @@
1
+ import type { CHILD_APP_COMMAND_LINE_RUNNER_TOKEN, CHILD_APP_PRELOAD_MANAGER_TOKEN } from '@tramvai/tokens-child-app';
2
+ export declare const runCommand: ({ status, runner, preloader, }: {
3
+ status: string;
4
+ runner: typeof CHILD_APP_COMMAND_LINE_RUNNER_TOKEN;
5
+ preloader: typeof CHILD_APP_PRELOAD_MANAGER_TOKEN;
6
+ }) => Promise<void>;
@@ -1,4 +1,4 @@
1
- import type { ChildAppCommandLineRunner, ChildAppRequestConfig, ChildAppLoader, ChildAppPreloadManager, ChildAppStateManager, CHILD_APP_RESOLVE_CONFIG_TOKEN, CHILD_APP_RESOLUTION_CONFIG_MANAGER_TOKEN } from '@tramvai/tokens-child-app';
1
+ import type { ChildAppCommandLineRunner, ChildAppRequestConfig, ChildAppLoader, ChildAppPreloadManager, ChildAppStateManager, CHILD_APP_RESOLVE_CONFIG_TOKEN, ChildAppFinalConfig, CHILD_APP_RESOLUTION_CONFIG_MANAGER_TOKEN } from '@tramvai/tokens-child-app';
2
2
  export declare class PreloadManager implements ChildAppPreloadManager {
3
3
  private loader;
4
4
  private runner;
@@ -20,6 +20,6 @@ export declare class PreloadManager implements ChildAppPreloadManager {
20
20
  runPreloaded(): Promise<void>;
21
21
  pageRender(): void;
22
22
  clearPreloaded(): Promise<void>;
23
- getPreloadedList(): ChildAppRequestConfig[];
23
+ getPreloadedList(): ChildAppFinalConfig[];
24
24
  private run;
25
25
  }
@@ -5,13 +5,13 @@ import { commandLineListTokens, CHILD_APP_INTERNAL_ROOT_STATE_SUBSCRIPTION_TOKEN
5
5
  export * from '@tramvai/tokens-child-app';
6
6
  import { ACTION_PAGE_RUNNER_TOKEN, CONTEXT_TOKEN, LOGGER_TOKEN, DISPATCHER_TOKEN, STORE_TOKEN, DISPATCHER_CONTEXT_TOKEN, STORE_MIDDLEWARE, INITIAL_APP_STATE_TOKEN, COMBINE_REDUCERS, ENV_MANAGER_TOKEN, REGISTER_CLEAR_CACHE_TOKEN, CLEAR_CACHE_TOKEN, ENV_USED_TOKEN } from '@tramvai/tokens-common';
7
7
  import { RENDER_SLOTS, EXTEND_RENDER } from '@tramvai/tokens-render';
8
- import { PAGE_SERVICE_TOKEN } from '@tramvai/tokens-router';
8
+ import { ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN, PAGE_SERVICE_TOKEN, ROUTER_TOKEN } from '@tramvai/tokens-router';
9
9
  import flatten from '@tinkoff/utils/array/flatten';
10
+ import noop from '@tinkoff/utils/function/noop';
10
11
  import { Subscription, ChildDispatcherContext, createEvent, createReducer } from '@tramvai/state';
11
12
  import React, { createContext, useContext, useMemo, useState, useEffect, createElement } from 'react';
12
13
  import applyOrReturn from '@tinkoff/utils/function/applyOrReturn';
13
14
  import { loadModule } from '@tinkoff/module-loader-client';
14
- import noop from '@tinkoff/utils/function/noop';
15
15
  import { useDi } from '@tramvai/react';
16
16
 
17
17
  const getChildProviders$2 = (appDi) => {
@@ -53,6 +53,46 @@ const getChildProviders$2 = (appDi) => {
53
53
  actions: CHILD_APP_INTERNAL_ACTION_TOKEN,
54
54
  },
55
55
  }),
56
+ provide({
57
+ provide: commandLineListTokens.spaTransition,
58
+ multi: true,
59
+ useFactory: ({ spaMode, actionRunner, actions }) => {
60
+ if (spaMode !== 'after') {
61
+ return function childAppRunActions() {
62
+ return actionRunner.runActions(flatten(actions));
63
+ };
64
+ }
65
+ return noop;
66
+ },
67
+ deps: {
68
+ actionRunner: ACTION_PAGE_RUNNER_TOKEN,
69
+ actions: CHILD_APP_INTERNAL_ACTION_TOKEN,
70
+ spaMode: {
71
+ token: ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN,
72
+ optional: true,
73
+ },
74
+ },
75
+ }),
76
+ provide({
77
+ provide: commandLineListTokens.afterSpaTransition,
78
+ multi: true,
79
+ useFactory: ({ spaMode, actionRunner, actions }) => {
80
+ if (spaMode === 'after') {
81
+ return function childAppRunActions() {
82
+ return actionRunner.runActions(flatten(actions));
83
+ };
84
+ }
85
+ return noop;
86
+ },
87
+ deps: {
88
+ actionRunner: ACTION_PAGE_RUNNER_TOKEN,
89
+ actions: CHILD_APP_INTERNAL_ACTION_TOKEN,
90
+ spaMode: {
91
+ token: ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN,
92
+ optional: true,
93
+ },
94
+ },
95
+ }),
56
96
  ];
57
97
  };
58
98
 
@@ -671,8 +711,8 @@ class PreloadManager {
671
711
  constructor({ loader, runner, resolutionConfigManager, resolveExternalConfig, store, }) {
672
712
  this.pageHasRendered = false;
673
713
  this.pageHasLoaded = false;
674
- this.map = new Map();
675
- this.serverPreloaded = new Map();
714
+ this.currentlyPreloaded = new Map();
715
+ this.hasPreloadBefore = new Set();
676
716
  this.hasInitialized = false;
677
717
  this.loader = loader;
678
718
  this.runner = runner;
@@ -689,66 +729,64 @@ class PreloadManager {
689
729
  // as it will lead to markup mismatch on markup hydration
690
730
  if (this.pageHasRendered) {
691
731
  // but in case render has happened load child-app as soon as possible
692
- const promise = (async () => {
693
- try {
694
- await this.loader.load(config);
695
- await this.run('customer', config);
696
- await this.run('clear', config);
697
- }
698
- catch (error) { }
699
- return config;
700
- })();
701
- this.map.set(key, promise);
702
- await promise;
732
+ try {
733
+ await this.loader.load(config);
734
+ await this.run('customer', config);
735
+ await this.run('clear', config);
736
+ this.hasPreloadBefore.add(key);
737
+ }
738
+ catch (error) { }
703
739
  }
704
740
  }
741
+ if (this.pageHasRendered) {
742
+ this.currentlyPreloaded.set(key, config);
743
+ }
705
744
  }
706
745
  isPreloaded(request) {
707
746
  const config = this.resolveExternalConfig(request);
708
747
  const { key } = config;
709
- return this.map.has(key) || this.serverPreloaded.has(key);
748
+ return this.hasPreloadBefore.has(key);
710
749
  }
711
750
  async runPreloaded() {
712
751
  await this.init();
713
- const promises = [];
714
- if (this.pageHasLoaded) {
715
- this.map.forEach((childAppPromise) => {
716
- promises.push((async () => {
717
- await this.run('spa', await childAppPromise);
718
- })());
719
- });
720
- }
721
- else {
722
- this.serverPreloaded.forEach((config) => {
723
- promises.push((async () => {
724
- await this.loader.init(config);
725
- await this.run('customer', config);
726
- })());
727
- });
752
+ if (this.pageHasRendered) {
753
+ return;
728
754
  }
755
+ const promises = [];
756
+ this.currentlyPreloaded.forEach((config) => {
757
+ promises.push((async () => {
758
+ await this.loader.init(config);
759
+ await this.run('customer', config);
760
+ })());
761
+ });
729
762
  await Promise.all(promises);
730
763
  }
731
764
  pageRender() {
732
765
  this.pageHasRendered = true;
733
766
  }
734
767
  async clearPreloaded() {
768
+ if (this.pageHasLoaded) {
769
+ this.currentlyPreloaded.clear();
770
+ return;
771
+ }
735
772
  this.pageHasLoaded = true;
736
773
  const promises = [];
737
- this.serverPreloaded.forEach((config) => {
774
+ this.currentlyPreloaded.forEach((config) => {
738
775
  promises.push(this.run('clear', config));
739
776
  });
740
- this.serverPreloaded.clear();
777
+ this.currentlyPreloaded.clear();
741
778
  await Promise.all(promises);
742
779
  }
743
780
  getPreloadedList() {
744
- return [...this.serverPreloaded.values()];
781
+ return Array.from(this.currentlyPreloaded.values());
745
782
  }
746
783
  initServerPreloaded() {
747
784
  if (!this.hasInitialized) {
748
785
  const { preloaded } = this.store.getState(ChildAppStore);
749
786
  preloaded.forEach((request) => {
750
787
  const config = this.resolveExternalConfig(request);
751
- this.serverPreloaded.set(config.key, config);
788
+ this.currentlyPreloaded.set(config.key, config);
789
+ this.hasPreloadBefore.add(config.key);
752
790
  });
753
791
  this.hasInitialized = true;
754
792
  }
@@ -768,8 +806,6 @@ class PreloadManager {
768
806
 
769
807
  class RenderManager {
770
808
  constructor({ logger, preloadManager, diManager, resolveExternalConfig, }) {
771
- this.hasRenderedSet = new Set();
772
- this.loadingInProgress = new Map();
773
809
  this.log = logger('child-app:render');
774
810
  this.preloadManager = preloadManager;
775
811
  this.diManager = diManager;
@@ -777,7 +813,6 @@ class RenderManager {
777
813
  }
778
814
  getChildDi(request) {
779
815
  const config = this.resolveExternalConfig(request);
780
- this.hasRenderedSet.add(config.key);
781
816
  if (this.preloadManager.isPreloaded(request)) {
782
817
  return [this.diManager.getChildDi(config), null];
783
818
  }
@@ -785,7 +820,6 @@ class RenderManager {
785
820
  message: 'Child-app has been used but not preloaded before React render',
786
821
  request,
787
822
  });
788
- this.loadingInProgress.set(config.key, config);
789
823
  const promiseDi = this.preloadManager.preload(request).then(() => {
790
824
  return this.diManager.getChildDi(config);
791
825
  });
@@ -797,6 +831,13 @@ class RenderManager {
797
831
  clear() { }
798
832
  }
799
833
 
834
+ const runCommand = async ({ status, runner, preloader, }) => {
835
+ const childApps = preloader.getPreloadedList();
836
+ await Promise.all(childApps.map((config) => {
837
+ return runner.run('client', status, config);
838
+ }));
839
+ };
840
+
800
841
  const browserProviders = [
801
842
  provide({
802
843
  provide: CHILD_APP_LOADER_TOKEN,
@@ -848,16 +889,50 @@ const browserProviders = [
848
889
  preloader: CHILD_APP_PRELOAD_MANAGER_TOKEN,
849
890
  },
850
891
  }),
892
+ provide({
893
+ provide: commandLineListTokens$1.customerStart,
894
+ multi: true,
895
+ useFactory: ({ router, preloader }) => {
896
+ router.registerHook('beforeNavigate', () => preloader.clearPreloaded());
897
+ router.registerHook('beforeUpdateCurrent', () => preloader.clearPreloaded());
898
+ },
899
+ deps: {
900
+ router: ROUTER_TOKEN,
901
+ preloader: CHILD_APP_PRELOAD_MANAGER_TOKEN,
902
+ },
903
+ }),
851
904
  provide({
852
905
  provide: commandLineListTokens$1.spaTransition,
853
906
  multi: true,
854
- useFactory: ({ preloader }) => {
855
- return function childAppRunPreloaded() {
856
- return preloader.runPreloaded();
907
+ useFactory: ({ preloader, runner }) => {
908
+ return async function childAppRunPreloaded() {
909
+ await runCommand({
910
+ preloader,
911
+ runner,
912
+ status: 'spa',
913
+ });
914
+ };
915
+ },
916
+ deps: {
917
+ preloader: CHILD_APP_PRELOAD_MANAGER_TOKEN,
918
+ runner: CHILD_APP_COMMAND_LINE_RUNNER_TOKEN,
919
+ },
920
+ }),
921
+ provide({
922
+ provide: commandLineListTokens$1.afterSpaTransition,
923
+ multi: true,
924
+ useFactory: ({ preloader, runner }) => {
925
+ return async function childAppRunPreloaded() {
926
+ await runCommand({
927
+ preloader,
928
+ runner,
929
+ status: 'afterSpa',
930
+ });
857
931
  };
858
932
  },
859
933
  deps: {
860
934
  preloader: CHILD_APP_PRELOAD_MANAGER_TOKEN,
935
+ runner: CHILD_APP_COMMAND_LINE_RUNNER_TOKEN,
861
936
  },
862
937
  }),
863
938
  ];
package/lib/server.es.js CHANGED
@@ -688,7 +688,7 @@ class PreloadManager {
688
688
  await Promise.all(promises);
689
689
  }
690
690
  getPreloadedList() {
691
- return [...this.preloadMap.values()];
691
+ return Array.from(this.preloadMap.values());
692
692
  }
693
693
  async run(status, config) {
694
694
  const childApp = this.loader.get(config);
package/lib/server.js CHANGED
@@ -698,7 +698,7 @@ class PreloadManager {
698
698
  await Promise.all(promises);
699
699
  }
700
700
  getPreloadedList() {
701
- return [...this.preloadMap.values()];
701
+ return Array.from(this.preloadMap.values());
702
702
  }
703
703
  async run(status, config) {
704
704
  const childApp = this.loader.get(config);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/module-child-app",
3
- "version": "1.82.3",
3
+ "version": "1.85.0",
4
4
  "description": "Module for child apps",
5
5
  "browser": {
6
6
  "./lib/server.js": "./lib/browser.js",
@@ -31,20 +31,20 @@
31
31
  "@tinkoff/env-validators": "0.0.3",
32
32
  "@tinkoff/module-loader-client": "0.3.25",
33
33
  "@tinkoff/module-loader-server": "0.4.41",
34
- "@tramvai/child-app-core": "1.82.3",
34
+ "@tramvai/child-app-core": "1.85.0",
35
35
  "@tramvai/safe-strings": "0.4.3",
36
- "@tramvai/tokens-child-app": "1.82.3"
36
+ "@tramvai/tokens-child-app": "1.85.0"
37
37
  },
38
38
  "devDependencies": {},
39
39
  "peerDependencies": {
40
40
  "@tinkoff/dippy": "0.7.39",
41
41
  "@tinkoff/utils": "^2.1.2",
42
- "@tramvai/core": "1.82.3",
43
- "@tramvai/state": "1.82.3",
44
- "@tramvai/react": "1.82.3",
45
- "@tramvai/tokens-common": "1.82.3",
46
- "@tramvai/tokens-render": "1.82.3",
47
- "@tramvai/tokens-router": "1.82.3",
42
+ "@tramvai/core": "1.85.0",
43
+ "@tramvai/state": "1.85.0",
44
+ "@tramvai/react": "1.85.0",
45
+ "@tramvai/tokens-common": "1.85.0",
46
+ "@tramvai/tokens-render": "1.85.0",
47
+ "@tramvai/tokens-router": "1.85.0",
48
48
  "react": ">=16.8.0",
49
49
  "react-dom": ">=16.8.0",
50
50
  "object-assign": "^4.1.1",