@openedx/frontend-base 1.0.0-alpha.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 (356) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +112 -0
  3. package/config/babel/babel.config.js +28 -0
  4. package/config/config-helpers/createConfig.js +13 -0
  5. package/config/config-helpers/createLintConfig.js +16 -0
  6. package/config/config-helpers/getBaseConfig.js +12 -0
  7. package/config/defaultConfigPaths.js +35 -0
  8. package/config/eslint/base.eslint.config.js +113 -0
  9. package/config/index.js +12 -0
  10. package/config/jest/jest.config.js +30 -0
  11. package/config/tsconfig.json +32 -0
  12. package/config/types.js +25 -0
  13. package/config/webpack/common-config/all/getCodeRules.js +52 -0
  14. package/config/webpack/common-config/all/getFileLoaderRules.js +26 -0
  15. package/config/webpack/common-config/all/getIgnoreWarnings.js +14 -0
  16. package/config/webpack/common-config/all/getImageMinimizer.js +25 -0
  17. package/config/webpack/common-config/all/getStylesheetRule.js +112 -0
  18. package/config/webpack/common-config/dev/getDevServer.js +38 -0
  19. package/config/webpack/common-config/index.js +18 -0
  20. package/config/webpack/common-config/site/getHtmlWebpackPlugin.js +16 -0
  21. package/config/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js +91 -0
  22. package/config/webpack/plugins/html-webpack-new-relic-plugin/index.js +7 -0
  23. package/config/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +3 -0
  24. package/config/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.js +108 -0
  25. package/config/webpack/plugins/paragon-webpack-plugin/index.js +7 -0
  26. package/config/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.js +64 -0
  27. package/config/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.js +53 -0
  28. package/config/webpack/plugins/paragon-webpack-plugin/utils/index.js +9 -0
  29. package/config/webpack/plugins/paragon-webpack-plugin/utils/paragonStylesheetUtils.js +114 -0
  30. package/config/webpack/plugins/paragon-webpack-plugin/utils/scriptUtils.js +146 -0
  31. package/config/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.js +126 -0
  32. package/config/webpack/plugins/paragon-webpack-plugin/utils/tagUtils.js +57 -0
  33. package/config/webpack/types.js +2 -0
  34. package/config/webpack/utils/getLocalAliases.js +65 -0
  35. package/config/webpack/utils/getPublicPath.js +6 -0
  36. package/config/webpack/utils/getResolvedSiteConfigPath.js +32 -0
  37. package/config/webpack/utils/paragonUtils.js +138 -0
  38. package/config/webpack/webpack.config.build.js +80 -0
  39. package/config/webpack/webpack.config.dev.js +76 -0
  40. package/config/webpack/webpack.config.dev.shell.js +110 -0
  41. package/eslint.config.js +18 -0
  42. package/frontend-base.d.ts +8 -0
  43. package/index.ts +7 -0
  44. package/jest.config.js +7 -0
  45. package/openedx-frontend-base.tgz +0 -0
  46. package/package.json +149 -0
  47. package/runtime/analytics/MockAnalyticsService.js +71 -0
  48. package/runtime/analytics/SegmentAnalyticsService.js +243 -0
  49. package/runtime/analytics/index.ts +12 -0
  50. package/runtime/analytics/interface.js +145 -0
  51. package/runtime/auth/AxiosCsrfTokenService.js +60 -0
  52. package/runtime/auth/AxiosJwtAuthService.js +363 -0
  53. package/runtime/auth/AxiosJwtTokenService.js +134 -0
  54. package/runtime/auth/LocalForageCache.js +76 -0
  55. package/runtime/auth/MockAuthService.js +278 -0
  56. package/runtime/auth/index.ts +19 -0
  57. package/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js +36 -0
  58. package/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js +37 -0
  59. package/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js +20 -0
  60. package/runtime/auth/interceptors/createRetryInterceptor.js +74 -0
  61. package/runtime/auth/interface.js +309 -0
  62. package/runtime/auth/utils.js +105 -0
  63. package/runtime/babel.config.js +3 -0
  64. package/runtime/config/index.ts +295 -0
  65. package/runtime/constants.ts +68 -0
  66. package/runtime/i18n/index.js +118 -0
  67. package/runtime/i18n/injectIntlWithShim.jsx +48 -0
  68. package/runtime/i18n/lib.ts +272 -0
  69. package/runtime/index.ts +134 -0
  70. package/runtime/initialize.js +352 -0
  71. package/runtime/jest.config.js +32 -0
  72. package/runtime/logging/MockLoggingService.js +31 -0
  73. package/runtime/logging/NewRelicLoggingService.js +184 -0
  74. package/runtime/logging/index.ts +9 -0
  75. package/runtime/logging/interface.js +109 -0
  76. package/runtime/logging/types.ts +4 -0
  77. package/runtime/react/AuthenticatedPageRoute.jsx +43 -0
  78. package/runtime/react/CombinedAppProvider.tsx +46 -0
  79. package/runtime/react/CurrentAppContext.tsx +25 -0
  80. package/runtime/react/CurrentAppProvider.tsx +46 -0
  81. package/runtime/react/Divider.tsx +5 -0
  82. package/runtime/react/ErrorBoundary.jsx +47 -0
  83. package/runtime/react/ErrorPage.jsx +72 -0
  84. package/runtime/react/LoginRedirect.jsx +16 -0
  85. package/runtime/react/PageWrap.jsx +24 -0
  86. package/runtime/react/SiteContext.tsx +32 -0
  87. package/runtime/react/SiteProvider.tsx +78 -0
  88. package/runtime/react/hooks.ts +106 -0
  89. package/runtime/react/index.ts +19 -0
  90. package/runtime/routing/index.ts +1 -0
  91. package/runtime/routing/utils.ts +34 -0
  92. package/runtime/scripts/GoogleAnalyticsLoader.ts +59 -0
  93. package/runtime/scripts/index.ts +1 -0
  94. package/runtime/setupTest.js +49 -0
  95. package/runtime/slots/Slot.tsx +32 -0
  96. package/runtime/slots/SlotContext.tsx +8 -0
  97. package/runtime/slots/hooks.ts +35 -0
  98. package/runtime/slots/index.ts +7 -0
  99. package/runtime/slots/layout/DefaultSlotLayout.tsx +9 -0
  100. package/runtime/slots/layout/hooks.ts +65 -0
  101. package/runtime/slots/layout/index.ts +5 -0
  102. package/runtime/slots/layout/types.ts +45 -0
  103. package/runtime/slots/layout/utils.ts +14 -0
  104. package/runtime/slots/types.ts +23 -0
  105. package/runtime/slots/utils.ts +59 -0
  106. package/runtime/slots/widget/WidgetContext.tsx +9 -0
  107. package/runtime/slots/widget/WidgetProvider.tsx +30 -0
  108. package/runtime/slots/widget/hooks.ts +105 -0
  109. package/runtime/slots/widget/iframe/IFrameContentWrapper.messages.tsx +16 -0
  110. package/runtime/slots/widget/iframe/IFrameContentWrapper.tsx +84 -0
  111. package/runtime/slots/widget/iframe/IFrameWidget.tsx +59 -0
  112. package/runtime/slots/widget/iframe/constants.ts +19 -0
  113. package/runtime/slots/widget/iframe/hooks.ts +179 -0
  114. package/runtime/slots/widget/iframe/index.ts +6 -0
  115. package/runtime/slots/widget/iframe/types.ts +7 -0
  116. package/runtime/slots/widget/index.ts +6 -0
  117. package/runtime/slots/widget/types.ts +134 -0
  118. package/runtime/slots/widget/utils.tsx +201 -0
  119. package/runtime/subscriptions.ts +60 -0
  120. package/runtime/testing/index.ts +9 -0
  121. package/runtime/testing/initializeMockApp.ts +81 -0
  122. package/runtime/testing/mockMessages.ts +23 -0
  123. package/runtime/utils.js +178 -0
  124. package/shell/DefaultLayout.tsx +18 -0
  125. package/shell/DefaultMain.tsx +7 -0
  126. package/shell/Logo.tsx +28 -0
  127. package/shell/Shell.messages.ts +61 -0
  128. package/shell/Shell.tsx +18 -0
  129. package/shell/app.scss +149 -0
  130. package/shell/app.ts +24 -0
  131. package/shell/babel.config.js +3 -0
  132. package/shell/dev/devFooter/app.tsx +43 -0
  133. package/shell/dev/devFooter/index.ts +1 -0
  134. package/shell/dev/devHeader/BarContext.tsx +13 -0
  135. package/shell/dev/devHeader/BarLink.tsx +16 -0
  136. package/shell/dev/devHeader/BarProvider.tsx +25 -0
  137. package/shell/dev/devHeader/CoursesLink.tsx +16 -0
  138. package/shell/dev/devHeader/FooContext.tsx +13 -0
  139. package/shell/dev/devHeader/FooLink.tsx +16 -0
  140. package/shell/dev/devHeader/FooProvider.tsx +25 -0
  141. package/shell/dev/devHeader/app.tsx +53 -0
  142. package/shell/dev/devHeader/index.ts +1 -0
  143. package/shell/dev/devHeader/providers.tsx +11 -0
  144. package/shell/dev/devHome/HomePage.tsx +28 -0
  145. package/shell/dev/devHome/app.ts +18 -0
  146. package/shell/dev/devHome/i18n/index.ts +27 -0
  147. package/shell/dev/devHome/index.ts +1 -0
  148. package/shell/dev/devHome/messages.ts +11 -0
  149. package/shell/dev/devUser/app.tsx +24 -0
  150. package/shell/dev/devUser/index.ts +1 -0
  151. package/shell/dev/index.ts +5 -0
  152. package/shell/dev/slotShowcase/HorizontalSlotLayout.tsx +11 -0
  153. package/shell/dev/slotShowcase/LayoutWithOptions.tsx +17 -0
  154. package/shell/dev/slotShowcase/SlotShowcasePage.tsx +66 -0
  155. package/shell/dev/slotShowcase/WidgetWithOptions.tsx +11 -0
  156. package/shell/dev/slotShowcase/app.tsx +373 -0
  157. package/shell/dev/slotShowcase/index.ts +1 -0
  158. package/shell/footer/CenterLinks.tsx +11 -0
  159. package/shell/footer/CopyrightNotice.tsx +36 -0
  160. package/shell/footer/Footer.tsx +34 -0
  161. package/shell/footer/LabeledLinkColumn.tsx +19 -0
  162. package/shell/footer/LanguageMenu.tsx +35 -0
  163. package/shell/footer/LanguageMenuItem.tsx +23 -0
  164. package/shell/footer/LeftLinks.tsx +11 -0
  165. package/shell/footer/LegalNotices.tsx +17 -0
  166. package/shell/footer/PoweredBy.tsx +17 -0
  167. package/shell/footer/RevealLinks.tsx +43 -0
  168. package/shell/footer/RightLinks.tsx +11 -0
  169. package/shell/footer/app.tsx +73 -0
  170. package/shell/footer/data/api.ts +48 -0
  171. package/shell/footer/index.ts +2 -0
  172. package/shell/header/AuthenticatedMenu.tsx +32 -0
  173. package/shell/header/Header.tsx +17 -0
  174. package/shell/header/anonymous-menu/AnonymousMenu.tsx +14 -0
  175. package/shell/header/anonymous-menu/LoginButton.tsx +14 -0
  176. package/shell/header/anonymous-menu/RegisterButton.tsx +15 -0
  177. package/shell/header/app.tsx +142 -0
  178. package/shell/header/desktop/DesktopLayout.tsx +22 -0
  179. package/shell/header/desktop/PrimaryNavLinks.tsx +10 -0
  180. package/shell/header/desktop/SecondaryNavLinks.tsx +10 -0
  181. package/shell/header/index.ts +2 -0
  182. package/shell/header/mobile/MobileLayout.tsx +47 -0
  183. package/shell/header/mobile/MobileNavLinks.tsx +10 -0
  184. package/shell/i18n/index.ts +25 -0
  185. package/shell/index.ts +7 -0
  186. package/shell/jest.config.js +30 -0
  187. package/shell/menus/LinkMenuItem.tsx +64 -0
  188. package/shell/menus/NavDropdownMenuSlot.tsx +29 -0
  189. package/shell/menus/ProfileLinkMenuItem.tsx +33 -0
  190. package/shell/menus/data/utils.ts +19 -0
  191. package/shell/public/index.html +10 -0
  192. package/shell/router/createRouter.ts +17 -0
  193. package/shell/router/getAppRoutes.ts +21 -0
  194. package/shell/setupTest.js +48 -0
  195. package/shell/site.config.dev.tsx +49 -0
  196. package/shell/site.tsx +41 -0
  197. package/test-site/app.d.ts +15 -0
  198. package/test-site/dist/176.436443549ebb858db483.js +2 -0
  199. package/test-site/dist/176.436443549ebb858db483.js.map +1 -0
  200. package/test-site/dist/362.536eff787d2380fe246c.js +2 -0
  201. package/test-site/dist/362.536eff787d2380fe246c.js.map +1 -0
  202. package/test-site/dist/653.486966b108d224551296.js +2 -0
  203. package/test-site/dist/653.486966b108d224551296.js.map +1 -0
  204. package/test-site/dist/74e025d3fe9a7b7f8503054e2563b353.jpg +0 -0
  205. package/test-site/dist/806.323cf6496ad0a7fe73a7.js +3 -0
  206. package/test-site/dist/806.323cf6496ad0a7fe73a7.js.LICENSE.txt +106 -0
  207. package/test-site/dist/806.323cf6496ad0a7fe73a7.js.map +1 -0
  208. package/test-site/dist/95ec738c0b7faac5b5c9126794446bbd.svg +4 -0
  209. package/test-site/dist/app.612058b36c74787759ac.css +61 -0
  210. package/test-site/dist/app.612058b36c74787759ac.css.map +1 -0
  211. package/test-site/dist/app.612058b36c74787759ac.js +2 -0
  212. package/test-site/dist/app.612058b36c74787759ac.js.map +1 -0
  213. package/test-site/dist/cb28cdb1468c915e27e5cec9af64f22f.svg +1 -0
  214. package/test-site/dist/index.html +1 -0
  215. package/test-site/dist/report.html +39 -0
  216. package/test-site/dist/runtime.c7aeaf7b967496cb076f.js +2 -0
  217. package/test-site/dist/runtime.c7aeaf7b967496cb076f.js.map +1 -0
  218. package/test-site/eslint.config.js +12 -0
  219. package/test-site/package-lock.json +19226 -0
  220. package/test-site/package.json +29 -0
  221. package/test-site/public/index.html +10 -0
  222. package/test-site/site.config.build.tsx +27 -0
  223. package/test-site/site.config.dev.tsx +27 -0
  224. package/test-site/src/authenticated-page/AuthenticatedPage.tsx +18 -0
  225. package/test-site/src/authenticated-page/i18n/index.ts +27 -0
  226. package/test-site/src/authenticated-page/index.tsx +28 -0
  227. package/test-site/src/example-page/ExamplePage.tsx +79 -0
  228. package/test-site/src/example-page/Image.tsx +11 -0
  229. package/test-site/src/example-page/ParagonPreview.jsx +66 -0
  230. package/test-site/src/example-page/apple.jpg +0 -0
  231. package/test-site/src/example-page/apple.svg +1 -0
  232. package/test-site/src/example-page/index.ts +16 -0
  233. package/test-site/src/i18n/README.md +3 -0
  234. package/test-site/src/i18n/messages/frontend-app-sample/ar.json +4 -0
  235. package/test-site/src/i18n/messages/frontend-app-sample/eo.json +1 -0
  236. package/test-site/src/i18n/messages/frontend-app-sample/es_419.json +4 -0
  237. package/test-site/src/i18n/messages/frontend-component-emptylangs/ar.json +1 -0
  238. package/test-site/src/i18n/messages/frontend-component-singlelang/ar.json +3 -0
  239. package/test-site/src/iframe-widget/IframeWidget.tsx +14 -0
  240. package/test-site/src/iframe-widget/index.ts +16 -0
  241. package/test-site/src/index.tsx +3 -0
  242. package/test-site/src/messages.js +11 -0
  243. package/test-site/src/site.scss +11 -0
  244. package/test-site/tsconfig.json +14 -0
  245. package/tools/babel/babel.config.js +27 -0
  246. package/tools/babel.config.js +3 -0
  247. package/tools/cli/README.md +29 -0
  248. package/tools/cli/commands/pack.ts +9 -0
  249. package/tools/cli/commands/release.ts +27 -0
  250. package/tools/cli/commands/serve.ts +43 -0
  251. package/tools/cli/intl-imports.ts +274 -0
  252. package/tools/cli/openedx.ts +101 -0
  253. package/tools/cli/transifex-utils.ts +75 -0
  254. package/tools/cli/utils/ensureConfigFilenameOption.ts +40 -0
  255. package/tools/cli/utils/formatter.ts +10 -0
  256. package/tools/cli/utils/getResolvedConfigPath.ts +23 -0
  257. package/tools/cli/utils/prettyPrintTitle.ts +15 -0
  258. package/tools/cli/utils/printUsage.ts +53 -0
  259. package/tools/config-helpers/createConfig.ts +8 -0
  260. package/tools/config-helpers/createLintConfig.ts +14 -0
  261. package/tools/config-helpers/getBaseConfig.ts +11 -0
  262. package/tools/defaultConfigPaths.ts +30 -0
  263. package/tools/dist/babel/babel.config.js +28 -0
  264. package/tools/dist/cli/commands/pack.js +14 -0
  265. package/tools/dist/cli/commands/release.js +28 -0
  266. package/tools/dist/cli/commands/serve.js +44 -0
  267. package/tools/dist/cli/intl-imports.js +233 -0
  268. package/tools/dist/cli/openedx.js +100 -0
  269. package/tools/dist/cli/transifex-utils.js +68 -0
  270. package/tools/dist/cli/utils/ensureConfigFilenameOption.js +42 -0
  271. package/tools/dist/cli/utils/formatter.js +10 -0
  272. package/tools/dist/cli/utils/getResolvedConfigPath.js +28 -0
  273. package/tools/dist/cli/utils/prettyPrintTitle.js +17 -0
  274. package/tools/dist/cli/utils/printUsage.js +48 -0
  275. package/tools/dist/config-helpers/createConfig.js +13 -0
  276. package/tools/dist/config-helpers/createLintConfig.js +16 -0
  277. package/tools/dist/config-helpers/getBaseConfig.js +12 -0
  278. package/tools/dist/defaultConfigPaths.js +35 -0
  279. package/tools/dist/eslint/base.eslint.config.js +113 -0
  280. package/tools/dist/eslint.config.js +11 -0
  281. package/tools/dist/index.js +12 -0
  282. package/tools/dist/jest/jest.config.js +30 -0
  283. package/tools/dist/jest.config.js +20 -0
  284. package/tools/dist/types.js +25 -0
  285. package/tools/dist/typescript/tsconfig.json +32 -0
  286. package/tools/dist/webpack/common-config/all/getCodeRules.js +52 -0
  287. package/tools/dist/webpack/common-config/all/getFileLoaderRules.js +26 -0
  288. package/tools/dist/webpack/common-config/all/getIgnoreWarnings.js +14 -0
  289. package/tools/dist/webpack/common-config/all/getImageMinimizer.js +25 -0
  290. package/tools/dist/webpack/common-config/all/getStylesheetRule.js +112 -0
  291. package/tools/dist/webpack/common-config/dev/getDevServer.js +38 -0
  292. package/tools/dist/webpack/common-config/index.js +18 -0
  293. package/tools/dist/webpack/common-config/site/getHtmlWebpackPlugin.js +16 -0
  294. package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js +91 -0
  295. package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/index.js +7 -0
  296. package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +3 -0
  297. package/tools/dist/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.js +108 -0
  298. package/tools/dist/webpack/plugins/paragon-webpack-plugin/index.js +7 -0
  299. package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.js +64 -0
  300. package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.js +53 -0
  301. package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/index.js +9 -0
  302. package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/paragonStylesheetUtils.js +114 -0
  303. package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/scriptUtils.js +146 -0
  304. package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.js +126 -0
  305. package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/tagUtils.js +57 -0
  306. package/tools/dist/webpack/types.js +2 -0
  307. package/tools/dist/webpack/utils/getLocalAliases.js +65 -0
  308. package/tools/dist/webpack/utils/getPublicPath.js +6 -0
  309. package/tools/dist/webpack/utils/getResolvedSiteConfigPath.js +32 -0
  310. package/tools/dist/webpack/utils/paragonUtils.js +138 -0
  311. package/tools/dist/webpack/webpack.config.build.js +80 -0
  312. package/tools/dist/webpack/webpack.config.dev.js +76 -0
  313. package/tools/dist/webpack/webpack.config.dev.shell.js +110 -0
  314. package/tools/eslint/base.eslint.config.js +124 -0
  315. package/tools/eslint/modules.d.ts +5 -0
  316. package/tools/eslint.config.js +15 -0
  317. package/tools/index.ts +3 -0
  318. package/tools/jest/jest.config.js +30 -0
  319. package/tools/jest.config.js +19 -0
  320. package/tools/tsconfig.json +24 -0
  321. package/tools/types.ts +21 -0
  322. package/tools/typescript/tsconfig.json +32 -0
  323. package/tools/webpack/common-config/README.md +15 -0
  324. package/tools/webpack/common-config/all/getCodeRules.ts +51 -0
  325. package/tools/webpack/common-config/all/getFileLoaderRules.ts +23 -0
  326. package/tools/webpack/common-config/all/getIgnoreWarnings.ts +13 -0
  327. package/tools/webpack/common-config/all/getImageMinimizer.ts +26 -0
  328. package/tools/webpack/common-config/all/getStylesheetRule.ts +111 -0
  329. package/tools/webpack/common-config/dev/getDevServer.ts +35 -0
  330. package/tools/webpack/common-config/index.ts +6 -0
  331. package/tools/webpack/common-config/site/getHtmlWebpackPlugin.ts +11 -0
  332. package/tools/webpack/modules.d.ts +6 -0
  333. package/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts +102 -0
  334. package/tools/webpack/plugins/html-webpack-new-relic-plugin/LICENSE +21 -0
  335. package/tools/webpack/plugins/html-webpack-new-relic-plugin/README.md +7 -0
  336. package/tools/webpack/plugins/html-webpack-new-relic-plugin/index.js +3 -0
  337. package/tools/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +1 -0
  338. package/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts +134 -0
  339. package/tools/webpack/plugins/paragon-webpack-plugin/index.ts +3 -0
  340. package/tools/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.ts +71 -0
  341. package/tools/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.ts +72 -0
  342. package/tools/webpack/plugins/paragon-webpack-plugin/utils/index.ts +6 -0
  343. package/tools/webpack/plugins/paragon-webpack-plugin/utils/paragonStylesheetUtils.ts +131 -0
  344. package/tools/webpack/plugins/paragon-webpack-plugin/utils/scriptUtils.ts +144 -0
  345. package/tools/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.ts +106 -0
  346. package/tools/webpack/plugins/paragon-webpack-plugin/utils/tagUtils.ts +54 -0
  347. package/tools/webpack/types.ts +69 -0
  348. package/tools/webpack/utils/getLocalAliases.ts +65 -0
  349. package/tools/webpack/utils/getPublicPath.ts +3 -0
  350. package/tools/webpack/utils/getResolvedSiteConfigPath.ts +28 -0
  351. package/tools/webpack/utils/paragonUtils.ts +152 -0
  352. package/tools/webpack/webpack.config.build.ts +93 -0
  353. package/tools/webpack/webpack.config.dev.shell.ts +122 -0
  354. package/tools/webpack/webpack.config.dev.ts +90 -0
  355. package/tsconfig.json +23 -0
  356. package/types.ts +99 -0
