this repo has no description
at main 97 lines 2.8 kB view raw
1// Sets up app specific configurations 2import type { Opt } from '@jet/environment'; 3import type { Intent } from '@jet/environment/dispatching'; 4import type { ActionModel } from '@jet/environment/types/models'; 5import { initializeUniqueIdContext } from '@amp/web-app-components/src/utils/uniqueId'; 6import { setLocale as setSharedLocale } from '@amp/web-app-components/src/utils/locale'; 7 8import type { 9 NormalizedStorefront, 10 NormalizedLanguage, 11} from '@jet-app/app-store/api/locale'; 12 13import { 14 DEFAULT_STOREFRONT_CODE, 15 DEFAULT_LANGUAGE_BCP47, 16} from '~/constants/storefront'; 17import { Jet } from '~/jet'; 18import { setup as setupI18n } from '~/stores/i18n'; 19import type { PrefetchedIntents } from '@amp/web-apps-common/src/jet/prefetched-intents'; 20import type { LoggerFactory } from '@amp/web-apps-logger'; 21import type { Locale as Language } from '@amp/web-apps-localization'; 22import type I18N from '@amp/web-apps-localization'; 23import '~/config/components/artwork'; 24import '~/config/components/shelf'; 25import type { FeaturesCallbacks } from './jet/dependencies/net'; 26 27export type Context = Map<string, unknown>; 28 29export async function bootstrap({ 30 loggerFactory, 31 initialUrl, 32 fetch, 33 prefetchedIntents, 34 featuresCallbacks, 35}: { 36 loggerFactory: LoggerFactory; 37 initialUrl: string; 38 fetch: typeof window.fetch; 39 prefetchedIntents: PrefetchedIntents; 40 featuresCallbacks?: FeaturesCallbacks; 41}): Promise<{ 42 context: Context; 43 jet: Jet; 44 initialAction: Opt<ActionModel>; 45 intent: Opt<Intent<unknown>>; 46 storefront: NormalizedStorefront; 47 language: NormalizedLanguage; 48 i18n: I18N; 49}> { 50 const log = loggerFactory.loggerFor('bootstrap'); 51 52 const context = new Map(); 53 54 const jet = Jet.load({ 55 loggerFactory, 56 context, 57 fetch, 58 prefetchedIntents, 59 featuresCallbacks, 60 }); 61 62 initializeUniqueIdContext(context, loggerFactory); 63 64 const routing = await jet.routeUrl(initialUrl); 65 66 if (routing) { 67 log.info('initial URL routed to:', routing); 68 } else { 69 log.warn('initial URL was unroutable:', initialUrl); 70 } 71 72 const { 73 intent = null, 74 action: initialAction = null, 75 storefront = DEFAULT_STOREFRONT_CODE, 76 language = DEFAULT_LANGUAGE_BCP47, 77 } = routing || {}; 78 79 // TODO: rdar://78109398 (i18n Improvements) 80 const i18nStore = await setupI18n( 81 context, 82 loggerFactory, 83 language.toLowerCase() as Language, 84 ); 85 jet.setLocale(i18nStore, storefront, language); 86 setSharedLocale(context, { storefront, language }); 87 88 return { 89 context, 90 jet, 91 initialAction, 92 intent, 93 storefront, 94 language, 95 i18n: i18nStore, 96 }; 97}