bootstrap.ts
1 import { makeRouterUsingRegisteredControllers } from '@jet/environment/routing'; 2 3 import type { AppStoreObjectGraph } from '@jet-app/app-store/foundation/runtime/app-store-object-graph'; 4 import { AppStoreIntentDispatcher } from '@jet-app/app-store/foundation/runtime/app-store-intent-dispatcher'; 5 import { AppStoreRuntime } from '@jet-app/app-store/foundation/runtime/runtime'; 6 7 import { 8 type Dependencies, 9 ObjectGraphType, 10 makeObjectGraph, 11 } from '~/jet/dependencies'; 12 13 import { AppEventPageIntentController } from '@jet-app/app-store/controllers/app-events/app-event-page-intent-controller'; 14 import { BundlePageIntentController } from '@jet-app/app-store/controllers/product-page/bundle-page-intent-controller'; 15 import { EditorialPageIntentController } from '@jet-app/app-store/controllers/editorial-pages/editorial-page-intent-controller'; 16 import { EditorialShelfCollectionPageIntentController } from '@jet-app/app-store/controllers/editorial-pages/editorial-shelf-collection-page-intent-controller'; 17 import { GroupingPageIntentController } from '@jet-app/app-store/controllers/grouping/grouping-page-intent-controller'; 18 import { ProductPageIntentController } from '@jet-app/app-store/controllers/product-page/product-page-intent-controller'; 19 import { SearchLandingPageIntentController } from '@jet-app/app-store/controllers/search/search-landing-page-intent-controller'; 20 import { SearchResultsPageIntentController } from '@jet-app/app-store/controllers/search/search-results-controller'; 21 import { RoutableArticlePageIntentController } from '@jet-app/app-store/controllers/today/routable-article-page-intent-controller'; 22 import { ArcadeGroupingPageIntentController } from '@jet-app/app-store/controllers/arcade/arcade-grouping-page-intent-controller'; 23 import { DeveloperPageIntentController } from '@jet-app/app-store/controllers/developer/developer-page-intent-controller'; 24 import { ChartsPageIntentController } from '@jet-app/app-store/controllers/top-charts/charts-page-intent-controller'; 25 import { ChartsHubPageIntentController } from '@jet-app/app-store/controllers/top-charts/charts-hub-page-intent-controller'; 26 import { SeeAllPageIntentController } from '@jet-app/app-store/controllers/product-page/see-all-intent-controller'; 27 import { RoutableTodayPageIntentController } from '@jet-app/app-store/controllers/today/routable-today-page-intent-controller'; 28 import { RoomPageIntentController } from '@jet-app/app-store/controllers/room/room-page-intent-controller'; 29 import { RoutableArcadeSeeAllPageController } from '@jet-app/app-store/controllers/arcade/routable-arcade-see-all-page-controller'; 30 import * as landingPageNavigationControllers from '@jet-app/app-store/common/web-navigation/platform-landing-page-intent-controllers'; 31 import { RootRedirectController } from '@jet-app/app-store/common/web-navigation/platform-landing-page-intent-controllers'; 32 import { EulaPageIntentController } from '@jet-app/app-store/controllers/product-page/eula-page-intent-controller'; 33 import { CategoryTabsIntentController } from '@jet-app/app-store/controllers/web-navigation/category-tabs-intent-controller'; 34 35 import { ErrorPageIntentController } from '~/jet/intents/error-page-intent-controller'; 36 import { ChartsPageRedirectIntentController } from '~/jet/intents/charts-page-redirect-intent-controller'; 37 38 import { 39 RouteUrlIntentController, 40 LintMetricsEventIntentController, 41 } from '~/jet/intents'; 42 import * as staticMessagePageControllers from '~/jet/intents/static-message-pages'; 43 44 function 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 */ 105 export 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 }