@openedx/frontend-base 1.0.0-alpha.9 → 1.0.0

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.
Files changed (895) hide show
  1. package/README.md +27 -0
  2. package/dist/index.d.ts +4 -0
  3. package/dist/index.js +4 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/runtime/analytics/MockAnalyticsService.d.ts +50 -0
  6. package/dist/runtime/analytics/MockAnalyticsService.js +64 -0
  7. package/dist/runtime/analytics/MockAnalyticsService.js.map +1 -0
  8. package/dist/runtime/analytics/SegmentAnalyticsService.d.ts +64 -0
  9. package/dist/runtime/analytics/SegmentAnalyticsService.js +218 -0
  10. package/dist/runtime/analytics/SegmentAnalyticsService.js.map +1 -0
  11. package/dist/runtime/analytics/index.d.ts +3 -0
  12. package/dist/runtime/analytics/index.js +4 -0
  13. package/dist/runtime/analytics/index.js.map +1 -0
  14. package/dist/runtime/analytics/interface.d.ts +53 -0
  15. package/dist/runtime/analytics/interface.js +133 -0
  16. package/dist/runtime/analytics/interface.js.map +1 -0
  17. package/dist/runtime/auth/AxiosCsrfTokenService.d.ts +10 -0
  18. package/dist/runtime/auth/AxiosCsrfTokenService.js +64 -0
  19. package/dist/runtime/auth/AxiosCsrfTokenService.js.map +1 -0
  20. package/dist/runtime/auth/AxiosJwtAuthService.d.ts +182 -0
  21. package/dist/runtime/auth/AxiosJwtAuthService.js +339 -0
  22. package/dist/runtime/auth/AxiosJwtAuthService.js.map +1 -0
  23. package/dist/runtime/auth/AxiosJwtTokenService.d.ts +16 -0
  24. package/dist/runtime/auth/AxiosJwtTokenService.js +130 -0
  25. package/dist/runtime/auth/AxiosJwtTokenService.js.map +1 -0
  26. package/dist/runtime/auth/LocalForageCache.d.ts +7 -0
  27. package/dist/runtime/auth/LocalForageCache.js +78 -0
  28. package/dist/runtime/auth/LocalForageCache.js.map +1 -0
  29. package/dist/runtime/auth/MockAuthService.d.ts +209 -0
  30. package/dist/runtime/auth/MockAuthService.js +256 -0
  31. package/dist/runtime/auth/MockAuthService.js.map +1 -0
  32. package/dist/runtime/auth/index.d.ts +3 -0
  33. package/dist/runtime/auth/index.js +4 -0
  34. package/dist/runtime/auth/index.js.map +1 -0
  35. package/dist/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.d.ts +2 -0
  36. package/dist/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js +42 -0
  37. package/dist/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js.map +1 -0
  38. package/dist/runtime/auth/interceptors/createJwtTokenProviderInterceptor.d.ts +2 -0
  39. package/dist/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js +40 -0
  40. package/dist/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js.map +1 -0
  41. package/dist/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.d.ts +2 -0
  42. package/dist/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js +26 -0
  43. package/dist/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js.map +1 -0
  44. package/dist/runtime/auth/interceptors/createRetryInterceptor.d.ts +3 -0
  45. package/dist/runtime/auth/interceptors/createRetryInterceptor.js +67 -0
  46. package/dist/runtime/auth/interceptors/createRetryInterceptor.js.map +1 -0
  47. package/dist/runtime/auth/interface.d.ts +133 -0
  48. package/dist/runtime/auth/interface.js +302 -0
  49. package/dist/runtime/auth/interface.js.map +1 -0
  50. package/dist/runtime/auth/utils.d.ts +13 -0
  51. package/dist/runtime/auth/utils.js +66 -0
  52. package/dist/runtime/auth/utils.js.map +1 -0
  53. package/dist/runtime/babel.config.d.ts +2 -0
  54. package/dist/runtime/babel.config.js +4 -0
  55. package/dist/runtime/babel.config.js.map +1 -0
  56. package/dist/runtime/config/index.d.ts +216 -0
  57. package/dist/runtime/config/index.js +428 -0
  58. package/dist/runtime/config/index.js.map +1 -0
  59. package/dist/runtime/constants.d.ts +57 -0
  60. package/dist/runtime/constants.js +58 -0
  61. package/dist/runtime/constants.js.map +1 -0
  62. package/dist/runtime/i18n/index.d.ts +3 -0
  63. package/dist/runtime/i18n/index.js +78 -0
  64. package/dist/runtime/i18n/index.js.map +1 -0
  65. package/dist/runtime/i18n/injectIntlWithShim.d.ts +11 -0
  66. package/dist/runtime/i18n/injectIntlWithShim.js +45 -0
  67. package/dist/runtime/i18n/injectIntlWithShim.js.map +1 -0
  68. package/dist/runtime/i18n/lib.d.ts +113 -0
  69. package/dist/runtime/i18n/lib.js +223 -0
  70. package/dist/runtime/i18n/lib.js.map +1 -0
  71. package/dist/runtime/index.d.ts +14 -0
  72. package/dist/runtime/index.js +15 -0
  73. package/dist/runtime/index.js.map +1 -0
  74. package/dist/runtime/initialize.d.ts +87 -0
  75. package/dist/runtime/initialize.js +305 -0
  76. package/dist/runtime/initialize.js.map +1 -0
  77. package/dist/runtime/jest.config.d.ts +16 -0
  78. package/dist/runtime/jest.config.js +34 -0
  79. package/dist/runtime/jest.config.js.map +1 -0
  80. package/dist/runtime/logging/MockLoggingService.d.ts +28 -0
  81. package/dist/runtime/logging/MockLoggingService.js +31 -0
  82. package/dist/runtime/logging/MockLoggingService.js.map +1 -0
  83. package/dist/runtime/logging/NewRelicLoggingService.d.ts +67 -0
  84. package/dist/runtime/logging/NewRelicLoggingService.js +175 -0
  85. package/dist/runtime/logging/NewRelicLoggingService.js.map +1 -0
  86. package/dist/runtime/logging/index.d.ts +3 -0
  87. package/dist/runtime/logging/index.js +4 -0
  88. package/dist/runtime/logging/index.js.map +1 -0
  89. package/dist/runtime/logging/interface.d.ts +38 -0
  90. package/dist/runtime/logging/interface.js +99 -0
  91. package/dist/runtime/logging/interface.js.map +1 -0
  92. package/dist/runtime/logging/types.d.ts +4 -0
  93. package/dist/runtime/logging/types.js +2 -0
  94. package/dist/runtime/logging/types.js.map +1 -0
  95. package/dist/runtime/react/AuthenticatedPageRoute.d.ts +30 -0
  96. package/dist/runtime/react/AuthenticatedPageRoute.js +38 -0
  97. package/dist/runtime/react/AuthenticatedPageRoute.js.map +1 -0
  98. package/dist/runtime/react/CombinedAppProvider.d.ts +6 -0
  99. package/dist/runtime/react/CombinedAppProvider.js +20 -0
  100. package/dist/runtime/react/CombinedAppProvider.js.map +1 -0
  101. package/dist/runtime/react/CurrentAppContext.d.ts +20 -0
  102. package/dist/runtime/react/CurrentAppContext.js +21 -0
  103. package/dist/runtime/react/CurrentAppContext.js.map +1 -0
  104. package/dist/runtime/react/CurrentAppProvider.d.ts +23 -0
  105. package/dist/runtime/react/CurrentAppProvider.js +33 -0
  106. package/dist/runtime/react/CurrentAppProvider.js.map +1 -0
  107. package/dist/runtime/react/Divider.d.ts +1 -0
  108. package/dist/runtime/react/Divider.js +5 -0
  109. package/dist/runtime/react/Divider.js.map +1 -0
  110. package/dist/runtime/react/ErrorBoundary.d.ts +32 -0
  111. package/dist/runtime/react/ErrorBoundary.js +40 -0
  112. package/dist/runtime/react/ErrorBoundary.js.map +1 -0
  113. package/dist/runtime/react/ErrorPage.d.ts +17 -0
  114. package/dist/runtime/react/ErrorPage.js +29 -0
  115. package/dist/runtime/react/ErrorPage.js.map +1 -0
  116. package/dist/runtime/react/LoginRedirect.d.ts +8 -0
  117. package/dist/runtime/react/LoginRedirect.js +16 -0
  118. package/dist/runtime/react/LoginRedirect.js.map +1 -0
  119. package/dist/runtime/react/NotFoundPage.d.ts +2 -0
  120. package/dist/runtime/react/NotFoundPage.js +14 -0
  121. package/dist/runtime/react/NotFoundPage.js.map +1 -0
  122. package/dist/runtime/react/PageWrap.d.ts +8 -0
  123. package/dist/runtime/react/PageWrap.js +21 -0
  124. package/dist/runtime/react/PageWrap.js.map +1 -0
  125. package/dist/runtime/react/SiteContext.d.ts +24 -0
  126. package/dist/runtime/react/SiteContext.js +26 -0
  127. package/dist/runtime/react/SiteContext.js.map +1 -0
  128. package/dist/runtime/react/SiteProvider.d.ts +29 -0
  129. package/dist/runtime/react/SiteProvider.js +69 -0
  130. package/dist/runtime/react/SiteProvider.js.map +1 -0
  131. package/dist/runtime/react/constants.d.ts +3 -0
  132. package/dist/runtime/react/constants.js +4 -0
  133. package/dist/runtime/react/constants.js.map +1 -0
  134. package/dist/runtime/react/hooks/index.d.ts +7 -0
  135. package/dist/runtime/react/hooks/index.js +8 -0
  136. package/dist/runtime/react/hooks/index.js.map +1 -0
  137. package/dist/runtime/react/hooks/theme/index.js +3 -0
  138. package/dist/runtime/react/hooks/theme/index.js.map +1 -0
  139. package/dist/runtime/react/hooks/theme/useTheme.d.ts +35 -0
  140. package/dist/runtime/react/hooks/theme/useTheme.js +153 -0
  141. package/dist/runtime/react/hooks/theme/useTheme.js.map +1 -0
  142. package/dist/runtime/react/hooks/theme/useThemeConfig.d.ts +16 -0
  143. package/dist/runtime/react/hooks/theme/useThemeConfig.js +29 -0
  144. package/dist/runtime/react/hooks/theme/useThemeConfig.js.map +1 -0
  145. package/dist/runtime/react/hooks/theme/useThemeCore.d.ts +10 -0
  146. package/dist/runtime/react/hooks/theme/useThemeCore.js +48 -0
  147. package/dist/runtime/react/hooks/theme/useThemeCore.js.map +1 -0
  148. package/dist/runtime/react/hooks/theme/useThemeVariants.d.ts +17 -0
  149. package/dist/runtime/react/hooks/theme/useThemeVariants.js +90 -0
  150. package/dist/runtime/react/hooks/theme/useThemeVariants.js.map +1 -0
  151. package/dist/runtime/react/hooks/theme/useTrackColorSchemeChoice.d.ts +8 -0
  152. package/dist/runtime/react/hooks/theme/useTrackColorSchemeChoice.js +30 -0
  153. package/dist/runtime/react/hooks/theme/useTrackColorSchemeChoice.js.map +1 -0
  154. package/dist/runtime/react/hooks/theme/utils.d.ts +6 -0
  155. package/dist/runtime/react/hooks/theme/utils.js +11 -0
  156. package/dist/runtime/react/hooks/theme/utils.js.map +1 -0
  157. package/dist/runtime/react/hooks/useActiveRoles.d.ts +2 -0
  158. package/dist/runtime/react/hooks/useActiveRoles.js +16 -0
  159. package/dist/runtime/react/hooks/useActiveRoles.js.map +1 -0
  160. package/dist/runtime/react/hooks/useActiveRouteRoleWatcher.d.ts +2 -0
  161. package/dist/runtime/react/hooks/useActiveRouteRoleWatcher.js +22 -0
  162. package/dist/runtime/react/hooks/useActiveRouteRoleWatcher.js.map +1 -0
  163. package/dist/runtime/react/hooks/useAppConfig.d.ts +2 -0
  164. package/dist/runtime/react/hooks/useAppConfig.js +8 -0
  165. package/dist/runtime/react/hooks/useAppConfig.js.map +1 -0
  166. package/dist/runtime/react/hooks/useAuthenticatedUser.d.ts +2 -0
  167. package/dist/runtime/react/hooks/useAuthenticatedUser.js +8 -0
  168. package/dist/runtime/react/hooks/useAuthenticatedUser.js.map +1 -0
  169. package/dist/runtime/react/hooks/useSiteConfig.d.ts +2 -0
  170. package/dist/runtime/react/hooks/useSiteConfig.js +8 -0
  171. package/dist/runtime/react/hooks/useSiteConfig.js.map +1 -0
  172. package/dist/runtime/react/hooks/useSiteEvent.d.ts +12 -0
  173. package/dist/runtime/react/hooks/useSiteEvent.js +22 -0
  174. package/dist/runtime/react/hooks/useSiteEvent.js.map +1 -0
  175. package/dist/runtime/react/index.d.ts +19 -0
  176. package/dist/runtime/react/index.js +20 -0
  177. package/dist/runtime/react/index.js.map +1 -0
  178. package/dist/runtime/react/reducers.d.ts +11 -0
  179. package/dist/runtime/react/reducers.js +28 -0
  180. package/dist/runtime/react/reducers.js.map +1 -0
  181. package/dist/runtime/routing/authenticatedLoader.d.ts +2 -0
  182. package/dist/runtime/routing/authenticatedLoader.js +27 -0
  183. package/dist/runtime/routing/authenticatedLoader.js.map +1 -0
  184. package/dist/runtime/routing/index.d.ts +2 -0
  185. package/dist/runtime/routing/index.js +3 -0
  186. package/dist/runtime/routing/index.js.map +1 -0
  187. package/dist/runtime/routing/utils.d.ts +4 -0
  188. package/dist/runtime/routing/utils.js +43 -0
  189. package/dist/runtime/routing/utils.js.map +1 -0
  190. package/dist/runtime/scripts/index.d.ts +1 -0
  191. package/dist/runtime/scripts/index.js +14 -0
  192. package/dist/runtime/scripts/index.js.map +1 -0
  193. package/dist/runtime/setupTest.d.ts +1 -0
  194. package/dist/runtime/setupTest.js +12 -0
  195. package/dist/runtime/setupTest.js.map +1 -0
  196. package/dist/runtime/slots/Slot.d.ts +11 -0
  197. package/dist/runtime/slots/Slot.js +37 -0
  198. package/dist/runtime/slots/Slot.js.map +1 -0
  199. package/dist/runtime/slots/SlotContext.d.ts +8 -0
  200. package/dist/runtime/slots/SlotContext.js +7 -0
  201. package/dist/runtime/slots/SlotContext.js.map +1 -0
  202. package/dist/runtime/slots/hooks.d.ts +11 -0
  203. package/dist/runtime/slots/hooks.js +19 -0
  204. package/dist/runtime/slots/hooks.js.map +1 -0
  205. package/dist/runtime/slots/index.js +7 -0
  206. package/dist/runtime/slots/index.js.map +1 -0
  207. package/dist/runtime/slots/layout/DefaultSlotLayout.d.ts +1 -0
  208. package/dist/runtime/slots/layout/DefaultSlotLayout.js +7 -0
  209. package/dist/runtime/slots/layout/DefaultSlotLayout.js.map +1 -0
  210. package/dist/runtime/slots/layout/hooks.d.ts +9 -0
  211. package/dist/runtime/slots/layout/hooks.js +52 -0
  212. package/dist/runtime/slots/layout/hooks.js.map +1 -0
  213. package/dist/runtime/slots/layout/index.js +5 -0
  214. package/dist/runtime/slots/layout/index.js.map +1 -0
  215. package/dist/runtime/slots/layout/types.d.ts +30 -0
  216. package/dist/runtime/slots/layout/types.js +12 -0
  217. package/dist/runtime/slots/layout/types.js.map +1 -0
  218. package/dist/runtime/slots/layout/utils.d.ts +5 -0
  219. package/dist/runtime/slots/layout/utils.js +11 -0
  220. package/dist/runtime/slots/layout/utils.js.map +1 -0
  221. package/dist/runtime/slots/types.d.ts +18 -0
  222. package/dist/runtime/slots/types.js +7 -0
  223. package/dist/runtime/slots/types.js.map +1 -0
  224. package/dist/runtime/slots/utils.d.ts +3 -0
  225. package/dist/runtime/slots/utils.js +65 -0
  226. package/dist/runtime/slots/utils.js.map +1 -0
  227. package/dist/runtime/slots/widget/WidgetContext.d.ts +6 -0
  228. package/dist/runtime/slots/widget/WidgetContext.js +8 -0
  229. package/dist/runtime/slots/widget/WidgetContext.js.map +1 -0
  230. package/dist/runtime/slots/widget/WidgetProvider.d.ts +9 -0
  231. package/dist/runtime/slots/widget/WidgetProvider.js +18 -0
  232. package/dist/runtime/slots/widget/WidgetProvider.js.map +1 -0
  233. package/dist/runtime/slots/widget/hooks.d.ts +12 -0
  234. package/dist/runtime/slots/widget/hooks.js +84 -0
  235. package/dist/runtime/slots/widget/hooks.js.map +1 -0
  236. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.d.ts +10 -0
  237. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.js +42 -0
  238. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.js.map +1 -0
  239. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.messages.d.ts +13 -0
  240. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.messages.js +15 -0
  241. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.messages.js.map +1 -0
  242. package/dist/runtime/slots/widget/iframe/IFrameWidget.d.ts +6 -0
  243. package/dist/runtime/slots/widget/iframe/IFrameWidget.js +32 -0
  244. package/dist/runtime/slots/widget/iframe/IFrameWidget.js.map +1 -0
  245. package/dist/runtime/slots/widget/iframe/constants.d.ts +15 -0
  246. package/dist/runtime/slots/widget/iframe/constants.js +17 -0
  247. package/dist/runtime/slots/widget/iframe/constants.js.map +1 -0
  248. package/dist/runtime/slots/widget/iframe/hooks.d.ts +64 -0
  249. package/dist/runtime/slots/widget/iframe/hooks.js +144 -0
  250. package/dist/runtime/slots/widget/iframe/hooks.js.map +1 -0
  251. package/dist/runtime/slots/widget/iframe/index.d.ts +3 -0
  252. package/dist/runtime/slots/widget/iframe/index.js +3 -0
  253. package/dist/runtime/slots/widget/iframe/index.js.map +1 -0
  254. package/dist/runtime/slots/widget/iframe/types.d.ts +5 -0
  255. package/dist/runtime/slots/widget/iframe/types.js +3 -0
  256. package/dist/runtime/slots/widget/iframe/types.js.map +1 -0
  257. package/dist/runtime/slots/widget/index.js +6 -0
  258. package/dist/runtime/slots/widget/index.js.map +1 -0
  259. package/dist/runtime/slots/widget/types.d.ts +108 -0
  260. package/dist/runtime/slots/widget/types.js +41 -0
  261. package/dist/runtime/slots/widget/types.js.map +1 -0
  262. package/dist/runtime/slots/widget/utils.d.ts +22 -0
  263. package/dist/runtime/slots/widget/utils.js +181 -0
  264. package/dist/runtime/slots/widget/utils.js.map +1 -0
  265. package/dist/runtime/subscriptions.d.ts +24 -0
  266. package/dist/runtime/subscriptions.js +48 -0
  267. package/dist/runtime/subscriptions.js.map +1 -0
  268. package/dist/runtime/testing/index.d.ts +8 -0
  269. package/dist/runtime/testing/index.js +9 -0
  270. package/dist/runtime/testing/index.js.map +1 -0
  271. package/dist/runtime/testing/initializeMockApp.d.ts +46 -0
  272. package/dist/runtime/testing/initializeMockApp.js +71 -0
  273. package/dist/runtime/testing/initializeMockApp.js.map +1 -0
  274. package/dist/runtime/testing/mockMessages.d.ts +22 -0
  275. package/dist/runtime/testing/mockMessages.js +23 -0
  276. package/dist/runtime/testing/mockMessages.js.map +1 -0
  277. package/dist/runtime/utils.d.ts +95 -0
  278. package/dist/runtime/utils.js +163 -0
  279. package/dist/runtime/utils.js.map +1 -0
  280. package/dist/shell/DefaultLayout.d.ts +1 -0
  281. package/dist/shell/DefaultLayout.js +7 -0
  282. package/dist/shell/DefaultLayout.js.map +1 -0
  283. package/dist/shell/DefaultMain.d.ts +1 -0
  284. package/dist/shell/DefaultMain.js +6 -0
  285. package/dist/shell/DefaultMain.js.map +1 -0
  286. package/dist/shell/Logo.d.ts +6 -0
  287. package/dist/shell/Logo.js +16 -0
  288. package/dist/shell/Logo.js.map +1 -0
  289. package/dist/shell/Shell.d.ts +1 -0
  290. package/dist/shell/Shell.js +10 -0
  291. package/dist/shell/Shell.js.map +1 -0
  292. package/dist/shell/Shell.messages.d.ts +63 -0
  293. package/dist/shell/Shell.messages.js +65 -0
  294. package/dist/shell/Shell.messages.js.map +1 -0
  295. package/dist/shell/app.d.ts +3 -0
  296. package/dist/shell/app.js +43 -0
  297. package/dist/shell/app.js.map +1 -0
  298. package/dist/shell/babel.config.d.ts +2 -0
  299. package/dist/shell/babel.config.js +4 -0
  300. package/dist/shell/babel.config.js.map +1 -0
  301. package/dist/shell/constants.d.ts +2 -0
  302. package/dist/shell/constants.js +3 -0
  303. package/dist/shell/constants.js.map +1 -0
  304. package/dist/shell/dev/devFooter/app.d.ts +3 -0
  305. package/dist/shell/dev/devFooter/app.js +36 -0
  306. package/dist/shell/dev/devFooter/app.js.map +1 -0
  307. package/dist/shell/dev/devFooter/index.js +2 -0
  308. package/dist/shell/dev/devFooter/index.js.map +1 -0
  309. package/dist/shell/dev/devHeader/BarContext.d.ts +7 -0
  310. package/dist/shell/dev/devHeader/BarContext.js +8 -0
  311. package/dist/shell/dev/devHeader/BarContext.js.map +1 -0
  312. package/dist/shell/dev/devHeader/BarLink.d.ts +1 -0
  313. package/dist/shell/dev/devHeader/BarLink.js +10 -0
  314. package/dist/shell/dev/devHeader/BarLink.js.map +1 -0
  315. package/dist/shell/dev/devHeader/BarProvider.d.ts +6 -0
  316. package/dist/shell/dev/devHeader/BarProvider.js +16 -0
  317. package/dist/shell/dev/devHeader/BarProvider.js.map +1 -0
  318. package/dist/shell/dev/devHeader/CoursesLink.d.ts +1 -0
  319. package/dist/shell/dev/devHeader/CoursesLink.js +10 -0
  320. package/dist/shell/dev/devHeader/CoursesLink.js.map +1 -0
  321. package/dist/shell/dev/devHeader/FooContext.d.ts +7 -0
  322. package/dist/shell/dev/devHeader/FooContext.js +8 -0
  323. package/dist/shell/dev/devHeader/FooContext.js.map +1 -0
  324. package/dist/shell/dev/devHeader/FooLink.d.ts +1 -0
  325. package/dist/shell/dev/devHeader/FooLink.js +10 -0
  326. package/dist/shell/dev/devHeader/FooLink.js.map +1 -0
  327. package/dist/shell/dev/devHeader/FooProvider.d.ts +6 -0
  328. package/dist/shell/dev/devHeader/FooProvider.js +16 -0
  329. package/dist/shell/dev/devHeader/FooProvider.js.map +1 -0
  330. package/dist/shell/dev/devHeader/app.d.ts +3 -0
  331. package/dist/shell/dev/devHeader/app.js +34 -0
  332. package/dist/shell/dev/devHeader/app.js.map +1 -0
  333. package/dist/shell/dev/devHeader/index.js +2 -0
  334. package/dist/shell/dev/devHeader/index.js.map +1 -0
  335. package/dist/shell/dev/devHeader/providers.d.ts +3 -0
  336. package/dist/shell/dev/devHeader/providers.js +8 -0
  337. package/dist/shell/dev/devHeader/providers.js.map +1 -0
  338. package/dist/shell/dev/devHome/HomePage.d.ts +1 -0
  339. package/dist/shell/dev/devHome/HomePage.js +14 -0
  340. package/dist/shell/dev/devHome/HomePage.js.map +1 -0
  341. package/dist/shell/dev/devHome/app.d.ts +3 -0
  342. package/dist/shell/dev/devHome/app.js +15 -0
  343. package/dist/shell/dev/devHome/app.js.map +1 -0
  344. package/dist/shell/dev/devHome/index.js +2 -0
  345. package/dist/shell/dev/devHome/index.js.map +1 -0
  346. package/dist/shell/dev/devHome/messages.d.ts +8 -0
  347. package/dist/shell/dev/devHome/messages.js +10 -0
  348. package/dist/shell/dev/devHome/messages.js.map +1 -0
  349. package/dist/shell/dev/index.d.ts +4 -0
  350. package/dist/shell/dev/index.js +5 -0
  351. package/dist/shell/dev/index.js.map +1 -0
  352. package/dist/shell/dev/slotShowcase/HorizontalSlotLayout.d.ts +1 -0
  353. package/dist/shell/dev/slotShowcase/HorizontalSlotLayout.js +8 -0
  354. package/dist/shell/dev/slotShowcase/HorizontalSlotLayout.js.map +1 -0
  355. package/dist/shell/dev/slotShowcase/LayoutWithOptions.d.ts +1 -0
  356. package/dist/shell/dev/slotShowcase/LayoutWithOptions.js +9 -0
  357. package/dist/shell/dev/slotShowcase/LayoutWithOptions.js.map +1 -0
  358. package/dist/shell/dev/slotShowcase/SlotShowcase.scss +50 -0
  359. package/dist/shell/dev/slotShowcase/SlotShowcasePage.d.ts +2 -0
  360. package/dist/shell/dev/slotShowcase/SlotShowcasePage.js +17 -0
  361. package/dist/shell/dev/slotShowcase/SlotShowcasePage.js.map +1 -0
  362. package/dist/shell/dev/slotShowcase/ToggleByRoleLayout.d.ts +1 -0
  363. package/dist/shell/dev/slotShowcase/ToggleByRoleLayout.js +11 -0
  364. package/dist/shell/dev/slotShowcase/ToggleByRoleLayout.js.map +1 -0
  365. package/dist/shell/dev/slotShowcase/WidgetWithOptions.d.ts +1 -0
  366. package/dist/shell/dev/slotShowcase/WidgetWithOptions.js +8 -0
  367. package/dist/shell/dev/slotShowcase/WidgetWithOptions.js.map +1 -0
  368. package/dist/shell/dev/slotShowcase/app.d.ts +3 -0
  369. package/dist/shell/dev/slotShowcase/app.js +372 -0
  370. package/dist/shell/dev/slotShowcase/app.js.map +1 -0
  371. package/dist/shell/dev/slotShowcase/index.js +2 -0
  372. package/dist/shell/dev/slotShowcase/index.js.map +1 -0
  373. package/dist/shell/footer/CenterLinks.d.ts +1 -0
  374. package/dist/shell/footer/CenterLinks.js +7 -0
  375. package/dist/shell/footer/CenterLinks.js.map +1 -0
  376. package/dist/shell/footer/CopyrightNotice.d.ts +10 -0
  377. package/dist/shell/footer/CopyrightNotice.js +10 -0
  378. package/dist/shell/footer/CopyrightNotice.js.map +1 -0
  379. package/dist/shell/footer/DesktopFooterLayout.d.ts +1 -0
  380. package/dist/shell/footer/DesktopFooterLayout.js +12 -0
  381. package/dist/shell/footer/DesktopFooterLayout.js.map +1 -0
  382. package/dist/shell/footer/Footer.d.ts +1 -0
  383. package/dist/shell/footer/Footer.js +6 -0
  384. package/dist/shell/footer/Footer.js.map +1 -0
  385. package/dist/shell/footer/LabeledLinkColumn.d.ts +1 -0
  386. package/dist/shell/footer/LabeledLinkColumn.js +11 -0
  387. package/dist/shell/footer/LabeledLinkColumn.js.map +1 -0
  388. package/dist/shell/footer/LanguageMenu.d.ts +1 -0
  389. package/dist/shell/footer/LanguageMenu.js +16 -0
  390. package/dist/shell/footer/LanguageMenu.js.map +1 -0
  391. package/dist/shell/footer/LanguageMenuItem.d.ts +8 -0
  392. package/dist/shell/footer/LanguageMenuItem.js +11 -0
  393. package/dist/shell/footer/LanguageMenuItem.js.map +1 -0
  394. package/dist/shell/footer/LeftLinks.d.ts +1 -0
  395. package/dist/shell/footer/LeftLinks.js +7 -0
  396. package/dist/shell/footer/LeftLinks.js.map +1 -0
  397. package/dist/shell/footer/LegalNotices.d.ts +1 -0
  398. package/dist/shell/footer/LegalNotices.js +10 -0
  399. package/dist/shell/footer/LegalNotices.js.map +1 -0
  400. package/dist/shell/footer/PoweredBy.d.ts +1 -0
  401. package/dist/shell/footer/PoweredBy.js +9 -0
  402. package/dist/shell/footer/PoweredBy.js.map +1 -0
  403. package/dist/shell/footer/RevealLinks.d.ts +1 -0
  404. package/dist/shell/footer/RevealLinks.js +16 -0
  405. package/dist/shell/footer/RevealLinks.js.map +1 -0
  406. package/dist/shell/footer/RightLinks.d.ts +1 -0
  407. package/dist/shell/footer/RightLinks.js +7 -0
  408. package/dist/shell/footer/RightLinks.js.map +1 -0
  409. package/dist/shell/footer/app.d.ts +3 -0
  410. package/dist/shell/footer/app.js +67 -0
  411. package/dist/shell/footer/app.js.map +1 -0
  412. package/dist/shell/footer/data/api.d.ts +1 -0
  413. package/dist/shell/footer/data/api.js +45 -0
  414. package/dist/shell/footer/data/api.js.map +1 -0
  415. package/dist/shell/footer/index.js +3 -0
  416. package/dist/shell/footer/index.js.map +1 -0
  417. package/dist/shell/header/AuthenticatedMenu.d.ts +5 -0
  418. package/dist/shell/header/AuthenticatedMenu.js +9 -0
  419. package/dist/shell/header/AuthenticatedMenu.js.map +1 -0
  420. package/dist/shell/header/Header.d.ts +1 -0
  421. package/dist/shell/header/Header.js +8 -0
  422. package/dist/shell/header/Header.js.map +1 -0
  423. package/dist/shell/header/HelpButton.d.ts +5 -0
  424. package/dist/shell/header/HelpButton.js +10 -0
  425. package/dist/shell/header/HelpButton.js.map +1 -0
  426. package/dist/shell/header/anonymous-menu/AnonymousMenu.d.ts +5 -0
  427. package/dist/shell/header/anonymous-menu/AnonymousMenu.js +7 -0
  428. package/dist/shell/header/anonymous-menu/AnonymousMenu.js.map +1 -0
  429. package/dist/shell/header/anonymous-menu/LoginButton.d.ts +3 -0
  430. package/dist/shell/header/anonymous-menu/LoginButton.js +22 -0
  431. package/dist/shell/header/anonymous-menu/LoginButton.js.map +1 -0
  432. package/dist/shell/header/anonymous-menu/RegisterButton.d.ts +3 -0
  433. package/dist/shell/header/anonymous-menu/RegisterButton.js +22 -0
  434. package/dist/shell/header/anonymous-menu/RegisterButton.js.map +1 -0
  435. package/dist/shell/header/app.d.ts +4 -0
  436. package/dist/shell/header/app.js +157 -0
  437. package/dist/shell/header/app.js.map +1 -0
  438. package/dist/shell/header/app.scss +20 -0
  439. package/dist/shell/header/constants.d.ts +3 -0
  440. package/dist/shell/header/constants.js +4 -0
  441. package/dist/shell/header/constants.js.map +1 -0
  442. package/dist/shell/header/course-bar/data/service.d.ts +11 -0
  443. package/dist/shell/header/course-bar/data/service.js +49 -0
  444. package/dist/shell/header/course-bar/data/service.js.map +1 -0
  445. package/dist/shell/header/course-bar/masquerade/MasqueradeBar.d.ts +1 -0
  446. package/dist/shell/header/course-bar/masquerade/MasqueradeBar.js +22 -0
  447. package/dist/shell/header/course-bar/masquerade/MasqueradeBar.js.map +1 -0
  448. package/dist/shell/header/course-bar/masquerade/MasqueradeContext.d.ts +3 -0
  449. package/dist/shell/header/course-bar/masquerade/MasqueradeContext.js +10 -0
  450. package/dist/shell/header/course-bar/masquerade/MasqueradeContext.js.map +1 -0
  451. package/dist/shell/header/course-bar/masquerade/StudioLink.d.ts +6 -0
  452. package/dist/shell/header/course-bar/masquerade/StudioLink.js +27 -0
  453. package/dist/shell/header/course-bar/masquerade/StudioLink.js.map +1 -0
  454. package/dist/shell/header/course-bar/masquerade/data/api.d.ts +29 -0
  455. package/dist/shell/header/course-bar/masquerade/data/api.js +33 -0
  456. package/dist/shell/header/course-bar/masquerade/data/api.js.map +1 -0
  457. package/dist/shell/header/course-bar/masquerade/hooks.d.ts +20 -0
  458. package/dist/shell/header/course-bar/masquerade/hooks.js +203 -0
  459. package/dist/shell/header/course-bar/masquerade/hooks.js.map +1 -0
  460. package/dist/shell/header/course-bar/masquerade/index.d.ts +1 -0
  461. package/dist/shell/header/course-bar/masquerade/index.js +2 -0
  462. package/dist/shell/header/course-bar/masquerade/index.js.map +1 -0
  463. package/dist/shell/header/course-bar/masquerade/masquerade-widget/MasqueradeUserNameInput.d.ts +7 -0
  464. package/dist/shell/header/course-bar/masquerade/masquerade-widget/MasqueradeUserNameInput.js +18 -0
  465. package/dist/shell/header/course-bar/masquerade/masquerade-widget/MasqueradeUserNameInput.js.map +1 -0
  466. package/dist/shell/header/course-bar/masquerade/masquerade-widget/MasqueradeWidget.d.ts +1 -0
  467. package/dist/shell/header/course-bar/masquerade/masquerade-widget/MasqueradeWidget.js +16 -0
  468. package/dist/shell/header/course-bar/masquerade/masquerade-widget/MasqueradeWidget.js.map +1 -0
  469. package/dist/shell/header/course-bar/masquerade/masquerade-widget/MasqueradeWidgetOption.d.ts +6 -0
  470. package/dist/shell/header/course-bar/masquerade/masquerade-widget/MasqueradeWidgetOption.js +18 -0
  471. package/dist/shell/header/course-bar/masquerade/masquerade-widget/MasqueradeWidgetOption.js.map +1 -0
  472. package/dist/shell/header/course-bar/masquerade/masquerade-widget/index.d.ts +2 -0
  473. package/dist/shell/header/course-bar/masquerade/masquerade-widget/index.js +3 -0
  474. package/dist/shell/header/course-bar/masquerade/masquerade-widget/index.js.map +1 -0
  475. package/dist/shell/header/course-bar/masquerade/masquerade-widget/messages.d.ts +28 -0
  476. package/dist/shell/header/course-bar/masquerade/masquerade-widget/messages.js +30 -0
  477. package/dist/shell/header/course-bar/masquerade/masquerade-widget/messages.js.map +1 -0
  478. package/dist/shell/header/course-bar/masquerade/messages.d.ts +28 -0
  479. package/dist/shell/header/course-bar/masquerade/messages.js +30 -0
  480. package/dist/shell/header/course-bar/masquerade/messages.js.map +1 -0
  481. package/dist/shell/header/course-bar/navigation/CourseTabsNavigation.d.ts +3 -0
  482. package/dist/shell/header/course-bar/navigation/CourseTabsNavigation.js +39 -0
  483. package/dist/shell/header/course-bar/navigation/CourseTabsNavigation.js.map +1 -0
  484. package/dist/shell/header/course-bar/navigation/course-tabs-navigation.scss +7 -0
  485. package/dist/shell/header/course-bar/navigation/messages.d.ts +8 -0
  486. package/dist/shell/header/course-bar/navigation/messages.js +10 -0
  487. package/dist/shell/header/course-bar/navigation/messages.js.map +1 -0
  488. package/dist/shell/header/course-bar/utils.d.ts +3 -0
  489. package/dist/shell/header/course-bar/utils.js +54 -0
  490. package/dist/shell/header/course-bar/utils.js.map +1 -0
  491. package/dist/shell/header/desktop/DesktopLayout.d.ts +1 -0
  492. package/dist/shell/header/desktop/DesktopLayout.js +10 -0
  493. package/dist/shell/header/desktop/DesktopLayout.js.map +1 -0
  494. package/dist/shell/header/desktop/PrimaryNavLinks.d.ts +1 -0
  495. package/dist/shell/header/desktop/PrimaryNavLinks.js +7 -0
  496. package/dist/shell/header/desktop/PrimaryNavLinks.js.map +1 -0
  497. package/dist/shell/header/desktop/SecondaryNavLinks.d.ts +1 -0
  498. package/dist/shell/header/desktop/SecondaryNavLinks.js +7 -0
  499. package/dist/shell/header/desktop/SecondaryNavLinks.js.map +1 -0
  500. package/dist/shell/header/helpButtonSlotOperation.d.ts +6 -0
  501. package/dist/shell/header/helpButtonSlotOperation.js +14 -0
  502. package/dist/shell/header/helpButtonSlotOperation.js.map +1 -0
  503. package/dist/shell/header/index.d.ts +5 -0
  504. package/dist/shell/header/index.js +6 -0
  505. package/dist/shell/header/index.js.map +1 -0
  506. package/dist/shell/header/mobile/MobileLayout.d.ts +1 -0
  507. package/dist/shell/header/mobile/MobileLayout.js +17 -0
  508. package/dist/shell/header/mobile/MobileLayout.js.map +1 -0
  509. package/dist/shell/header/mobile/MobileNavLinks.d.ts +1 -0
  510. package/dist/shell/header/mobile/MobileNavLinks.js +7 -0
  511. package/dist/shell/header/mobile/MobileNavLinks.js.map +1 -0
  512. package/dist/shell/index.d.ts +8 -0
  513. package/dist/shell/index.js +9 -0
  514. package/dist/shell/index.js.map +1 -0
  515. package/dist/shell/jest.config.d.ts +15 -0
  516. package/dist/shell/jest.config.js +32 -0
  517. package/dist/shell/jest.config.js.map +1 -0
  518. package/dist/shell/layer-order.scss +1 -0
  519. package/dist/shell/menus/LinkMenuItem.d.ts +9 -0
  520. package/dist/shell/menus/LinkMenuItem.js +38 -0
  521. package/dist/shell/menus/LinkMenuItem.js.map +1 -0
  522. package/dist/shell/menus/NavDropdownMenuSlot.d.ts +7 -0
  523. package/dist/shell/menus/NavDropdownMenuSlot.js +14 -0
  524. package/dist/shell/menus/NavDropdownMenuSlot.js.map +1 -0
  525. package/dist/shell/menus/ProfileLinkMenuItem.d.ts +8 -0
  526. package/dist/shell/menus/ProfileLinkMenuItem.js +16 -0
  527. package/dist/shell/menus/ProfileLinkMenuItem.js.map +1 -0
  528. package/dist/shell/menus/data/utils.d.ts +4 -0
  529. package/dist/shell/menus/data/utils.js +13 -0
  530. package/dist/shell/menus/data/utils.js.map +1 -0
  531. package/dist/shell/router/createRouter.d.ts +1 -0
  532. package/dist/shell/router/createRouter.js +26 -0
  533. package/dist/shell/router/createRouter.js.map +1 -0
  534. package/dist/shell/router/getAppRoutes.d.ts +2 -0
  535. package/dist/shell/router/getAppRoutes.js +27 -0
  536. package/dist/shell/router/getAppRoutes.js.map +1 -0
  537. package/dist/shell/setupTest.d.ts +1 -0
  538. package/dist/shell/setupTest.js +12 -0
  539. package/dist/shell/setupTest.js.map +1 -0
  540. package/dist/shell/site.config.dev.d.ts +4 -0
  541. package/dist/shell/site.config.dev.js +43 -0
  542. package/dist/shell/site.config.dev.js.map +1 -0
  543. package/dist/shell/site.d.ts +1 -0
  544. package/dist/shell/site.js +45 -0
  545. package/dist/shell/site.js.map +1 -0
  546. package/dist/shell/style.d.ts +3 -0
  547. package/dist/shell/style.js +10 -0
  548. package/dist/shell/style.js.map +1 -0
  549. package/dist/shell/style.scss +147 -0
  550. package/dist/tools/babel/babel.config.d.ts +12 -0
  551. package/dist/tools/babel.config.d.ts +2 -0
  552. package/dist/tools/babel.config.js +3 -0
  553. package/dist/tools/cli/commands/serve.d.ts +1 -0
  554. package/dist/tools/cli/commands/translations.d.ts +2 -0
  555. package/dist/tools/cli/commands/translations.js +20 -0
  556. package/dist/tools/cli/openedx.d.ts +2 -0
  557. package/dist/tools/cli/openedx.js +111 -0
  558. package/dist/tools/cli/utils/ensureConfigFilenameOption.d.ts +2 -0
  559. package/dist/tools/cli/utils/formatter.d.ts +1 -0
  560. package/dist/tools/cli/utils/formatter.js +3 -0
  561. package/dist/tools/cli/utils/getResolvedConfigPath.d.ts +2 -0
  562. package/dist/tools/cli/utils/prettyPrintTitle.d.ts +1 -0
  563. package/dist/tools/cli/utils/printUsage.d.ts +1 -0
  564. package/dist/tools/cli/utils/printUsage.js +47 -0
  565. package/dist/tools/cli/utils/translations/index.d.ts +2 -0
  566. package/dist/tools/cli/utils/translations/index.js +7 -0
  567. package/dist/tools/cli/utils/translations/messagesObject.d.ts +26 -0
  568. package/dist/tools/cli/utils/translations/messagesObject.js +66 -0
  569. package/dist/tools/cli/utils/translations/prepare.d.ts +5 -0
  570. package/dist/tools/cli/utils/translations/prepare.js +98 -0
  571. package/dist/tools/cli/utils/translations/pull.d.ts +6 -0
  572. package/dist/tools/cli/utils/translations/pull.js +102 -0
  573. package/dist/tools/config-helpers/createConfig.d.ts +2 -0
  574. package/dist/tools/config-helpers/createLintConfig.d.ts +2 -0
  575. package/dist/tools/config-helpers/getBaseConfig.d.ts +2 -0
  576. package/dist/tools/defaultConfigPaths.d.ts +8 -0
  577. package/dist/tools/eslint/base.eslint.config.d.ts +3 -0
  578. package/dist/tools/eslint/base.eslint.config.js +114 -0
  579. package/dist/tools/eslint.config.d.ts +3 -0
  580. package/dist/tools/index.d.ts +3 -0
  581. package/dist/tools/jest/jest.config.d.ts +14 -0
  582. package/dist/tools/jest.config.d.ts +8 -0
  583. package/dist/tools/types.d.ts +20 -0
  584. package/dist/tools/types.js +25 -0
  585. package/dist/tools/typescript/tsconfig.json +33 -0
  586. package/dist/tools/webpack/common-config/all/getCodeRules.d.ts +2 -0
  587. package/dist/tools/webpack/common-config/all/getFileLoaderRules.d.ts +11 -0
  588. package/dist/tools/webpack/common-config/all/getImageMinimizer.d.ts +5 -0
  589. package/dist/tools/webpack/common-config/all/getStylesheetRule.d.ts +12 -0
  590. package/dist/tools/webpack/common-config/all/getStylesheetRule.js +150 -0
  591. package/dist/tools/webpack/common-config/all/postcssWrapLayer.d.ts +4 -0
  592. package/dist/tools/webpack/common-config/all/postcssWrapLayer.js +32 -0
  593. package/dist/tools/webpack/common-config/dev/getDevServer.d.ts +2 -0
  594. package/dist/tools/webpack/common-config/dev/getDevServer.js +36 -0
  595. package/dist/tools/webpack/common-config/index.d.ts +7 -0
  596. package/dist/tools/webpack/common-config/index.js +20 -0
  597. package/dist/tools/webpack/common-config/site/getHtmlWebpackPlugin.d.ts +2 -0
  598. package/dist/tools/webpack/common-config/site/getHtmlWebpackPlugin.js +24 -0
  599. package/dist/tools/webpack/common-config/site/getI18nMessagesFallbackPlugin/emptyI18n.d.ts +2 -0
  600. package/dist/tools/webpack/common-config/site/getI18nMessagesFallbackPlugin/emptyI18n.js +3 -0
  601. package/dist/tools/webpack/common-config/site/getI18nMessagesFallbackPlugin/index.d.ts +2 -0
  602. package/dist/tools/webpack/common-config/site/getI18nMessagesFallbackPlugin/index.js +26 -0
  603. package/dist/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.d.ts +16 -0
  604. package/dist/tools/webpack/plugins/html-webpack-new-relic-plugin/index.d.ts +2 -0
  605. package/dist/tools/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.d.ts +1 -0
  606. package/dist/tools/webpack/utils/getPublicPath.d.ts +1 -0
  607. package/dist/tools/webpack/utils/getPublicPath.js +6 -0
  608. package/dist/tools/webpack/utils/getResolvedSiteConfigPath.d.ts +1 -0
  609. package/dist/tools/webpack/utils/getResolvedSiteI18nPath.d.ts +1 -0
  610. package/dist/tools/webpack/utils/getResolvedSiteI18nPath.js +25 -0
  611. package/dist/tools/webpack/webpack.config.build.d.ts +3 -0
  612. package/dist/tools/webpack/webpack.config.build.js +78 -0
  613. package/dist/tools/webpack/webpack.config.dev.d.ts +3 -0
  614. package/dist/tools/webpack/webpack.config.dev.js +78 -0
  615. package/dist/tools/webpack/webpack.config.dev.shell.d.ts +3 -0
  616. package/dist/tools/webpack/webpack.config.dev.shell.js +105 -0
  617. package/dist/types.d.ts +93 -0
  618. package/dist/types.js +7 -0
  619. package/dist/types.js.map +1 -0
  620. package/package.json +45 -32
  621. package/config/eslint/base.eslint.config.js +0 -113
  622. package/config/tsconfig.json +0 -32
  623. package/config/types.js +0 -23
  624. package/config/webpack/common-config/all/getIgnoreWarnings.js +0 -14
  625. package/config/webpack/common-config/all/getStylesheetRule.js +0 -112
  626. package/config/webpack/common-config/dev/getDevServer.js +0 -38
  627. package/config/webpack/common-config/index.js +0 -18
  628. package/config/webpack/common-config/site/getHtmlWebpackPlugin.js +0 -16
  629. package/config/webpack/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js +0 -66
  630. package/config/webpack/utils/getLocalAliases.js +0 -65
  631. package/config/webpack/utils/getPublicPath.js +0 -6
  632. package/config/webpack/webpack.config.build.js +0 -69
  633. package/config/webpack/webpack.config.dev.js +0 -69
  634. package/config/webpack/webpack.config.dev.shell.js +0 -103
  635. package/index.ts +0 -7
  636. package/runtime/__mocks__/file.js +0 -1
  637. package/runtime/__mocks__/svg.js +0 -1
  638. package/runtime/__mocks__/universal-cookie.js +0 -6
  639. package/runtime/analytics/MockAnalyticsService.js +0 -71
  640. package/runtime/analytics/SegmentAnalyticsService.js +0 -243
  641. package/runtime/analytics/index.ts +0 -12
  642. package/runtime/analytics/interface.js +0 -145
  643. package/runtime/analytics/interface.test.js +0 -242
  644. package/runtime/auth/AxiosCsrfTokenService.js +0 -60
  645. package/runtime/auth/AxiosJwtAuthService.js +0 -363
  646. package/runtime/auth/AxiosJwtAuthService.test.jsx +0 -1076
  647. package/runtime/auth/AxiosJwtTokenService.js +0 -134
  648. package/runtime/auth/LocalForageCache.js +0 -76
  649. package/runtime/auth/MockAuthService.js +0 -278
  650. package/runtime/auth/index.ts +0 -19
  651. package/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js +0 -36
  652. package/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js +0 -37
  653. package/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js +0 -20
  654. package/runtime/auth/interceptors/createRetryInterceptor.js +0 -74
  655. package/runtime/auth/interceptors/createRetryInterceptor.test.js +0 -23
  656. package/runtime/auth/interface.js +0 -309
  657. package/runtime/auth/utils.js +0 -105
  658. package/runtime/babel.config.js +0 -3
  659. package/runtime/config/getExternalLinkUrl.test.js +0 -76
  660. package/runtime/config/index.ts +0 -294
  661. package/runtime/constants.ts +0 -68
  662. package/runtime/i18n/index.js +0 -118
  663. package/runtime/i18n/injectIntlWithShim.jsx +0 -48
  664. package/runtime/i18n/lib.test.js +0 -230
  665. package/runtime/i18n/lib.ts +0 -272
  666. package/runtime/index.ts +0 -139
  667. package/runtime/initialize.async.function.config.test.js +0 -43
  668. package/runtime/initialize.const.config.test.js +0 -41
  669. package/runtime/initialize.function.config.test.js +0 -41
  670. package/runtime/initialize.js +0 -352
  671. package/runtime/initialize.test.js +0 -356
  672. package/runtime/jest.config.js +0 -33
  673. package/runtime/logging/MockLoggingService.js +0 -31
  674. package/runtime/logging/NewRelicLoggingService.js +0 -184
  675. package/runtime/logging/NewRelicLoggingService.test.js +0 -214
  676. package/runtime/logging/index.ts +0 -9
  677. package/runtime/logging/interface.js +0 -109
  678. package/runtime/logging/types.ts +0 -4
  679. package/runtime/react/AuthenticatedPageRoute.jsx +0 -43
  680. package/runtime/react/AuthenticatedPageRoute.test.jsx +0 -135
  681. package/runtime/react/CombinedAppProvider.tsx +0 -46
  682. package/runtime/react/CurrentAppContext.tsx +0 -25
  683. package/runtime/react/CurrentAppProvider.tsx +0 -46
  684. package/runtime/react/Divider.tsx +0 -5
  685. package/runtime/react/ErrorBoundary.jsx +0 -47
  686. package/runtime/react/ErrorBoundary.test.jsx +0 -83
  687. package/runtime/react/ErrorPage.jsx +0 -72
  688. package/runtime/react/LoginRedirect.jsx +0 -16
  689. package/runtime/react/PageWrap.jsx +0 -24
  690. package/runtime/react/SiteContext.tsx +0 -32
  691. package/runtime/react/SiteProvider.test.jsx +0 -66
  692. package/runtime/react/SiteProvider.tsx +0 -101
  693. package/runtime/react/constants.ts +0 -3
  694. package/runtime/react/hooks/index.ts +0 -8
  695. package/runtime/react/hooks/theme/useTheme.test.ts +0 -221
  696. package/runtime/react/hooks/theme/useTheme.ts +0 -179
  697. package/runtime/react/hooks/theme/useThemeConfig.test.ts +0 -107
  698. package/runtime/react/hooks/theme/useThemeConfig.ts +0 -34
  699. package/runtime/react/hooks/theme/useThemeCore.test.ts +0 -65
  700. package/runtime/react/hooks/theme/useThemeCore.ts +0 -52
  701. package/runtime/react/hooks/theme/useThemeVariants.test.ts +0 -97
  702. package/runtime/react/hooks/theme/useThemeVariants.ts +0 -116
  703. package/runtime/react/hooks/theme/useTrackColorSchemeChoice.test.ts +0 -54
  704. package/runtime/react/hooks/theme/useTrackColorSchemeChoice.ts +0 -30
  705. package/runtime/react/hooks/theme/utils.ts +0 -11
  706. package/runtime/react/hooks/useActiveRoles.ts +0 -15
  707. package/runtime/react/hooks/useActiveRouteRoleWatcher.ts +0 -31
  708. package/runtime/react/hooks/useAppConfig.ts +0 -9
  709. package/runtime/react/hooks/useAuthenticatedUser.test.tsx +0 -41
  710. package/runtime/react/hooks/useAuthenticatedUser.ts +0 -9
  711. package/runtime/react/hooks/useSiteConfig.test.tsx +0 -13
  712. package/runtime/react/hooks/useSiteConfig.ts +0 -9
  713. package/runtime/react/hooks/useSiteEvent.ts +0 -24
  714. package/runtime/react/index.ts +0 -19
  715. package/runtime/react/reducers.ts +0 -40
  716. package/runtime/routing/index.ts +0 -1
  717. package/runtime/routing/utils.test.ts +0 -7
  718. package/runtime/routing/utils.ts +0 -34
  719. package/runtime/scripts/GoogleAnalyticsLoader.test.ts +0 -77
  720. package/runtime/scripts/GoogleAnalyticsLoader.ts +0 -59
  721. package/runtime/scripts/index.ts +0 -1
  722. package/runtime/setupTest.js +0 -14
  723. package/runtime/site.config.test.tsx +0 -33
  724. package/runtime/slots/Slot.test.tsx +0 -40
  725. package/runtime/slots/Slot.tsx +0 -32
  726. package/runtime/slots/SlotContext.tsx +0 -8
  727. package/runtime/slots/hooks.ts +0 -35
  728. package/runtime/slots/layout/DefaultSlotLayout.test.tsx +0 -31
  729. package/runtime/slots/layout/DefaultSlotLayout.tsx +0 -9
  730. package/runtime/slots/layout/hooks.test.tsx +0 -178
  731. package/runtime/slots/layout/hooks.ts +0 -65
  732. package/runtime/slots/layout/types.ts +0 -45
  733. package/runtime/slots/layout/utils.test.ts +0 -67
  734. package/runtime/slots/layout/utils.ts +0 -14
  735. package/runtime/slots/types.ts +0 -24
  736. package/runtime/slots/utils.test.ts +0 -64
  737. package/runtime/slots/utils.ts +0 -78
  738. package/runtime/slots/widget/WidgetContext.tsx +0 -9
  739. package/runtime/slots/widget/WidgetProvider.tsx +0 -30
  740. package/runtime/slots/widget/hooks.ts +0 -105
  741. package/runtime/slots/widget/iframe/IFrameContentWrapper.messages.tsx +0 -16
  742. package/runtime/slots/widget/iframe/IFrameContentWrapper.tsx +0 -84
  743. package/runtime/slots/widget/iframe/IFrameWidget.tsx +0 -59
  744. package/runtime/slots/widget/iframe/constants.ts +0 -19
  745. package/runtime/slots/widget/iframe/hooks.ts +0 -179
  746. package/runtime/slots/widget/iframe/index.ts +0 -6
  747. package/runtime/slots/widget/iframe/types.ts +0 -7
  748. package/runtime/slots/widget/types.ts +0 -134
  749. package/runtime/slots/widget/utils.tsx +0 -201
  750. package/runtime/subscriptions.ts +0 -60
  751. package/runtime/testing/index.ts +0 -9
  752. package/runtime/testing/initializeMockApp.test.ts +0 -66
  753. package/runtime/testing/initializeMockApp.ts +0 -86
  754. package/runtime/testing/mockMessages.ts +0 -23
  755. package/runtime/utils.js +0 -178
  756. package/runtime/utils.test.js +0 -116
  757. package/shell/DefaultLayout.tsx +0 -18
  758. package/shell/DefaultMain.tsx +0 -7
  759. package/shell/Logo.test.tsx +0 -32
  760. package/shell/Logo.tsx +0 -28
  761. package/shell/Shell.messages.ts +0 -61
  762. package/shell/Shell.tsx +0 -18
  763. package/shell/__mocks__/file.js +0 -1
  764. package/shell/__mocks__/svg.js +0 -1
  765. package/shell/__mocks__/universal-cookie.js +0 -6
  766. package/shell/app.scss +0 -150
  767. package/shell/app.ts +0 -38
  768. package/shell/babel.config.js +0 -3
  769. package/shell/dev/devFooter/app.tsx +0 -43
  770. package/shell/dev/devHeader/BarContext.tsx +0 -13
  771. package/shell/dev/devHeader/BarLink.tsx +0 -16
  772. package/shell/dev/devHeader/BarProvider.tsx +0 -25
  773. package/shell/dev/devHeader/CoursesLink.tsx +0 -16
  774. package/shell/dev/devHeader/FooContext.tsx +0 -13
  775. package/shell/dev/devHeader/FooLink.tsx +0 -16
  776. package/shell/dev/devHeader/FooProvider.tsx +0 -25
  777. package/shell/dev/devHeader/app.tsx +0 -53
  778. package/shell/dev/devHeader/providers.tsx +0 -11
  779. package/shell/dev/devHome/HomePage.tsx +0 -28
  780. package/shell/dev/devHome/app.ts +0 -18
  781. package/shell/dev/devHome/i18n/index.ts +0 -27
  782. package/shell/dev/devHome/messages.ts +0 -11
  783. package/shell/dev/devUser/app.tsx +0 -24
  784. package/shell/dev/devUser/index.ts +0 -1
  785. package/shell/dev/index.ts +0 -5
  786. package/shell/dev/slotShowcase/HorizontalSlotLayout.tsx +0 -11
  787. package/shell/dev/slotShowcase/LayoutWithOptions.tsx +0 -17
  788. package/shell/dev/slotShowcase/SlotShowcasePage.tsx +0 -66
  789. package/shell/dev/slotShowcase/WidgetWithOptions.tsx +0 -11
  790. package/shell/dev/slotShowcase/app.tsx +0 -373
  791. package/shell/footer/CenterLinks.tsx +0 -11
  792. package/shell/footer/CopyrightNotice.tsx +0 -36
  793. package/shell/footer/Footer.tsx +0 -34
  794. package/shell/footer/LabeledLinkColumn.tsx +0 -19
  795. package/shell/footer/LanguageMenu.tsx +0 -35
  796. package/shell/footer/LanguageMenuItem.tsx +0 -23
  797. package/shell/footer/LeftLinks.tsx +0 -11
  798. package/shell/footer/LegalNotices.tsx +0 -17
  799. package/shell/footer/PoweredBy.tsx +0 -17
  800. package/shell/footer/RevealLinks.tsx +0 -43
  801. package/shell/footer/RightLinks.tsx +0 -11
  802. package/shell/footer/app.tsx +0 -73
  803. package/shell/footer/data/api.ts +0 -48
  804. package/shell/header/AuthenticatedMenu.tsx +0 -32
  805. package/shell/header/Header.tsx +0 -17
  806. package/shell/header/anonymous-menu/AnonymousMenu.tsx +0 -14
  807. package/shell/header/anonymous-menu/LoginButton.tsx +0 -14
  808. package/shell/header/anonymous-menu/RegisterButton.tsx +0 -15
  809. package/shell/header/app.tsx +0 -142
  810. package/shell/header/desktop/DesktopLayout.tsx +0 -22
  811. package/shell/header/desktop/PrimaryNavLinks.tsx +0 -10
  812. package/shell/header/desktop/SecondaryNavLinks.tsx +0 -10
  813. package/shell/header/index.ts +0 -2
  814. package/shell/header/mobile/MobileLayout.tsx +0 -47
  815. package/shell/header/mobile/MobileNavLinks.tsx +0 -10
  816. package/shell/i18n/index.ts +0 -25
  817. package/shell/index.ts +0 -7
  818. package/shell/jest.config.js +0 -31
  819. package/shell/menus/LinkMenuItem.tsx +0 -64
  820. package/shell/menus/NavDropdownMenuSlot.tsx +0 -29
  821. package/shell/menus/ProfileLinkMenuItem.tsx +0 -33
  822. package/shell/menus/data/utils.ts +0 -19
  823. package/shell/public/index.html +0 -10
  824. package/shell/router/createRouter.test.tsx +0 -50
  825. package/shell/router/createRouter.ts +0 -17
  826. package/shell/router/getAppRoutes.test.tsx +0 -59
  827. package/shell/router/getAppRoutes.ts +0 -21
  828. package/shell/setupTest.js +0 -13
  829. package/shell/site.config.dev.tsx +0 -49
  830. package/shell/site.config.test.tsx +0 -16
  831. package/shell/site.tsx +0 -41
  832. package/tools/dist/babel/babel.config.js +0 -28
  833. package/tools/dist/cli/intl-imports.js +0 -233
  834. package/tools/dist/cli/intl-imports.test.js +0 -146
  835. package/tools/dist/cli/openedx.js +0 -86
  836. package/tools/dist/cli/transifex-utils.js +0 -68
  837. package/tools/dist/cli/utils/formatter.js +0 -10
  838. package/tools/dist/cli/utils/printUsage.js +0 -39
  839. package/tools/dist/config-helpers/createConfig.js +0 -13
  840. package/tools/dist/config-helpers/createLintConfig.js +0 -16
  841. package/tools/dist/config-helpers/getBaseConfig.js +0 -12
  842. package/tools/dist/defaultConfigPaths.js +0 -35
  843. package/tools/dist/eslint/base.eslint.config.js +0 -113
  844. package/tools/dist/index.js +0 -12
  845. package/tools/dist/jest/jest.config.js +0 -30
  846. package/tools/dist/types.js +0 -23
  847. package/tools/dist/typescript/tsconfig.json +0 -32
  848. package/tools/dist/webpack/common-config/all/getCodeRules.js +0 -52
  849. package/tools/dist/webpack/common-config/all/getFileLoaderRules.js +0 -26
  850. package/tools/dist/webpack/common-config/all/getIgnoreWarnings.js +0 -14
  851. package/tools/dist/webpack/common-config/all/getImageMinimizer.js +0 -25
  852. package/tools/dist/webpack/common-config/all/getStylesheetRule.js +0 -112
  853. package/tools/dist/webpack/common-config/dev/getDevServer.js +0 -38
  854. package/tools/dist/webpack/common-config/index.js +0 -18
  855. package/tools/dist/webpack/common-config/site/getHtmlWebpackPlugin.js +0 -16
  856. package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js +0 -91
  857. package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/index.js +0 -7
  858. package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js +0 -66
  859. package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +0 -3
  860. package/tools/dist/webpack/utils/getLocalAliases.js +0 -65
  861. package/tools/dist/webpack/utils/getPublicPath.js +0 -6
  862. package/tools/dist/webpack/utils/getResolvedSiteConfigPath.js +0 -32
  863. package/tools/dist/webpack/webpack.config.build.js +0 -69
  864. package/tools/dist/webpack/webpack.config.dev.js +0 -69
  865. package/tools/dist/webpack/webpack.config.dev.shell.js +0 -103
  866. package/types.ts +0 -119
  867. /package/{runtime/react/hooks/theme/index.ts → dist/runtime/react/hooks/theme/index.d.ts} +0 -0
  868. /package/{runtime/slots/index.ts → dist/runtime/slots/index.d.ts} +0 -0
  869. /package/{runtime/slots/layout/index.ts → dist/runtime/slots/layout/index.d.ts} +0 -0
  870. /package/{runtime/slots/widget/index.ts → dist/runtime/slots/widget/index.d.ts} +0 -0
  871. /package/{shell/dev/devFooter/index.ts → dist/shell/dev/devFooter/index.d.ts} +0 -0
  872. /package/{shell/dev/devHeader/index.ts → dist/shell/dev/devHeader/index.d.ts} +0 -0
  873. /package/{shell/dev/devHome/index.ts → dist/shell/dev/devHome/index.d.ts} +0 -0
  874. /package/{shell/dev/slotShowcase/index.ts → dist/shell/dev/slotShowcase/index.d.ts} +0 -0
  875. /package/{shell/footer/index.ts → dist/shell/footer/index.d.ts} +0 -0
  876. /package/{config → dist/tools}/babel/babel.config.js +0 -0
  877. /package/{tools/dist → dist/tools}/cli/commands/serve.js +0 -0
  878. /package/{tools/dist → dist/tools}/cli/utils/ensureConfigFilenameOption.js +0 -0
  879. /package/{tools/dist → dist/tools}/cli/utils/getResolvedConfigPath.js +0 -0
  880. /package/{tools/dist → dist/tools}/cli/utils/prettyPrintTitle.js +0 -0
  881. /package/{config → dist/tools}/config-helpers/createConfig.js +0 -0
  882. /package/{config → dist/tools}/config-helpers/createLintConfig.js +0 -0
  883. /package/{config → dist/tools}/config-helpers/getBaseConfig.js +0 -0
  884. /package/{config → dist/tools}/defaultConfigPaths.js +0 -0
  885. /package/{tools/dist → dist/tools}/eslint.config.js +0 -0
  886. /package/{config → dist/tools}/index.js +0 -0
  887. /package/{config → dist/tools}/jest/jest.config.js +0 -0
  888. /package/{tools/dist → dist/tools}/jest.config.js +0 -0
  889. /package/{config → dist/tools}/webpack/common-config/all/getCodeRules.js +0 -0
  890. /package/{config → dist/tools}/webpack/common-config/all/getFileLoaderRules.js +0 -0
  891. /package/{config → dist/tools}/webpack/common-config/all/getImageMinimizer.js +0 -0
  892. /package/{config → dist/tools}/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js +0 -0
  893. /package/{config → dist/tools}/webpack/plugins/html-webpack-new-relic-plugin/index.js +0 -0
  894. /package/{config → dist/tools}/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +0 -0
  895. /package/{config → dist/tools}/webpack/utils/getResolvedSiteConfigPath.js +0 -0
