@openedx/frontend-base 1.0.0-alpha.12 → 1.0.0-alpha.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (754) hide show
  1. package/{index.ts → dist/index.d.ts} +0 -3
  2. package/dist/index.js +4 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/runtime/analytics/MockAnalyticsService.d.ts +50 -0
  5. package/dist/runtime/analytics/MockAnalyticsService.js +64 -0
  6. package/dist/runtime/analytics/MockAnalyticsService.js.map +1 -0
  7. package/dist/runtime/analytics/SegmentAnalyticsService.d.ts +64 -0
  8. package/dist/runtime/analytics/SegmentAnalyticsService.js +218 -0
  9. package/dist/runtime/analytics/SegmentAnalyticsService.js.map +1 -0
  10. package/dist/runtime/analytics/index.d.ts +3 -0
  11. package/dist/runtime/analytics/index.js +4 -0
  12. package/dist/runtime/analytics/index.js.map +1 -0
  13. package/dist/runtime/analytics/interface.d.ts +53 -0
  14. package/{runtime → dist/runtime}/analytics/interface.js +26 -38
  15. package/dist/runtime/analytics/interface.js.map +1 -0
  16. package/dist/runtime/auth/AxiosCsrfTokenService.d.ts +10 -0
  17. package/dist/runtime/auth/AxiosCsrfTokenService.js +64 -0
  18. package/dist/runtime/auth/AxiosCsrfTokenService.js.map +1 -0
  19. package/dist/runtime/auth/AxiosJwtAuthService.d.ts +182 -0
  20. package/dist/runtime/auth/AxiosJwtAuthService.js +339 -0
  21. package/dist/runtime/auth/AxiosJwtAuthService.js.map +1 -0
  22. package/dist/runtime/auth/AxiosJwtTokenService.d.ts +16 -0
  23. package/dist/runtime/auth/AxiosJwtTokenService.js +130 -0
  24. package/dist/runtime/auth/AxiosJwtTokenService.js.map +1 -0
  25. package/dist/runtime/auth/LocalForageCache.d.ts +7 -0
  26. package/dist/runtime/auth/LocalForageCache.js +78 -0
  27. package/dist/runtime/auth/LocalForageCache.js.map +1 -0
  28. package/dist/runtime/auth/MockAuthService.d.ts +209 -0
  29. package/dist/runtime/auth/MockAuthService.js +256 -0
  30. package/dist/runtime/auth/MockAuthService.js.map +1 -0
  31. package/dist/runtime/auth/index.d.ts +3 -0
  32. package/dist/runtime/auth/index.js +4 -0
  33. package/dist/runtime/auth/index.js.map +1 -0
  34. package/dist/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.d.ts +2 -0
  35. package/dist/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js +42 -0
  36. package/dist/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js.map +1 -0
  37. package/dist/runtime/auth/interceptors/createJwtTokenProviderInterceptor.d.ts +2 -0
  38. package/dist/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js +40 -0
  39. package/dist/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js.map +1 -0
  40. package/dist/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.d.ts +2 -0
  41. package/dist/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js +26 -0
  42. package/dist/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js.map +1 -0
  43. package/dist/runtime/auth/interceptors/createRetryInterceptor.d.ts +3 -0
  44. package/dist/runtime/auth/interceptors/createRetryInterceptor.js +67 -0
  45. package/dist/runtime/auth/interceptors/createRetryInterceptor.js.map +1 -0
  46. package/dist/runtime/auth/interface.d.ts +133 -0
  47. package/{runtime → dist/runtime}/auth/interface.js +65 -72
  48. package/dist/runtime/auth/interface.js.map +1 -0
  49. package/dist/runtime/auth/utils.d.ts +13 -0
  50. package/dist/runtime/auth/utils.js +66 -0
  51. package/dist/runtime/auth/utils.js.map +1 -0
  52. package/dist/runtime/babel.config.d.ts +2 -0
  53. package/{shell → dist/runtime}/babel.config.js +2 -1
  54. package/dist/runtime/babel.config.js.map +1 -0
  55. package/{runtime/config/index.ts → dist/runtime/config/index.d.ts} +28 -123
  56. package/dist/runtime/config/index.js +323 -0
  57. package/dist/runtime/config/index.js.map +1 -0
  58. package/dist/runtime/constants.d.ts +57 -0
  59. package/{runtime/constants.ts → dist/runtime/constants.js} +1 -11
  60. package/dist/runtime/constants.js.map +1 -0
  61. package/dist/runtime/i18n/index.d.ts +3 -0
  62. package/{runtime → dist/runtime}/i18n/index.js +4 -44
  63. package/dist/runtime/i18n/index.js.map +1 -0
  64. package/dist/runtime/i18n/injectIntlWithShim.d.ts +11 -0
  65. package/dist/runtime/i18n/injectIntlWithShim.js +45 -0
  66. package/dist/runtime/i18n/injectIntlWithShim.js.map +1 -0
  67. package/dist/runtime/i18n/lib.d.ts +119 -0
  68. package/dist/runtime/i18n/lib.js +236 -0
  69. package/dist/runtime/i18n/lib.js.map +1 -0
  70. package/dist/runtime/index.d.ts +13 -0
  71. package/dist/runtime/index.js +14 -0
  72. package/dist/runtime/index.js.map +1 -0
  73. package/dist/runtime/initialize.d.ts +91 -0
  74. package/dist/runtime/initialize.js +312 -0
  75. package/dist/runtime/initialize.js.map +1 -0
  76. package/dist/runtime/jest.config.d.ts +17 -0
  77. package/dist/runtime/jest.config.js +35 -0
  78. package/dist/runtime/jest.config.js.map +1 -0
  79. package/dist/runtime/logging/MockLoggingService.d.ts +28 -0
  80. package/dist/runtime/logging/MockLoggingService.js +31 -0
  81. package/dist/runtime/logging/MockLoggingService.js.map +1 -0
  82. package/dist/runtime/logging/NewRelicLoggingService.d.ts +67 -0
  83. package/dist/runtime/logging/NewRelicLoggingService.js +175 -0
  84. package/dist/runtime/logging/NewRelicLoggingService.js.map +1 -0
  85. package/{runtime/logging/index.ts → dist/runtime/logging/index.d.ts} +1 -7
  86. package/dist/runtime/logging/index.js +4 -0
  87. package/dist/runtime/logging/index.js.map +1 -0
  88. package/dist/runtime/logging/interface.d.ts +38 -0
  89. package/{runtime → dist/runtime}/logging/interface.js +16 -26
  90. package/dist/runtime/logging/interface.js.map +1 -0
  91. package/dist/runtime/logging/types.d.ts +4 -0
  92. package/dist/runtime/logging/types.js +2 -0
  93. package/dist/runtime/logging/types.js.map +1 -0
  94. package/dist/runtime/react/AuthenticatedPageRoute.d.ts +28 -0
  95. package/{runtime/react/AuthenticatedPageRoute.jsx → dist/runtime/react/AuthenticatedPageRoute.js} +11 -18
  96. package/dist/runtime/react/AuthenticatedPageRoute.js.map +1 -0
  97. package/dist/runtime/react/CombinedAppProvider.d.ts +6 -0
  98. package/dist/runtime/react/CombinedAppProvider.js +24 -0
  99. package/dist/runtime/react/CombinedAppProvider.js.map +1 -0
  100. package/dist/runtime/react/CurrentAppContext.d.ts +20 -0
  101. package/{runtime/react/CurrentAppContext.tsx → dist/runtime/react/CurrentAppContext.js} +3 -7
  102. package/dist/runtime/react/CurrentAppContext.js.map +1 -0
  103. package/dist/runtime/react/CurrentAppProvider.d.ts +23 -0
  104. package/dist/runtime/react/CurrentAppProvider.js +33 -0
  105. package/dist/runtime/react/CurrentAppProvider.js.map +1 -0
  106. package/dist/runtime/react/Divider.d.ts +1 -0
  107. package/dist/runtime/react/Divider.js +5 -0
  108. package/dist/runtime/react/Divider.js.map +1 -0
  109. package/dist/runtime/react/ErrorBoundary.d.ts +32 -0
  110. package/dist/runtime/react/ErrorBoundary.js +40 -0
  111. package/dist/runtime/react/ErrorBoundary.js.map +1 -0
  112. package/dist/runtime/react/ErrorPage.d.ts +17 -0
  113. package/dist/runtime/react/ErrorPage.js +29 -0
  114. package/dist/runtime/react/ErrorPage.js.map +1 -0
  115. package/dist/runtime/react/LoginRedirect.d.ts +8 -0
  116. package/{runtime/react/LoginRedirect.jsx → dist/runtime/react/LoginRedirect.js} +5 -5
  117. package/dist/runtime/react/LoginRedirect.js.map +1 -0
  118. package/dist/runtime/react/PageWrap.d.ts +8 -0
  119. package/{runtime/react/PageWrap.jsx → dist/runtime/react/PageWrap.js} +7 -10
  120. package/dist/runtime/react/PageWrap.js.map +1 -0
  121. package/dist/runtime/react/SiteContext.d.ts +24 -0
  122. package/{runtime/react/SiteContext.tsx → dist/runtime/react/SiteContext.js} +5 -11
  123. package/dist/runtime/react/SiteContext.js.map +1 -0
  124. package/dist/runtime/react/SiteProvider.d.ts +29 -0
  125. package/dist/runtime/react/SiteProvider.js +69 -0
  126. package/dist/runtime/react/SiteProvider.js.map +1 -0
  127. package/dist/runtime/react/constants.d.ts +3 -0
  128. package/{runtime/react/constants.ts → dist/runtime/react/constants.js} +1 -0
  129. package/dist/runtime/react/constants.js.map +1 -0
  130. package/{runtime/react/hooks/index.ts → dist/runtime/react/hooks/index.d.ts} +0 -1
  131. package/dist/runtime/react/hooks/index.js +8 -0
  132. package/dist/runtime/react/hooks/index.js.map +1 -0
  133. package/dist/runtime/react/hooks/theme/index.js +3 -0
  134. package/dist/runtime/react/hooks/theme/index.js.map +1 -0
  135. package/dist/runtime/react/hooks/theme/useTheme.d.ts +35 -0
  136. package/dist/runtime/react/hooks/theme/useTheme.js +153 -0
  137. package/dist/runtime/react/hooks/theme/useTheme.js.map +1 -0
  138. package/dist/runtime/react/hooks/theme/useThemeConfig.d.ts +16 -0
  139. package/{runtime/react/hooks/theme/useThemeConfig.ts → dist/runtime/react/hooks/theme/useThemeConfig.js} +11 -16
  140. package/dist/runtime/react/hooks/theme/useThemeConfig.js.map +1 -0
  141. package/dist/runtime/react/hooks/theme/useThemeCore.d.ts +10 -0
  142. package/dist/runtime/react/hooks/theme/useThemeCore.js +40 -0
  143. package/dist/runtime/react/hooks/theme/useThemeCore.js.map +1 -0
  144. package/dist/runtime/react/hooks/theme/useThemeVariants.d.ts +17 -0
  145. package/dist/runtime/react/hooks/theme/useThemeVariants.js +90 -0
  146. package/dist/runtime/react/hooks/theme/useThemeVariants.js.map +1 -0
  147. package/dist/runtime/react/hooks/theme/useTrackColorSchemeChoice.d.ts +8 -0
  148. package/dist/runtime/react/hooks/theme/useTrackColorSchemeChoice.js +30 -0
  149. package/dist/runtime/react/hooks/theme/useTrackColorSchemeChoice.js.map +1 -0
  150. package/dist/runtime/react/hooks/theme/utils.d.ts +6 -0
  151. package/{runtime/react/hooks/theme/utils.ts → dist/runtime/react/hooks/theme/utils.js} +4 -4
  152. package/dist/runtime/react/hooks/theme/utils.js.map +1 -0
  153. package/dist/runtime/react/hooks/useActiveRoles.d.ts +2 -0
  154. package/{runtime/react/hooks/useActiveRoles.ts → dist/runtime/react/hooks/useActiveRoles.js} +6 -8
  155. package/dist/runtime/react/hooks/useActiveRoles.js.map +1 -0
  156. package/dist/runtime/react/hooks/useActiveRouteRoleWatcher.d.ts +2 -0
  157. package/dist/runtime/react/hooks/useActiveRouteRoleWatcher.js +26 -0
  158. package/dist/runtime/react/hooks/useActiveRouteRoleWatcher.js.map +1 -0
  159. package/dist/runtime/react/hooks/useAppConfig.d.ts +2 -0
  160. package/{runtime/react/hooks/useAppConfig.ts → dist/runtime/react/hooks/useAppConfig.js} +3 -4
  161. package/dist/runtime/react/hooks/useAppConfig.js.map +1 -0
  162. package/dist/runtime/react/hooks/useAuthenticatedUser.d.ts +2 -0
  163. package/{runtime/react/hooks/useAuthenticatedUser.ts → dist/runtime/react/hooks/useAuthenticatedUser.js} +3 -4
  164. package/dist/runtime/react/hooks/useAuthenticatedUser.js.map +1 -0
  165. package/dist/runtime/react/hooks/useSiteConfig.d.ts +2 -0
  166. package/{runtime/react/hooks/useSiteConfig.ts → dist/runtime/react/hooks/useSiteConfig.js} +3 -4
  167. package/dist/runtime/react/hooks/useSiteConfig.js.map +1 -0
  168. package/dist/runtime/react/hooks/useSiteEvent.d.ts +12 -0
  169. package/{runtime/react/hooks/useSiteEvent.ts → dist/runtime/react/hooks/useSiteEvent.js} +7 -9
  170. package/dist/runtime/react/hooks/useSiteEvent.js.map +1 -0
  171. package/{runtime/react/index.ts → dist/runtime/react/index.d.ts} +0 -1
  172. package/dist/runtime/react/index.js +19 -0
  173. package/dist/runtime/react/index.js.map +1 -0
  174. package/dist/runtime/react/reducers.d.ts +11 -0
  175. package/dist/runtime/react/reducers.js +28 -0
  176. package/dist/runtime/react/reducers.js.map +1 -0
  177. package/dist/runtime/routing/index.js +2 -0
  178. package/dist/runtime/routing/index.js.map +1 -0
  179. package/dist/runtime/routing/utils.d.ts +4 -0
  180. package/dist/runtime/routing/utils.js +28 -0
  181. package/dist/runtime/routing/utils.js.map +1 -0
  182. package/dist/runtime/scripts/GoogleAnalyticsLoader.d.ts +12 -0
  183. package/dist/runtime/scripts/GoogleAnalyticsLoader.js +49 -0
  184. package/dist/runtime/scripts/GoogleAnalyticsLoader.js.map +1 -0
  185. package/dist/runtime/scripts/index.js +2 -0
  186. package/dist/runtime/scripts/index.js.map +1 -0
  187. package/dist/runtime/setupTest.d.ts +1 -0
  188. package/{runtime → dist/runtime}/setupTest.js +6 -8
  189. package/dist/runtime/setupTest.js.map +1 -0
  190. package/dist/runtime/slots/Slot.d.ts +9 -0
  191. package/dist/runtime/slots/Slot.js +30 -0
  192. package/dist/runtime/slots/Slot.js.map +1 -0
  193. package/dist/runtime/slots/SlotContext.d.ts +7 -0
  194. package/dist/runtime/slots/SlotContext.js +7 -0
  195. package/dist/runtime/slots/SlotContext.js.map +1 -0
  196. package/dist/runtime/slots/hooks.d.ts +12 -0
  197. package/dist/runtime/slots/hooks.js +29 -0
  198. package/dist/runtime/slots/hooks.js.map +1 -0
  199. package/dist/runtime/slots/index.js +7 -0
  200. package/dist/runtime/slots/index.js.map +1 -0
  201. package/dist/runtime/slots/layout/DefaultSlotLayout.d.ts +1 -0
  202. package/dist/runtime/slots/layout/DefaultSlotLayout.js +7 -0
  203. package/dist/runtime/slots/layout/DefaultSlotLayout.js.map +1 -0
  204. package/dist/runtime/slots/layout/hooks.d.ts +10 -0
  205. package/dist/runtime/slots/layout/hooks.js +57 -0
  206. package/dist/runtime/slots/layout/hooks.js.map +1 -0
  207. package/dist/runtime/slots/layout/index.js +5 -0
  208. package/dist/runtime/slots/layout/index.js.map +1 -0
  209. package/{runtime/slots/layout/types.ts → dist/runtime/slots/layout/types.d.ts} +10 -25
  210. package/dist/runtime/slots/layout/types.js +12 -0
  211. package/dist/runtime/slots/layout/types.js.map +1 -0
  212. package/dist/runtime/slots/layout/utils.d.ts +5 -0
  213. package/dist/runtime/slots/layout/utils.js +11 -0
  214. package/dist/runtime/slots/layout/utils.js.map +1 -0
  215. package/{runtime/slots/types.ts → dist/runtime/slots/types.d.ts} +6 -12
  216. package/dist/runtime/slots/types.js +7 -0
  217. package/dist/runtime/slots/types.js.map +1 -0
  218. package/dist/runtime/slots/utils.d.ts +3 -0
  219. package/dist/runtime/slots/utils.js +66 -0
  220. package/dist/runtime/slots/utils.js.map +1 -0
  221. package/dist/runtime/slots/widget/WidgetContext.d.ts +6 -0
  222. package/dist/runtime/slots/widget/WidgetContext.js +8 -0
  223. package/dist/runtime/slots/widget/WidgetContext.js.map +1 -0
  224. package/dist/runtime/slots/widget/WidgetProvider.d.ts +9 -0
  225. package/dist/runtime/slots/widget/WidgetProvider.js +18 -0
  226. package/dist/runtime/slots/widget/WidgetProvider.js.map +1 -0
  227. package/dist/runtime/slots/widget/hooks.d.ts +13 -0
  228. package/dist/runtime/slots/widget/hooks.js +104 -0
  229. package/dist/runtime/slots/widget/hooks.js.map +1 -0
  230. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.d.ts +10 -0
  231. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.js +42 -0
  232. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.js.map +1 -0
  233. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.messages.d.ts +13 -0
  234. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.messages.js +15 -0
  235. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.messages.js.map +1 -0
  236. package/dist/runtime/slots/widget/iframe/IFrameWidget.d.ts +6 -0
  237. package/dist/runtime/slots/widget/iframe/IFrameWidget.js +32 -0
  238. package/dist/runtime/slots/widget/iframe/IFrameWidget.js.map +1 -0
  239. package/dist/runtime/slots/widget/iframe/constants.d.ts +15 -0
  240. package/{runtime/slots/widget/iframe/constants.ts → dist/runtime/slots/widget/iframe/constants.js} +2 -4
  241. package/dist/runtime/slots/widget/iframe/constants.js.map +1 -0
  242. package/dist/runtime/slots/widget/iframe/hooks.d.ts +64 -0
  243. package/dist/runtime/slots/widget/iframe/hooks.js +144 -0
  244. package/dist/runtime/slots/widget/iframe/hooks.js.map +1 -0
  245. package/{runtime/slots/widget/iframe/index.ts → dist/runtime/slots/widget/iframe/index.d.ts} +1 -4
  246. package/dist/runtime/slots/widget/iframe/index.js +3 -0
  247. package/dist/runtime/slots/widget/iframe/index.js.map +1 -0
  248. package/{runtime/slots/widget/iframe/types.ts → dist/runtime/slots/widget/iframe/types.d.ts} +2 -4
  249. package/dist/runtime/slots/widget/iframe/types.js +3 -0
  250. package/dist/runtime/slots/widget/iframe/types.js.map +1 -0
  251. package/dist/runtime/slots/widget/index.js +6 -0
  252. package/dist/runtime/slots/widget/index.js.map +1 -0
  253. package/{runtime/slots/widget/types.ts → dist/runtime/slots/widget/types.d.ts} +50 -84
  254. package/dist/runtime/slots/widget/types.js +41 -0
  255. package/dist/runtime/slots/widget/types.js.map +1 -0
  256. package/dist/runtime/slots/widget/utils.d.ts +22 -0
  257. package/dist/runtime/slots/widget/utils.js +166 -0
  258. package/dist/runtime/slots/widget/utils.js.map +1 -0
  259. package/{runtime/subscriptions.ts → dist/runtime/subscriptions.d.ts} +5 -41
  260. package/dist/runtime/subscriptions.js +48 -0
  261. package/dist/runtime/subscriptions.js.map +1 -0
  262. package/{runtime/testing/index.ts → dist/runtime/testing/index.d.ts} +0 -1
  263. package/dist/runtime/testing/index.js +9 -0
  264. package/dist/runtime/testing/index.js.map +1 -0
  265. package/dist/runtime/testing/initializeMockApp.d.ts +46 -0
  266. package/{runtime/testing/initializeMockApp.ts → dist/runtime/testing/initializeMockApp.js} +26 -41
  267. package/dist/runtime/testing/initializeMockApp.js.map +1 -0
  268. package/dist/runtime/testing/mockMessages.d.ts +22 -0
  269. package/dist/runtime/testing/mockMessages.js +23 -0
  270. package/dist/runtime/testing/mockMessages.js.map +1 -0
  271. package/dist/runtime/utils.d.ts +95 -0
  272. package/{runtime → dist/runtime}/utils.js +55 -70
  273. package/dist/runtime/utils.js.map +1 -0
  274. package/dist/shell/DefaultLayout.d.ts +1 -0
  275. package/dist/shell/DefaultLayout.js +7 -0
  276. package/dist/shell/DefaultLayout.js.map +1 -0
  277. package/dist/shell/DefaultMain.d.ts +1 -0
  278. package/dist/shell/DefaultMain.js +6 -0
  279. package/dist/shell/DefaultMain.js.map +1 -0
  280. package/dist/shell/Logo.d.ts +6 -0
  281. package/dist/shell/Logo.js +11 -0
  282. package/dist/shell/Logo.js.map +1 -0
  283. package/dist/shell/Shell.d.ts +1 -0
  284. package/dist/shell/Shell.js +10 -0
  285. package/dist/shell/Shell.js.map +1 -0
  286. package/dist/shell/Shell.messages.d.ts +58 -0
  287. package/dist/shell/Shell.messages.js +60 -0
  288. package/dist/shell/Shell.messages.js.map +1 -0
  289. package/dist/shell/app.d.ts +3 -0
  290. package/dist/shell/app.js +35 -0
  291. package/dist/shell/app.js.map +1 -0
  292. package/dist/shell/babel.config.d.ts +2 -0
  293. package/{runtime → dist/shell}/babel.config.js +2 -1
  294. package/dist/shell/babel.config.js.map +1 -0
  295. package/dist/shell/dev/devFooter/app.d.ts +3 -0
  296. package/dist/shell/dev/devFooter/app.js +36 -0
  297. package/dist/shell/dev/devFooter/app.js.map +1 -0
  298. package/dist/shell/dev/devFooter/index.js +2 -0
  299. package/dist/shell/dev/devFooter/index.js.map +1 -0
  300. package/dist/shell/dev/devHeader/BarContext.d.ts +7 -0
  301. package/dist/shell/dev/devHeader/BarContext.js +8 -0
  302. package/dist/shell/dev/devHeader/BarContext.js.map +1 -0
  303. package/dist/shell/dev/devHeader/BarLink.d.ts +1 -0
  304. package/dist/shell/dev/devHeader/BarLink.js +10 -0
  305. package/dist/shell/dev/devHeader/BarLink.js.map +1 -0
  306. package/dist/shell/dev/devHeader/BarProvider.d.ts +6 -0
  307. package/dist/shell/dev/devHeader/BarProvider.js +16 -0
  308. package/dist/shell/dev/devHeader/BarProvider.js.map +1 -0
  309. package/dist/shell/dev/devHeader/CoursesLink.d.ts +1 -0
  310. package/dist/shell/dev/devHeader/CoursesLink.js +10 -0
  311. package/dist/shell/dev/devHeader/CoursesLink.js.map +1 -0
  312. package/dist/shell/dev/devHeader/FooContext.d.ts +7 -0
  313. package/dist/shell/dev/devHeader/FooContext.js +8 -0
  314. package/dist/shell/dev/devHeader/FooContext.js.map +1 -0
  315. package/dist/shell/dev/devHeader/FooLink.d.ts +1 -0
  316. package/dist/shell/dev/devHeader/FooLink.js +10 -0
  317. package/dist/shell/dev/devHeader/FooLink.js.map +1 -0
  318. package/dist/shell/dev/devHeader/FooProvider.d.ts +6 -0
  319. package/dist/shell/dev/devHeader/FooProvider.js +16 -0
  320. package/dist/shell/dev/devHeader/FooProvider.js.map +1 -0
  321. package/dist/shell/dev/devHeader/app.d.ts +3 -0
  322. package/dist/shell/dev/devHeader/app.js +34 -0
  323. package/dist/shell/dev/devHeader/app.js.map +1 -0
  324. package/dist/shell/dev/devHeader/index.js +2 -0
  325. package/dist/shell/dev/devHeader/index.js.map +1 -0
  326. package/dist/shell/dev/devHeader/providers.d.ts +3 -0
  327. package/dist/shell/dev/devHeader/providers.js +8 -0
  328. package/dist/shell/dev/devHeader/providers.js.map +1 -0
  329. package/dist/shell/dev/devHome/HomePage.d.ts +1 -0
  330. package/dist/shell/dev/devHome/HomePage.js +13 -0
  331. package/dist/shell/dev/devHome/HomePage.js.map +1 -0
  332. package/dist/shell/dev/devHome/app.d.ts +3 -0
  333. package/dist/shell/dev/devHome/app.js +16 -0
  334. package/dist/shell/dev/devHome/app.js.map +1 -0
  335. package/dist/shell/dev/devHome/i18n/index.d.ts +27 -0
  336. package/dist/shell/dev/devHome/i18n/index.js +28 -0
  337. package/dist/shell/dev/devHome/i18n/index.js.map +1 -0
  338. package/dist/shell/dev/devHome/index.js +2 -0
  339. package/dist/shell/dev/devHome/index.js.map +1 -0
  340. package/dist/shell/dev/devHome/messages.d.ts +8 -0
  341. package/dist/shell/dev/devHome/messages.js +10 -0
  342. package/dist/shell/dev/devHome/messages.js.map +1 -0
  343. package/dist/shell/dev/devUser/app.d.ts +3 -0
  344. package/dist/shell/dev/devUser/app.js +22 -0
  345. package/dist/shell/dev/devUser/app.js.map +1 -0
  346. package/dist/shell/dev/devUser/index.js +2 -0
  347. package/dist/shell/dev/devUser/index.js.map +1 -0
  348. package/dist/shell/dev/index.js +6 -0
  349. package/dist/shell/dev/index.js.map +1 -0
  350. package/dist/shell/dev/slotShowcase/HorizontalSlotLayout.d.ts +1 -0
  351. package/dist/shell/dev/slotShowcase/HorizontalSlotLayout.js +7 -0
  352. package/dist/shell/dev/slotShowcase/HorizontalSlotLayout.js.map +1 -0
  353. package/dist/shell/dev/slotShowcase/LayoutWithOptions.d.ts +1 -0
  354. package/dist/shell/dev/slotShowcase/LayoutWithOptions.js +9 -0
  355. package/dist/shell/dev/slotShowcase/LayoutWithOptions.js.map +1 -0
  356. package/dist/shell/dev/slotShowcase/SlotShowcasePage.d.ts +1 -0
  357. package/dist/shell/dev/slotShowcase/SlotShowcasePage.js +8 -0
  358. package/dist/shell/dev/slotShowcase/SlotShowcasePage.js.map +1 -0
  359. package/dist/shell/dev/slotShowcase/WidgetWithOptions.d.ts +1 -0
  360. package/dist/shell/dev/slotShowcase/WidgetWithOptions.js +8 -0
  361. package/dist/shell/dev/slotShowcase/WidgetWithOptions.js.map +1 -0
  362. package/dist/shell/dev/slotShowcase/app.d.ts +3 -0
  363. package/dist/shell/dev/slotShowcase/app.js +336 -0
  364. package/dist/shell/dev/slotShowcase/app.js.map +1 -0
  365. package/dist/shell/dev/slotShowcase/index.js +2 -0
  366. package/dist/shell/dev/slotShowcase/index.js.map +1 -0
  367. package/dist/shell/footer/CenterLinks.d.ts +1 -0
  368. package/dist/shell/footer/CenterLinks.js +7 -0
  369. package/dist/shell/footer/CenterLinks.js.map +1 -0
  370. package/dist/shell/footer/CopyrightNotice.d.ts +10 -0
  371. package/dist/shell/footer/CopyrightNotice.js +10 -0
  372. package/dist/shell/footer/CopyrightNotice.js.map +1 -0
  373. package/dist/shell/footer/Footer.d.ts +1 -0
  374. package/dist/shell/footer/Footer.js +12 -0
  375. package/dist/shell/footer/Footer.js.map +1 -0
  376. package/dist/shell/footer/LabeledLinkColumn.d.ts +1 -0
  377. package/dist/shell/footer/LabeledLinkColumn.js +11 -0
  378. package/dist/shell/footer/LabeledLinkColumn.js.map +1 -0
  379. package/dist/shell/footer/LanguageMenu.d.ts +1 -0
  380. package/dist/shell/footer/LanguageMenu.js +16 -0
  381. package/dist/shell/footer/LanguageMenu.js.map +1 -0
  382. package/dist/shell/footer/LanguageMenuItem.d.ts +8 -0
  383. package/dist/shell/footer/LanguageMenuItem.js +11 -0
  384. package/dist/shell/footer/LanguageMenuItem.js.map +1 -0
  385. package/dist/shell/footer/LeftLinks.d.ts +1 -0
  386. package/dist/shell/footer/LeftLinks.js +7 -0
  387. package/dist/shell/footer/LeftLinks.js.map +1 -0
  388. package/dist/shell/footer/LegalNotices.d.ts +1 -0
  389. package/dist/shell/footer/LegalNotices.js +10 -0
  390. package/dist/shell/footer/LegalNotices.js.map +1 -0
  391. package/dist/shell/footer/PoweredBy.d.ts +1 -0
  392. package/dist/shell/footer/PoweredBy.js +9 -0
  393. package/dist/shell/footer/PoweredBy.js.map +1 -0
  394. package/dist/shell/footer/RevealLinks.d.ts +1 -0
  395. package/dist/shell/footer/RevealLinks.js +16 -0
  396. package/dist/shell/footer/RevealLinks.js.map +1 -0
  397. package/dist/shell/footer/RightLinks.d.ts +1 -0
  398. package/dist/shell/footer/RightLinks.js +7 -0
  399. package/dist/shell/footer/RightLinks.js.map +1 -0
  400. package/dist/shell/footer/app.d.ts +3 -0
  401. package/dist/shell/footer/app.js +59 -0
  402. package/dist/shell/footer/app.js.map +1 -0
  403. package/dist/shell/footer/data/api.d.ts +1 -0
  404. package/dist/shell/footer/data/api.js +45 -0
  405. package/dist/shell/footer/data/api.js.map +1 -0
  406. package/dist/shell/footer/index.js +3 -0
  407. package/dist/shell/footer/index.js.map +1 -0
  408. package/dist/shell/header/AuthenticatedMenu.d.ts +5 -0
  409. package/dist/shell/header/AuthenticatedMenu.js +13 -0
  410. package/dist/shell/header/AuthenticatedMenu.js.map +1 -0
  411. package/dist/shell/header/Header.d.ts +1 -0
  412. package/dist/shell/header/Header.js +8 -0
  413. package/dist/shell/header/Header.js.map +1 -0
  414. package/dist/shell/header/anonymous-menu/AnonymousMenu.d.ts +5 -0
  415. package/dist/shell/header/anonymous-menu/AnonymousMenu.js +7 -0
  416. package/dist/shell/header/anonymous-menu/AnonymousMenu.js.map +1 -0
  417. package/dist/shell/header/anonymous-menu/LoginButton.d.ts +3 -0
  418. package/dist/shell/header/anonymous-menu/LoginButton.js +22 -0
  419. package/dist/shell/header/anonymous-menu/LoginButton.js.map +1 -0
  420. package/dist/shell/header/anonymous-menu/RegisterButton.d.ts +3 -0
  421. package/dist/shell/header/anonymous-menu/RegisterButton.js +22 -0
  422. package/dist/shell/header/anonymous-menu/RegisterButton.js.map +1 -0
  423. package/dist/shell/header/app.d.ts +3 -0
  424. package/dist/shell/header/app.js +119 -0
  425. package/dist/shell/header/app.js.map +1 -0
  426. package/dist/shell/header/desktop/DesktopLayout.d.ts +1 -0
  427. package/dist/shell/header/desktop/DesktopLayout.js +9 -0
  428. package/dist/shell/header/desktop/DesktopLayout.js.map +1 -0
  429. package/dist/shell/header/desktop/PrimaryNavLinks.d.ts +1 -0
  430. package/dist/shell/header/desktop/PrimaryNavLinks.js +7 -0
  431. package/dist/shell/header/desktop/PrimaryNavLinks.js.map +1 -0
  432. package/dist/shell/header/desktop/SecondaryNavLinks.d.ts +1 -0
  433. package/dist/shell/header/desktop/SecondaryNavLinks.js +7 -0
  434. package/dist/shell/header/desktop/SecondaryNavLinks.js.map +1 -0
  435. package/dist/shell/header/index.js +3 -0
  436. package/dist/shell/header/index.js.map +1 -0
  437. package/dist/shell/header/mobile/MobileLayout.d.ts +1 -0
  438. package/dist/shell/header/mobile/MobileLayout.js +17 -0
  439. package/dist/shell/header/mobile/MobileLayout.js.map +1 -0
  440. package/dist/shell/header/mobile/MobileNavLinks.d.ts +1 -0
  441. package/dist/shell/header/mobile/MobileNavLinks.js +7 -0
  442. package/dist/shell/header/mobile/MobileNavLinks.js.map +1 -0
  443. package/dist/shell/i18n/index.d.ts +25 -0
  444. package/dist/shell/i18n/index.js +26 -0
  445. package/dist/shell/i18n/index.js.map +1 -0
  446. package/dist/shell/index.js +8 -0
  447. package/dist/shell/index.js.map +1 -0
  448. package/dist/shell/jest.config.d.ts +16 -0
  449. package/{tools/dist/jest → dist/shell}/jest.config.js +13 -11
  450. package/dist/shell/jest.config.js.map +1 -0
  451. package/dist/shell/menus/LinkMenuItem.d.ts +9 -0
  452. package/dist/shell/menus/LinkMenuItem.js +36 -0
  453. package/dist/shell/menus/LinkMenuItem.js.map +1 -0
  454. package/dist/shell/menus/NavDropdownMenuSlot.d.ts +7 -0
  455. package/dist/shell/menus/NavDropdownMenuSlot.js +14 -0
  456. package/dist/shell/menus/NavDropdownMenuSlot.js.map +1 -0
  457. package/dist/shell/menus/ProfileLinkMenuItem.d.ts +8 -0
  458. package/dist/shell/menus/ProfileLinkMenuItem.js +16 -0
  459. package/dist/shell/menus/ProfileLinkMenuItem.js.map +1 -0
  460. package/dist/shell/menus/data/utils.d.ts +4 -0
  461. package/dist/shell/menus/data/utils.js +13 -0
  462. package/dist/shell/menus/data/utils.js.map +1 -0
  463. package/dist/shell/router/createRouter.d.ts +1 -0
  464. package/{shell/router/createRouter.ts → dist/shell/router/createRouter.js} +9 -11
  465. package/dist/shell/router/createRouter.js.map +1 -0
  466. package/dist/shell/router/getAppRoutes.d.ts +2 -0
  467. package/dist/shell/router/getAppRoutes.js +14 -0
  468. package/dist/shell/router/getAppRoutes.js.map +1 -0
  469. package/dist/shell/setupTest.d.ts +1 -0
  470. package/{shell → dist/shell}/setupTest.js +6 -7
  471. package/dist/shell/setupTest.js.map +1 -0
  472. package/dist/shell/site.config.dev.d.ts +4 -0
  473. package/dist/shell/site.config.dev.js +43 -0
  474. package/dist/shell/site.config.dev.js.map +1 -0
  475. package/dist/shell/site.d.ts +1 -0
  476. package/dist/shell/site.js +35 -0
  477. package/dist/shell/site.js.map +1 -0
  478. package/dist/tools/babel/babel.config.d.ts +12 -0
  479. package/dist/tools/cli/commands/serve.d.ts +1 -0
  480. package/dist/tools/cli/intl-imports.d.ts +7 -0
  481. package/dist/tools/cli/intl-imports.test.d.ts +1 -0
  482. package/dist/tools/cli/openedx.d.ts +2 -0
  483. package/{tools/dist → dist/tools}/cli/openedx.js +1 -1
  484. package/dist/tools/cli/transifex-utils.d.ts +2 -0
  485. package/dist/tools/cli/utils/ensureConfigFilenameOption.d.ts +2 -0
  486. package/dist/tools/cli/utils/formatter.d.ts +1 -0
  487. package/dist/tools/cli/utils/getResolvedConfigPath.d.ts +2 -0
  488. package/dist/tools/cli/utils/prettyPrintTitle.d.ts +1 -0
  489. package/dist/tools/cli/utils/printUsage.d.ts +1 -0
  490. package/dist/tools/config-helpers/createConfig.d.ts +2 -0
  491. package/dist/tools/config-helpers/createLintConfig.d.ts +2 -0
  492. package/dist/tools/config-helpers/getBaseConfig.d.ts +2 -0
  493. package/dist/tools/defaultConfigPaths.d.ts +8 -0
  494. package/dist/tools/eslint/base.eslint.config.d.ts +3 -0
  495. package/dist/tools/eslint.config.d.ts +3 -0
  496. package/dist/tools/index.d.ts +3 -0
  497. package/dist/tools/jest/jest.config.d.ts +15 -0
  498. package/dist/tools/jest.config.d.ts +8 -0
  499. package/dist/tools/types.d.ts +18 -0
  500. package/{tools/dist → dist/tools}/typescript/tsconfig.json +2 -1
  501. package/dist/tools/webpack/common-config/all/getCodeRules.d.ts +2 -0
  502. package/dist/tools/webpack/common-config/all/getFileLoaderRules.d.ts +11 -0
  503. package/dist/tools/webpack/common-config/all/getImageMinimizer.d.ts +5 -0
  504. package/dist/tools/webpack/common-config/all/getStylesheetRule.d.ts +8 -0
  505. package/dist/tools/webpack/common-config/dev/getDevServer.d.ts +2 -0
  506. package/dist/tools/webpack/common-config/index.d.ts +6 -0
  507. package/dist/tools/webpack/common-config/site/getHtmlWebpackPlugin.d.ts +2 -0
  508. package/dist/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.d.ts +18 -0
  509. package/dist/tools/webpack/plugins/html-webpack-new-relic-plugin/index.d.ts +2 -0
  510. package/dist/tools/webpack/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.d.ts +1 -0
  511. package/dist/tools/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.d.ts +1 -0
  512. package/dist/tools/webpack/utils/getPublicPath.d.ts +1 -0
  513. package/dist/tools/webpack/utils/getResolvedSiteConfigPath.d.ts +1 -0
  514. package/dist/tools/webpack/webpack.config.build.d.ts +3 -0
  515. package/{config → dist/tools}/webpack/webpack.config.build.js +8 -5
  516. package/dist/tools/webpack/webpack.config.dev.d.ts +3 -0
  517. package/{tools/dist → dist/tools}/webpack/webpack.config.dev.js +8 -5
  518. package/dist/tools/webpack/webpack.config.dev.shell.d.ts +3 -0
  519. package/{tools/dist → dist/tools}/webpack/webpack.config.dev.shell.js +0 -4
  520. package/dist/types.d.ts +82 -0
  521. package/dist/types.js +7 -0
  522. package/dist/types.js.map +1 -0
  523. package/package.json +21 -16
  524. package/config/tsconfig.json +0 -32
  525. package/config/webpack/common-config/all/getIgnoreWarnings.js +0 -14
  526. package/config/webpack/utils/getLocalAliases.js +0 -65
  527. package/config/webpack/webpack.config.dev.js +0 -70
  528. package/config/webpack/webpack.config.dev.shell.js +0 -104
  529. package/runtime/__mocks__/file.js +0 -1
  530. package/runtime/__mocks__/svg.js +0 -1
  531. package/runtime/__mocks__/universal-cookie.js +0 -6
  532. package/runtime/analytics/MockAnalyticsService.js +0 -71
  533. package/runtime/analytics/SegmentAnalyticsService.js +0 -243
  534. package/runtime/analytics/index.ts +0 -12
  535. package/runtime/analytics/interface.test.js +0 -242
  536. package/runtime/auth/AxiosCsrfTokenService.js +0 -60
  537. package/runtime/auth/AxiosJwtAuthService.js +0 -363
  538. package/runtime/auth/AxiosJwtAuthService.test.jsx +0 -1076
  539. package/runtime/auth/AxiosJwtTokenService.js +0 -134
  540. package/runtime/auth/LocalForageCache.js +0 -76
  541. package/runtime/auth/MockAuthService.js +0 -278
  542. package/runtime/auth/index.ts +0 -19
  543. package/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js +0 -36
  544. package/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js +0 -37
  545. package/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js +0 -20
  546. package/runtime/auth/interceptors/createRetryInterceptor.js +0 -74
  547. package/runtime/auth/interceptors/createRetryInterceptor.test.js +0 -23
  548. package/runtime/auth/utils.js +0 -105
  549. package/runtime/config/getExternalLinkUrl.test.js +0 -76
  550. package/runtime/i18n/injectIntlWithShim.jsx +0 -48
  551. package/runtime/i18n/lib.test.js +0 -230
  552. package/runtime/i18n/lib.ts +0 -272
  553. package/runtime/index.ts +0 -139
  554. package/runtime/initialize.async.function.config.test.js +0 -43
  555. package/runtime/initialize.const.config.test.js +0 -41
  556. package/runtime/initialize.function.config.test.js +0 -41
  557. package/runtime/initialize.js +0 -352
  558. package/runtime/initialize.test.js +0 -356
  559. package/runtime/jest.config.js +0 -33
  560. package/runtime/logging/MockLoggingService.js +0 -31
  561. package/runtime/logging/NewRelicLoggingService.js +0 -184
  562. package/runtime/logging/NewRelicLoggingService.test.js +0 -214
  563. package/runtime/logging/types.ts +0 -4
  564. package/runtime/react/AuthenticatedPageRoute.test.jsx +0 -135
  565. package/runtime/react/CombinedAppProvider.tsx +0 -46
  566. package/runtime/react/CurrentAppProvider.tsx +0 -46
  567. package/runtime/react/Divider.tsx +0 -5
  568. package/runtime/react/ErrorBoundary.jsx +0 -47
  569. package/runtime/react/ErrorBoundary.test.jsx +0 -83
  570. package/runtime/react/ErrorPage.jsx +0 -72
  571. package/runtime/react/SiteProvider.test.jsx +0 -66
  572. package/runtime/react/SiteProvider.tsx +0 -101
  573. package/runtime/react/hooks/theme/useTheme.test.ts +0 -221
  574. package/runtime/react/hooks/theme/useTheme.ts +0 -179
  575. package/runtime/react/hooks/theme/useThemeConfig.test.ts +0 -107
  576. package/runtime/react/hooks/theme/useThemeCore.test.ts +0 -65
  577. package/runtime/react/hooks/theme/useThemeCore.ts +0 -52
  578. package/runtime/react/hooks/theme/useThemeVariants.test.ts +0 -97
  579. package/runtime/react/hooks/theme/useThemeVariants.ts +0 -116
  580. package/runtime/react/hooks/theme/useTrackColorSchemeChoice.test.ts +0 -54
  581. package/runtime/react/hooks/theme/useTrackColorSchemeChoice.ts +0 -30
  582. package/runtime/react/hooks/useActiveRouteRoleWatcher.ts +0 -31
  583. package/runtime/react/hooks/useAuthenticatedUser.test.tsx +0 -41
  584. package/runtime/react/hooks/useSiteConfig.test.tsx +0 -13
  585. package/runtime/react/reducers.ts +0 -40
  586. package/runtime/routing/utils.test.ts +0 -7
  587. package/runtime/routing/utils.ts +0 -34
  588. package/runtime/scripts/GoogleAnalyticsLoader.test.ts +0 -77
  589. package/runtime/scripts/GoogleAnalyticsLoader.ts +0 -59
  590. package/runtime/site.config.test.tsx +0 -33
  591. package/runtime/slots/Slot.test.tsx +0 -40
  592. package/runtime/slots/Slot.tsx +0 -32
  593. package/runtime/slots/SlotContext.tsx +0 -8
  594. package/runtime/slots/hooks.ts +0 -35
  595. package/runtime/slots/layout/DefaultSlotLayout.test.tsx +0 -31
  596. package/runtime/slots/layout/DefaultSlotLayout.tsx +0 -9
  597. package/runtime/slots/layout/hooks.test.tsx +0 -178
  598. package/runtime/slots/layout/hooks.ts +0 -65
  599. package/runtime/slots/layout/utils.test.ts +0 -67
  600. package/runtime/slots/layout/utils.ts +0 -14
  601. package/runtime/slots/utils.test.ts +0 -64
  602. package/runtime/slots/utils.ts +0 -78
  603. package/runtime/slots/widget/WidgetContext.tsx +0 -9
  604. package/runtime/slots/widget/WidgetProvider.tsx +0 -30
  605. package/runtime/slots/widget/hooks.ts +0 -105
  606. package/runtime/slots/widget/iframe/IFrameContentWrapper.messages.tsx +0 -16
  607. package/runtime/slots/widget/iframe/IFrameContentWrapper.tsx +0 -84
  608. package/runtime/slots/widget/iframe/IFrameWidget.tsx +0 -59
  609. package/runtime/slots/widget/iframe/hooks.ts +0 -179
  610. package/runtime/slots/widget/utils.tsx +0 -201
  611. package/runtime/testing/initializeMockApp.test.ts +0 -66
  612. package/runtime/testing/mockMessages.ts +0 -23
  613. package/runtime/utils.test.js +0 -116
  614. package/shell/DefaultLayout.tsx +0 -18
  615. package/shell/DefaultMain.tsx +0 -7
  616. package/shell/Logo.test.tsx +0 -32
  617. package/shell/Logo.tsx +0 -28
  618. package/shell/Shell.messages.ts +0 -61
  619. package/shell/Shell.tsx +0 -18
  620. package/shell/__mocks__/file.js +0 -1
  621. package/shell/__mocks__/svg.js +0 -1
  622. package/shell/__mocks__/universal-cookie.js +0 -6
  623. package/shell/app.ts +0 -38
  624. package/shell/dev/devFooter/app.tsx +0 -43
  625. package/shell/dev/devHeader/BarContext.tsx +0 -13
  626. package/shell/dev/devHeader/BarLink.tsx +0 -16
  627. package/shell/dev/devHeader/BarProvider.tsx +0 -25
  628. package/shell/dev/devHeader/CoursesLink.tsx +0 -16
  629. package/shell/dev/devHeader/FooContext.tsx +0 -13
  630. package/shell/dev/devHeader/FooLink.tsx +0 -16
  631. package/shell/dev/devHeader/FooProvider.tsx +0 -25
  632. package/shell/dev/devHeader/app.tsx +0 -53
  633. package/shell/dev/devHeader/providers.tsx +0 -11
  634. package/shell/dev/devHome/HomePage.tsx +0 -28
  635. package/shell/dev/devHome/app.ts +0 -18
  636. package/shell/dev/devHome/i18n/index.ts +0 -27
  637. package/shell/dev/devHome/messages.ts +0 -11
  638. package/shell/dev/devUser/app.tsx +0 -24
  639. package/shell/dev/slotShowcase/HorizontalSlotLayout.tsx +0 -11
  640. package/shell/dev/slotShowcase/LayoutWithOptions.tsx +0 -17
  641. package/shell/dev/slotShowcase/SlotShowcasePage.tsx +0 -66
  642. package/shell/dev/slotShowcase/WidgetWithOptions.tsx +0 -11
  643. package/shell/dev/slotShowcase/app.tsx +0 -373
  644. package/shell/footer/CenterLinks.tsx +0 -11
  645. package/shell/footer/CopyrightNotice.tsx +0 -36
  646. package/shell/footer/Footer.tsx +0 -34
  647. package/shell/footer/LabeledLinkColumn.tsx +0 -19
  648. package/shell/footer/LanguageMenu.tsx +0 -35
  649. package/shell/footer/LanguageMenuItem.tsx +0 -23
  650. package/shell/footer/LeftLinks.tsx +0 -11
  651. package/shell/footer/LegalNotices.tsx +0 -17
  652. package/shell/footer/PoweredBy.tsx +0 -17
  653. package/shell/footer/RevealLinks.tsx +0 -43
  654. package/shell/footer/RightLinks.tsx +0 -11
  655. package/shell/footer/app.tsx +0 -73
  656. package/shell/footer/data/api.ts +0 -48
  657. package/shell/header/AuthenticatedMenu.tsx +0 -32
  658. package/shell/header/Header.tsx +0 -17
  659. package/shell/header/anonymous-menu/AnonymousMenu.tsx +0 -14
  660. package/shell/header/anonymous-menu/LoginButton.tsx +0 -14
  661. package/shell/header/anonymous-menu/RegisterButton.tsx +0 -15
  662. package/shell/header/app.tsx +0 -142
  663. package/shell/header/desktop/DesktopLayout.tsx +0 -22
  664. package/shell/header/desktop/PrimaryNavLinks.tsx +0 -10
  665. package/shell/header/desktop/SecondaryNavLinks.tsx +0 -10
  666. package/shell/header/mobile/MobileLayout.tsx +0 -47
  667. package/shell/header/mobile/MobileNavLinks.tsx +0 -10
  668. package/shell/i18n/index.ts +0 -25
  669. package/shell/jest.config.js +0 -31
  670. package/shell/menus/LinkMenuItem.tsx +0 -64
  671. package/shell/menus/NavDropdownMenuSlot.tsx +0 -29
  672. package/shell/menus/ProfileLinkMenuItem.tsx +0 -33
  673. package/shell/menus/data/utils.ts +0 -19
  674. package/shell/public/index.html +0 -10
  675. package/shell/router/createRouter.test.tsx +0 -50
  676. package/shell/router/getAppRoutes.test.tsx +0 -59
  677. package/shell/router/getAppRoutes.ts +0 -21
  678. package/shell/site.config.dev.tsx +0 -49
  679. package/shell/site.config.test.tsx +0 -16
  680. package/shell/site.tsx +0 -41
  681. package/tools/dist/babel/babel.config.js +0 -28
  682. package/tools/dist/config-helpers/createConfig.js +0 -13
  683. package/tools/dist/config-helpers/createLintConfig.js +0 -16
  684. package/tools/dist/config-helpers/getBaseConfig.js +0 -12
  685. package/tools/dist/defaultConfigPaths.js +0 -35
  686. package/tools/dist/eslint/base.eslint.config.js +0 -113
  687. package/tools/dist/index.js +0 -12
  688. package/tools/dist/types.js +0 -23
  689. package/tools/dist/webpack/common-config/all/getCodeRules.js +0 -52
  690. package/tools/dist/webpack/common-config/all/getFileLoaderRules.js +0 -26
  691. package/tools/dist/webpack/common-config/all/getIgnoreWarnings.js +0 -14
  692. package/tools/dist/webpack/common-config/all/getImageMinimizer.js +0 -25
  693. package/tools/dist/webpack/common-config/all/getStylesheetRule.js +0 -112
  694. package/tools/dist/webpack/common-config/dev/getDevServer.js +0 -38
  695. package/tools/dist/webpack/common-config/index.js +0 -18
  696. package/tools/dist/webpack/common-config/site/getHtmlWebpackPlugin.js +0 -16
  697. package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js +0 -91
  698. package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/index.js +0 -7
  699. package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js +0 -66
  700. package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +0 -3
  701. package/tools/dist/webpack/utils/getLocalAliases.js +0 -65
  702. package/tools/dist/webpack/utils/getPublicPath.js +0 -6
  703. package/tools/dist/webpack/utils/getResolvedSiteConfigPath.js +0 -32
  704. package/tools/dist/webpack/webpack.config.build.js +0 -70
  705. package/types.ts +0 -119
  706. /package/{runtime/react/hooks/theme/index.ts → dist/runtime/react/hooks/theme/index.d.ts} +0 -0
  707. /package/{runtime/routing/index.ts → dist/runtime/routing/index.d.ts} +0 -0
  708. /package/{runtime/scripts/index.ts → dist/runtime/scripts/index.d.ts} +0 -0
  709. /package/{runtime/slots/index.ts → dist/runtime/slots/index.d.ts} +0 -0
  710. /package/{runtime/slots/layout/index.ts → dist/runtime/slots/layout/index.d.ts} +0 -0
  711. /package/{runtime/slots/widget/index.ts → dist/runtime/slots/widget/index.d.ts} +0 -0
  712. /package/{shell → dist/shell}/app.scss +0 -0
  713. /package/{shell/dev/devFooter/index.ts → dist/shell/dev/devFooter/index.d.ts} +0 -0
  714. /package/{shell/dev/devHeader/index.ts → dist/shell/dev/devHeader/index.d.ts} +0 -0
  715. /package/{shell/dev/devHome/index.ts → dist/shell/dev/devHome/index.d.ts} +0 -0
  716. /package/{shell/dev/devUser/index.ts → dist/shell/dev/devUser/index.d.ts} +0 -0
  717. /package/{shell/dev/index.ts → dist/shell/dev/index.d.ts} +0 -0
  718. /package/{shell/dev/slotShowcase/index.ts → dist/shell/dev/slotShowcase/index.d.ts} +0 -0
  719. /package/{shell/footer/index.ts → dist/shell/footer/index.d.ts} +0 -0
  720. /package/{shell/header/index.ts → dist/shell/header/index.d.ts} +0 -0
  721. /package/{shell/index.ts → dist/shell/index.d.ts} +0 -0
  722. /package/{config → dist/tools}/babel/babel.config.js +0 -0
  723. /package/{tools/dist → dist/tools}/cli/commands/serve.js +0 -0
  724. /package/{tools/dist → dist/tools}/cli/intl-imports.js +0 -0
  725. /package/{tools/dist → dist/tools}/cli/intl-imports.test.js +0 -0
  726. /package/{tools/dist → dist/tools}/cli/transifex-utils.js +0 -0
  727. /package/{tools/dist → dist/tools}/cli/utils/ensureConfigFilenameOption.js +0 -0
  728. /package/{tools/dist → dist/tools}/cli/utils/formatter.js +0 -0
  729. /package/{tools/dist → dist/tools}/cli/utils/getResolvedConfigPath.js +0 -0
  730. /package/{tools/dist → dist/tools}/cli/utils/prettyPrintTitle.js +0 -0
  731. /package/{tools/dist → dist/tools}/cli/utils/printUsage.js +0 -0
  732. /package/{config → dist/tools}/config-helpers/createConfig.js +0 -0
  733. /package/{config → dist/tools}/config-helpers/createLintConfig.js +0 -0
  734. /package/{config → dist/tools}/config-helpers/getBaseConfig.js +0 -0
  735. /package/{config → dist/tools}/defaultConfigPaths.js +0 -0
  736. /package/{config → dist/tools}/eslint/base.eslint.config.js +0 -0
  737. /package/{tools/dist → dist/tools}/eslint.config.js +0 -0
  738. /package/{config → dist/tools}/index.js +0 -0
  739. /package/{config → dist/tools}/jest/jest.config.js +0 -0
  740. /package/{tools/dist → dist/tools}/jest.config.js +0 -0
  741. /package/{config → dist/tools}/types.js +0 -0
  742. /package/{config → dist/tools}/webpack/common-config/all/getCodeRules.js +0 -0
  743. /package/{config → dist/tools}/webpack/common-config/all/getFileLoaderRules.js +0 -0
  744. /package/{config → dist/tools}/webpack/common-config/all/getImageMinimizer.js +0 -0
  745. /package/{config → dist/tools}/webpack/common-config/all/getStylesheetRule.js +0 -0
  746. /package/{config → dist/tools}/webpack/common-config/dev/getDevServer.js +0 -0
  747. /package/{config → dist/tools}/webpack/common-config/index.js +0 -0
  748. /package/{config → dist/tools}/webpack/common-config/site/getHtmlWebpackPlugin.js +0 -0
  749. /package/{config → dist/tools}/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js +0 -0
  750. /package/{config → dist/tools}/webpack/plugins/html-webpack-new-relic-plugin/index.js +0 -0
  751. /package/{config → dist/tools}/webpack/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js +0 -0
  752. /package/{config → dist/tools}/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +0 -0
  753. /package/{config → dist/tools}/webpack/utils/getPublicPath.js +0 -0
  754. /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
- });