@@ -0,0 +1,152 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { Chunk } from 'webpack';
4
+ import { ParagonThemeCss, ParagonThemeUrlsFile } from '../types';
5
+
6
+ /**
7
+ * Retrieves the name of the brand package from the given directory.
8
+ *
9
+ * @param {string} dir - The directory path containing the package.json file.
10
+ * @return {string} The name of the brand package, or an empty string if not found.
11
+ */
12
+ function getBrandPackageName(dir: string) {
13
+ const appDependencies = JSON.parse(fs.readFileSync(path.resolve(dir, 'package.json'), 'utf-8')).dependencies;
14
+ return Object.keys(appDependencies).find((key) => /@(open)?edx\/brand/.exec(key)) ?? '';
15
+ }
16
+
17
+ /**
18
+ * Attempts to extract the Paragon version from the `node_modules` of
19
+ * the consuming application.
20
+ *
21
+ * @param {string} dir Path to directory containing `node_modules`.
22
+ * @returns {string} Paragon dependency version of the consuming application
23
+ */
24
+ export function getParagonVersion(dir: string, { isBrandOverride = false } = {}) {
25
+ const npmPackageName = isBrandOverride ? getBrandPackageName(dir) : '@openedx/paragon';
26
+ const pathToPackageJson = `${dir}/node_modules/${npmPackageName}/package.json`;
27
+ if (!fs.existsSync(pathToPackageJson)) {
28
+ return undefined;
29
+ }
30
+ return JSON.parse(fs.readFileSync(pathToPackageJson, 'utf-8')).version;
31
+ }
32
+
33
+ /**
34
+ * Attempts to extract the Paragon theme CSS from the locally installed `@openedx/paragon` package.
35
+ * @param {string} dir Path to directory containing `node_modules`.
36
+ * @param {boolean} isBrandOverride
37
+ * @returns {ParagonThemeCss}
38
+ */
39
+ export function getParagonThemeCss(dir: string, { isBrandOverride = false } = {}): ParagonThemeCss | undefined {
40
+ const npmPackageName = isBrandOverride ? getBrandPackageName(dir) : '@openedx/paragon';
41
+ const pathToParagonThemeOutput = path.resolve(dir, 'node_modules', npmPackageName, 'dist', 'theme-urls.json');
42
+
43
+ if (!fs.existsSync(pathToParagonThemeOutput)) {
44
+ return undefined;
45
+ }
46
+ const paragonConfig: ParagonThemeUrlsFile = JSON.parse(fs.readFileSync(pathToParagonThemeOutput, 'utf-8'));
47
+ const {
48
+ core: themeCore,
49
+ variants: themeVariants,
50
+ defaults,
51
+ } = paragonConfig?.themeUrls || {};
52
+
53
+ const pathToCoreCss = path.resolve(dir, 'node_modules', npmPackageName, 'dist', themeCore.paths.minified);
54
+ const coreCssExists = fs.existsSync(pathToCoreCss);
55
+
56
+ const themeVariantResults = Object.entries(themeVariants || {}).reduce((themeVariantAcc, [themeVariant, value]) => {
57
+ const themeVariantCssDefault = path.resolve(dir, 'node_modules', npmPackageName, 'dist', value.paths.default);
58
+ const themeVariantCssMinified = path.resolve(dir, 'node_modules', npmPackageName, 'dist', value.paths.minified);
59
+
60
+ if (!fs.existsSync(themeVariantCssDefault) && !fs.existsSync(themeVariantCssMinified)) {
61
+ return themeVariantAcc;
62
+ }
63
+
64
+ return ({
65
+ ...themeVariantAcc,
66
+ [themeVariant]: {
67
+ filePath: themeVariantCssMinified,
68
+ entryName: isBrandOverride ? `brand.theme.variants.${themeVariant}` : `paragon.theme.variants.${themeVariant}`,
69
+ outputChunkName: isBrandOverride ? `brand-theme-variants-${themeVariant}` : `paragon-theme-variants-${themeVariant}`,
70
+ },
71
+ });
72
+ }, {});
73
+
74
+ if (!coreCssExists || Object.keys(themeVariantResults).length === 0) {
75
+ return undefined;
76
+ }
77
+
78
+ const coreResult = {
79
+ filePath: path.resolve(dir, pathToCoreCss),
80
+ entryName: isBrandOverride ? 'brand.theme.core' : 'paragon.theme.core',
81
+ outputChunkName: isBrandOverride ? 'brand-theme-core' : 'paragon-theme-core',
82
+ };
83
+
84
+ return {
85
+ core: fs.existsSync(pathToCoreCss) ? coreResult : undefined,
86
+ variants: themeVariantResults,
87
+ defaults,
88
+ };
89
+ }
90
+
91
+ /**
92
+ * @typedef CacheGroup
93
+ * @property {string} type The type of cache group.
94
+ * @property {string|function} name The name of the cache group.
95
+ * @property {function} chunks A function that returns true if the chunk should be included in the cache group.
96
+ * @property {boolean} enforce If true, this cache group will be created even if it conflicts with default cache groups.
97
+ */
98
+
99
+ /**
100
+ * @param {ParagonThemeCss} paragonThemeCss The Paragon theme CSS metadata.
101
+ * @returns {Object.<string, CacheGroup>} The cache groups for the Paragon theme CSS.
102
+ */
103
+ export function getParagonCacheGroups(paragonThemeCss: ParagonThemeCss | undefined) {
104
+ if (!paragonThemeCss) {
105
+ return {};
106
+ }
107
+ const cacheGroups: Record<string, { type: string, name: string, chunks: (chunk: Chunk) => boolean, enforce: boolean }> = {};
108
+
109
+ if (paragonThemeCss.core !== undefined) {
110
+ const { core } = paragonThemeCss;
111
+ cacheGroups[paragonThemeCss.core.outputChunkName] = {
112
+ type: 'css/mini-extract',
113
+ name: paragonThemeCss.core.outputChunkName,
114
+ chunks: (chunk: Chunk) => chunk.name === core.entryName,
115
+ enforce: true,
116
+ };
117
+ }
118
+
119
+ Object.values(paragonThemeCss.variants).forEach(({ entryName, outputChunkName }) => {
120
+ cacheGroups[outputChunkName] = {
121
+ type: 'css/mini-extract',
122
+ name: outputChunkName,
123
+ chunks: (chunk: Chunk) => chunk.name === entryName,
124
+ enforce: true,
125
+ };
126
+ });
127
+ return cacheGroups;
128
+ }
129
+
130
+ /**
131
+ * @param {ParagonThemeCss} paragonThemeCss The Paragon theme CSS metadata.
132
+ * @returns {Object.<string, string>} The entry points for the Paragon theme CSS. Example: ```
133
+ * {
134
+ * "paragon.theme.core": "/path/to/node_modules/@openedx/paragon/dist/core.min.css",
135
+ * "paragon.theme.variants.light": "/path/to/node_modules/@openedx/paragon/dist/light.min.css"
136
+ * }
137
+ * ```
138
+ */
139
+ export function getParagonEntryPoints(paragonThemeCss: ParagonThemeCss | undefined) {
140
+ if (!paragonThemeCss) {
141
+ return {};
142
+ }
143
+
144
+ const entryPoints: Record<string, string> = {};
145
+ if (paragonThemeCss.core !== undefined) {
146
+ entryPoints[paragonThemeCss.core.entryName] = path.resolve(process.cwd(), paragonThemeCss.core.filePath);
147
+ }
148
+ Object.values(paragonThemeCss.variants).forEach(({ filePath, entryName }) => {
149
+ entryPoints[entryName] = path.resolve(process.cwd(), filePath);
150
+ });
151
+ return entryPoints;
152
+ }
@@ -0,0 +1,93 @@
1
+ import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin';
2
+ import MiniCssExtractPlugin from 'mini-css-extract-plugin';
3
+ import path from 'path';
4
+ import { Configuration } from 'webpack';
5
+ import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
6
+ import RemoveEmptyScriptsPlugin from 'webpack-remove-empty-scripts';
7
+
8
+ import {
9
+ getCodeRules,
10
+ getFileLoaderRules,
11
+ getHtmlWebpackPlugin,
12
+ getImageMinimizer,
13
+ getStylesheetRule
14
+ } from './common-config';
15
+
16
+ import ParagonWebpackPlugin from './plugins/paragon-webpack-plugin/ParagonWebpackPlugin';
17
+
18
+ import getLocalAliases from './utils/getLocalAliases';
19
+ import getPublicPath from './utils/getPublicPath';
20
+ import getResolvedSiteConfigPath from './utils/getResolvedSiteConfigPath';
21
+ import {
22
+ getParagonCacheGroups,
23
+ getParagonEntryPoints,
24
+ getParagonThemeCss,
25
+ } from './utils/paragonUtils';
26
+
27
+ const paragonThemeCss = getParagonThemeCss(process.cwd());
28
+ const brandThemeCss = getParagonThemeCss(process.cwd(), { isBrandOverride: true });
29
+ const aliases = getLocalAliases();
30
+ const resolvedSiteConfigPath = getResolvedSiteConfigPath('site.config.build.tsx');
31
+
32
+ const config: Configuration = {
33
+ mode: 'production',
34
+ devtool: 'source-map',
35
+ entry: {
36
+ app: path.resolve(process.cwd(), 'node_modules/@openedx/frontend-base/shell/site'),
37
+ ...getParagonEntryPoints(paragonThemeCss),
38
+ ...getParagonEntryPoints(brandThemeCss),
39
+ },
40
+ output: {
41
+ filename: '[name].[chunkhash].js',
42
+ path: path.resolve(process.cwd(), 'dist'),
43
+ publicPath: getPublicPath(),
44
+ clean: true, // Clean the output directory before emit.
45
+ },
46
+ resolve: {
47
+ alias: {
48
+ ...aliases,
49
+ 'site.config': resolvedSiteConfigPath,
50
+ },
51
+ extensions: ['.js', '.jsx', '.ts', '.tsx'],
52
+ },
53
+ module: {
54
+ rules: [
55
+ ...getCodeRules('production', resolvedSiteConfigPath),
56
+ getStylesheetRule('production'),
57
+ ...getFileLoaderRules(),
58
+ ],
59
+ },
60
+ // Extract common modules among all chunks to one common chunk and extract the Webpack runtime to a single runtime chunk.
61
+ optimization: {
62
+ runtimeChunk: 'single',
63
+ splitChunks: {
64
+ chunks: 'all',
65
+ cacheGroups: {
66
+ ...getParagonCacheGroups(paragonThemeCss),
67
+ ...getParagonCacheGroups(brandThemeCss),
68
+ },
69
+ },
70
+ minimizer: getImageMinimizer(),
71
+ },
72
+ // Specify additional processing or side-effects done on the Webpack output bundles as a whole.
73
+ plugins: [
74
+ // RemoveEmptyScriptsPlugin get rid of empty scripts generated by webpack when using mini-css-extract-plugin
75
+ // This helps to clean up the final bundle application
76
+ // See: https://www.npmjs.com/package/webpack-remove-empty-scripts#usage-with-mini-css-extract-plugin
77
+
78
+ new RemoveEmptyScriptsPlugin(),
79
+ // Writes the extracted CSS from each entry to a file in the output directory.
80
+ new ParagonWebpackPlugin(),
81
+ new MiniCssExtractPlugin({
82
+ filename: '[name].[chunkhash].css',
83
+ }),
84
+ getHtmlWebpackPlugin(),
85
+ new ForkTsCheckerWebpackPlugin(),
86
+ new BundleAnalyzerPlugin({
87
+ analyzerMode: 'static',
88
+ openAnalyzer: false,
89
+ }),
90
+ ],
91
+ };
92
+
93
+ export default config;
@@ -0,0 +1,122 @@
1
+ import { transform } from '@formatjs/ts-transformer';
2
+ import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
3
+ import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin';
4
+ import MiniCssExtractPlugin from 'mini-css-extract-plugin';
5
+ import path from 'path';
6
+ import ReactRefreshTypeScript from 'react-refresh-typescript';
7
+ import { Configuration } from 'webpack';
8
+ import RemoveEmptyScriptsPlugin from 'webpack-remove-empty-scripts';
9
+
10
+ import {
11
+ getDevServer,
12
+ getFileLoaderRules,
13
+ getImageMinimizer,
14
+ getStylesheetRule
15
+ } from './common-config';
16
+
17
+ import ParagonWebpackPlugin from './plugins/paragon-webpack-plugin/ParagonWebpackPlugin';
18
+
19
+ import HtmlWebpackPlugin from 'html-webpack-plugin';
20
+ import getLocalAliases from './utils/getLocalAliases';
21
+ import getPublicPath from './utils/getPublicPath';
22
+ import getResolvedSiteConfigPath from './utils/getResolvedSiteConfigPath';
23
+ import {
24
+ getParagonCacheGroups,
25
+ getParagonEntryPoints,
26
+ getParagonThemeCss,
27
+ } from './utils/paragonUtils';
28
+
29
+ const paragonThemeCss = getParagonThemeCss(process.cwd());
30
+ const brandThemeCss = getParagonThemeCss(process.cwd(), { isBrandOverride: true });
31
+ const aliases = getLocalAliases();
32
+ const resolvedSiteConfigPath = getResolvedSiteConfigPath('shell/site.config.dev.tsx');
33
+
34
+ const config: Configuration = {
35
+ entry: {
36
+ app: path.resolve(process.cwd(), 'shell/site'),
37
+ ...getParagonEntryPoints(paragonThemeCss),
38
+ ...getParagonEntryPoints(brandThemeCss),
39
+ },
40
+ output: {
41
+ path: path.resolve(process.cwd(), './dist'),
42
+ publicPath: getPublicPath(),
43
+ },
44
+ resolve: {
45
+ alias: {
46
+ ...aliases,
47
+ 'site.config': resolvedSiteConfigPath,
48
+ },
49
+ extensions: ['.js', '.jsx', '.ts', '.tsx'],
50
+ },
51
+ mode: 'development',
52
+ devtool: 'eval-source-map',
53
+ module: {
54
+ rules: [
55
+ {
56
+ test: /\.(js|jsx|ts|tsx)$/,
57
+ include: [
58
+ /shell/,
59
+ /runtime/,
60
+ path.resolve(process.cwd(), 'types'),
61
+ resolvedSiteConfigPath,
62
+ ],
63
+ use: {
64
+ loader: require.resolve('ts-loader'),
65
+ options: {
66
+ transpileOnly: true,
67
+ compilerOptions: {
68
+ noEmit: false,
69
+ },
70
+ getCustomTransformers() {
71
+ return {
72
+ before: [
73
+ transform({
74
+ overrideIdFn: '[sha512:contenthash:base64:6]',
75
+ }),
76
+ ReactRefreshTypeScript()
77
+ ],
78
+ };
79
+ },
80
+ },
81
+ },
82
+ },
83
+ getStylesheetRule('dev'),
84
+ ...getFileLoaderRules(),
85
+ ],
86
+ },
87
+ optimization: {
88
+ splitChunks: {
89
+ chunks: 'all',
90
+ cacheGroups: {
91
+ ...getParagonCacheGroups(paragonThemeCss),
92
+ ...getParagonCacheGroups(brandThemeCss),
93
+ },
94
+ },
95
+ minimizer: getImageMinimizer(),
96
+ },
97
+ // Specify additional processing or side-effects done on the Webpack output bundles as a whole.
98
+ plugins: [
99
+ // RemoveEmptyScriptsPlugin get rid of empty scripts generated by webpack when using mini-css-extract-plugin
100
+ // This helps to clean up the final bundle application
101
+ // See: https://www.npmjs.com/package/webpack-remove-empty-scripts#usage-with-mini-css-extract-plugin
102
+ new RemoveEmptyScriptsPlugin(),
103
+ new ParagonWebpackPlugin(),
104
+ // Writes the extracted CSS from each entry to a file in the output directory.
105
+ new MiniCssExtractPlugin({
106
+ filename: '[name].css',
107
+ }),
108
+ new HtmlWebpackPlugin({
109
+ inject: true, // Appends script tags linking to the webpack bundles at the end of the body
110
+ template: path.resolve(process.cwd(), 'shell/public/index.html'),
111
+ chunks: ['app'],
112
+ }),
113
+ new ReactRefreshWebpackPlugin(),
114
+ new ForkTsCheckerWebpackPlugin(),
115
+ ],
116
+ // This configures webpack-dev-server which serves bundles from memory and provides live
117
+ // reloading.
118
+
119
+ devServer: getDevServer(),
120
+ };
121
+
122
+ export default config;
@@ -0,0 +1,90 @@
1
+ import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
2
+ import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin';
3
+ import MiniCssExtractPlugin from 'mini-css-extract-plugin';
4
+ import path from 'path';
5
+ import { Configuration } from 'webpack';
6
+ import RemoveEmptyScriptsPlugin from 'webpack-remove-empty-scripts';
7
+
8
+ import {
9
+ getCodeRules,
10
+ getDevServer,
11
+ getFileLoaderRules,
12
+ getHtmlWebpackPlugin,
13
+ getImageMinimizer,
14
+ getStylesheetRule
15
+ } from './common-config';
16
+
17
+ import ParagonWebpackPlugin from './plugins/paragon-webpack-plugin/ParagonWebpackPlugin';
18
+
19
+ import getLocalAliases from './utils/getLocalAliases';
20
+ import getPublicPath from './utils/getPublicPath';
21
+ import getResolvedSiteConfigPath from './utils/getResolvedSiteConfigPath';
22
+ import {
23
+ getParagonCacheGroups,
24
+ getParagonEntryPoints,
25
+ getParagonThemeCss,
26
+ } from './utils/paragonUtils';
27
+
28
+ const paragonThemeCss = getParagonThemeCss(process.cwd());
29
+ const brandThemeCss = getParagonThemeCss(process.cwd(), { isBrandOverride: true });
30
+ const aliases = getLocalAliases();
31
+ const resolvedSiteConfigPath = getResolvedSiteConfigPath('site.config.dev.tsx');
32
+
33
+ const config: Configuration = {
34
+ entry: {
35
+ app: path.resolve(process.cwd(), 'node_modules/@openedx/frontend-base/shell/site'),
36
+ ...getParagonEntryPoints(paragonThemeCss),
37
+ ...getParagonEntryPoints(brandThemeCss),
38
+ },
39
+ output: {
40
+ path: path.resolve(process.cwd(), './dist'),
41
+ publicPath: getPublicPath(),
42
+ },
43
+ resolve: {
44
+ alias: {
45
+ ...aliases,
46
+ 'site.config': resolvedSiteConfigPath,
47
+ },
48
+ extensions: ['.js', '.jsx', '.ts', '.tsx'],
49
+ },
50
+ mode: 'development',
51
+ devtool: 'eval-source-map',
52
+ module: {
53
+ rules: [
54
+ ...getCodeRules('dev', resolvedSiteConfigPath),
55
+ getStylesheetRule('dev'),
56
+ ...getFileLoaderRules(),
57
+ ],
58
+ },
59
+ optimization: {
60
+ splitChunks: {
61
+ chunks: 'all',
62
+ cacheGroups: {
63
+ ...getParagonCacheGroups(paragonThemeCss),
64
+ ...getParagonCacheGroups(brandThemeCss),
65
+ },
66
+ },
67
+ minimizer: getImageMinimizer(),
68
+ },
69
+ // Specify additional processing or side-effects done on the Webpack output bundles as a whole.
70
+ plugins: [
71
+ // RemoveEmptyScriptsPlugin get rid of empty scripts generated by webpack when using mini-css-extract-plugin
72
+ // This helps to clean up the final bundle application
73
+ // See: https://www.npmjs.com/package/webpack-remove-empty-scripts#usage-with-mini-css-extract-plugin
74
+ new RemoveEmptyScriptsPlugin(),
75
+ new ParagonWebpackPlugin(),
76
+ // Writes the extracted CSS from each entry to a file in the output directory.
77
+ new MiniCssExtractPlugin({
78
+ filename: '[name].css',
79
+ }),
80
+ getHtmlWebpackPlugin(),
81
+ new ReactRefreshWebpackPlugin(),
82
+ new ForkTsCheckerWebpackPlugin(),
83
+ ],
84
+ // This configures webpack-dev-server which serves bundles from memory and provides live
85
+ // reloading.
86
+
87
+ devServer: getDevServer(),
88
+ };
89
+
90
+ export default config;
package/tsconfig.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "extends": "./tools/typescript/tsconfig.json",
3
+ "compilerOptions": {
4
+ "rootDir": ".",
5
+ "outDir": "dist",
6
+ },
7
+ "include": [
8
+ "runtime/**/*",
9
+ "shell/**/*",
10
+ "index.ts",
11
+ "jest.config.js",
12
+ "babel.config.js",
13
+ "eslint.config.js",
14
+ "frontend-base.d.ts",
15
+ ],
16
+ "exclude": [
17
+ "test-site/**/*",
18
+ "dist/**/*",
19
+ "coverage/**/*",
20
+ "tools/**/*",
21
+ "config/**/*",
22
+ ],
23
+ }
package/types.ts ADDED
@@ -0,0 +1,99 @@
1
+ import { FC, ReactElement, ReactNode } from 'react';
2
+ import { MessageDescriptor } from 'react-intl';
3
+ import { RouteObject } from 'react-router';
4
+ import { SlotOperation } from './runtime/slots/types';
5
+
6
+ // Apps
7
+
8
+ export interface ExternalRoute {
9
+ role: string,
10
+ url: string,
11
+ }
12
+
13
+ export type RoleRouteObject = RouteObject & {
14
+ handle?: {
15
+ /**
16
+ * A route role is used to identify a route that fulfills a particular role in the site, such as "login", "learnerHome", or "profile".
17
+ */
18
+ role?: string,
19
+ },
20
+ };
21
+
22
+ export type AppConfig = Record<string, unknown>;
23
+
24
+ export type AppProvider = FC<{ children?: ReactNode }>;
25
+
26
+ export interface App {
27
+ appId: string,
28
+ messages?: LocalizedMessages,
29
+ routes?: RoleRouteObject[],
30
+ providers?: AppProvider[],
31
+ slots?: SlotOperation[],
32
+ config?: AppConfig,
33
+ }
34
+
35
+ // Site Config
36
+
37
+ export interface RequiredSiteConfig {
38
+ siteId: string,
39
+ siteName: string,
40
+ baseUrl: string,
41
+
42
+ // Backends
43
+ lmsBaseUrl: string,
44
+
45
+ // Frontends
46
+ loginUrl: string,
47
+ logoutUrl: string,
48
+ }
49
+
50
+ export type LocalizedMessages = Record<string, Record<string, string>>;
51
+
52
+ export interface OptionalSiteConfig {
53
+ // Site environment
54
+ environment: EnvironmentTypes,
55
+
56
+ // Apps, routes, and URLs
57
+ apps: App[],
58
+ basename: string,
59
+ externalRoutes: ExternalRoute[],
60
+ externalLinkUrlOverrides: string[],
61
+ mfeConfigApiUrl: string | null,
62
+
63
+ // Cookies
64
+ accessTokenCookieName: string,
65
+ languagePreferenceCookieName: string,
66
+ userInfoCookieName: string,
67
+
68
+ // Paths
69
+ csrfTokenApiPath: string,
70
+ refreshAccessTokenApiPath: string,
71
+
72
+ // Logging
73
+ ignoredErrorRegex: RegExp | null,
74
+
75
+ // Analytics
76
+ segmentKey: string | null,
77
+ }
78
+
79
+ export type SiteConfig = RequiredSiteConfig & Partial<OptionalSiteConfig>;
80
+
81
+ export interface User {
82
+ administrator: boolean,
83
+ email: string,
84
+ name: string,
85
+ roles: string[],
86
+ userId: number,
87
+ username: string,
88
+ avatar: string,
89
+ }
90
+
91
+ export enum EnvironmentTypes {
92
+ PRODUCTION = 'production',
93
+ DEVELOPMENT = 'development',
94
+ TEST = 'test',
95
+ }
96
+
97
+ // Menu Items
98
+
99
+ export type MenuItemName = string | MessageDescriptor | ReactElement;