/ src / jet / bootstrap.ts
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  }