@@ -1,1076 +0,0 @@
1
- /* eslint-disable arrow-body-style, no-console */
2
- import axios from 'axios';
3
- import MockAdapter from 'axios-mock-adapter';
4
- import Cookies from 'universal-cookie';
5
- import { getSiteConfig } from '../config';
6
- import AxiosJwtAuthService from './AxiosJwtAuthService';
7
-
8
- const mockLoggingService = {
9
- logInfo: jest.fn(),
10
- logError: jest.fn(),
11
- setCustomAttribute: jest.fn(),
12
- };
13
-
14
- const authOptions = {
15
- config: getSiteConfig(),
16
- loggingService: mockLoggingService,
17
- };
18
-
19
- // Set up mocks
20
- // ---------------------------------------------------------------
21
-
22
- const secondsInDay = 60 * 60 * 24;
23
- const yesterdayInSeconds = (Date.now() / 1000) - secondsInDay;
24
- const tomorrowInSeconds = (Date.now() / 1000) + secondsInDay;
25
-
26
- const jwtTokens = {
27
- expired: {
28
- decoded: {
29
- user_id: '12345',
30
- preferred_username: 'test',
31
- administrator: false,
32
- exp: yesterdayInSeconds,
33
- },
34
- },
35
- valid: {
36
- decoded: {
37
- user_id: '12345',
38
- preferred_username: 'test',
39
- administrator: false,
40
- exp: tomorrowInSeconds,
41
- },
42
- formatted: {
43
- userId: '12345',
44
- username: 'test',
45
- administrator: false,
46
- roles: [],
47
- },
48
- },
49
- validWithRoles: {
50
- decoded: {
51
- user_id: '12345',
52
- preferred_username: 'test',
53
- administrator: true,
54
- roles: ['role1', 'role2'],
55
- exp: tomorrowInSeconds,
56
- },
57
- formatted: {
58
- userId: '12345',
59
- username: 'test',
60
- administrator: true,
61
- roles: ['role1', 'role2'],
62
- },
63
- },
64
- };
65
-
66
- // encode mock JWT tokens
67
- Object.keys(jwtTokens).forEach((jwtTokenName) => {
68
- const decodedJwt = jwtTokens[jwtTokenName].decoded;
69
- jwtTokens[jwtTokenName].encoded = `header.${btoa(JSON.stringify(decodedJwt))}`;
70
- });
71
-
72
- const mockCsrfToken = 'thetokenvalue';
73
- const mockApiEndpointPath = `${authOptions.config.baseUrl}/api/v1/test`;
74
-
75
- global.location ??= { ...global.location, assign: jest.fn() };
76
-
77
- const mockCookies = new Cookies();
78
-
79
- let accessTokenAxios = null;
80
- let csrfTokensAxios = null;
81
- let axiosMock = null;
82
- let accessTokenAxiosMock = null;
83
- let csrfTokensAxiosMock = null;
84
- let client = null;
85
- let cachedClient = null;
86
-
87
- // Helpers
88
- const setJwtCookieTo = (jwtCookieValue) => {
89
- mockCookies.get.mockImplementation((cookieName) => {
90
- if (cookieName === authOptions.config.accessTokenCookieName) {
91
- return jwtCookieValue;
92
- }
93
- return undefined;
94
- });
95
- };
96
-
97
- const setJwtTokenRefreshResponseTo = (status, jwtCookieValue, responseEpochSeconds = null) => {
98
- accessTokenAxiosMock.onPost().reply(() => {
99
- setJwtCookieTo(jwtCookieValue);
100
- if (responseEpochSeconds) {
101
- const data = { response_epoch_seconds: responseEpochSeconds, expires_epoch_seconds: responseEpochSeconds + 3600 };
102
- return [status, data];
103
- }
104
- return [status];
105
- });
106
- };
107
-
108
- function expectLogout(redirectUrl = authOptions.config.baseUrl) {
109
- const encodedRedirectUrl = encodeURIComponent(redirectUrl);
110
- expect(global.location.assign)
111
- .toHaveBeenCalledWith(`${authOptions.config.logoutUrl}?redirect_url=${encodedRedirectUrl}`);
112
- }
113
-
114
- function expectLogin(redirectUrl = authOptions.config.baseUrl) {
115
- const encodedRedirectUrl = encodeURIComponent(redirectUrl);
116
- expect(global.location.assign)
117
- .toHaveBeenCalledWith(`${authOptions.config.loginUrl}?next=${encodedRedirectUrl}`);
118
- }
119
-
120
- // customAttributes is sent into expect.objectContaining
121
- // and can include other matchers in the object like expect.any(Number)
122
- const expectLogFunctionToHaveBeenCalledWithMessage = (
123
- callParams,
124
- errorMessage,
125
- customAttributes,
126
- ) => {
127
- const loggedError = callParams[0];
128
- expect(typeof loggedError === 'string' ? loggedError : loggedError.message).toEqual(errorMessage);
129
- if (customAttributes) {
130
- expect(callParams[1]).toEqual(expect.objectContaining(customAttributes));
131
- }
132
- };
133
-
134
- const expectSingleCallToJwtTokenRefresh = () => {
135
- expect(accessTokenAxiosMock.history.post.length).toBe(1);
136
- };
137
-
138
- const expectNoCallToJwtTokenRefresh = () => {
139
- expect(accessTokenAxiosMock.history.post.length).toBe(0);
140
- };
141
-
142
- const expectSingleCallToCsrfTokenFetch = () => {
143
- expect(csrfTokensAxiosMock.history.get.length).toBe(1);
144
- };
145
-
146
- const expectNoCallToCsrfTokenFetch = () => {
147
- expect(csrfTokensAxiosMock.history.get.length).toBe(0);
148
- };
149
-
150
- const expectRequestToHaveJwtAuth = (request) => {
151
- expect(request.headers['USE-JWT-COOKIE']).toBeTruthy();
152
- expect(request.withCredentials).toBe(true);
153
- };
154
-
155
- const expectRequestToHaveCsrfToken = (request) => {
156
- expect(request.headers['X-CSRFToken']).toEqual(mockCsrfToken);
157
- };
158
-
159
- expect.extend({
160
- toBeWithinRange(received, floor, ceiling) {
161
- const pass = received >= floor && received <= ceiling;
162
- if (pass) {
163
- return {
164
- message: () => `expected ${received} not to be within range ${floor} - ${ceiling}`,
165
- pass: true,
166
- };
167
- }
168
- return {
169
- message: () => `expected ${received} to be within range ${floor} - ${ceiling}`,
170
- pass: false,
171
- };
172
- },
173
- });
174
-
175
- const { location } = global;
176
- const service = new AxiosJwtAuthService(authOptions);
177
-
178
- beforeEach(() => {
179
- accessTokenAxios = service.getJwtTokenService().getHttpClient();
180
- csrfTokensAxios = service.getCsrfTokenService().getHttpClient();
181
- // This sets the mock adapter on the default instance
182
- axiosMock = new MockAdapter(service.getAuthenticatedHttpClient());
183
- accessTokenAxiosMock = new MockAdapter(accessTokenAxios);
184
- csrfTokensAxiosMock = new MockAdapter(csrfTokensAxios);
185
-
186
- client = service.getAuthenticatedHttpClient();
187
- cachedClient = service.getAuthenticatedHttpClient({ useCache: true });
188
-
189
- service.setAuthenticatedUser(null);
190
- axiosMock.reset();
191
- accessTokenAxiosMock.reset();
192
- csrfTokensAxiosMock.reset();
193
- mockCookies.get.mockReset();
194
- delete global.location;
195
- global.location = {
196
- assign: jest.fn(),
197
- origin: 'http://localhost',
198
- };
199
- mockLoggingService.logInfo.mockReset();
200
- mockLoggingService.logError.mockReset();
201
- mockLoggingService.setCustomAttribute.mockReset();
202
- service.getCsrfTokenService().clearCsrfTokenCache();
203
- axiosMock.onGet('/unauthorized').reply(401);
204
- axiosMock.onGet('/forbidden').reply(403);
205
- axiosMock.onAny().reply(200);
206
- csrfTokensAxiosMock.onGet().reply(200, { csrfToken: mockCsrfToken });
207
- axios.defaults.maxRetries = 0;
208
- csrfTokensAxios.defaults.maxRetries = 0;
209
- accessTokenAxios.defaults.maxRetries = 0;
210
- });
211
-
212
- afterEach(() => {
213
- global.location = location;
214
- });
215
-
216
- describe('applyMiddleware', () => {
217
- it('should apply all middleware to the http clients in the service', () => {
218
- const clients = [
219
- service.authenticatedHttpClient, service.httpClient,
220
- service.cachedAuthenticatedHttpClient, service.cachedHttpClient,
221
- ].filter(Boolean);
222
-
223
- const middleware1 = jest.fn();
224
- const middleware2 = jest.fn();
225
-
226
- service.applyMiddleware([middleware1, middleware2]);
227
- expect(middleware1).toHaveBeenCalledTimes(clients.length);
228
- expect(middleware2).toHaveBeenCalledTimes(clients.length);
229
- });
230
-
231
- it('throws an error and calls logError', () => {
232
- const error = new Error('middleware error');
233
- const middleware = jest.fn(() => { throw error; });
234
-
235
- try {
236
- service.applyMiddleware([middleware]);
237
- } catch (e) {
238
- expectLogFunctionToHaveBeenCalledWithMessage(
239
- mockLoggingService.logError.mock.calls[0],
240
- `[frontend-auth] ${error.message}`,
241
- );
242
- }
243
- });
244
- });
245
-
246
- describe('getAuthenticatedHttpClient', () => {
247
- beforeEach(() => {
248
- console.error = jest.fn();
249
- });
250
-
251
- afterAll(() => {
252
- console.error.mockRestore();
253
- });
254
-
255
- it('returns a singleton', () => {
256
- const client1 = service.getAuthenticatedHttpClient();
257
- const client2 = service.getAuthenticatedHttpClient();
258
- expect(client2).toBe(client1);
259
- });
260
-
261
- it('returns a cached singleton', () => {
262
- const client1 = service.getAuthenticatedHttpClient({ useCache: true });
263
- const client2 = service.getAuthenticatedHttpClient({ useCache: true });
264
- expect(client2).toBe(client1);
265
- expect(client1).not.toBeNull();
266
- expect(client2).not.toBeNull();
267
- });
268
-
269
- it('returns a different singleton between the cached and non cached versions', () => {
270
- const client1 = service.getAuthenticatedHttpClient({ useCache: true });
271
- const client2 = service.getAuthenticatedHttpClient();
272
- expect(client2).not.toBe(client1);
273
- expect(client1).not.toBeNull();
274
- expect(client2).not.toBeNull();
275
-
276
- // the cached client should have ``storage`` property if configured properly
277
- expect(client1).toHaveProperty('storage');
278
- expect(client2).not.toHaveProperty('storage');
279
- });
280
- });
281
-
282
- describe('authenticatedHttpClient usage', () => {
283
- describe('User is logged in', () => {
284
- describe('No jwt cookie exists on load', () => {
285
- beforeEach(() => {
286
- setJwtCookieTo(null);
287
- setJwtTokenRefreshResponseTo(200, jwtTokens.valid.encoded);
288
- });
289
-
290
- describe('Single requests', () => {
291
- ['get', 'options'].forEach((method) => {
292
- it(`${method.toUpperCase()}: refreshes the jwt token`, () => {
293
- return client[method](mockApiEndpointPath).then(() => {
294
- expectSingleCallToJwtTokenRefresh();
295
- expectNoCallToCsrfTokenFetch();
296
- expectRequestToHaveJwtAuth(axiosMock.history[method][0]);
297
- });
298
- });
299
- });
300
-
301
- ['post', 'put', 'patch', 'delete'].forEach((method) => {
302
- it(`${method.toUpperCase()}: refreshes the csrf and jwt tokens`, () => {
303
- return client[method](mockApiEndpointPath).then(() => {
304
- expectSingleCallToJwtTokenRefresh();
305
- expectSingleCallToCsrfTokenFetch();
306
- expectRequestToHaveJwtAuth(axiosMock.history[method][0]);
307
- expectRequestToHaveCsrfToken(axiosMock.history[method][0]);
308
- });
309
- });
310
- });
311
- });
312
-
313
- describe('Single request to relative url', () => {
314
- ['post', 'put', 'patch', 'delete'].forEach((method) => {
315
- it(`${method.toUpperCase()}: refreshes the csrf and jwt tokens`, () => {
316
- return client[method]('/local/path').then(() => {
317
- expectSingleCallToJwtTokenRefresh();
318
- expectSingleCallToCsrfTokenFetch();
319
- expectRequestToHaveCsrfToken(axiosMock.history[method][0]);
320
- expectRequestToHaveJwtAuth(axiosMock.history[method][0]);
321
- expect(csrfTokensAxiosMock.history.get[0].url)
322
- .toEqual(`${global.location.origin}${authOptions.config.csrfTokenApiPath}`);
323
- });
324
- });
325
- });
326
- });
327
-
328
- describe('Multiple parallel requests', () => {
329
- ['get', 'options'].forEach((method) => {
330
- it(`${method.toUpperCase()}: refresh the jwt token only once`, () => {
331
- return Promise.all([
332
- client[method](mockApiEndpointPath),
333
- client[method](mockApiEndpointPath),
334
- ]).then(() => {
335
- expectSingleCallToJwtTokenRefresh();
336
- expectNoCallToCsrfTokenFetch();
337
- expectRequestToHaveJwtAuth(axiosMock.history[method][0]);
338
- expectRequestToHaveJwtAuth(axiosMock.history[method][1]);
339
- });
340
- });
341
- });
342
-
343
- ['post', 'put', 'patch', 'delete'].forEach((method) => {
344
- it(`${method.toUpperCase()}: refresh the jwt and csrf tokens only once`, () => {
345
- return Promise.all([
346
- client[method](mockApiEndpointPath),
347
- client[method](mockApiEndpointPath),
348
- ]).then(() => {
349
- expectSingleCallToJwtTokenRefresh();
350
- expectSingleCallToCsrfTokenFetch();
351
- expectRequestToHaveJwtAuth(axiosMock.history[method][0]);
352
- expectRequestToHaveCsrfToken(axiosMock.history[method][0]);
353
- expectRequestToHaveJwtAuth(axiosMock.history[method][1]);
354
- expectRequestToHaveCsrfToken(axiosMock.history[method][1]);
355
- });
356
- });
357
- });
358
- });
359
-
360
- describe('Multiple serial requests', () => {
361
- ['get', 'options'].forEach((method) => {
362
- it(`${method.toUpperCase()}: refresh the jwt token only once`, () => {
363
- return client[method](mockApiEndpointPath)
364
- .then(() => client[method](mockApiEndpointPath))
365
- .then(() => {
366
- expectSingleCallToJwtTokenRefresh();
367
- expectNoCallToCsrfTokenFetch();
368
- expectRequestToHaveJwtAuth(axiosMock.history[method][0]);
369
- expectRequestToHaveJwtAuth(axiosMock.history[method][1]);
370
- });
371
- });
372
- });
373
-
374
- ['post', 'put', 'patch', 'delete'].forEach((method) => {
375
- it(`${method.toUpperCase()}: refreshes the csrf and jwt tokens only once`, () => {
376
- return client[method](mockApiEndpointPath)
377
- .then(() => client[method](mockApiEndpointPath))
378
- .then(() => {
379
- expectSingleCallToJwtTokenRefresh();
380
- expectSingleCallToCsrfTokenFetch();
381
- expectRequestToHaveJwtAuth(axiosMock.history[method][0]);
382
- expectRequestToHaveCsrfToken(axiosMock.history[method][0]);
383
- expectRequestToHaveJwtAuth(axiosMock.history[method][1]);
384
- expectRequestToHaveCsrfToken(axiosMock.history[method][1]);
385
- });
386
- });
387
- });
388
- });
389
- });
390
-
391
- describe('An expired token is found on load', () => {
392
- beforeEach(() => {
393
- setJwtCookieTo(jwtTokens.expired.encoded);
394
- setJwtTokenRefreshResponseTo(200, jwtTokens.valid.encoded);
395
- });
396
-
397
- ['get', 'options'].forEach((method) => {
398
- it(`${method.toUpperCase()}: refreshes the jwt token`, () => {
399
- return client[method](mockApiEndpointPath).then(() => {
400
- expectSingleCallToJwtTokenRefresh();
401
- expectNoCallToCsrfTokenFetch();
402
- expectRequestToHaveJwtAuth(axiosMock.history[method][0]);
403
- });
404
- });
405
- });
406
-
407
- ['post', 'put', 'patch', 'delete'].forEach((method) => {
408
- it(`${method.toUpperCase()}: refreshes the csrf and jwt tokens`, () => {
409
- return client[method](mockApiEndpointPath).then(() => {
410
- expectSingleCallToJwtTokenRefresh();
411
- expectSingleCallToCsrfTokenFetch();
412
- expectRequestToHaveJwtAuth(axiosMock.history[method][0]);
413
- expectRequestToHaveCsrfToken(axiosMock.history[method][0]);
414
- });
415
- });
416
- });
417
- });
418
-
419
- describe('A valid token is found on load', () => {
420
- beforeEach(() => {
421
- setJwtCookieTo(jwtTokens.valid.encoded);
422
- setJwtTokenRefreshResponseTo(200, jwtTokens.valid.encoded);
423
- });
424
-
425
- ['get', 'options'].forEach((method) => {
426
- it(`${method.toUpperCase()}: does not attempt to refresh the jwt token`, () => {
427
- setJwtCookieTo(jwtTokens.valid.encoded);
428
- return client[method](mockApiEndpointPath).then(() => {
429
- expectNoCallToJwtTokenRefresh();
430
- expectNoCallToCsrfTokenFetch();
431
- expectRequestToHaveJwtAuth(axiosMock.history[method][0]);
432
- });
433
- });
434
- });
435
-
436
- ['post', 'put', 'patch', 'delete'].forEach((method) => {
437
- it(`${method.toUpperCase()}: refreshes the csrf token but does not attempt to refresh the jwt token`, () => {
438
- setJwtCookieTo(jwtTokens.valid.encoded);
439
- return client[method](mockApiEndpointPath).then(() => {
440
- expectNoCallToJwtTokenRefresh();
441
- expectSingleCallToCsrfTokenFetch();
442
- expectRequestToHaveJwtAuth(axiosMock.history[method][0]);
443
- expectRequestToHaveCsrfToken(axiosMock.history[method][0]);
444
- });
445
- });
446
- });
447
- });
448
- });
449
-
450
- describe('Token refresh failures', () => {
451
- describe('The refresh request fails for an unknown reason', () => {
452
- beforeEach(() => {
453
- setJwtCookieTo(null);
454
- setJwtTokenRefreshResponseTo(403, null);
455
- });
456
-
457
- ['get', 'options', 'post', 'put', 'patch', 'delete'].forEach((method) => {
458
- it(`${method.toUpperCase()}: throws an error and calls logError`, () => {
459
- expect.hasAssertions();
460
- return client[method](mockApiEndpointPath).catch(() => {
461
- expectSingleCallToJwtTokenRefresh();
462
- expectNoCallToCsrfTokenFetch();
463
- expectLogFunctionToHaveBeenCalledWithMessage(
464
- mockLoggingService.logError.mock.calls[0],
465
- '[frontend-auth] Axios Error (Response): 403 - See custom attributes for details.',
466
- {
467
- httpErrorRequestMethod: 'post',
468
- httpErrorResponseData: '(empty response)',
469
- httpErrorStatus: 403,
470
- httpErrorType: 'api-response-error',
471
- httpErrorRequestUrl: 'http://localhost:18000/login_refresh',
472
- },
473
- );
474
- });
475
- });
476
- });
477
- });
478
-
479
- describe('The refresh request fails due to a timeout', () => {
480
- beforeEach(() => {
481
- setJwtCookieTo(null);
482
- accessTokenAxiosMock.onPost().timeout();
483
- });
484
-
485
- it('throws an error and calls logError', async () => {
486
- expect.hasAssertions();
487
- try {
488
- await client.get(mockApiEndpointPath);
489
- } catch (e) {
490
- expectSingleCallToJwtTokenRefresh();
491
- expectNoCallToCsrfTokenFetch();
492
- expectLogFunctionToHaveBeenCalledWithMessage(
493
- mockLoggingService.logError.mock.calls[0],
494
- '[frontend-auth] Axios Error (Config): See custom attributes for details.',
495
- {
496
- httpErrorRequestMethod: 'post',
497
- httpErrorMessage: 'timeout of 0ms exceeded',
498
- httpErrorType: 'api-request-config-error',
499
- httpErrorRequestUrl: 'http://localhost:18000/login_refresh',
500
- },
501
- );
502
- }
503
- });
504
-
505
- it('retries the refresh request and succeeds', async () => {
506
- accessTokenAxiosMock.reset();
507
- accessTokenAxiosMock.onPost().timeoutOnce();
508
- accessTokenAxiosMock.onPost().replyOnce(() => {
509
- setJwtCookieTo(jwtTokens.valid.encoded);
510
- return [200];
511
- });
512
- accessTokenAxios.defaults.maxRetries = 1;
513
-
514
- await client.get(mockApiEndpointPath);
515
- expect(accessTokenAxiosMock.history.post.length).toBe(2);
516
- expectNoCallToCsrfTokenFetch();
517
- });
518
- });
519
-
520
- // This test case is unexpected, but occurring in production. See ARCH-948 for
521
- // more information on a similar situation that was happening prior to this
522
- // refactor in Oct 2019.
523
- describe('Unexpected case where token refresh succeeds but no new cookie is found', () => {
524
- beforeEach(() => {
525
- setJwtCookieTo(null);
526
- // The JWT cookie is null despite a 200 response.
527
- setJwtTokenRefreshResponseTo(200, null);
528
- });
529
-
530
- ['get', 'options', 'post', 'put', 'patch', 'delete'].forEach((method) => {
531
- it(`${method.toUpperCase()}: throws an error and calls logError`, () => {
532
- expect.hasAssertions();
533
- return client[method](mockApiEndpointPath).catch(() => {
534
- expectSingleCallToJwtTokenRefresh();
535
- expectNoCallToCsrfTokenFetch();
536
- expectLogFunctionToHaveBeenCalledWithMessage(
537
- mockLoggingService.logError.mock.calls[0],
538
- '[frontend-auth] Access token is still null after successful refresh.',
539
- { axiosResponse: expect.any(Object) },
540
- );
541
- });
542
- });
543
- });
544
- });
545
-
546
- // This tests adding additional debug info for an unexpected error occurring in production.
547
- describe('Unexpected case where token refresh succeeds with response time, but no new cookie is found', () => {
548
- const browserDriftSeconds = 4;
549
-
550
- beforeEach(() => {
551
- setJwtCookieTo(null);
552
- // set server time to be 4 seconds in future
553
- const responseEpochSeconds = (Date.now() / 1000) + browserDriftSeconds;
554
- // The JWT cookie is null despite a 200 response.
555
- setJwtTokenRefreshResponseTo(200, null, responseEpochSeconds);
556
- });
557
-
558
- ['get', 'options', 'post', 'put', 'patch', 'delete'].forEach((method) => {
559
- it(`${method.toUpperCase()}: throws an error and calls logError`, () => {
560
- expect.hasAssertions();
561
- return client[method](mockApiEndpointPath).catch(() => {
562
- expectSingleCallToJwtTokenRefresh();
563
- expectNoCallToCsrfTokenFetch();
564
- expectLogFunctionToHaveBeenCalledWithMessage(
565
- mockLoggingService.logError.mock.calls[0],
566
- '[frontend-auth] Access token is still null after successful refresh.',
567
- {
568
- axiosResponse: expect.any(Object),
569
- browserDriftSeconds: expect.toBeWithinRange(browserDriftSeconds - 0.1, browserDriftSeconds + 0.1),
570
- },
571
- );
572
- });
573
- });
574
- });
575
- });
576
-
577
- // This test case is unexpected, but occurring in production. See ARCH-948 for
578
- // more information on a similar situation that was happening prior to this
579
- // refactor in Oct 2019.
580
- describe('Unexpected case where token refresh succeeds but the cookie is malformed', () => {
581
- beforeEach(() => {
582
- setJwtCookieTo('malformed jwt');
583
- // The JWT cookie is malformed despite a 200 response.
584
- setJwtTokenRefreshResponseTo(200, 'malformed jwt');
585
- });
586
-
587
- ['get', 'options', 'post', 'put', 'patch', 'delete'].forEach((method) => {
588
- it(`${method.toUpperCase()}: throws an error and calls logError`, () => {
589
- expect.hasAssertions();
590
- return client[method](mockApiEndpointPath).catch(() => {
591
- expectSingleCallToJwtTokenRefresh();
592
- expectNoCallToCsrfTokenFetch();
593
- expectLogFunctionToHaveBeenCalledWithMessage(
594
- mockLoggingService.logError.mock.calls[0],
595
- '[frontend-auth] Error decoding JWT token',
596
- { cookieValue: 'malformed jwt' },
597
- );
598
- expectLogFunctionToHaveBeenCalledWithMessage(
599
- mockLoggingService.logError.mock.calls[1],
600
- '[frontend-auth] Error decoding JWT token',
601
- { cookieValue: 'malformed jwt' },
602
- );
603
- });
604
- });
605
- });
606
- });
607
- });
608
-
609
- describe('User is logged out', () => {
610
- beforeEach(() => {
611
- setJwtCookieTo(null);
612
- setJwtTokenRefreshResponseTo(401, null);
613
- });
614
-
615
- ['get', 'options', 'post', 'put', 'patch', 'delete'].forEach((method) => {
616
- it(`${method.toUpperCase()}: does not redirect to login`, () => {
617
- return client[method](mockApiEndpointPath).then(() => {
618
- expectSingleCallToJwtTokenRefresh();
619
- expect(global.location.assign).not.toHaveBeenCalled();
620
- });
621
- });
622
- });
623
- });
624
-
625
- describe('JWT exempt requests using isPublic request configuration', () => {
626
- beforeEach(() => {
627
- setJwtCookieTo(null);
628
- setJwtTokenRefreshResponseTo(401, null);
629
- });
630
-
631
- ['get', 'options'].forEach((method) => {
632
- it(`${method.toUpperCase()}: does not refresh the JWT`, () => {
633
- return client[method](mockApiEndpointPath, { isPublic: true }).then(() => {
634
- expectNoCallToJwtTokenRefresh();
635
- expectNoCallToCsrfTokenFetch();
636
- });
637
- });
638
- });
639
-
640
- ['post', 'put', 'patch'].forEach((method) => {
641
- it(`${method.toUpperCase()}: does not refresh the JWT`, () => {
642
- return client[method](mockApiEndpointPath, {}, { isPublic: true }).then(() => {
643
- expectNoCallToJwtTokenRefresh();
644
- expectSingleCallToCsrfTokenFetch();
645
- });
646
- });
647
- });
648
-
649
- it('DELETE: does not refresh the JWT', () => {
650
- return client.delete(mockApiEndpointPath, { isPublic: true }).then(() => {
651
- expectNoCallToJwtTokenRefresh();
652
- expectSingleCallToCsrfTokenFetch();
653
- });
654
- });
655
- });
656
-
657
- describe('CSRF exempt requests using isCsrfExempt request configuration', () => {
658
- beforeEach(() => {
659
- setJwtCookieTo(null);
660
- setJwtTokenRefreshResponseTo(401, null);
661
- });
662
-
663
- ['get', 'options', 'delete'].forEach((method) => {
664
- it(`${method.toUpperCase()}: does not fetch a Csrf token`, () => {
665
- return client[method](mockApiEndpointPath, { isCsrfExempt: true }).then(() => {
666
- expectSingleCallToJwtTokenRefresh();
667
- expectNoCallToCsrfTokenFetch();
668
- });
669
- });
670
- });
671
-
672
- ['post', 'put', 'patch'].forEach((method) => {
673
- it(`${method.toUpperCase()}: does not fetch a Csrf token`, () => {
674
- return client[method](mockApiEndpointPath, {}, { isCsrfExempt: true }).then(() => {
675
- expectSingleCallToJwtTokenRefresh();
676
- expectNoCallToCsrfTokenFetch();
677
- });
678
- });
679
- });
680
- });
681
-
682
- describe('Info logging for authorization errors from api requests with a valid token', () => {
683
- beforeEach(() => {
684
- setJwtCookieTo(null);
685
- setJwtTokenRefreshResponseTo(200, jwtTokens.valid.encoded);
686
- });
687
-
688
- it('logs info for 401 unauthorized api responses', () => {
689
- setJwtCookieTo(jwtTokens.valid.encoded);
690
- expect.hasAssertions();
691
- return client.get('/unauthorized').catch(() => {
692
- expectLogFunctionToHaveBeenCalledWithMessage(
693
- mockLoggingService.logInfo.mock.calls[0],
694
- 'Axios Error (Response): 401 - See custom attributes for details.',
695
- {
696
- httpErrorRequestMethod: 'get',
697
- httpErrorStatus: 401,
698
- httpErrorType: 'api-response-error',
699
- httpErrorRequestUrl: '/unauthorized',
700
- httpErrorResponseData: '(empty response)',
701
- },
702
- );
703
- expectRequestToHaveJwtAuth(axiosMock.history.get[0]);
704
- });
705
- });
706
-
707
- it('logs info for 403 forbidden api responses', () => {
708
- setJwtCookieTo(jwtTokens.valid.encoded);
709
- expect.hasAssertions();
710
- return client.get('/forbidden').catch(() => {
711
- expectLogFunctionToHaveBeenCalledWithMessage(
712
- mockLoggingService.logInfo.mock.calls[0],
713
- 'Axios Error (Response): 403 - See custom attributes for details.',
714
- {
715
- httpErrorRequestMethod: 'get',
716
- httpErrorStatus: 403,
717
- httpErrorType: 'api-response-error',
718
- httpErrorRequestUrl: '/forbidden',
719
- httpErrorResponseData: '(empty response)',
720
- },
721
- );
722
- expectRequestToHaveJwtAuth(axiosMock.history.get[0]);
723
- });
724
- });
725
- });
726
- });
727
-
728
- describe('redirectToLogin', () => {
729
- it('can redirect to login with different redirect url parameters', () => {
730
- service.redirectToLogin('http://edx.org/dashboard');
731
- expectLogin('http://edx.org/dashboard');
732
- service.redirectToLogin();
733
- expectLogin(authOptions.config.baseUrl);
734
- });
735
- });
736
-
737
- describe('redirectToLogout', () => {
738
- it('can redirect to logout with different redirect url parameters', () => {
739
- service.redirectToLogout('http://edx.org/');
740
- expectLogout('http://edx.org/');
741
- service.redirectToLogout();
742
- expectLogout(authOptions.config.baseUrl);
743
- });
744
- });
745
-
746
- describe('hydrateAuthenticatedUser', () => {
747
- beforeEach(() => {
748
- axiosMock.reset();
749
- });
750
-
751
- it('should not change authenticated user if it is null', async () => {
752
- await service.hydrateAuthenticatedUser();
753
- expect(service.getAuthenticatedUser()).toBeNull();
754
- });
755
-
756
- it('should call the user accounts API and merge the result into authenticatedUser', async () => {
757
- setJwtCookieTo(jwtTokens.valid.encoded);
758
- service.setAuthenticatedUser({
759
- userId: 'abc123',
760
- username: 'the_user',
761
- roles: [],
762
- administrator: false,
763
- name: 'test user',
764
- });
765
- axiosMock.onGet(`${authOptions.config.lmsBaseUrl}/api/user/v1/accounts/the_user`).reply(200, {
766
- additional: 'data',
767
- });
768
- await service.hydrateAuthenticatedUser();
769
- const authenticatedUser = service.getAuthenticatedUser();
770
- expect(authenticatedUser).toEqual({
771
- userId: 'abc123',
772
- username: 'the_user',
773
- roles: [],
774
- administrator: false,
775
- additional: 'data',
776
- name: 'test user',
777
- });
778
- });
779
- });
780
-
781
- describe('ensureAuthenticatedUser', () => {
782
- describe('when the user is logged in', () => {
783
- it('refreshes a missing jwt token and returns a user access token', () => {
784
- setJwtCookieTo(null);
785
- setJwtTokenRefreshResponseTo(200, jwtTokens.valid.encoded);
786
- return service.ensureAuthenticatedUser().then((authenticatedUserAccessToken) => {
787
- expect(authenticatedUserAccessToken).toEqual(jwtTokens.valid.formatted);
788
- expectSingleCallToJwtTokenRefresh();
789
- });
790
- });
791
-
792
- it('refreshes a missing jwt token and returns a user access token with roles', () => {
793
- setJwtCookieTo(null);
794
- setJwtTokenRefreshResponseTo(200, jwtTokens.validWithRoles.encoded);
795
- return service.ensureAuthenticatedUser().then((authenticatedUserAccessToken) => {
796
- expect(authenticatedUserAccessToken).toEqual(jwtTokens.validWithRoles.formatted);
797
- expectSingleCallToJwtTokenRefresh();
798
- });
799
- });
800
-
801
- // This test case is unexpected, but occurring in production. See ARCH-948 for
802
- // more information on a similar situation that was happening prior to this
803
- // refactor in Oct 2019.
804
- it('throws an error and calls logError if there was a problem getting the jwt cookie', () => {
805
- setJwtCookieTo(null);
806
- // The JWT cookie is null despite a 200 response.
807
- setJwtTokenRefreshResponseTo(200, null);
808
- expect.hasAssertions();
809
- return service.ensureAuthenticatedUser().catch(() => {
810
- expectSingleCallToJwtTokenRefresh();
811
- expectLogFunctionToHaveBeenCalledWithMessage(
812
- mockLoggingService.logError.mock.calls[0],
813
- '[frontend-auth] Access token is still null after successful refresh.',
814
- { axiosResponse: expect.any(Object) },
815
- );
816
- });
817
- });
818
- });
819
-
820
- describe('when the user is logged out', () => {
821
- beforeEach(() => {
822
- setJwtTokenRefreshResponseTo(401, null);
823
- });
824
-
825
- it('attempts to refresh a missing jwt token and redirects user to login', () => {
826
- setJwtCookieTo(null);
827
- expect.hasAssertions();
828
- return service.ensureAuthenticatedUser(`${authOptions.config.baseUrl}/route`).catch((unauthorizedError) => {
829
- expect(unauthorizedError.isRedirecting).toBe(true);
830
- expectSingleCallToJwtTokenRefresh();
831
- expectLogin(`${authOptions.config.baseUrl}/route`);
832
- });
833
- });
834
-
835
- it('throws an error and does not redirect if the referrer is the login page', () => {
836
- jest.spyOn(global.document, 'referrer', 'get').mockReturnValue(authOptions.config.loginUrl);
837
- setJwtCookieTo(null);
838
- expect.hasAssertions();
839
- return service.ensureAuthenticatedUser().catch(() => {
840
- expectSingleCallToJwtTokenRefresh();
841
- expect(global.location.assign).not.toHaveBeenCalled();
842
- expectLogFunctionToHaveBeenCalledWithMessage(
843
- mockLoggingService.logError.mock.calls[0],
844
- '[frontend-auth] Redirect from login page. Rejecting to avoid infinite redirect loop.',
845
- );
846
- });
847
- });
848
- });
849
- });
850
-
851
- describe('fetchAuthenticatedUser', () => {
852
- it('refreshes a missing jwt token and returns a user access token', () => {
853
- setJwtCookieTo(null);
854
- setJwtTokenRefreshResponseTo(200, jwtTokens.valid.encoded);
855
- return service.fetchAuthenticatedUser().then((authenticatedUserAccessToken) => {
856
- expect(authenticatedUserAccessToken).toEqual(jwtTokens.valid.formatted);
857
- expect(mockLoggingService.setCustomAttribute).toHaveBeenCalledWith('userId', jwtTokens.valid.formatted.userId);
858
- expectSingleCallToJwtTokenRefresh();
859
- });
860
- });
861
-
862
- it('found a valid token from cache and no call for refresh', () => {
863
- setJwtCookieTo(jwtTokens.valid.encoded);
864
- return service.fetchAuthenticatedUser().then((authenticatedUserAccessToken) => {
865
- expect(authenticatedUserAccessToken).toEqual(jwtTokens.valid.formatted);
866
- expectNoCallToJwtTokenRefresh();
867
- });
868
- });
869
-
870
- it('refreshes the token forcefully even if token is not yet expired', () => {
871
- setJwtCookieTo(jwtTokens.valid.encoded);
872
- setJwtTokenRefreshResponseTo(401, null);
873
- return service.fetchAuthenticatedUser({ forceRefresh: true }).then((authenticatedUserAccessToken) => {
874
- expect(authenticatedUserAccessToken).toEqual(null);
875
- expect(mockLoggingService.setCustomAttribute).not.toHaveBeenCalled();
876
- expectSingleCallToJwtTokenRefresh();
877
- });
878
- });
879
- });
880
-
881
- // These tests all make real network calls to http://httpbin.org.
882
- describe('Cache Functionality', () => {
883
- const getUrl = 'https://jsonplaceholder.typicode.com/posts/1';
884
- const postUrl = 'https://jsonplaceholder.typicode.com/posts';
885
- const requestId = 'get-jsonplaceholder-posts';
886
-
887
- const getWithRequestId = async (config = {}) => cachedClient.get(getUrl, {
888
- id: requestId,
889
- ...config,
890
- });
891
-
892
- const postWithRequestId = async (config = {}) => cachedClient.post(postUrl, {
893
- ...config,
894
- });
895
-
896
- describe('No JWT Token Found on Load', () => {
897
- beforeEach(async () => {
898
- setJwtCookieTo(null);
899
- setJwtTokenRefreshResponseTo(200, jwtTokens.valid.encoded);
900
-
901
- // Remove cache for previous requests
902
- await cachedClient.storage.remove(requestId);
903
- });
904
-
905
- it('Cached GET: does not refresh JWT on second request with valid JWT', async () => {
906
- const response1 = await getWithRequestId();
907
-
908
- // Verify first request was not pulled from cache
909
- expect(response1.cached).toEqual(false);
910
-
911
- const response2 = await getWithRequestId();
912
- expectSingleCallToJwtTokenRefresh();
913
- // Like the uncached, client the CSRF token shouldn't be fetched either
914
- expectNoCallToCsrfTokenFetch();
915
- expectRequestToHaveJwtAuth(response2.config);
916
- expect(response2.cached).toEqual(true);
917
- });
918
-
919
- it('Cached GET: clears cached entry if cache.override = true', async () => {
920
- const response1 = await getWithRequestId();
921
- // Verify first request was not pulled from cache
922
- expect(response1.cached).toEqual(false);
923
-
924
- const response2 = await getWithRequestId();
925
- expect(response2.cached).toEqual(true);
926
-
927
- const response3 = await getWithRequestId({
928
- cache: {
929
- override: true,
930
- },
931
- });
932
- expect(response3.cached).toEqual(false);
933
- });
934
-
935
- it('Always refreshes the JWT on GET requests with invalid JWT', async () => {
936
- const response1 = await getWithRequestId();
937
- setJwtCookieTo(null);
938
- setJwtTokenRefreshResponseTo(200, jwtTokens.valid.encoded);
939
- expectRequestToHaveJwtAuth(response1.config);
940
-
941
- const response2 = await getWithRequestId();
942
- expect(accessTokenAxiosMock.history.post.length).toBe(2);
943
- // Like the uncached client, the CSRF token shouldn't be fetched either
944
- expectNoCallToCsrfTokenFetch();
945
- expectRequestToHaveJwtAuth(response2.config);
946
- expect(response2.cached).toEqual(true);
947
- });
948
-
949
- it('Always refreshes the JWT on POST requests', async () => {
950
- const response1 = await postWithRequestId();
951
- setJwtCookieTo(null);
952
- setJwtTokenRefreshResponseTo(200, jwtTokens.valid.encoded);
953
- expectRequestToHaveJwtAuth(response1.config);
954
-
955
- const response2 = await postWithRequestId();
956
- expectRequestToHaveJwtAuth(response2.config);
957
- // Verify the JWT got refreshed for both requests that do not have a JWT
958
- expect(accessTokenAxiosMock.history.post.length).toBe(2);
959
- // Like the uncached client the CSRF token should only be fetched once
960
- expect(csrfTokensAxiosMock.history.get.length).toBe(1);
961
- // Making a post request with axios-cache-adapter automatically invalidates the cache
962
- expect(response2.request.fromCache).toEqual(undefined);
963
- });
964
-
965
- it('Parallel GET Requests: refresh the jwt token only once', async () => {
966
- const responses = await Promise.all([
967
- getWithRequestId(),
968
- getWithRequestId(),
969
- ]);
970
-
971
- expectSingleCallToJwtTokenRefresh();
972
- expectNoCallToCsrfTokenFetch();
973
- expectRequestToHaveJwtAuth(responses[0].config);
974
- expectRequestToHaveJwtAuth(responses[1].config);
975
- });
976
-
977
- it('Parallel POST Requests: refresh the jwt and csrf tokens only once', async () => {
978
- const responses = await Promise.all([
979
- postWithRequestId(),
980
- postWithRequestId(),
981
- ]);
982
- expectSingleCallToJwtTokenRefresh();
983
- expectSingleCallToCsrfTokenFetch();
984
- expectRequestToHaveJwtAuth(responses[0].config);
985
- expectRequestToHaveCsrfToken(responses[0].config);
986
- expectRequestToHaveJwtAuth(responses[1].config);
987
- expectRequestToHaveCsrfToken(responses[1].config);
988
- });
989
- });
990
-
991
- describe('An expired token is found on load', () => {
992
- beforeEach(() => {
993
- setJwtCookieTo(jwtTokens.expired.encoded);
994
- setJwtTokenRefreshResponseTo(200, jwtTokens.valid.encoded);
995
- });
996
-
997
- it('GET request: refreshes the jwt token', async () => {
998
- const response = await cachedClient.get(getUrl);
999
- expectSingleCallToJwtTokenRefresh();
1000
- expectNoCallToCsrfTokenFetch();
1001
- expectRequestToHaveJwtAuth(response.config);
1002
- });
1003
-
1004
- ['post', 'put', 'patch', 'delete'].forEach((method) => {
1005
- it(`${method.toUpperCase()}: refreshes the csrf and jwt tokens`, async () => {
1006
- const response = await cachedClient[method](method === 'post' ? postUrl : getUrl);
1007
- expectSingleCallToJwtTokenRefresh();
1008
- expectSingleCallToCsrfTokenFetch();
1009
- expectRequestToHaveJwtAuth(response.config);
1010
- expectRequestToHaveCsrfToken(response.config);
1011
- });
1012
- });
1013
- });
1014
-
1015
- describe('A valid token is found on load', () => {
1016
- beforeEach(() => {
1017
- setJwtCookieTo(jwtTokens.valid.encoded);
1018
- setJwtTokenRefreshResponseTo(200, jwtTokens.valid.encoded);
1019
- });
1020
-
1021
- it('GET request: does not attempt to refresh the jwt token', async () => {
1022
- setJwtCookieTo(jwtTokens.valid.encoded);
1023
- const response = await getWithRequestId();
1024
- expectNoCallToJwtTokenRefresh();
1025
- expectNoCallToCsrfTokenFetch();
1026
- expectRequestToHaveJwtAuth(response.config);
1027
- });
1028
-
1029
- ['post', 'put', 'patch', 'delete'].forEach((method) => {
1030
- it(`${method.toUpperCase()}: refreshes the csrf token but does not attempt to refresh the jwt token`, async () => {
1031
- setJwtCookieTo(jwtTokens.valid.encoded);
1032
- const response = await cachedClient[method](method === 'post' ? postUrl : getUrl, {
1033
- id: requestId,
1034
- });
1035
- expectNoCallToJwtTokenRefresh();
1036
- expectSingleCallToCsrfTokenFetch();
1037
- expectRequestToHaveJwtAuth(response.config);
1038
- expectRequestToHaveCsrfToken(response.config);
1039
- });
1040
- });
1041
- });
1042
-
1043
- describe('Token refresh failures', () => {
1044
- describe('The refresh request fails for an unknown reason', () => {
1045
- beforeEach(() => {
1046
- setJwtCookieTo(null);
1047
- setJwtTokenRefreshResponseTo(403, null);
1048
- });
1049
-
1050
- ['get', 'post', 'put', 'patch', 'delete'].forEach((method) => {
1051
- it(`${method.toUpperCase()}: throws an error and calls logError`, async () => {
1052
- expect.hasAssertions();
1053
- try {
1054
- await cachedClient[method](getUrl, {
1055
- id: requestId,
1056
- });
1057
- } catch (err) {
1058
- expectSingleCallToJwtTokenRefresh();
1059
- expectNoCallToCsrfTokenFetch();
1060
- expectLogFunctionToHaveBeenCalledWithMessage(
1061
- mockLoggingService.logError.mock.calls[0],
1062
- '[frontend-auth] Axios Error (Response): 403 - See custom attributes for details.',
1063
- {
1064
- httpErrorRequestMethod: 'post',
1065
- httpErrorResponseData: '(empty response)',
1066
- httpErrorStatus: 403,
1067
- httpErrorType: 'api-response-error',
1068
- httpErrorRequestUrl: 'http://localhost:18000/login_refresh',
1069
- },
1070
- );
1071
- }
1072
- });
1073
- });
1074
- });
1075
- });
1076
- });