From bce557cc2dc767628bed6aac87301a1be7c5431b Mon Sep 17 00:00:00 2001 From: rxliuli Date: Tue, 4 Nov 2025 05:03:50 +0800 Subject: init commit --- src/jet/bootstrap.ts | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 src/jet/bootstrap.ts (limited to 'src/jet/bootstrap.ts') diff --git a/src/jet/bootstrap.ts b/src/jet/bootstrap.ts new file mode 100644 index 0000000..32b10a0 --- /dev/null +++ b/src/jet/bootstrap.ts @@ -0,0 +1,125 @@ +import { makeRouterUsingRegisteredControllers } from '@jet/environment/routing'; + +import type { AppStoreObjectGraph } from '@jet-app/app-store/foundation/runtime/app-store-object-graph'; +import { AppStoreIntentDispatcher } from '@jet-app/app-store/foundation/runtime/app-store-intent-dispatcher'; +import { AppStoreRuntime } from '@jet-app/app-store/foundation/runtime/runtime'; + +import { + type Dependencies, + ObjectGraphType, + makeObjectGraph, +} from '~/jet/dependencies'; + +import { AppEventPageIntentController } from '@jet-app/app-store/controllers/app-events/app-event-page-intent-controller'; +import { BundlePageIntentController } from '@jet-app/app-store/controllers/product-page/bundle-page-intent-controller'; +import { EditorialPageIntentController } from '@jet-app/app-store/controllers/editorial-pages/editorial-page-intent-controller'; +import { EditorialShelfCollectionPageIntentController } from '@jet-app/app-store/controllers/editorial-pages/editorial-shelf-collection-page-intent-controller'; +import { GroupingPageIntentController } from '@jet-app/app-store/controllers/grouping/grouping-page-intent-controller'; +import { ProductPageIntentController } from '@jet-app/app-store/controllers/product-page/product-page-intent-controller'; +import { SearchLandingPageIntentController } from '@jet-app/app-store/controllers/search/search-landing-page-intent-controller'; +import { SearchResultsPageIntentController } from '@jet-app/app-store/controllers/search/search-results-controller'; +import { RoutableArticlePageIntentController } from '@jet-app/app-store/controllers/today/routable-article-page-intent-controller'; +import { ArcadeGroupingPageIntentController } from '@jet-app/app-store/controllers/arcade/arcade-grouping-page-intent-controller'; +import { DeveloperPageIntentController } from '@jet-app/app-store/controllers/developer/developer-page-intent-controller'; +import { ChartsPageIntentController } from '@jet-app/app-store/controllers/top-charts/charts-page-intent-controller'; +import { ChartsHubPageIntentController } from '@jet-app/app-store/controllers/top-charts/charts-hub-page-intent-controller'; +import { SeeAllPageIntentController } from '@jet-app/app-store/controllers/product-page/see-all-intent-controller'; +import { RoutableTodayPageIntentController } from '@jet-app/app-store/controllers/today/routable-today-page-intent-controller'; +import { RoomPageIntentController } from '@jet-app/app-store/controllers/room/room-page-intent-controller'; +import { RoutableArcadeSeeAllPageController } from '@jet-app/app-store/controllers/arcade/routable-arcade-see-all-page-controller'; +import * as landingPageNavigationControllers from '@jet-app/app-store/common/web-navigation/platform-landing-page-intent-controllers'; +import { RootRedirectController } from '@jet-app/app-store/common/web-navigation/platform-landing-page-intent-controllers'; +import { EulaPageIntentController } from '@jet-app/app-store/controllers/product-page/eula-page-intent-controller'; +import { CategoryTabsIntentController } from '@jet-app/app-store/controllers/web-navigation/category-tabs-intent-controller'; + +import { ErrorPageIntentController } from '~/jet/intents/error-page-intent-controller'; +import { ChartsPageRedirectIntentController } from '~/jet/intents/charts-page-redirect-intent-controller'; + +import { + RouteUrlIntentController, + LintMetricsEventIntentController, +} from '~/jet/intents'; +import * as staticMessagePageControllers from '~/jet/intents/static-message-pages'; + +function makeIntentDispatcher(): AppStoreIntentDispatcher { + const intentDispatcher = new AppStoreIntentDispatcher(); + + intentDispatcher.register(RouteUrlIntentController); + intentDispatcher.register(LintMetricsEventIntentController); + + // Route Providers + for (const Controller of Object.values(landingPageNavigationControllers)) { + // `RootRedirectController` needs to be registered last, due to it's path match of `/{sf}`, + // it could inadvertently match a landing page route like `/vision`, so we are skipping it here + // and registering it at the bottom of this function. + if (Controller !== RootRedirectController) { + intentDispatcher.register(Controller); + } + } + + for (const StaticMessagePageController of Object.values( + staticMessagePageControllers, + )) { + intentDispatcher.register(StaticMessagePageController); + } + + intentDispatcher.register(ArcadeGroupingPageIntentController); + intentDispatcher.register(BundlePageIntentController); + intentDispatcher.register(EditorialPageIntentController); + intentDispatcher.register(EditorialShelfCollectionPageIntentController); + intentDispatcher.register(GroupingPageIntentController); + intentDispatcher.register(new SearchResultsPageIntentController()); + intentDispatcher.register(SearchLandingPageIntentController); + intentDispatcher.register(DeveloperPageIntentController); + intentDispatcher.register(RoutableArticlePageIntentController); + intentDispatcher.register(RoutableTodayPageIntentController); + intentDispatcher.register(RoomPageIntentController); + intentDispatcher.register(RoutableArcadeSeeAllPageController); + intentDispatcher.register(EulaPageIntentController); + intentDispatcher.register(ChartsPageRedirectIntentController); + intentDispatcher.register(ErrorPageIntentController); + + // "Charts" Pages; "hub" must come first since so it's URL matches before the "detail" page + intentDispatcher.register(ChartsHubPageIntentController); + intentDispatcher.register(ChartsPageIntentController); + + // Product Page Routes; order is important due to overlapping URL patterns + // The product page itself must come last or it will match the more-specific patterns + intentDispatcher.register(AppEventPageIntentController); + intentDispatcher.register(SeeAllPageIntentController); + intentDispatcher.register(ProductPageIntentController); + + intentDispatcher.register(new CategoryTabsIntentController()); + + // We register the root redirect controller last so more specific path patterns can be matched first + intentDispatcher.register(RootRedirectController); + + return intentDispatcher; +} + +/** + * Bootstraps the Jet runtime for Apps + * + * @param dependencies dependencies to initialize the Object Graph with + */ +export function bootstrap(dependencies: Dependencies): { + runtime: AppStoreRuntime; + objectGraph: AppStoreObjectGraph; +} { + const intentDispatcher = makeIntentDispatcher(); + + const baseObjectGraph = makeObjectGraph(dependencies); + + const router = makeRouterUsingRegisteredControllers( + intentDispatcher, + baseObjectGraph, + ); + const appObjectGraph = baseObjectGraph + .adding(ObjectGraphType.router, router) + .adding(ObjectGraphType.dispatcher, intentDispatcher); + + return { + runtime: new AppStoreRuntime(intentDispatcher, appObjectGraph), + objectGraph: appObjectGraph, + }; +} -- cgit v1.2.3