this repo has no description
1import { makeRouterUsingRegisteredControllers } from '@jet/environment/routing';
2
3import type { AppStoreObjectGraph } from '@jet-app/app-store/foundation/runtime/app-store-object-graph';
4import { AppStoreIntentDispatcher } from '@jet-app/app-store/foundation/runtime/app-store-intent-dispatcher';
5import { AppStoreRuntime } from '@jet-app/app-store/foundation/runtime/runtime';
6
7import {
8 type Dependencies,
9 ObjectGraphType,
10 makeObjectGraph,
11} from '~/jet/dependencies';
12
13import { AppEventPageIntentController } from '@jet-app/app-store/controllers/app-events/app-event-page-intent-controller';
14import { BundlePageIntentController } from '@jet-app/app-store/controllers/product-page/bundle-page-intent-controller';
15import { EditorialPageIntentController } from '@jet-app/app-store/controllers/editorial-pages/editorial-page-intent-controller';
16import { EditorialShelfCollectionPageIntentController } from '@jet-app/app-store/controllers/editorial-pages/editorial-shelf-collection-page-intent-controller';
17import { GroupingPageIntentController } from '@jet-app/app-store/controllers/grouping/grouping-page-intent-controller';
18import { ProductPageIntentController } from '@jet-app/app-store/controllers/product-page/product-page-intent-controller';
19import { SearchLandingPageIntentController } from '@jet-app/app-store/controllers/search/search-landing-page-intent-controller';
20import { SearchResultsPageIntentController } from '@jet-app/app-store/controllers/search/search-results-controller';
21import { RoutableArticlePageIntentController } from '@jet-app/app-store/controllers/today/routable-article-page-intent-controller';
22import { ArcadeGroupingPageIntentController } from '@jet-app/app-store/controllers/arcade/arcade-grouping-page-intent-controller';
23import { DeveloperPageIntentController } from '@jet-app/app-store/controllers/developer/developer-page-intent-controller';
24import { ChartsPageIntentController } from '@jet-app/app-store/controllers/top-charts/charts-page-intent-controller';
25import { ChartsHubPageIntentController } from '@jet-app/app-store/controllers/top-charts/charts-hub-page-intent-controller';
26import { SeeAllPageIntentController } from '@jet-app/app-store/controllers/product-page/see-all-intent-controller';
27import { RoutableTodayPageIntentController } from '@jet-app/app-store/controllers/today/routable-today-page-intent-controller';
28import { RoomPageIntentController } from '@jet-app/app-store/controllers/room/room-page-intent-controller';
29import { RoutableArcadeSeeAllPageController } from '@jet-app/app-store/controllers/arcade/routable-arcade-see-all-page-controller';
30import * as landingPageNavigationControllers from '@jet-app/app-store/common/web-navigation/platform-landing-page-intent-controllers';
31import { RootRedirectController } from '@jet-app/app-store/common/web-navigation/platform-landing-page-intent-controllers';
32import { EulaPageIntentController } from '@jet-app/app-store/controllers/product-page/eula-page-intent-controller';
33import { CategoryTabsIntentController } from '@jet-app/app-store/controllers/web-navigation/category-tabs-intent-controller';
34
35import { ErrorPageIntentController } from '~/jet/intents/error-page-intent-controller';
36import { ChartsPageRedirectIntentController } from '~/jet/intents/charts-page-redirect-intent-controller';
37
38import {
39 RouteUrlIntentController,
40 LintMetricsEventIntentController,
41} from '~/jet/intents';
42import * as staticMessagePageControllers from '~/jet/intents/static-message-pages';
43
44function makeIntentDispatcher(): AppStoreIntentDispatcher {
45 const intentDispatcher = new AppStoreIntentDispatcher();
46
47 intentDispatcher.register(RouteUrlIntentController);
48 intentDispatcher.register(LintMetricsEventIntentController);
49
50 // Route Providers
51 for (const Controller of Object.values(landingPageNavigationControllers)) {
52 // `RootRedirectController` needs to be registered last, due to it's path match of `/{sf}`,
53 // it could inadvertently match a landing page route like `/vision`, so we are skipping it here
54 // and registering it at the bottom of this function.
55 if (Controller !== RootRedirectController) {
56 intentDispatcher.register(Controller);
57 }
58 }
59
60 for (const StaticMessagePageController of Object.values(
61 staticMessagePageControllers,
62 )) {
63 intentDispatcher.register(StaticMessagePageController);
64 }
65
66 intentDispatcher.register(ArcadeGroupingPageIntentController);
67 intentDispatcher.register(BundlePageIntentController);
68 intentDispatcher.register(EditorialPageIntentController);
69 intentDispatcher.register(EditorialShelfCollectionPageIntentController);
70 intentDispatcher.register(GroupingPageIntentController);
71 intentDispatcher.register(new SearchResultsPageIntentController());
72 intentDispatcher.register(SearchLandingPageIntentController);
73 intentDispatcher.register(DeveloperPageIntentController);
74 intentDispatcher.register(RoutableArticlePageIntentController);
75 intentDispatcher.register(RoutableTodayPageIntentController);
76 intentDispatcher.register(RoomPageIntentController);
77 intentDispatcher.register(RoutableArcadeSeeAllPageController);
78 intentDispatcher.register(EulaPageIntentController);
79 intentDispatcher.register(ChartsPageRedirectIntentController);
80 intentDispatcher.register(ErrorPageIntentController);
81
82 // "Charts" Pages; "hub" must come first since so it's URL matches before the "detail" page
83 intentDispatcher.register(ChartsHubPageIntentController);
84 intentDispatcher.register(ChartsPageIntentController);
85
86 // Product Page Routes; order is important due to overlapping URL patterns
87 // The product page itself must come last or it will match the more-specific patterns
88 intentDispatcher.register(AppEventPageIntentController);
89 intentDispatcher.register(SeeAllPageIntentController);
90 intentDispatcher.register(ProductPageIntentController);
91
92 intentDispatcher.register(new CategoryTabsIntentController());
93
94 // We register the root redirect controller last so more specific path patterns can be matched first
95 intentDispatcher.register(RootRedirectController);
96
97 return intentDispatcher;
98}
99
100/**
101 * Bootstraps the Jet runtime for Apps
102 *
103 * @param dependencies dependencies to initialize the Object Graph with
104 */
105export function bootstrap(dependencies: Dependencies): {
106 runtime: AppStoreRuntime;
107 objectGraph: AppStoreObjectGraph;
108} {
109 const intentDispatcher = makeIntentDispatcher();
110
111 const baseObjectGraph = makeObjectGraph(dependencies);
112
113 const router = makeRouterUsingRegisteredControllers(
114 intentDispatcher,
115 baseObjectGraph,
116 );
117 const appObjectGraph = baseObjectGraph
118 .adding(ObjectGraphType.router, router)
119 .adding(ObjectGraphType.dispatcher, intentDispatcher);
120
121 return {
122 runtime: new AppStoreRuntime(intentDispatcher, appObjectGraph),
123 objectGraph: appObjectGraph,
124 };
125}