@openedx/frontend-base 1.0.0-alpha.12 → 1.0.0-alpha.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{index.ts → dist/index.d.ts} +0 -3
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/analytics/MockAnalyticsService.d.ts +50 -0
- package/dist/runtime/analytics/MockAnalyticsService.js +64 -0
- package/dist/runtime/analytics/MockAnalyticsService.js.map +1 -0
- package/dist/runtime/analytics/SegmentAnalyticsService.d.ts +64 -0
- package/dist/runtime/analytics/SegmentAnalyticsService.js +218 -0
- package/dist/runtime/analytics/SegmentAnalyticsService.js.map +1 -0
- package/dist/runtime/analytics/index.d.ts +3 -0
- package/dist/runtime/analytics/index.js +4 -0
- package/dist/runtime/analytics/index.js.map +1 -0
- package/dist/runtime/analytics/interface.d.ts +53 -0
- package/{runtime → dist/runtime}/analytics/interface.js +26 -38
- package/dist/runtime/analytics/interface.js.map +1 -0
- package/dist/runtime/auth/AxiosCsrfTokenService.d.ts +10 -0
- package/dist/runtime/auth/AxiosCsrfTokenService.js +64 -0
- package/dist/runtime/auth/AxiosCsrfTokenService.js.map +1 -0
- package/dist/runtime/auth/AxiosJwtAuthService.d.ts +182 -0
- package/dist/runtime/auth/AxiosJwtAuthService.js +339 -0
- package/dist/runtime/auth/AxiosJwtAuthService.js.map +1 -0
- package/dist/runtime/auth/AxiosJwtTokenService.d.ts +16 -0
- package/dist/runtime/auth/AxiosJwtTokenService.js +130 -0
- package/dist/runtime/auth/AxiosJwtTokenService.js.map +1 -0
- package/dist/runtime/auth/LocalForageCache.d.ts +7 -0
- package/dist/runtime/auth/LocalForageCache.js +78 -0
- package/dist/runtime/auth/LocalForageCache.js.map +1 -0
- package/dist/runtime/auth/MockAuthService.d.ts +209 -0
- package/dist/runtime/auth/MockAuthService.js +256 -0
- package/dist/runtime/auth/MockAuthService.js.map +1 -0
- package/dist/runtime/auth/index.d.ts +3 -0
- package/dist/runtime/auth/index.js +4 -0
- package/dist/runtime/auth/index.js.map +1 -0
- package/dist/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.d.ts +2 -0
- package/dist/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js +42 -0
- package/dist/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js.map +1 -0
- package/dist/runtime/auth/interceptors/createJwtTokenProviderInterceptor.d.ts +2 -0
- package/dist/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js +40 -0
- package/dist/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js.map +1 -0
- package/dist/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.d.ts +2 -0
- package/dist/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js +26 -0
- package/dist/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js.map +1 -0
- package/dist/runtime/auth/interceptors/createRetryInterceptor.d.ts +3 -0
- package/dist/runtime/auth/interceptors/createRetryInterceptor.js +67 -0
- package/dist/runtime/auth/interceptors/createRetryInterceptor.js.map +1 -0
- package/dist/runtime/auth/interface.d.ts +133 -0
- package/{runtime → dist/runtime}/auth/interface.js +65 -72
- package/dist/runtime/auth/interface.js.map +1 -0
- package/dist/runtime/auth/utils.d.ts +13 -0
- package/dist/runtime/auth/utils.js +66 -0
- package/dist/runtime/auth/utils.js.map +1 -0
- package/dist/runtime/babel.config.d.ts +2 -0
- package/{shell → dist/runtime}/babel.config.js +2 -1
- package/dist/runtime/babel.config.js.map +1 -0
- package/{runtime/config/index.ts → dist/runtime/config/index.d.ts} +28 -123
- package/dist/runtime/config/index.js +323 -0
- package/dist/runtime/config/index.js.map +1 -0
- package/dist/runtime/constants.d.ts +57 -0
- package/{runtime/constants.ts → dist/runtime/constants.js} +1 -11
- package/dist/runtime/constants.js.map +1 -0
- package/dist/runtime/i18n/index.d.ts +3 -0
- package/{runtime → dist/runtime}/i18n/index.js +4 -44
- package/dist/runtime/i18n/index.js.map +1 -0
- package/dist/runtime/i18n/injectIntlWithShim.d.ts +11 -0
- package/dist/runtime/i18n/injectIntlWithShim.js +45 -0
- package/dist/runtime/i18n/injectIntlWithShim.js.map +1 -0
- package/dist/runtime/i18n/lib.d.ts +119 -0
- package/dist/runtime/i18n/lib.js +236 -0
- package/dist/runtime/i18n/lib.js.map +1 -0
- package/dist/runtime/index.d.ts +13 -0
- package/dist/runtime/index.js +14 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/initialize.d.ts +91 -0
- package/dist/runtime/initialize.js +312 -0
- package/dist/runtime/initialize.js.map +1 -0
- package/dist/runtime/jest.config.d.ts +17 -0
- package/dist/runtime/jest.config.js +35 -0
- package/dist/runtime/jest.config.js.map +1 -0
- package/dist/runtime/logging/MockLoggingService.d.ts +28 -0
- package/dist/runtime/logging/MockLoggingService.js +31 -0
- package/dist/runtime/logging/MockLoggingService.js.map +1 -0
- package/dist/runtime/logging/NewRelicLoggingService.d.ts +67 -0
- package/dist/runtime/logging/NewRelicLoggingService.js +175 -0
- package/dist/runtime/logging/NewRelicLoggingService.js.map +1 -0
- package/{runtime/logging/index.ts → dist/runtime/logging/index.d.ts} +1 -7
- package/dist/runtime/logging/index.js +4 -0
- package/dist/runtime/logging/index.js.map +1 -0
- package/dist/runtime/logging/interface.d.ts +38 -0
- package/{runtime → dist/runtime}/logging/interface.js +16 -26
- package/dist/runtime/logging/interface.js.map +1 -0
- package/dist/runtime/logging/types.d.ts +4 -0
- package/dist/runtime/logging/types.js +2 -0
- package/dist/runtime/logging/types.js.map +1 -0
- package/dist/runtime/react/AuthenticatedPageRoute.d.ts +28 -0
- package/{runtime/react/AuthenticatedPageRoute.jsx → dist/runtime/react/AuthenticatedPageRoute.js} +11 -18
- package/dist/runtime/react/AuthenticatedPageRoute.js.map +1 -0
- package/dist/runtime/react/CombinedAppProvider.d.ts +6 -0
- package/dist/runtime/react/CombinedAppProvider.js +24 -0
- package/dist/runtime/react/CombinedAppProvider.js.map +1 -0
- package/dist/runtime/react/CurrentAppContext.d.ts +20 -0
- package/{runtime/react/CurrentAppContext.tsx → dist/runtime/react/CurrentAppContext.js} +3 -7
- package/dist/runtime/react/CurrentAppContext.js.map +1 -0
- package/dist/runtime/react/CurrentAppProvider.d.ts +23 -0
- package/dist/runtime/react/CurrentAppProvider.js +33 -0
- package/dist/runtime/react/CurrentAppProvider.js.map +1 -0
- package/dist/runtime/react/Divider.d.ts +1 -0
- package/dist/runtime/react/Divider.js +5 -0
- package/dist/runtime/react/Divider.js.map +1 -0
- package/dist/runtime/react/ErrorBoundary.d.ts +32 -0
- package/dist/runtime/react/ErrorBoundary.js +40 -0
- package/dist/runtime/react/ErrorBoundary.js.map +1 -0
- package/dist/runtime/react/ErrorPage.d.ts +17 -0
- package/dist/runtime/react/ErrorPage.js +29 -0
- package/dist/runtime/react/ErrorPage.js.map +1 -0
- package/dist/runtime/react/LoginRedirect.d.ts +8 -0
- package/{runtime/react/LoginRedirect.jsx → dist/runtime/react/LoginRedirect.js} +5 -5
- package/dist/runtime/react/LoginRedirect.js.map +1 -0
- package/dist/runtime/react/PageWrap.d.ts +8 -0
- package/{runtime/react/PageWrap.jsx → dist/runtime/react/PageWrap.js} +7 -10
- package/dist/runtime/react/PageWrap.js.map +1 -0
- package/dist/runtime/react/SiteContext.d.ts +24 -0
- package/{runtime/react/SiteContext.tsx → dist/runtime/react/SiteContext.js} +5 -11
- package/dist/runtime/react/SiteContext.js.map +1 -0
- package/dist/runtime/react/SiteProvider.d.ts +29 -0
- package/dist/runtime/react/SiteProvider.js +69 -0
- package/dist/runtime/react/SiteProvider.js.map +1 -0
- package/dist/runtime/react/constants.d.ts +3 -0
- package/{runtime/react/constants.ts → dist/runtime/react/constants.js} +1 -0
- package/dist/runtime/react/constants.js.map +1 -0
- package/{runtime/react/hooks/index.ts → dist/runtime/react/hooks/index.d.ts} +0 -1
- package/dist/runtime/react/hooks/index.js +8 -0
- package/dist/runtime/react/hooks/index.js.map +1 -0
- package/dist/runtime/react/hooks/theme/index.js +3 -0
- package/dist/runtime/react/hooks/theme/index.js.map +1 -0
- package/dist/runtime/react/hooks/theme/useTheme.d.ts +35 -0
- package/dist/runtime/react/hooks/theme/useTheme.js +153 -0
- package/dist/runtime/react/hooks/theme/useTheme.js.map +1 -0
- package/dist/runtime/react/hooks/theme/useThemeConfig.d.ts +16 -0
- package/{runtime/react/hooks/theme/useThemeConfig.ts → dist/runtime/react/hooks/theme/useThemeConfig.js} +11 -16
- package/dist/runtime/react/hooks/theme/useThemeConfig.js.map +1 -0
- package/dist/runtime/react/hooks/theme/useThemeCore.d.ts +10 -0
- package/dist/runtime/react/hooks/theme/useThemeCore.js +40 -0
- package/dist/runtime/react/hooks/theme/useThemeCore.js.map +1 -0
- package/dist/runtime/react/hooks/theme/useThemeVariants.d.ts +17 -0
- package/dist/runtime/react/hooks/theme/useThemeVariants.js +90 -0
- package/dist/runtime/react/hooks/theme/useThemeVariants.js.map +1 -0
- package/dist/runtime/react/hooks/theme/useTrackColorSchemeChoice.d.ts +8 -0
- package/dist/runtime/react/hooks/theme/useTrackColorSchemeChoice.js +30 -0
- package/dist/runtime/react/hooks/theme/useTrackColorSchemeChoice.js.map +1 -0
- package/dist/runtime/react/hooks/theme/utils.d.ts +6 -0
- package/{runtime/react/hooks/theme/utils.ts → dist/runtime/react/hooks/theme/utils.js} +4 -4
- package/dist/runtime/react/hooks/theme/utils.js.map +1 -0
- package/dist/runtime/react/hooks/useActiveRoles.d.ts +2 -0
- package/{runtime/react/hooks/useActiveRoles.ts → dist/runtime/react/hooks/useActiveRoles.js} +6 -8
- package/dist/runtime/react/hooks/useActiveRoles.js.map +1 -0
- package/dist/runtime/react/hooks/useActiveRouteRoleWatcher.d.ts +2 -0
- package/dist/runtime/react/hooks/useActiveRouteRoleWatcher.js +26 -0
- package/dist/runtime/react/hooks/useActiveRouteRoleWatcher.js.map +1 -0
- package/dist/runtime/react/hooks/useAppConfig.d.ts +2 -0
- package/{runtime/react/hooks/useAppConfig.ts → dist/runtime/react/hooks/useAppConfig.js} +3 -4
- package/dist/runtime/react/hooks/useAppConfig.js.map +1 -0
- package/dist/runtime/react/hooks/useAuthenticatedUser.d.ts +2 -0
- package/{runtime/react/hooks/useAuthenticatedUser.ts → dist/runtime/react/hooks/useAuthenticatedUser.js} +3 -4
- package/dist/runtime/react/hooks/useAuthenticatedUser.js.map +1 -0
- package/dist/runtime/react/hooks/useSiteConfig.d.ts +2 -0
- package/{runtime/react/hooks/useSiteConfig.ts → dist/runtime/react/hooks/useSiteConfig.js} +3 -4
- package/dist/runtime/react/hooks/useSiteConfig.js.map +1 -0
- package/dist/runtime/react/hooks/useSiteEvent.d.ts +12 -0
- package/{runtime/react/hooks/useSiteEvent.ts → dist/runtime/react/hooks/useSiteEvent.js} +7 -9
- package/dist/runtime/react/hooks/useSiteEvent.js.map +1 -0
- package/{runtime/react/index.ts → dist/runtime/react/index.d.ts} +0 -1
- package/dist/runtime/react/index.js +19 -0
- package/dist/runtime/react/index.js.map +1 -0
- package/dist/runtime/react/reducers.d.ts +11 -0
- package/dist/runtime/react/reducers.js +28 -0
- package/dist/runtime/react/reducers.js.map +1 -0
- package/dist/runtime/routing/index.js +2 -0
- package/dist/runtime/routing/index.js.map +1 -0
- package/dist/runtime/routing/utils.d.ts +4 -0
- package/dist/runtime/routing/utils.js +28 -0
- package/dist/runtime/routing/utils.js.map +1 -0
- package/dist/runtime/scripts/GoogleAnalyticsLoader.d.ts +12 -0
- package/dist/runtime/scripts/GoogleAnalyticsLoader.js +49 -0
- package/dist/runtime/scripts/GoogleAnalyticsLoader.js.map +1 -0
- package/dist/runtime/scripts/index.js +2 -0
- package/dist/runtime/scripts/index.js.map +1 -0
- package/dist/runtime/setupTest.d.ts +1 -0
- package/{runtime → dist/runtime}/setupTest.js +6 -8
- package/dist/runtime/setupTest.js.map +1 -0
- package/dist/runtime/slots/Slot.d.ts +9 -0
- package/dist/runtime/slots/Slot.js +30 -0
- package/dist/runtime/slots/Slot.js.map +1 -0
- package/dist/runtime/slots/SlotContext.d.ts +7 -0
- package/dist/runtime/slots/SlotContext.js +7 -0
- package/dist/runtime/slots/SlotContext.js.map +1 -0
- package/dist/runtime/slots/hooks.d.ts +12 -0
- package/dist/runtime/slots/hooks.js +29 -0
- package/dist/runtime/slots/hooks.js.map +1 -0
- package/dist/runtime/slots/index.js +7 -0
- package/dist/runtime/slots/index.js.map +1 -0
- package/dist/runtime/slots/layout/DefaultSlotLayout.d.ts +1 -0
- package/dist/runtime/slots/layout/DefaultSlotLayout.js +7 -0
- package/dist/runtime/slots/layout/DefaultSlotLayout.js.map +1 -0
- package/dist/runtime/slots/layout/hooks.d.ts +10 -0
- package/dist/runtime/slots/layout/hooks.js +57 -0
- package/dist/runtime/slots/layout/hooks.js.map +1 -0
- package/dist/runtime/slots/layout/index.js +5 -0
- package/dist/runtime/slots/layout/index.js.map +1 -0
- package/{runtime/slots/layout/types.ts → dist/runtime/slots/layout/types.d.ts} +10 -25
- package/dist/runtime/slots/layout/types.js +12 -0
- package/dist/runtime/slots/layout/types.js.map +1 -0
- package/dist/runtime/slots/layout/utils.d.ts +5 -0
- package/dist/runtime/slots/layout/utils.js +11 -0
- package/dist/runtime/slots/layout/utils.js.map +1 -0
- package/{runtime/slots/types.ts → dist/runtime/slots/types.d.ts} +6 -12
- package/dist/runtime/slots/types.js +7 -0
- package/dist/runtime/slots/types.js.map +1 -0
- package/dist/runtime/slots/utils.d.ts +3 -0
- package/dist/runtime/slots/utils.js +66 -0
- package/dist/runtime/slots/utils.js.map +1 -0
- package/dist/runtime/slots/widget/WidgetContext.d.ts +6 -0
- package/dist/runtime/slots/widget/WidgetContext.js +8 -0
- package/dist/runtime/slots/widget/WidgetContext.js.map +1 -0
- package/dist/runtime/slots/widget/WidgetProvider.d.ts +9 -0
- package/dist/runtime/slots/widget/WidgetProvider.js +18 -0
- package/dist/runtime/slots/widget/WidgetProvider.js.map +1 -0
- package/dist/runtime/slots/widget/hooks.d.ts +13 -0
- package/dist/runtime/slots/widget/hooks.js +104 -0
- package/dist/runtime/slots/widget/hooks.js.map +1 -0
- package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.d.ts +10 -0
- package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.js +42 -0
- package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.js.map +1 -0
- package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.messages.d.ts +13 -0
- package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.messages.js +15 -0
- package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.messages.js.map +1 -0
- package/dist/runtime/slots/widget/iframe/IFrameWidget.d.ts +6 -0
- package/dist/runtime/slots/widget/iframe/IFrameWidget.js +32 -0
- package/dist/runtime/slots/widget/iframe/IFrameWidget.js.map +1 -0
- package/dist/runtime/slots/widget/iframe/constants.d.ts +15 -0
- package/{runtime/slots/widget/iframe/constants.ts → dist/runtime/slots/widget/iframe/constants.js} +2 -4
- package/dist/runtime/slots/widget/iframe/constants.js.map +1 -0
- package/dist/runtime/slots/widget/iframe/hooks.d.ts +64 -0
- package/dist/runtime/slots/widget/iframe/hooks.js +144 -0
- package/dist/runtime/slots/widget/iframe/hooks.js.map +1 -0
- package/{runtime/slots/widget/iframe/index.ts → dist/runtime/slots/widget/iframe/index.d.ts} +1 -4
- package/dist/runtime/slots/widget/iframe/index.js +3 -0
- package/dist/runtime/slots/widget/iframe/index.js.map +1 -0
- package/{runtime/slots/widget/iframe/types.ts → dist/runtime/slots/widget/iframe/types.d.ts} +2 -4
- package/dist/runtime/slots/widget/iframe/types.js +3 -0
- package/dist/runtime/slots/widget/iframe/types.js.map +1 -0
- package/dist/runtime/slots/widget/index.js +6 -0
- package/dist/runtime/slots/widget/index.js.map +1 -0
- package/{runtime/slots/widget/types.ts → dist/runtime/slots/widget/types.d.ts} +50 -84
- package/dist/runtime/slots/widget/types.js +41 -0
- package/dist/runtime/slots/widget/types.js.map +1 -0
- package/dist/runtime/slots/widget/utils.d.ts +22 -0
- package/dist/runtime/slots/widget/utils.js +166 -0
- package/dist/runtime/slots/widget/utils.js.map +1 -0
- package/{runtime/subscriptions.ts → dist/runtime/subscriptions.d.ts} +5 -41
- package/dist/runtime/subscriptions.js +48 -0
- package/dist/runtime/subscriptions.js.map +1 -0
- package/{runtime/testing/index.ts → dist/runtime/testing/index.d.ts} +0 -1
- package/dist/runtime/testing/index.js +9 -0
- package/dist/runtime/testing/index.js.map +1 -0
- package/dist/runtime/testing/initializeMockApp.d.ts +46 -0
- package/{runtime/testing/initializeMockApp.ts → dist/runtime/testing/initializeMockApp.js} +26 -41
- package/dist/runtime/testing/initializeMockApp.js.map +1 -0
- package/dist/runtime/testing/mockMessages.d.ts +22 -0
- package/dist/runtime/testing/mockMessages.js +23 -0
- package/dist/runtime/testing/mockMessages.js.map +1 -0
- package/dist/runtime/utils.d.ts +95 -0
- package/{runtime → dist/runtime}/utils.js +55 -70
- package/dist/runtime/utils.js.map +1 -0
- package/dist/shell/DefaultLayout.d.ts +1 -0
- package/dist/shell/DefaultLayout.js +7 -0
- package/dist/shell/DefaultLayout.js.map +1 -0
- package/dist/shell/DefaultMain.d.ts +1 -0
- package/dist/shell/DefaultMain.js +6 -0
- package/dist/shell/DefaultMain.js.map +1 -0
- package/dist/shell/Logo.d.ts +6 -0
- package/dist/shell/Logo.js +11 -0
- package/dist/shell/Logo.js.map +1 -0
- package/dist/shell/Shell.d.ts +1 -0
- package/dist/shell/Shell.js +10 -0
- package/dist/shell/Shell.js.map +1 -0
- package/dist/shell/Shell.messages.d.ts +58 -0
- package/dist/shell/Shell.messages.js +60 -0
- package/dist/shell/Shell.messages.js.map +1 -0
- package/dist/shell/app.d.ts +3 -0
- package/dist/shell/app.js +35 -0
- package/dist/shell/app.js.map +1 -0
- package/dist/shell/babel.config.d.ts +2 -0
- package/{runtime → dist/shell}/babel.config.js +2 -1
- package/dist/shell/babel.config.js.map +1 -0
- package/dist/shell/dev/devFooter/app.d.ts +3 -0
- package/dist/shell/dev/devFooter/app.js +36 -0
- package/dist/shell/dev/devFooter/app.js.map +1 -0
- package/dist/shell/dev/devFooter/index.js +2 -0
- package/dist/shell/dev/devFooter/index.js.map +1 -0
- package/dist/shell/dev/devHeader/BarContext.d.ts +7 -0
- package/dist/shell/dev/devHeader/BarContext.js +8 -0
- package/dist/shell/dev/devHeader/BarContext.js.map +1 -0
- package/dist/shell/dev/devHeader/BarLink.d.ts +1 -0
- package/dist/shell/dev/devHeader/BarLink.js +10 -0
- package/dist/shell/dev/devHeader/BarLink.js.map +1 -0
- package/dist/shell/dev/devHeader/BarProvider.d.ts +6 -0
- package/dist/shell/dev/devHeader/BarProvider.js +16 -0
- package/dist/shell/dev/devHeader/BarProvider.js.map +1 -0
- package/dist/shell/dev/devHeader/CoursesLink.d.ts +1 -0
- package/dist/shell/dev/devHeader/CoursesLink.js +10 -0
- package/dist/shell/dev/devHeader/CoursesLink.js.map +1 -0
- package/dist/shell/dev/devHeader/FooContext.d.ts +7 -0
- package/dist/shell/dev/devHeader/FooContext.js +8 -0
- package/dist/shell/dev/devHeader/FooContext.js.map +1 -0
- package/dist/shell/dev/devHeader/FooLink.d.ts +1 -0
- package/dist/shell/dev/devHeader/FooLink.js +10 -0
- package/dist/shell/dev/devHeader/FooLink.js.map +1 -0
- package/dist/shell/dev/devHeader/FooProvider.d.ts +6 -0
- package/dist/shell/dev/devHeader/FooProvider.js +16 -0
- package/dist/shell/dev/devHeader/FooProvider.js.map +1 -0
- package/dist/shell/dev/devHeader/app.d.ts +3 -0
- package/dist/shell/dev/devHeader/app.js +34 -0
- package/dist/shell/dev/devHeader/app.js.map +1 -0
- package/dist/shell/dev/devHeader/index.js +2 -0
- package/dist/shell/dev/devHeader/index.js.map +1 -0
- package/dist/shell/dev/devHeader/providers.d.ts +3 -0
- package/dist/shell/dev/devHeader/providers.js +8 -0
- package/dist/shell/dev/devHeader/providers.js.map +1 -0
- package/dist/shell/dev/devHome/HomePage.d.ts +1 -0
- package/dist/shell/dev/devHome/HomePage.js +13 -0
- package/dist/shell/dev/devHome/HomePage.js.map +1 -0
- package/dist/shell/dev/devHome/app.d.ts +3 -0
- package/dist/shell/dev/devHome/app.js +16 -0
- package/dist/shell/dev/devHome/app.js.map +1 -0
- package/dist/shell/dev/devHome/i18n/index.d.ts +27 -0
- package/dist/shell/dev/devHome/i18n/index.js +28 -0
- package/dist/shell/dev/devHome/i18n/index.js.map +1 -0
- package/dist/shell/dev/devHome/index.js +2 -0
- package/dist/shell/dev/devHome/index.js.map +1 -0
- package/dist/shell/dev/devHome/messages.d.ts +8 -0
- package/dist/shell/dev/devHome/messages.js +10 -0
- package/dist/shell/dev/devHome/messages.js.map +1 -0
- package/dist/shell/dev/devUser/app.d.ts +3 -0
- package/dist/shell/dev/devUser/app.js +22 -0
- package/dist/shell/dev/devUser/app.js.map +1 -0
- package/dist/shell/dev/devUser/index.js +2 -0
- package/dist/shell/dev/devUser/index.js.map +1 -0
- package/dist/shell/dev/index.js +6 -0
- package/dist/shell/dev/index.js.map +1 -0
- package/dist/shell/dev/slotShowcase/HorizontalSlotLayout.d.ts +1 -0
- package/dist/shell/dev/slotShowcase/HorizontalSlotLayout.js +7 -0
- package/dist/shell/dev/slotShowcase/HorizontalSlotLayout.js.map +1 -0
- package/dist/shell/dev/slotShowcase/LayoutWithOptions.d.ts +1 -0
- package/dist/shell/dev/slotShowcase/LayoutWithOptions.js +9 -0
- package/dist/shell/dev/slotShowcase/LayoutWithOptions.js.map +1 -0
- package/dist/shell/dev/slotShowcase/SlotShowcasePage.d.ts +1 -0
- package/dist/shell/dev/slotShowcase/SlotShowcasePage.js +8 -0
- package/dist/shell/dev/slotShowcase/SlotShowcasePage.js.map +1 -0
- package/dist/shell/dev/slotShowcase/WidgetWithOptions.d.ts +1 -0
- package/dist/shell/dev/slotShowcase/WidgetWithOptions.js +8 -0
- package/dist/shell/dev/slotShowcase/WidgetWithOptions.js.map +1 -0
- package/dist/shell/dev/slotShowcase/app.d.ts +3 -0
- package/dist/shell/dev/slotShowcase/app.js +336 -0
- package/dist/shell/dev/slotShowcase/app.js.map +1 -0
- package/dist/shell/dev/slotShowcase/index.js +2 -0
- package/dist/shell/dev/slotShowcase/index.js.map +1 -0
- package/dist/shell/footer/CenterLinks.d.ts +1 -0
- package/dist/shell/footer/CenterLinks.js +7 -0
- package/dist/shell/footer/CenterLinks.js.map +1 -0
- package/dist/shell/footer/CopyrightNotice.d.ts +10 -0
- package/dist/shell/footer/CopyrightNotice.js +10 -0
- package/dist/shell/footer/CopyrightNotice.js.map +1 -0
- package/dist/shell/footer/Footer.d.ts +1 -0
- package/dist/shell/footer/Footer.js +12 -0
- package/dist/shell/footer/Footer.js.map +1 -0
- package/dist/shell/footer/LabeledLinkColumn.d.ts +1 -0
- package/dist/shell/footer/LabeledLinkColumn.js +11 -0
- package/dist/shell/footer/LabeledLinkColumn.js.map +1 -0
- package/dist/shell/footer/LanguageMenu.d.ts +1 -0
- package/dist/shell/footer/LanguageMenu.js +16 -0
- package/dist/shell/footer/LanguageMenu.js.map +1 -0
- package/dist/shell/footer/LanguageMenuItem.d.ts +8 -0
- package/dist/shell/footer/LanguageMenuItem.js +11 -0
- package/dist/shell/footer/LanguageMenuItem.js.map +1 -0
- package/dist/shell/footer/LeftLinks.d.ts +1 -0
- package/dist/shell/footer/LeftLinks.js +7 -0
- package/dist/shell/footer/LeftLinks.js.map +1 -0
- package/dist/shell/footer/LegalNotices.d.ts +1 -0
- package/dist/shell/footer/LegalNotices.js +10 -0
- package/dist/shell/footer/LegalNotices.js.map +1 -0
- package/dist/shell/footer/PoweredBy.d.ts +1 -0
- package/dist/shell/footer/PoweredBy.js +9 -0
- package/dist/shell/footer/PoweredBy.js.map +1 -0
- package/dist/shell/footer/RevealLinks.d.ts +1 -0
- package/dist/shell/footer/RevealLinks.js +16 -0
- package/dist/shell/footer/RevealLinks.js.map +1 -0
- package/dist/shell/footer/RightLinks.d.ts +1 -0
- package/dist/shell/footer/RightLinks.js +7 -0
- package/dist/shell/footer/RightLinks.js.map +1 -0
- package/dist/shell/footer/app.d.ts +3 -0
- package/dist/shell/footer/app.js +59 -0
- package/dist/shell/footer/app.js.map +1 -0
- package/dist/shell/footer/data/api.d.ts +1 -0
- package/dist/shell/footer/data/api.js +45 -0
- package/dist/shell/footer/data/api.js.map +1 -0
- package/dist/shell/footer/index.js +3 -0
- package/dist/shell/footer/index.js.map +1 -0
- package/dist/shell/header/AuthenticatedMenu.d.ts +5 -0
- package/dist/shell/header/AuthenticatedMenu.js +13 -0
- package/dist/shell/header/AuthenticatedMenu.js.map +1 -0
- package/dist/shell/header/Header.d.ts +1 -0
- package/dist/shell/header/Header.js +8 -0
- package/dist/shell/header/Header.js.map +1 -0
- package/dist/shell/header/anonymous-menu/AnonymousMenu.d.ts +5 -0
- package/dist/shell/header/anonymous-menu/AnonymousMenu.js +7 -0
- package/dist/shell/header/anonymous-menu/AnonymousMenu.js.map +1 -0
- package/dist/shell/header/anonymous-menu/LoginButton.d.ts +3 -0
- package/dist/shell/header/anonymous-menu/LoginButton.js +22 -0
- package/dist/shell/header/anonymous-menu/LoginButton.js.map +1 -0
- package/dist/shell/header/anonymous-menu/RegisterButton.d.ts +3 -0
- package/dist/shell/header/anonymous-menu/RegisterButton.js +22 -0
- package/dist/shell/header/anonymous-menu/RegisterButton.js.map +1 -0
- package/dist/shell/header/app.d.ts +3 -0
- package/dist/shell/header/app.js +119 -0
- package/dist/shell/header/app.js.map +1 -0
- package/dist/shell/header/desktop/DesktopLayout.d.ts +1 -0
- package/dist/shell/header/desktop/DesktopLayout.js +9 -0
- package/dist/shell/header/desktop/DesktopLayout.js.map +1 -0
- package/dist/shell/header/desktop/PrimaryNavLinks.d.ts +1 -0
- package/dist/shell/header/desktop/PrimaryNavLinks.js +7 -0
- package/dist/shell/header/desktop/PrimaryNavLinks.js.map +1 -0
- package/dist/shell/header/desktop/SecondaryNavLinks.d.ts +1 -0
- package/dist/shell/header/desktop/SecondaryNavLinks.js +7 -0
- package/dist/shell/header/desktop/SecondaryNavLinks.js.map +1 -0
- package/dist/shell/header/index.js +3 -0
- package/dist/shell/header/index.js.map +1 -0
- package/dist/shell/header/mobile/MobileLayout.d.ts +1 -0
- package/dist/shell/header/mobile/MobileLayout.js +17 -0
- package/dist/shell/header/mobile/MobileLayout.js.map +1 -0
- package/dist/shell/header/mobile/MobileNavLinks.d.ts +1 -0
- package/dist/shell/header/mobile/MobileNavLinks.js +7 -0
- package/dist/shell/header/mobile/MobileNavLinks.js.map +1 -0
- package/dist/shell/i18n/index.d.ts +25 -0
- package/dist/shell/i18n/index.js +26 -0
- package/dist/shell/i18n/index.js.map +1 -0
- package/dist/shell/index.js +8 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/shell/jest.config.d.ts +16 -0
- package/{tools/dist/jest → dist/shell}/jest.config.js +13 -11
- package/dist/shell/jest.config.js.map +1 -0
- package/dist/shell/menus/LinkMenuItem.d.ts +9 -0
- package/dist/shell/menus/LinkMenuItem.js +36 -0
- package/dist/shell/menus/LinkMenuItem.js.map +1 -0
- package/dist/shell/menus/NavDropdownMenuSlot.d.ts +7 -0
- package/dist/shell/menus/NavDropdownMenuSlot.js +14 -0
- package/dist/shell/menus/NavDropdownMenuSlot.js.map +1 -0
- package/dist/shell/menus/ProfileLinkMenuItem.d.ts +8 -0
- package/dist/shell/menus/ProfileLinkMenuItem.js +16 -0
- package/dist/shell/menus/ProfileLinkMenuItem.js.map +1 -0
- package/dist/shell/menus/data/utils.d.ts +4 -0
- package/dist/shell/menus/data/utils.js +13 -0
- package/dist/shell/menus/data/utils.js.map +1 -0
- package/dist/shell/router/createRouter.d.ts +1 -0
- package/{shell/router/createRouter.ts → dist/shell/router/createRouter.js} +9 -11
- package/dist/shell/router/createRouter.js.map +1 -0
- package/dist/shell/router/getAppRoutes.d.ts +2 -0
- package/dist/shell/router/getAppRoutes.js +14 -0
- package/dist/shell/router/getAppRoutes.js.map +1 -0
- package/dist/shell/setupTest.d.ts +1 -0
- package/{shell → dist/shell}/setupTest.js +6 -7
- package/dist/shell/setupTest.js.map +1 -0
- package/dist/shell/site.config.dev.d.ts +4 -0
- package/dist/shell/site.config.dev.js +43 -0
- package/dist/shell/site.config.dev.js.map +1 -0
- package/dist/shell/site.d.ts +1 -0
- package/dist/shell/site.js +35 -0
- package/dist/shell/site.js.map +1 -0
- package/dist/tools/babel/babel.config.d.ts +12 -0
- package/dist/tools/cli/commands/serve.d.ts +1 -0
- package/dist/tools/cli/intl-imports.d.ts +7 -0
- package/dist/tools/cli/intl-imports.test.d.ts +1 -0
- package/dist/tools/cli/openedx.d.ts +2 -0
- package/{tools/dist → dist/tools}/cli/openedx.js +1 -1
- package/dist/tools/cli/transifex-utils.d.ts +2 -0
- package/dist/tools/cli/utils/ensureConfigFilenameOption.d.ts +2 -0
- package/dist/tools/cli/utils/formatter.d.ts +1 -0
- package/dist/tools/cli/utils/getResolvedConfigPath.d.ts +2 -0
- package/dist/tools/cli/utils/prettyPrintTitle.d.ts +1 -0
- package/dist/tools/cli/utils/printUsage.d.ts +1 -0
- package/dist/tools/config-helpers/createConfig.d.ts +2 -0
- package/dist/tools/config-helpers/createLintConfig.d.ts +2 -0
- package/dist/tools/config-helpers/getBaseConfig.d.ts +2 -0
- package/dist/tools/defaultConfigPaths.d.ts +8 -0
- package/dist/tools/eslint/base.eslint.config.d.ts +3 -0
- package/dist/tools/eslint.config.d.ts +3 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/jest/jest.config.d.ts +15 -0
- package/dist/tools/jest.config.d.ts +8 -0
- package/dist/tools/types.d.ts +18 -0
- package/{tools/dist → dist/tools}/typescript/tsconfig.json +2 -1
- package/dist/tools/webpack/common-config/all/getCodeRules.d.ts +2 -0
- package/dist/tools/webpack/common-config/all/getFileLoaderRules.d.ts +11 -0
- package/dist/tools/webpack/common-config/all/getImageMinimizer.d.ts +5 -0
- package/dist/tools/webpack/common-config/all/getStylesheetRule.d.ts +8 -0
- package/dist/tools/webpack/common-config/dev/getDevServer.d.ts +2 -0
- package/dist/tools/webpack/common-config/index.d.ts +6 -0
- package/dist/tools/webpack/common-config/site/getHtmlWebpackPlugin.d.ts +2 -0
- package/dist/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.d.ts +18 -0
- package/dist/tools/webpack/plugins/html-webpack-new-relic-plugin/index.d.ts +2 -0
- package/dist/tools/webpack/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.d.ts +1 -0
- package/dist/tools/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.d.ts +1 -0
- package/dist/tools/webpack/utils/getPublicPath.d.ts +1 -0
- package/dist/tools/webpack/utils/getResolvedSiteConfigPath.d.ts +1 -0
- package/dist/tools/webpack/webpack.config.build.d.ts +3 -0
- package/{config → dist/tools}/webpack/webpack.config.build.js +8 -5
- package/dist/tools/webpack/webpack.config.dev.d.ts +3 -0
- package/{tools/dist → dist/tools}/webpack/webpack.config.dev.js +8 -5
- package/dist/tools/webpack/webpack.config.dev.shell.d.ts +3 -0
- package/{tools/dist → dist/tools}/webpack/webpack.config.dev.shell.js +0 -4
- package/dist/types.d.ts +82 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +21 -16
- package/config/tsconfig.json +0 -32
- package/config/webpack/common-config/all/getIgnoreWarnings.js +0 -14
- package/config/webpack/utils/getLocalAliases.js +0 -65
- package/config/webpack/webpack.config.dev.js +0 -70
- package/config/webpack/webpack.config.dev.shell.js +0 -104
- package/runtime/__mocks__/file.js +0 -1
- package/runtime/__mocks__/svg.js +0 -1
- package/runtime/__mocks__/universal-cookie.js +0 -6
- package/runtime/analytics/MockAnalyticsService.js +0 -71
- package/runtime/analytics/SegmentAnalyticsService.js +0 -243
- package/runtime/analytics/index.ts +0 -12
- package/runtime/analytics/interface.test.js +0 -242
- package/runtime/auth/AxiosCsrfTokenService.js +0 -60
- package/runtime/auth/AxiosJwtAuthService.js +0 -363
- package/runtime/auth/AxiosJwtAuthService.test.jsx +0 -1076
- package/runtime/auth/AxiosJwtTokenService.js +0 -134
- package/runtime/auth/LocalForageCache.js +0 -76
- package/runtime/auth/MockAuthService.js +0 -278
- package/runtime/auth/index.ts +0 -19
- package/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js +0 -36
- package/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js +0 -37
- package/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js +0 -20
- package/runtime/auth/interceptors/createRetryInterceptor.js +0 -74
- package/runtime/auth/interceptors/createRetryInterceptor.test.js +0 -23
- package/runtime/auth/utils.js +0 -105
- package/runtime/config/getExternalLinkUrl.test.js +0 -76
- package/runtime/i18n/injectIntlWithShim.jsx +0 -48
- package/runtime/i18n/lib.test.js +0 -230
- package/runtime/i18n/lib.ts +0 -272
- package/runtime/index.ts +0 -139
- package/runtime/initialize.async.function.config.test.js +0 -43
- package/runtime/initialize.const.config.test.js +0 -41
- package/runtime/initialize.function.config.test.js +0 -41
- package/runtime/initialize.js +0 -352
- package/runtime/initialize.test.js +0 -356
- package/runtime/jest.config.js +0 -33
- package/runtime/logging/MockLoggingService.js +0 -31
- package/runtime/logging/NewRelicLoggingService.js +0 -184
- package/runtime/logging/NewRelicLoggingService.test.js +0 -214
- package/runtime/logging/types.ts +0 -4
- package/runtime/react/AuthenticatedPageRoute.test.jsx +0 -135
- package/runtime/react/CombinedAppProvider.tsx +0 -46
- package/runtime/react/CurrentAppProvider.tsx +0 -46
- package/runtime/react/Divider.tsx +0 -5
- package/runtime/react/ErrorBoundary.jsx +0 -47
- package/runtime/react/ErrorBoundary.test.jsx +0 -83
- package/runtime/react/ErrorPage.jsx +0 -72
- package/runtime/react/SiteProvider.test.jsx +0 -66
- package/runtime/react/SiteProvider.tsx +0 -101
- package/runtime/react/hooks/theme/useTheme.test.ts +0 -221
- package/runtime/react/hooks/theme/useTheme.ts +0 -179
- package/runtime/react/hooks/theme/useThemeConfig.test.ts +0 -107
- package/runtime/react/hooks/theme/useThemeCore.test.ts +0 -65
- package/runtime/react/hooks/theme/useThemeCore.ts +0 -52
- package/runtime/react/hooks/theme/useThemeVariants.test.ts +0 -97
- package/runtime/react/hooks/theme/useThemeVariants.ts +0 -116
- package/runtime/react/hooks/theme/useTrackColorSchemeChoice.test.ts +0 -54
- package/runtime/react/hooks/theme/useTrackColorSchemeChoice.ts +0 -30
- package/runtime/react/hooks/useActiveRouteRoleWatcher.ts +0 -31
- package/runtime/react/hooks/useAuthenticatedUser.test.tsx +0 -41
- package/runtime/react/hooks/useSiteConfig.test.tsx +0 -13
- package/runtime/react/reducers.ts +0 -40
- package/runtime/routing/utils.test.ts +0 -7
- package/runtime/routing/utils.ts +0 -34
- package/runtime/scripts/GoogleAnalyticsLoader.test.ts +0 -77
- package/runtime/scripts/GoogleAnalyticsLoader.ts +0 -59
- package/runtime/site.config.test.tsx +0 -33
- package/runtime/slots/Slot.test.tsx +0 -40
- package/runtime/slots/Slot.tsx +0 -32
- package/runtime/slots/SlotContext.tsx +0 -8
- package/runtime/slots/hooks.ts +0 -35
- package/runtime/slots/layout/DefaultSlotLayout.test.tsx +0 -31
- package/runtime/slots/layout/DefaultSlotLayout.tsx +0 -9
- package/runtime/slots/layout/hooks.test.tsx +0 -178
- package/runtime/slots/layout/hooks.ts +0 -65
- package/runtime/slots/layout/utils.test.ts +0 -67
- package/runtime/slots/layout/utils.ts +0 -14
- package/runtime/slots/utils.test.ts +0 -64
- package/runtime/slots/utils.ts +0 -78
- package/runtime/slots/widget/WidgetContext.tsx +0 -9
- package/runtime/slots/widget/WidgetProvider.tsx +0 -30
- package/runtime/slots/widget/hooks.ts +0 -105
- package/runtime/slots/widget/iframe/IFrameContentWrapper.messages.tsx +0 -16
- package/runtime/slots/widget/iframe/IFrameContentWrapper.tsx +0 -84
- package/runtime/slots/widget/iframe/IFrameWidget.tsx +0 -59
- package/runtime/slots/widget/iframe/hooks.ts +0 -179
- package/runtime/slots/widget/utils.tsx +0 -201
- package/runtime/testing/initializeMockApp.test.ts +0 -66
- package/runtime/testing/mockMessages.ts +0 -23
- package/runtime/utils.test.js +0 -116
- package/shell/DefaultLayout.tsx +0 -18
- package/shell/DefaultMain.tsx +0 -7
- package/shell/Logo.test.tsx +0 -32
- package/shell/Logo.tsx +0 -28
- package/shell/Shell.messages.ts +0 -61
- package/shell/Shell.tsx +0 -18
- package/shell/__mocks__/file.js +0 -1
- package/shell/__mocks__/svg.js +0 -1
- package/shell/__mocks__/universal-cookie.js +0 -6
- package/shell/app.ts +0 -38
- package/shell/dev/devFooter/app.tsx +0 -43
- package/shell/dev/devHeader/BarContext.tsx +0 -13
- package/shell/dev/devHeader/BarLink.tsx +0 -16
- package/shell/dev/devHeader/BarProvider.tsx +0 -25
- package/shell/dev/devHeader/CoursesLink.tsx +0 -16
- package/shell/dev/devHeader/FooContext.tsx +0 -13
- package/shell/dev/devHeader/FooLink.tsx +0 -16
- package/shell/dev/devHeader/FooProvider.tsx +0 -25
- package/shell/dev/devHeader/app.tsx +0 -53
- package/shell/dev/devHeader/providers.tsx +0 -11
- package/shell/dev/devHome/HomePage.tsx +0 -28
- package/shell/dev/devHome/app.ts +0 -18
- package/shell/dev/devHome/i18n/index.ts +0 -27
- package/shell/dev/devHome/messages.ts +0 -11
- package/shell/dev/devUser/app.tsx +0 -24
- package/shell/dev/slotShowcase/HorizontalSlotLayout.tsx +0 -11
- package/shell/dev/slotShowcase/LayoutWithOptions.tsx +0 -17
- package/shell/dev/slotShowcase/SlotShowcasePage.tsx +0 -66
- package/shell/dev/slotShowcase/WidgetWithOptions.tsx +0 -11
- package/shell/dev/slotShowcase/app.tsx +0 -373
- package/shell/footer/CenterLinks.tsx +0 -11
- package/shell/footer/CopyrightNotice.tsx +0 -36
- package/shell/footer/Footer.tsx +0 -34
- package/shell/footer/LabeledLinkColumn.tsx +0 -19
- package/shell/footer/LanguageMenu.tsx +0 -35
- package/shell/footer/LanguageMenuItem.tsx +0 -23
- package/shell/footer/LeftLinks.tsx +0 -11
- package/shell/footer/LegalNotices.tsx +0 -17
- package/shell/footer/PoweredBy.tsx +0 -17
- package/shell/footer/RevealLinks.tsx +0 -43
- package/shell/footer/RightLinks.tsx +0 -11
- package/shell/footer/app.tsx +0 -73
- package/shell/footer/data/api.ts +0 -48
- package/shell/header/AuthenticatedMenu.tsx +0 -32
- package/shell/header/Header.tsx +0 -17
- package/shell/header/anonymous-menu/AnonymousMenu.tsx +0 -14
- package/shell/header/anonymous-menu/LoginButton.tsx +0 -14
- package/shell/header/anonymous-menu/RegisterButton.tsx +0 -15
- package/shell/header/app.tsx +0 -142
- package/shell/header/desktop/DesktopLayout.tsx +0 -22
- package/shell/header/desktop/PrimaryNavLinks.tsx +0 -10
- package/shell/header/desktop/SecondaryNavLinks.tsx +0 -10
- package/shell/header/mobile/MobileLayout.tsx +0 -47
- package/shell/header/mobile/MobileNavLinks.tsx +0 -10
- package/shell/i18n/index.ts +0 -25
- package/shell/jest.config.js +0 -31
- package/shell/menus/LinkMenuItem.tsx +0 -64
- package/shell/menus/NavDropdownMenuSlot.tsx +0 -29
- package/shell/menus/ProfileLinkMenuItem.tsx +0 -33
- package/shell/menus/data/utils.ts +0 -19
- package/shell/public/index.html +0 -10
- package/shell/router/createRouter.test.tsx +0 -50
- package/shell/router/getAppRoutes.test.tsx +0 -59
- package/shell/router/getAppRoutes.ts +0 -21
- package/shell/site.config.dev.tsx +0 -49
- package/shell/site.config.test.tsx +0 -16
- package/shell/site.tsx +0 -41
- package/tools/dist/babel/babel.config.js +0 -28
- package/tools/dist/config-helpers/createConfig.js +0 -13
- package/tools/dist/config-helpers/createLintConfig.js +0 -16
- package/tools/dist/config-helpers/getBaseConfig.js +0 -12
- package/tools/dist/defaultConfigPaths.js +0 -35
- package/tools/dist/eslint/base.eslint.config.js +0 -113
- package/tools/dist/index.js +0 -12
- package/tools/dist/types.js +0 -23
- package/tools/dist/webpack/common-config/all/getCodeRules.js +0 -52
- package/tools/dist/webpack/common-config/all/getFileLoaderRules.js +0 -26
- package/tools/dist/webpack/common-config/all/getIgnoreWarnings.js +0 -14
- package/tools/dist/webpack/common-config/all/getImageMinimizer.js +0 -25
- package/tools/dist/webpack/common-config/all/getStylesheetRule.js +0 -112
- package/tools/dist/webpack/common-config/dev/getDevServer.js +0 -38
- package/tools/dist/webpack/common-config/index.js +0 -18
- package/tools/dist/webpack/common-config/site/getHtmlWebpackPlugin.js +0 -16
- package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js +0 -91
- package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/index.js +0 -7
- package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js +0 -66
- package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +0 -3
- package/tools/dist/webpack/utils/getLocalAliases.js +0 -65
- package/tools/dist/webpack/utils/getPublicPath.js +0 -6
- package/tools/dist/webpack/utils/getResolvedSiteConfigPath.js +0 -32
- package/tools/dist/webpack/webpack.config.build.js +0 -70
- package/types.ts +0 -119
- /package/{runtime/react/hooks/theme/index.ts → dist/runtime/react/hooks/theme/index.d.ts} +0 -0
- /package/{runtime/routing/index.ts → dist/runtime/routing/index.d.ts} +0 -0
- /package/{runtime/scripts/index.ts → dist/runtime/scripts/index.d.ts} +0 -0
- /package/{runtime/slots/index.ts → dist/runtime/slots/index.d.ts} +0 -0
- /package/{runtime/slots/layout/index.ts → dist/runtime/slots/layout/index.d.ts} +0 -0
- /package/{runtime/slots/widget/index.ts → dist/runtime/slots/widget/index.d.ts} +0 -0
- /package/{shell → dist/shell}/app.scss +0 -0
- /package/{shell/dev/devFooter/index.ts → dist/shell/dev/devFooter/index.d.ts} +0 -0
- /package/{shell/dev/devHeader/index.ts → dist/shell/dev/devHeader/index.d.ts} +0 -0
- /package/{shell/dev/devHome/index.ts → dist/shell/dev/devHome/index.d.ts} +0 -0
- /package/{shell/dev/devUser/index.ts → dist/shell/dev/devUser/index.d.ts} +0 -0
- /package/{shell/dev/index.ts → dist/shell/dev/index.d.ts} +0 -0
- /package/{shell/dev/slotShowcase/index.ts → dist/shell/dev/slotShowcase/index.d.ts} +0 -0
- /package/{shell/footer/index.ts → dist/shell/footer/index.d.ts} +0 -0
- /package/{shell/header/index.ts → dist/shell/header/index.d.ts} +0 -0
- /package/{shell/index.ts → dist/shell/index.d.ts} +0 -0
- /package/{config → dist/tools}/babel/babel.config.js +0 -0
- /package/{tools/dist → dist/tools}/cli/commands/serve.js +0 -0
- /package/{tools/dist → dist/tools}/cli/intl-imports.js +0 -0
- /package/{tools/dist → dist/tools}/cli/intl-imports.test.js +0 -0
- /package/{tools/dist → dist/tools}/cli/transifex-utils.js +0 -0
- /package/{tools/dist → dist/tools}/cli/utils/ensureConfigFilenameOption.js +0 -0
- /package/{tools/dist → dist/tools}/cli/utils/formatter.js +0 -0
- /package/{tools/dist → dist/tools}/cli/utils/getResolvedConfigPath.js +0 -0
- /package/{tools/dist → dist/tools}/cli/utils/prettyPrintTitle.js +0 -0
- /package/{tools/dist → dist/tools}/cli/utils/printUsage.js +0 -0
- /package/{config → dist/tools}/config-helpers/createConfig.js +0 -0
- /package/{config → dist/tools}/config-helpers/createLintConfig.js +0 -0
- /package/{config → dist/tools}/config-helpers/getBaseConfig.js +0 -0
- /package/{config → dist/tools}/defaultConfigPaths.js +0 -0
- /package/{config → dist/tools}/eslint/base.eslint.config.js +0 -0
- /package/{tools/dist → dist/tools}/eslint.config.js +0 -0
- /package/{config → dist/tools}/index.js +0 -0
- /package/{config → dist/tools}/jest/jest.config.js +0 -0
- /package/{tools/dist → dist/tools}/jest.config.js +0 -0
- /package/{config → dist/tools}/types.js +0 -0
- /package/{config → dist/tools}/webpack/common-config/all/getCodeRules.js +0 -0
- /package/{config → dist/tools}/webpack/common-config/all/getFileLoaderRules.js +0 -0
- /package/{config → dist/tools}/webpack/common-config/all/getImageMinimizer.js +0 -0
- /package/{config → dist/tools}/webpack/common-config/all/getStylesheetRule.js +0 -0
- /package/{config → dist/tools}/webpack/common-config/dev/getDevServer.js +0 -0
- /package/{config → dist/tools}/webpack/common-config/index.js +0 -0
- /package/{config → dist/tools}/webpack/common-config/site/getHtmlWebpackPlugin.js +0 -0
- /package/{config → dist/tools}/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js +0 -0
- /package/{config → dist/tools}/webpack/plugins/html-webpack-new-relic-plugin/index.js +0 -0
- /package/{config → dist/tools}/webpack/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js +0 -0
- /package/{config → dist/tools}/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +0 -0
- /package/{config → dist/tools}/webpack/utils/getPublicPath.js +0 -0
- /package/{config → dist/tools}/webpack/utils/getResolvedSiteConfigPath.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../runtime/analytics/interface.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,MAAM,YAAY,GAAG;IACnB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;IACnC,UAAU,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;IAC9E,cAAc,EAAE,SAAS,CAAC,KAAK,CAAC;QAC9B,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;QACnC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;KACnC,CAAC,CAAC,UAAU;CACd,CAAC;AAEF,MAAM,YAAY,GAAG;IACnB,oBAAoB,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;IAC/C,yBAAyB,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;IACpD,qBAAqB,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;IAChD,cAAc,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;IACzC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;CACzC,CAAC;AAEF,IAAI,OAAO,CAAC;AAEZ;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,gBAAgB,EAAE,OAAO;IAC1D,SAAS,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IACzE,OAAO,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,SAAS,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAChF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAS,EAAE,UAAU;IACxD,OAAO,OAAO,CAAC,oBAAoB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAM,EAAE,MAAM;IACtD,OAAO,CAAC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAM;IAC1C,OAAO,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,SAAS,EAAE,UAAU;IAClD,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU;IACtD,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC;AAED;;;;;;;;;GASG","sourcesContent":["/**\n * #### Import members from **@openedx/frontend-base** Analytics\n *\n * Contains a shared interface for tracking events. Has a default implementation of\n * SegmentAnalyticsService, which supports Segment and the Tracking Log API (hosted in LMS).\n *\n * The `initialize` function performs much of the analytics configuration for you. If, however,\n * you're not using the `initialize` function, analytics can be configured via:\n *\n * ```\n * import {\n * getSiteConfig,\n * getAuthenticatedHttpClient,\n * getLoggingService,\n * configureAnalytics,\n * SegmentAnalyticsService\n * } from '@openedx/frontend-base';\n *\n * configureAnalytics(SegmentAnalyticsService, {\n * config: getSiteConfig(),\n * loggingService: getLoggingService(),\n * httpClient: getAuthenticatedHttpClient(),\n * });\n * ```\n *\n * As shown in this example, analytics depends on the configuration document, logging, and having\n * an authenticated HTTP client.\n *\n * @module Analytics\n */\nimport PropTypes from 'prop-types';\n\nconst optionsShape = {\n config: PropTypes.object.isRequired,\n httpClient: PropTypes.oneOfType([PropTypes.func, PropTypes.object]).isRequired,\n loggingService: PropTypes.shape({\n logError: PropTypes.func.isRequired,\n logInfo: PropTypes.func.isRequired,\n }).isRequired,\n};\n\nconst serviceShape = {\n sendTrackingLogEvent: PropTypes.func.isRequired,\n identifyAuthenticatedUser: PropTypes.func.isRequired,\n identifyAnonymousUser: PropTypes.func.isRequired,\n sendTrackEvent: PropTypes.func.isRequired,\n sendPageEvent: PropTypes.func.isRequired,\n};\n\nlet service;\n\n/**\n *\n * @param {class} AnalyticsService\n * @param {*} options\n * @returns {AnalyticsService}\n */\nexport function configureAnalytics(AnalyticsService, options) {\n PropTypes.checkPropTypes(optionsShape, options, 'property', 'Analytics');\n service = new AnalyticsService(options);\n PropTypes.checkPropTypes(serviceShape, service, 'property', 'AnalyticsService');\n return service;\n}\n\n/**\n *\n * @param {*} eventName\n * @param {*} properties\n * @returns {Promise}\n */\nexport function sendTrackingLogEvent(eventName, properties) {\n return service.sendTrackingLogEvent(eventName, properties);\n}\n\n/**\n *\n *\n * @param {*} userId\n * @param {*} traits\n */\nexport function identifyAuthenticatedUser(userId, traits) {\n service.identifyAuthenticatedUser(userId, traits);\n}\n\n/**\n *\n *\n * @param {*} traits\n * @returns {Promise}\n */\nexport function identifyAnonymousUser(traits) {\n return service.identifyAnonymousUser(traits);\n}\n\n/**\n *\n *\n * @param {*} eventName\n * @param {*} properties\n */\nexport function sendTrackEvent(eventName, properties) {\n service.sendTrackEvent(eventName, properties);\n}\n\n/**\n *\n *\n * @param {*} category\n * @param {*} name\n * @param {*} properties\n */\nexport function sendPageEvent(category, name, properties) {\n service.sendPageEvent(category, name, properties);\n}\n\n/**\n *\n *\n * @returns {AnalyticsService}\n */\nexport function getAnalyticsService() {\n if (!service) {\n throw Error('You must first configure the analytics service.');\n }\n\n return service;\n}\n\n/**\n *\n */\nexport function resetAnalyticsService() {\n service = null;\n}\n\n/**\n * @name AnalyticsService\n * @interface\n * @memberof module:Analytics\n * @property {function} identifyAnonymousUser\n * @property {function} identifyAuthenticatedUser\n * @property {function} sendPageEvent\n * @property {function} sendTrackEvent\n * @property {function} sendTrackingLogEvent\n */\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export default class AxiosCsrfTokenService {
|
|
2
|
+
constructor(csrfTokenApiPath: any);
|
|
3
|
+
csrfTokenApiPath: any;
|
|
4
|
+
httpClient: import("axios").AxiosInstance;
|
|
5
|
+
csrfTokenCache: {};
|
|
6
|
+
csrfTokenRequestPromises: {};
|
|
7
|
+
getCsrfToken(url: any): Promise<any>;
|
|
8
|
+
clearCsrfTokenCache(): void;
|
|
9
|
+
getHttpClient(): import("axios").AxiosInstance;
|
|
10
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import axios from 'axios';
|
|
11
|
+
import { getUrlParts, processAxiosErrorAndThrow } from './utils';
|
|
12
|
+
export default class AxiosCsrfTokenService {
|
|
13
|
+
constructor(csrfTokenApiPath) {
|
|
14
|
+
this.csrfTokenApiPath = csrfTokenApiPath;
|
|
15
|
+
this.httpClient = axios.create();
|
|
16
|
+
// Set withCredentials to true. Enables cross-site Access-Control requests
|
|
17
|
+
// to be made using cookies, authorization headers or TLS client
|
|
18
|
+
// certificates. More on MDN:
|
|
19
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials
|
|
20
|
+
this.httpClient.defaults.withCredentials = true;
|
|
21
|
+
this.httpClient.defaults.headers['USE-JWT-COOKIE'] = true;
|
|
22
|
+
this.csrfTokenCache = {};
|
|
23
|
+
this.csrfTokenRequestPromises = {};
|
|
24
|
+
}
|
|
25
|
+
getCsrfToken(url) {
|
|
26
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
+
let urlParts;
|
|
28
|
+
try {
|
|
29
|
+
urlParts = getUrlParts(url);
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
// If the url is not parsable it's likely because a relative
|
|
33
|
+
// path was supplied as the url. This is acceptable and in
|
|
34
|
+
// this case we should use the current origin of the page.
|
|
35
|
+
urlParts = getUrlParts(global.location.origin);
|
|
36
|
+
}
|
|
37
|
+
const { protocol, domain } = urlParts;
|
|
38
|
+
const csrfToken = this.csrfTokenCache[domain];
|
|
39
|
+
if (csrfToken) {
|
|
40
|
+
return csrfToken;
|
|
41
|
+
}
|
|
42
|
+
if (!this.csrfTokenRequestPromises[domain]) {
|
|
43
|
+
this.csrfTokenRequestPromises[domain] = this.httpClient
|
|
44
|
+
.get(`${protocol}://${domain}${this.csrfTokenApiPath}`)
|
|
45
|
+
.then((response) => {
|
|
46
|
+
this.csrfTokenCache[domain] = response.data.csrfToken;
|
|
47
|
+
return this.csrfTokenCache[domain];
|
|
48
|
+
})
|
|
49
|
+
.catch(processAxiosErrorAndThrow)
|
|
50
|
+
.finally(() => {
|
|
51
|
+
delete this.csrfTokenRequestPromises[domain];
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return this.csrfTokenRequestPromises[domain];
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
clearCsrfTokenCache() {
|
|
58
|
+
this.csrfTokenCache = {};
|
|
59
|
+
}
|
|
60
|
+
getHttpClient() {
|
|
61
|
+
return this.httpClient;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=AxiosCsrfTokenService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AxiosCsrfTokenService.js","sourceRoot":"","sources":["../../../runtime/auth/AxiosCsrfTokenService.js"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAEjE,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACxC,YAAY,gBAAgB;QAC1B,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,0EAA0E;QAC1E,gEAAgE;QAChE,6BAA6B;QAC7B,kFAAkF;QAClF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;QAE1D,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC;IACrC,CAAC;IAEK,YAAY,CAAC,GAAG;;YACpB,IAAI,QAAQ,CAAC;YACb,IAAI,CAAC;gBACH,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,4DAA4D;gBAC5D,0DAA0D;gBAC1D,0DAA0D;gBAC1D,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAE9C,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU;qBACpD,GAAG,CAAC,GAAG,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;qBACtD,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACjB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;oBACtD,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBACrC,CAAC,CAAC;qBACD,KAAK,CAAC,yBAAyB,CAAC;qBAChC,OAAO,CAAC,GAAG,EAAE;oBACZ,OAAO,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;gBAC/C,CAAC,CAAC,CAAC;YACP,CAAC;YAED,OAAO,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;KAAA;IAED,mBAAmB;QACjB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF","sourcesContent":["import axios from 'axios';\nimport { getUrlParts, processAxiosErrorAndThrow } from './utils';\n\nexport default class AxiosCsrfTokenService {\n constructor(csrfTokenApiPath) {\n this.csrfTokenApiPath = csrfTokenApiPath;\n this.httpClient = axios.create();\n // Set withCredentials to true. Enables cross-site Access-Control requests\n // to be made using cookies, authorization headers or TLS client\n // certificates. More on MDN:\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials\n this.httpClient.defaults.withCredentials = true;\n this.httpClient.defaults.headers['USE-JWT-COOKIE'] = true;\n\n this.csrfTokenCache = {};\n this.csrfTokenRequestPromises = {};\n }\n\n async getCsrfToken(url) {\n let urlParts;\n try {\n urlParts = getUrlParts(url);\n } catch (e) {\n // If the url is not parsable it's likely because a relative\n // path was supplied as the url. This is acceptable and in\n // this case we should use the current origin of the page.\n urlParts = getUrlParts(global.location.origin);\n }\n\n const { protocol, domain } = urlParts;\n const csrfToken = this.csrfTokenCache[domain];\n\n if (csrfToken) {\n return csrfToken;\n }\n\n if (!this.csrfTokenRequestPromises[domain]) {\n this.csrfTokenRequestPromises[domain] = this.httpClient\n .get(`${protocol}://${domain}${this.csrfTokenApiPath}`)\n .then((response) => {\n this.csrfTokenCache[domain] = response.data.csrfToken;\n return this.csrfTokenCache[domain];\n })\n .catch(processAxiosErrorAndThrow)\n .finally(() => {\n delete this.csrfTokenRequestPromises[domain];\n });\n }\n\n return this.csrfTokenRequestPromises[domain];\n }\n\n clearCsrfTokenCache() {\n this.csrfTokenCache = {};\n }\n\n getHttpClient() {\n return this.httpClient;\n }\n}\n"]}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
export default AxiosJwtAuthService;
|
|
2
|
+
/**
|
|
3
|
+
* @implements {AuthService}
|
|
4
|
+
* @memberof module:Auth
|
|
5
|
+
*/
|
|
6
|
+
declare class AxiosJwtAuthService implements AuthService {
|
|
7
|
+
/**
|
|
8
|
+
* @param {Object} options
|
|
9
|
+
* @param {Object} options.config
|
|
10
|
+
* @param {string} options.config.baseUrl
|
|
11
|
+
* @param {string} options.config.lmsBaseUrl
|
|
12
|
+
* @param {string} options.config.loginUrl
|
|
13
|
+
* @param {string} options.config.logoutUrl
|
|
14
|
+
* @param {string} options.config.refreshAccessTokenApiPath
|
|
15
|
+
* @param {string} options.config.accessTokenCookieName
|
|
16
|
+
* @param {string} options.config.csrfTokenApiPath
|
|
17
|
+
* @param {Object} options.loggingService requires logError and logInfo methods
|
|
18
|
+
*/
|
|
19
|
+
constructor(options: {
|
|
20
|
+
config: {
|
|
21
|
+
baseUrl: string;
|
|
22
|
+
lmsBaseUrl: string;
|
|
23
|
+
loginUrl: string;
|
|
24
|
+
logoutUrl: string;
|
|
25
|
+
refreshAccessTokenApiPath: string;
|
|
26
|
+
accessTokenCookieName: string;
|
|
27
|
+
csrfTokenApiPath: string;
|
|
28
|
+
};
|
|
29
|
+
loggingService: any;
|
|
30
|
+
});
|
|
31
|
+
authenticatedHttpClient: HttpClient;
|
|
32
|
+
httpClient: import("axios").AxiosInstance;
|
|
33
|
+
cachedAuthenticatedHttpClient: any;
|
|
34
|
+
cachedHttpClient: any;
|
|
35
|
+
authenticatedUser: any;
|
|
36
|
+
config: {
|
|
37
|
+
baseUrl: string;
|
|
38
|
+
lmsBaseUrl: string;
|
|
39
|
+
loginUrl: string;
|
|
40
|
+
logoutUrl: string;
|
|
41
|
+
refreshAccessTokenApiPath: string;
|
|
42
|
+
accessTokenCookieName: string;
|
|
43
|
+
csrfTokenApiPath: string;
|
|
44
|
+
};
|
|
45
|
+
loggingService: any;
|
|
46
|
+
jwtTokenService: AxiosJwtTokenService;
|
|
47
|
+
csrfTokenService: AxiosCsrfTokenService;
|
|
48
|
+
middleware: any;
|
|
49
|
+
/**
|
|
50
|
+
* Applies middleware to the axios instances in this service.
|
|
51
|
+
*
|
|
52
|
+
* @param {Array} middleware Middleware to apply.
|
|
53
|
+
*/
|
|
54
|
+
applyMiddleware(middleware?: any[]): void;
|
|
55
|
+
/**
|
|
56
|
+
* Gets the authenticated HTTP client for the service. This is an axios instance.
|
|
57
|
+
*
|
|
58
|
+
* @param {Object} [options] Optional options for how the HTTP client should be configured.
|
|
59
|
+
* @param {boolean} [options.useCache] Whether to use front end caching for all requests made
|
|
60
|
+
* with the returned client.
|
|
61
|
+
*
|
|
62
|
+
* @returns {HttpClient} A configured axios http client which can be used for authenticated
|
|
63
|
+
* requests.
|
|
64
|
+
*/
|
|
65
|
+
getAuthenticatedHttpClient(options?: {
|
|
66
|
+
useCache?: boolean | undefined;
|
|
67
|
+
}): HttpClient;
|
|
68
|
+
/**
|
|
69
|
+
* Gets the unauthenticated HTTP client for the service. This is an axios instance.
|
|
70
|
+
*
|
|
71
|
+
* @param {Object} [options] Optional options for how the HTTP client should be configured.
|
|
72
|
+
* @param {boolean} [options.useCache] Whether to use front end caching for all requests made
|
|
73
|
+
* with the returned client.
|
|
74
|
+
* @returns {HttpClient} A configured axios http client.
|
|
75
|
+
*/
|
|
76
|
+
getHttpClient(options?: {
|
|
77
|
+
useCache?: boolean | undefined;
|
|
78
|
+
}): HttpClient;
|
|
79
|
+
/**
|
|
80
|
+
* Used primarily for testing.
|
|
81
|
+
*
|
|
82
|
+
* @ignore
|
|
83
|
+
*/
|
|
84
|
+
getJwtTokenService(): AxiosJwtTokenService;
|
|
85
|
+
/**
|
|
86
|
+
* Used primarily for testing.
|
|
87
|
+
*
|
|
88
|
+
* @ignore
|
|
89
|
+
*/
|
|
90
|
+
getCsrfTokenService(): AxiosCsrfTokenService;
|
|
91
|
+
/**
|
|
92
|
+
* Builds a URL to the login page with a post-login redirect URL attached as a query parameter.
|
|
93
|
+
*
|
|
94
|
+
* ```
|
|
95
|
+
* const url = getLoginRedirectUrl('http://localhost/mypage');
|
|
96
|
+
* console.log(url); // http://localhost/login?next=http%3A%2F%2Flocalhost%2Fmypage
|
|
97
|
+
* ```
|
|
98
|
+
*
|
|
99
|
+
* @param {string} redirectUrl The URL the user should be redirected to after logging in.
|
|
100
|
+
*/
|
|
101
|
+
getLoginRedirectUrl(redirectUrl?: string): string;
|
|
102
|
+
/**
|
|
103
|
+
* Redirects the user to the login page.
|
|
104
|
+
*
|
|
105
|
+
* @param {string} redirectUrl The URL the user should be redirected to after logging in.
|
|
106
|
+
*/
|
|
107
|
+
redirectToLogin(redirectUrl?: string): void;
|
|
108
|
+
/**
|
|
109
|
+
* Builds a URL to the logout page with a post-logout redirect URL attached as a query parameter.
|
|
110
|
+
*
|
|
111
|
+
* ```
|
|
112
|
+
* const url = getLogoutRedirectUrl('http://localhost/mypage');
|
|
113
|
+
* console.log(url); // http://localhost/logout?next=http%3A%2F%2Flocalhost%2Fmypage
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* @param {string} redirectUrl The URL the user should be redirected to after logging out.
|
|
117
|
+
*/
|
|
118
|
+
getLogoutRedirectUrl(redirectUrl?: string): string;
|
|
119
|
+
/**
|
|
120
|
+
* Redirects the user to the logout page.
|
|
121
|
+
*
|
|
122
|
+
* @param {string} redirectUrl The URL the user should be redirected to after logging out.
|
|
123
|
+
*/
|
|
124
|
+
redirectToLogout(redirectUrl?: string): void;
|
|
125
|
+
/**
|
|
126
|
+
* If it exists, returns the user data representing the currently authenticated user. If the
|
|
127
|
+
* user is anonymous, returns null.
|
|
128
|
+
*
|
|
129
|
+
* @returns {UserData|null}
|
|
130
|
+
*/
|
|
131
|
+
getAuthenticatedUser(): UserData | null;
|
|
132
|
+
/**
|
|
133
|
+
* Sets the authenticated user to the provided value.
|
|
134
|
+
*
|
|
135
|
+
* @param {UserData} authUser
|
|
136
|
+
*/
|
|
137
|
+
setAuthenticatedUser(authUser: UserData): void;
|
|
138
|
+
/**
|
|
139
|
+
* Reads the authenticated user's access token. Resolves to null if the user is
|
|
140
|
+
* unauthenticated.
|
|
141
|
+
*
|
|
142
|
+
* @returns {Promise<UserData>|Promise<null>} Resolves to the user's access token if they are
|
|
143
|
+
* logged in.
|
|
144
|
+
*/
|
|
145
|
+
fetchAuthenticatedUser(options?: {}): Promise<UserData> | Promise<null>;
|
|
146
|
+
/**
|
|
147
|
+
* Ensures a user is authenticated. It will redirect to login when not
|
|
148
|
+
* authenticated.
|
|
149
|
+
*
|
|
150
|
+
* @param {string} [redirectUrl=config.baseUrl] to return user after login when not
|
|
151
|
+
* authenticated.
|
|
152
|
+
* @returns {Promise<UserData>}
|
|
153
|
+
*/
|
|
154
|
+
ensureAuthenticatedUser(redirectUrl?: string): Promise<UserData>;
|
|
155
|
+
/**
|
|
156
|
+
* Fetches additional user account information for the authenticated user and merges it into the
|
|
157
|
+
* existing authenticatedUser object, available via getAuthenticatedUser().
|
|
158
|
+
*
|
|
159
|
+
* ```
|
|
160
|
+
* console.log(authenticatedUser); // Will be sparse and only contain basic information.
|
|
161
|
+
* await hydrateAuthenticatedUser()
|
|
162
|
+
* const authenticatedUser = getAuthenticatedUser();
|
|
163
|
+
* console.log(authenticatedUser); // Will contain additional user information
|
|
164
|
+
* ```
|
|
165
|
+
*
|
|
166
|
+
* @returns {Promise<null>}
|
|
167
|
+
*/
|
|
168
|
+
hydrateAuthenticatedUser(): Promise<null>;
|
|
169
|
+
/**
|
|
170
|
+
* Adds authentication defaults and interceptors to an HTTP client instance.
|
|
171
|
+
*
|
|
172
|
+
* @param {HttpClient} newHttpClient
|
|
173
|
+
* @param {Object} config
|
|
174
|
+
* @param {string} [config.refreshAccessTokenApiPath]
|
|
175
|
+
* @param {string} [config.accessTokenCookieName]
|
|
176
|
+
* @param {string} [config.csrfTokenApiPath]
|
|
177
|
+
* @returns {HttpClient} A configured Axios HTTP client.
|
|
178
|
+
*/
|
|
179
|
+
addAuthenticationToHttpClient(newHttpClient: HttpClient): HttpClient;
|
|
180
|
+
}
|
|
181
|
+
import AxiosJwtTokenService from './AxiosJwtTokenService';
|
|
182
|
+
import AxiosCsrfTokenService from './AxiosCsrfTokenService';
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import axios from 'axios';
|
|
11
|
+
import PropTypes from 'prop-types';
|
|
12
|
+
import { camelCaseObject } from '../utils';
|
|
13
|
+
import AxiosCsrfTokenService from './AxiosCsrfTokenService';
|
|
14
|
+
import AxiosJwtTokenService from './AxiosJwtTokenService';
|
|
15
|
+
import createCsrfTokenProviderInterceptor from './interceptors/createCsrfTokenProviderInterceptor';
|
|
16
|
+
import createJwtTokenProviderInterceptor from './interceptors/createJwtTokenProviderInterceptor';
|
|
17
|
+
import createProcessAxiosRequestErrorInterceptor from './interceptors/createProcessAxiosRequestErrorInterceptor';
|
|
18
|
+
import configureCache from './LocalForageCache';
|
|
19
|
+
import { logFrontendAuthError } from './utils';
|
|
20
|
+
const optionsPropTypes = {
|
|
21
|
+
config: PropTypes.shape({
|
|
22
|
+
baseUrl: PropTypes.string.isRequired,
|
|
23
|
+
lmsBaseUrl: PropTypes.string.isRequired,
|
|
24
|
+
loginUrl: PropTypes.string.isRequired,
|
|
25
|
+
logoutUrl: PropTypes.string.isRequired,
|
|
26
|
+
refreshAccessTokenApiPath: PropTypes.string.isRequired,
|
|
27
|
+
accessTokenCookieName: PropTypes.string.isRequired,
|
|
28
|
+
csrfTokenApiPath: PropTypes.string.isRequired,
|
|
29
|
+
}).isRequired,
|
|
30
|
+
loggingService: PropTypes.shape({
|
|
31
|
+
logError: PropTypes.func.isRequired,
|
|
32
|
+
logInfo: PropTypes.func.isRequired,
|
|
33
|
+
}).isRequired,
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* @implements {AuthService}
|
|
37
|
+
* @memberof module:Auth
|
|
38
|
+
*/
|
|
39
|
+
class AxiosJwtAuthService {
|
|
40
|
+
/**
|
|
41
|
+
* @param {Object} options
|
|
42
|
+
* @param {Object} options.config
|
|
43
|
+
* @param {string} options.config.baseUrl
|
|
44
|
+
* @param {string} options.config.lmsBaseUrl
|
|
45
|
+
* @param {string} options.config.loginUrl
|
|
46
|
+
* @param {string} options.config.logoutUrl
|
|
47
|
+
* @param {string} options.config.refreshAccessTokenApiPath
|
|
48
|
+
* @param {string} options.config.accessTokenCookieName
|
|
49
|
+
* @param {string} options.config.csrfTokenApiPath
|
|
50
|
+
* @param {Object} options.loggingService requires logError and logInfo methods
|
|
51
|
+
*/
|
|
52
|
+
constructor(options) {
|
|
53
|
+
this.authenticatedHttpClient = null;
|
|
54
|
+
this.httpClient = null;
|
|
55
|
+
this.cachedAuthenticatedHttpClient = null;
|
|
56
|
+
this.cachedHttpClient = null;
|
|
57
|
+
this.authenticatedUser = null;
|
|
58
|
+
PropTypes.checkPropTypes(optionsPropTypes, options, 'options', 'AuthService');
|
|
59
|
+
this.config = options.config;
|
|
60
|
+
this.loggingService = options.loggingService;
|
|
61
|
+
this.jwtTokenService = new AxiosJwtTokenService(this.loggingService, this.config.accessTokenCookieName, this.config.lmsBaseUrl, this.config.refreshAccessTokenApiPath);
|
|
62
|
+
this.csrfTokenService = new AxiosCsrfTokenService(this.config.csrfTokenApiPath);
|
|
63
|
+
this.authenticatedHttpClient = this.addAuthenticationToHttpClient(axios.create());
|
|
64
|
+
this.httpClient = axios.create();
|
|
65
|
+
configureCache()
|
|
66
|
+
.then((cachedAxiosClient) => {
|
|
67
|
+
this.cachedAuthenticatedHttpClient = this.addAuthenticationToHttpClient(cachedAxiosClient);
|
|
68
|
+
this.cachedHttpClient = cachedAxiosClient;
|
|
69
|
+
})
|
|
70
|
+
.catch((e) => {
|
|
71
|
+
// fallback to non-cached HTTP clients and log error
|
|
72
|
+
this.cachedAuthenticatedHttpClient = this.authenticatedHttpClient;
|
|
73
|
+
this.cachedHttpClient = this.httpClient;
|
|
74
|
+
logFrontendAuthError(this.loggingService, `configureCache failed with error: ${e.message}`);
|
|
75
|
+
}).finally(() => {
|
|
76
|
+
this.middleware = options.middleware;
|
|
77
|
+
this.applyMiddleware(options.middleware);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Applies middleware to the axios instances in this service.
|
|
82
|
+
*
|
|
83
|
+
* @param {Array} middleware Middleware to apply.
|
|
84
|
+
*/
|
|
85
|
+
applyMiddleware(middleware = []) {
|
|
86
|
+
const clients = [
|
|
87
|
+
this.authenticatedHttpClient, this.httpClient,
|
|
88
|
+
this.cachedAuthenticatedHttpClient, this.cachedHttpClient,
|
|
89
|
+
];
|
|
90
|
+
try {
|
|
91
|
+
(middleware).forEach((middlewareFn) => {
|
|
92
|
+
clients.forEach((client) => client && middlewareFn(client));
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
logFrontendAuthError(this.loggingService, error);
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Gets the authenticated HTTP client for the service. This is an axios instance.
|
|
102
|
+
*
|
|
103
|
+
* @param {Object} [options] Optional options for how the HTTP client should be configured.
|
|
104
|
+
* @param {boolean} [options.useCache] Whether to use front end caching for all requests made
|
|
105
|
+
* with the returned client.
|
|
106
|
+
*
|
|
107
|
+
* @returns {HttpClient} A configured axios http client which can be used for authenticated
|
|
108
|
+
* requests.
|
|
109
|
+
*/
|
|
110
|
+
getAuthenticatedHttpClient(options = {}) {
|
|
111
|
+
if (options.useCache) {
|
|
112
|
+
return this.cachedAuthenticatedHttpClient;
|
|
113
|
+
}
|
|
114
|
+
return this.authenticatedHttpClient;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Gets the unauthenticated HTTP client for the service. This is an axios instance.
|
|
118
|
+
*
|
|
119
|
+
* @param {Object} [options] Optional options for how the HTTP client should be configured.
|
|
120
|
+
* @param {boolean} [options.useCache] Whether to use front end caching for all requests made
|
|
121
|
+
* with the returned client.
|
|
122
|
+
* @returns {HttpClient} A configured axios http client.
|
|
123
|
+
*/
|
|
124
|
+
getHttpClient(options = {}) {
|
|
125
|
+
if (options.useCache) {
|
|
126
|
+
return this.cachedHttpClient;
|
|
127
|
+
}
|
|
128
|
+
return this.httpClient;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Used primarily for testing.
|
|
132
|
+
*
|
|
133
|
+
* @ignore
|
|
134
|
+
*/
|
|
135
|
+
getJwtTokenService() {
|
|
136
|
+
return this.jwtTokenService;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Used primarily for testing.
|
|
140
|
+
*
|
|
141
|
+
* @ignore
|
|
142
|
+
*/
|
|
143
|
+
getCsrfTokenService() {
|
|
144
|
+
return this.csrfTokenService;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Builds a URL to the login page with a post-login redirect URL attached as a query parameter.
|
|
148
|
+
*
|
|
149
|
+
* ```
|
|
150
|
+
* const url = getLoginRedirectUrl('http://localhost/mypage');
|
|
151
|
+
* console.log(url); // http://localhost/login?next=http%3A%2F%2Flocalhost%2Fmypage
|
|
152
|
+
* ```
|
|
153
|
+
*
|
|
154
|
+
* @param {string} redirectUrl The URL the user should be redirected to after logging in.
|
|
155
|
+
*/
|
|
156
|
+
getLoginRedirectUrl(redirectUrl = this.config.baseUrl) {
|
|
157
|
+
return `${this.config.loginUrl}?next=${encodeURIComponent(redirectUrl)}`;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Redirects the user to the login page.
|
|
161
|
+
*
|
|
162
|
+
* @param {string} redirectUrl The URL the user should be redirected to after logging in.
|
|
163
|
+
*/
|
|
164
|
+
redirectToLogin(redirectUrl = this.config.baseUrl) {
|
|
165
|
+
global.location.assign(this.getLoginRedirectUrl(redirectUrl));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Builds a URL to the logout page with a post-logout redirect URL attached as a query parameter.
|
|
169
|
+
*
|
|
170
|
+
* ```
|
|
171
|
+
* const url = getLogoutRedirectUrl('http://localhost/mypage');
|
|
172
|
+
* console.log(url); // http://localhost/logout?next=http%3A%2F%2Flocalhost%2Fmypage
|
|
173
|
+
* ```
|
|
174
|
+
*
|
|
175
|
+
* @param {string} redirectUrl The URL the user should be redirected to after logging out.
|
|
176
|
+
*/
|
|
177
|
+
getLogoutRedirectUrl(redirectUrl = this.config.baseUrl) {
|
|
178
|
+
return `${this.config.logoutUrl}?redirect_url=${encodeURIComponent(redirectUrl)}`;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Redirects the user to the logout page.
|
|
182
|
+
*
|
|
183
|
+
* @param {string} redirectUrl The URL the user should be redirected to after logging out.
|
|
184
|
+
*/
|
|
185
|
+
redirectToLogout(redirectUrl = this.config.baseUrl) {
|
|
186
|
+
global.location.assign(this.getLogoutRedirectUrl(redirectUrl));
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* If it exists, returns the user data representing the currently authenticated user. If the
|
|
190
|
+
* user is anonymous, returns null.
|
|
191
|
+
*
|
|
192
|
+
* @returns {UserData|null}
|
|
193
|
+
*/
|
|
194
|
+
getAuthenticatedUser() {
|
|
195
|
+
return this.authenticatedUser;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Sets the authenticated user to the provided value.
|
|
199
|
+
*
|
|
200
|
+
* @param {UserData} authUser
|
|
201
|
+
*/
|
|
202
|
+
setAuthenticatedUser(authUser) {
|
|
203
|
+
this.authenticatedUser = authUser;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Reads the authenticated user's access token. Resolves to null if the user is
|
|
207
|
+
* unauthenticated.
|
|
208
|
+
*
|
|
209
|
+
* @returns {Promise<UserData>|Promise<null>} Resolves to the user's access token if they are
|
|
210
|
+
* logged in.
|
|
211
|
+
*/
|
|
212
|
+
fetchAuthenticatedUser() {
|
|
213
|
+
return __awaiter(this, arguments, void 0, function* (options = {}) {
|
|
214
|
+
const decodedAccessToken = yield this.jwtTokenService.getJwtToken(options.forceRefresh || false);
|
|
215
|
+
if (decodedAccessToken !== null) {
|
|
216
|
+
this.setAuthenticatedUser({
|
|
217
|
+
email: decodedAccessToken.email,
|
|
218
|
+
userId: decodedAccessToken.user_id,
|
|
219
|
+
username: decodedAccessToken.preferred_username,
|
|
220
|
+
roles: decodedAccessToken.roles || [],
|
|
221
|
+
administrator: decodedAccessToken.administrator,
|
|
222
|
+
name: decodedAccessToken.name,
|
|
223
|
+
});
|
|
224
|
+
// Sets userId as a custom attribute that will be included with all subsequent log messages.
|
|
225
|
+
// Very helpful for debugging.
|
|
226
|
+
this.loggingService.setCustomAttribute('userId', decodedAccessToken.user_id);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
this.setAuthenticatedUser(null);
|
|
230
|
+
// Intentionally not setting `userId` in the logging service here because it would be useful
|
|
231
|
+
// to know the previously logged in user for debugging refresh issues.
|
|
232
|
+
}
|
|
233
|
+
return this.getAuthenticatedUser();
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Ensures a user is authenticated. It will redirect to login when not
|
|
238
|
+
* authenticated.
|
|
239
|
+
*
|
|
240
|
+
* @param {string} [redirectUrl=config.baseUrl] to return user after login when not
|
|
241
|
+
* authenticated.
|
|
242
|
+
* @returns {Promise<UserData>}
|
|
243
|
+
*/
|
|
244
|
+
ensureAuthenticatedUser() {
|
|
245
|
+
return __awaiter(this, arguments, void 0, function* (redirectUrl = this.config.baseUrl) {
|
|
246
|
+
var _a;
|
|
247
|
+
yield this.fetchAuthenticatedUser();
|
|
248
|
+
if (this.getAuthenticatedUser() === null) {
|
|
249
|
+
const isRedirectFromLoginPage = (_a = global.document.referrer) === null || _a === void 0 ? void 0 : _a.startsWith(this.config.loginUrl);
|
|
250
|
+
if (isRedirectFromLoginPage) {
|
|
251
|
+
const redirectLoopError = new Error('Redirect from login page. Rejecting to avoid infinite redirect loop.');
|
|
252
|
+
logFrontendAuthError(this.loggingService, redirectLoopError);
|
|
253
|
+
throw redirectLoopError;
|
|
254
|
+
}
|
|
255
|
+
// The user is not authenticated, send them to the login page.
|
|
256
|
+
this.redirectToLogin(redirectUrl);
|
|
257
|
+
const unauthorizedError = new Error('Failed to ensure the user is authenticated');
|
|
258
|
+
unauthorizedError.isRedirecting = true;
|
|
259
|
+
throw unauthorizedError;
|
|
260
|
+
}
|
|
261
|
+
return this.getAuthenticatedUser();
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Fetches additional user account information for the authenticated user and merges it into the
|
|
266
|
+
* existing authenticatedUser object, available via getAuthenticatedUser().
|
|
267
|
+
*
|
|
268
|
+
* ```
|
|
269
|
+
* console.log(authenticatedUser); // Will be sparse and only contain basic information.
|
|
270
|
+
* await hydrateAuthenticatedUser()
|
|
271
|
+
* const authenticatedUser = getAuthenticatedUser();
|
|
272
|
+
* console.log(authenticatedUser); // Will contain additional user information
|
|
273
|
+
* ```
|
|
274
|
+
*
|
|
275
|
+
* @returns {Promise<null>}
|
|
276
|
+
*/
|
|
277
|
+
hydrateAuthenticatedUser() {
|
|
278
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
279
|
+
const user = this.getAuthenticatedUser();
|
|
280
|
+
if (user !== null) {
|
|
281
|
+
const response = yield this.authenticatedHttpClient
|
|
282
|
+
.get(`${this.config.lmsBaseUrl}/api/user/v1/accounts/${user.username}`);
|
|
283
|
+
this.setAuthenticatedUser(Object.assign(Object.assign({}, user), camelCaseObject(response.data)));
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Adds authentication defaults and interceptors to an HTTP client instance.
|
|
289
|
+
*
|
|
290
|
+
* @param {HttpClient} newHttpClient
|
|
291
|
+
* @param {Object} config
|
|
292
|
+
* @param {string} [config.refreshAccessTokenApiPath]
|
|
293
|
+
* @param {string} [config.accessTokenCookieName]
|
|
294
|
+
* @param {string} [config.csrfTokenApiPath]
|
|
295
|
+
* @returns {HttpClient} A configured Axios HTTP client.
|
|
296
|
+
*/
|
|
297
|
+
addAuthenticationToHttpClient(newHttpClient) {
|
|
298
|
+
const httpClient = Object.create(newHttpClient);
|
|
299
|
+
// Set withCredentials to true. Enables cross-site Access-Control requests
|
|
300
|
+
// to be made using cookies, authorization headers or TLS client
|
|
301
|
+
// certificates. More on MDN:
|
|
302
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials
|
|
303
|
+
httpClient.defaults.withCredentials = true;
|
|
304
|
+
// Axios interceptors
|
|
305
|
+
// The JWT access token interceptor attempts to refresh the user's jwt token
|
|
306
|
+
// before any request unless the isPublic flag is set on the request config.
|
|
307
|
+
const refreshAccessTokenInterceptor = createJwtTokenProviderInterceptor({
|
|
308
|
+
jwtTokenService: this.jwtTokenService,
|
|
309
|
+
shouldSkip: axiosRequestConfig => axiosRequestConfig.isPublic,
|
|
310
|
+
});
|
|
311
|
+
// The CSRF token intercepter fetches and caches a csrf token for any post,
|
|
312
|
+
// put, patch, or delete request. That token is then added to the request
|
|
313
|
+
// headers.
|
|
314
|
+
const attachCsrfTokenInterceptor = createCsrfTokenProviderInterceptor({
|
|
315
|
+
csrfTokenService: this.csrfTokenService,
|
|
316
|
+
csrfTokenApiPath: this.config.csrfTokenApiPath,
|
|
317
|
+
shouldSkip: (axiosRequestConfig) => {
|
|
318
|
+
const { method, isCsrfExempt } = axiosRequestConfig;
|
|
319
|
+
const CSRF_PROTECTED_METHODS = ['post', 'put', 'patch', 'delete'];
|
|
320
|
+
return isCsrfExempt || !CSRF_PROTECTED_METHODS.includes(method);
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
const processAxiosRequestErrorInterceptor = createProcessAxiosRequestErrorInterceptor({
|
|
324
|
+
loggingService: this.loggingService,
|
|
325
|
+
});
|
|
326
|
+
// Request interceptors: Axios runs the interceptors in reverse order from
|
|
327
|
+
// how they are listed. After fetching csrf tokens no longer require jwt
|
|
328
|
+
// authentication, it won't matter which happens first. This change is
|
|
329
|
+
// coming soon in edx-platform. Nov. 2019
|
|
330
|
+
httpClient.interceptors.request.use(attachCsrfTokenInterceptor);
|
|
331
|
+
httpClient.interceptors.request.use(refreshAccessTokenInterceptor);
|
|
332
|
+
// Response interceptor: moves axios response error data into the error
|
|
333
|
+
// object at error.customAttributes
|
|
334
|
+
httpClient.interceptors.response.use(response => response, processAxiosRequestErrorInterceptor);
|
|
335
|
+
return httpClient;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
export default AxiosJwtAuthService;
|
|
339
|
+
//# sourceMappingURL=AxiosJwtAuthService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AxiosJwtAuthService.js","sourceRoot":"","sources":["../../../runtime/auth/AxiosJwtAuthService.js"],"names":[],"mappings":"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","sourcesContent":["import axios from 'axios';\nimport PropTypes from 'prop-types';\nimport { camelCaseObject } from '../utils';\nimport AxiosCsrfTokenService from './AxiosCsrfTokenService';\nimport AxiosJwtTokenService from './AxiosJwtTokenService';\nimport createCsrfTokenProviderInterceptor from './interceptors/createCsrfTokenProviderInterceptor';\nimport createJwtTokenProviderInterceptor from './interceptors/createJwtTokenProviderInterceptor';\nimport createProcessAxiosRequestErrorInterceptor from './interceptors/createProcessAxiosRequestErrorInterceptor';\nimport configureCache from './LocalForageCache';\nimport { logFrontendAuthError } from './utils';\n\nconst optionsPropTypes = {\n config: PropTypes.shape({\n baseUrl: PropTypes.string.isRequired,\n lmsBaseUrl: PropTypes.string.isRequired,\n loginUrl: PropTypes.string.isRequired,\n logoutUrl: PropTypes.string.isRequired,\n refreshAccessTokenApiPath: PropTypes.string.isRequired,\n accessTokenCookieName: PropTypes.string.isRequired,\n csrfTokenApiPath: PropTypes.string.isRequired,\n }).isRequired,\n loggingService: PropTypes.shape({\n logError: PropTypes.func.isRequired,\n logInfo: PropTypes.func.isRequired,\n }).isRequired,\n};\n\n/**\n * @implements {AuthService}\n * @memberof module:Auth\n */\nclass AxiosJwtAuthService {\n /**\n * @param {Object} options\n * @param {Object} options.config\n * @param {string} options.config.baseUrl\n * @param {string} options.config.lmsBaseUrl\n * @param {string} options.config.loginUrl\n * @param {string} options.config.logoutUrl\n * @param {string} options.config.refreshAccessTokenApiPath\n * @param {string} options.config.accessTokenCookieName\n * @param {string} options.config.csrfTokenApiPath\n * @param {Object} options.loggingService requires logError and logInfo methods\n */\n constructor(options) {\n this.authenticatedHttpClient = null;\n this.httpClient = null;\n this.cachedAuthenticatedHttpClient = null;\n this.cachedHttpClient = null;\n this.authenticatedUser = null;\n\n PropTypes.checkPropTypes(optionsPropTypes, options, 'options', 'AuthService');\n\n this.config = options.config;\n this.loggingService = options.loggingService;\n this.jwtTokenService = new AxiosJwtTokenService(\n this.loggingService,\n this.config.accessTokenCookieName,\n this.config.lmsBaseUrl,\n this.config.refreshAccessTokenApiPath,\n );\n this.csrfTokenService = new AxiosCsrfTokenService(this.config.csrfTokenApiPath);\n this.authenticatedHttpClient = this.addAuthenticationToHttpClient(axios.create());\n this.httpClient = axios.create();\n configureCache()\n .then((cachedAxiosClient) => {\n this.cachedAuthenticatedHttpClient = this.addAuthenticationToHttpClient(cachedAxiosClient);\n this.cachedHttpClient = cachedAxiosClient;\n })\n .catch((e) => {\n // fallback to non-cached HTTP clients and log error\n this.cachedAuthenticatedHttpClient = this.authenticatedHttpClient;\n this.cachedHttpClient = this.httpClient;\n logFrontendAuthError(this.loggingService, `configureCache failed with error: ${e.message}`);\n }).finally(() => {\n this.middleware = options.middleware;\n this.applyMiddleware(options.middleware);\n });\n }\n\n /**\n * Applies middleware to the axios instances in this service.\n *\n * @param {Array} middleware Middleware to apply.\n */\n applyMiddleware(middleware = []) {\n const clients = [\n this.authenticatedHttpClient, this.httpClient,\n this.cachedAuthenticatedHttpClient, this.cachedHttpClient,\n ];\n try {\n (middleware).forEach((middlewareFn) => {\n clients.forEach((client) => client && middlewareFn(client));\n });\n } catch (error) {\n logFrontendAuthError(this.loggingService, error);\n throw error;\n }\n }\n\n /**\n * Gets the authenticated HTTP client for the service. This is an axios instance.\n *\n * @param {Object} [options] Optional options for how the HTTP client should be configured.\n * @param {boolean} [options.useCache] Whether to use front end caching for all requests made\n * with the returned client.\n *\n * @returns {HttpClient} A configured axios http client which can be used for authenticated\n * requests.\n */\n getAuthenticatedHttpClient(options = {}) {\n if (options.useCache) {\n return this.cachedAuthenticatedHttpClient;\n }\n\n return this.authenticatedHttpClient;\n }\n\n /**\n * Gets the unauthenticated HTTP client for the service. This is an axios instance.\n *\n * @param {Object} [options] Optional options for how the HTTP client should be configured.\n * @param {boolean} [options.useCache] Whether to use front end caching for all requests made\n * with the returned client.\n * @returns {HttpClient} A configured axios http client.\n */\n getHttpClient(options = {}) {\n if (options.useCache) {\n return this.cachedHttpClient;\n }\n\n return this.httpClient;\n }\n\n /**\n * Used primarily for testing.\n *\n * @ignore\n */\n getJwtTokenService() {\n return this.jwtTokenService;\n }\n\n /**\n * Used primarily for testing.\n *\n * @ignore\n */\n getCsrfTokenService() {\n return this.csrfTokenService;\n }\n\n /**\n * Builds a URL to the login page with a post-login redirect URL attached as a query parameter.\n *\n * ```\n * const url = getLoginRedirectUrl('http://localhost/mypage');\n * console.log(url); // http://localhost/login?next=http%3A%2F%2Flocalhost%2Fmypage\n * ```\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging in.\n */\n getLoginRedirectUrl(redirectUrl = this.config.baseUrl) {\n return `${this.config.loginUrl}?next=${encodeURIComponent(redirectUrl)}`;\n }\n\n /**\n * Redirects the user to the login page.\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging in.\n */\n redirectToLogin(redirectUrl = this.config.baseUrl) {\n global.location.assign(this.getLoginRedirectUrl(redirectUrl));\n }\n\n /**\n * Builds a URL to the logout page with a post-logout redirect URL attached as a query parameter.\n *\n * ```\n * const url = getLogoutRedirectUrl('http://localhost/mypage');\n * console.log(url); // http://localhost/logout?next=http%3A%2F%2Flocalhost%2Fmypage\n * ```\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging out.\n */\n getLogoutRedirectUrl(redirectUrl = this.config.baseUrl) {\n return `${this.config.logoutUrl}?redirect_url=${encodeURIComponent(redirectUrl)}`;\n }\n\n /**\n * Redirects the user to the logout page.\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging out.\n */\n redirectToLogout(redirectUrl = this.config.baseUrl) {\n global.location.assign(this.getLogoutRedirectUrl(redirectUrl));\n }\n\n /**\n * If it exists, returns the user data representing the currently authenticated user. If the\n * user is anonymous, returns null.\n *\n * @returns {UserData|null}\n */\n getAuthenticatedUser() {\n return this.authenticatedUser;\n }\n\n /**\n * Sets the authenticated user to the provided value.\n *\n * @param {UserData} authUser\n */\n setAuthenticatedUser(authUser) {\n this.authenticatedUser = authUser;\n }\n\n /**\n * Reads the authenticated user's access token. Resolves to null if the user is\n * unauthenticated.\n *\n * @returns {Promise<UserData>|Promise<null>} Resolves to the user's access token if they are\n * logged in.\n */\n async fetchAuthenticatedUser(options = {}) {\n const decodedAccessToken = await this.jwtTokenService.getJwtToken(options.forceRefresh || false);\n\n if (decodedAccessToken !== null) {\n this.setAuthenticatedUser({\n email: decodedAccessToken.email,\n userId: decodedAccessToken.user_id,\n username: decodedAccessToken.preferred_username,\n roles: decodedAccessToken.roles || [],\n administrator: decodedAccessToken.administrator,\n name: decodedAccessToken.name,\n });\n // Sets userId as a custom attribute that will be included with all subsequent log messages.\n // Very helpful for debugging.\n this.loggingService.setCustomAttribute('userId', decodedAccessToken.user_id);\n } else {\n this.setAuthenticatedUser(null);\n // Intentionally not setting `userId` in the logging service here because it would be useful\n // to know the previously logged in user for debugging refresh issues.\n }\n\n return this.getAuthenticatedUser();\n }\n\n /**\n * Ensures a user is authenticated. It will redirect to login when not\n * authenticated.\n *\n * @param {string} [redirectUrl=config.baseUrl] to return user after login when not\n * authenticated.\n * @returns {Promise<UserData>}\n */\n async ensureAuthenticatedUser(redirectUrl = this.config.baseUrl) {\n await this.fetchAuthenticatedUser();\n\n if (this.getAuthenticatedUser() === null) {\n const isRedirectFromLoginPage = global.document.referrer?.startsWith(this.config.loginUrl);\n\n if (isRedirectFromLoginPage) {\n const redirectLoopError = new Error('Redirect from login page. Rejecting to avoid infinite redirect loop.');\n logFrontendAuthError(this.loggingService, redirectLoopError);\n throw redirectLoopError;\n }\n\n // The user is not authenticated, send them to the login page.\n this.redirectToLogin(redirectUrl);\n\n const unauthorizedError = new Error('Failed to ensure the user is authenticated');\n unauthorizedError.isRedirecting = true;\n throw unauthorizedError;\n }\n\n return this.getAuthenticatedUser();\n }\n\n /**\n * Fetches additional user account information for the authenticated user and merges it into the\n * existing authenticatedUser object, available via getAuthenticatedUser().\n *\n * ```\n * console.log(authenticatedUser); // Will be sparse and only contain basic information.\n * await hydrateAuthenticatedUser()\n * const authenticatedUser = getAuthenticatedUser();\n * console.log(authenticatedUser); // Will contain additional user information\n * ```\n *\n * @returns {Promise<null>}\n */\n async hydrateAuthenticatedUser() {\n const user = this.getAuthenticatedUser();\n if (user !== null) {\n const response = await this.authenticatedHttpClient\n .get(`${this.config.lmsBaseUrl}/api/user/v1/accounts/${user.username}`);\n this.setAuthenticatedUser({ ...user, ...camelCaseObject(response.data) });\n }\n }\n\n /**\n * Adds authentication defaults and interceptors to an HTTP client instance.\n *\n * @param {HttpClient} newHttpClient\n * @param {Object} config\n * @param {string} [config.refreshAccessTokenApiPath]\n * @param {string} [config.accessTokenCookieName]\n * @param {string} [config.csrfTokenApiPath]\n * @returns {HttpClient} A configured Axios HTTP client.\n */\n addAuthenticationToHttpClient(newHttpClient) {\n const httpClient = Object.create(newHttpClient);\n // Set withCredentials to true. Enables cross-site Access-Control requests\n // to be made using cookies, authorization headers or TLS client\n // certificates. More on MDN:\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials\n httpClient.defaults.withCredentials = true;\n\n // Axios interceptors\n\n // The JWT access token interceptor attempts to refresh the user's jwt token\n // before any request unless the isPublic flag is set on the request config.\n const refreshAccessTokenInterceptor = createJwtTokenProviderInterceptor({\n jwtTokenService: this.jwtTokenService,\n shouldSkip: axiosRequestConfig => axiosRequestConfig.isPublic,\n });\n // The CSRF token intercepter fetches and caches a csrf token for any post,\n // put, patch, or delete request. That token is then added to the request\n // headers.\n const attachCsrfTokenInterceptor = createCsrfTokenProviderInterceptor({\n csrfTokenService: this.csrfTokenService,\n csrfTokenApiPath: this.config.csrfTokenApiPath,\n shouldSkip: (axiosRequestConfig) => {\n const { method, isCsrfExempt } = axiosRequestConfig;\n const CSRF_PROTECTED_METHODS = ['post', 'put', 'patch', 'delete'];\n return isCsrfExempt || !CSRF_PROTECTED_METHODS.includes(method);\n },\n });\n\n const processAxiosRequestErrorInterceptor = createProcessAxiosRequestErrorInterceptor({\n loggingService: this.loggingService,\n });\n\n // Request interceptors: Axios runs the interceptors in reverse order from\n // how they are listed. After fetching csrf tokens no longer require jwt\n // authentication, it won't matter which happens first. This change is\n // coming soon in edx-platform. Nov. 2019\n httpClient.interceptors.request.use(attachCsrfTokenInterceptor);\n httpClient.interceptors.request.use(refreshAccessTokenInterceptor);\n\n // Response interceptor: moves axios response error data into the error\n // object at error.customAttributes\n httpClient.interceptors.response.use(\n response => response,\n processAxiosRequestErrorInterceptor,\n );\n\n return httpClient;\n }\n}\n\nexport default AxiosJwtAuthService;\n"]}
|