@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
package/README.md ADDED
@@ -0,0 +1,112 @@
1
+ # Open edX frontend framework
2
+
3
+ | :rotating_light: Alpha |
4
+ |:------------------------------------------------------------------------------------------|
5
+ | frontend-base is under **active development** and may change significantly without warning. |
6
+
7
+ This library is a **future** replacement for many of the foundational libraries in the Open edX frontend.
8
+
9
+ Development of this library is part of a project to create a reference implementation for [OEP-65: Frontend Composability](https://open-edx-proposals.readthedocs.io/en/latest/architectural-decisions/oep-0065-arch-frontend-composability.html).
10
+
11
+ It will replace:
12
+
13
+ - https://github.com/openedx/frontend-build
14
+ - https://github.com/openedx/frontend-platform
15
+ - https://github.com/openedx/frontend-plugin-framework
16
+ - https://github.com/openedx/frontend-component-header
17
+ - https://github.com/openedx/frontend-component-footer
18
+
19
+ The new frontend framework will completely take over responsibility for the functionality of those libraries, and will also include a "shell" application.
20
+
21
+ It will enable Open edX frontends to be loaded as "direct plugins" as part of a single, unified application. It will also support creation of "project" repositories as a central place to check in an Open edX instance's frontend customizations and extensions.
22
+
23
+ ## Further reading
24
+
25
+ - [OEP-65: Frontend composability](https://open-edx-proposals.readthedocs.io/en/latest/architectural-decisions/oep-0065-arch-frontend-composability.html)
26
+ - [ADR 0001: Create a unified platform library](https://github.com/openedx/open-edx-proposals/pull/598)
27
+ - [Discourse discussion on frontend projects](https://discuss.openedx.org/t/oep-65-adjacent-a-frontend-architecture-vision/13223)
28
+
29
+ ## Communication
30
+
31
+ You can follow ongoing progress on the project's [Github project board](https://github.com/orgs/openedx/projects/65/views/1).
32
+
33
+ Feel free to reach out in [#wg-frontend on Slack](https://openedx.slack.com/archives/C04BM6YC7A6) with any questions.
34
+
35
+ ## Development
36
+
37
+ This library is under development and for now is released manually to npm.
38
+
39
+ ### Developing with Tutor
40
+
41
+ In order to use develop frontend-base with Tutor, you need to create a Tutor plugin which patches some of the LMS's development settings.
42
+
43
+ ```
44
+ from tutormfe.hooks import MFE_APPS, MFE_ATTRS_TYPE
45
+
46
+ from tutor import hooks
47
+
48
+ hooks.Filters.ENV_PATCHES.add_item(
49
+ (
50
+ "openedx-lms-development-settings",
51
+ """
52
+ CORS_ORIGIN_WHITELIST.append("http://{{ MFE_HOST }}:8080")
53
+ LOGIN_REDIRECT_WHITELIST.append("http://{{ MFE_HOST }}:8080")
54
+ CSRF_TRUSTED_ORIGINS.append("http://{{ MFE_HOST }}:8080")
55
+ """
56
+ )
57
+ )
58
+ ```
59
+
60
+ Once you enable this plugin, you can start the development site with:
61
+
62
+ ```
63
+ nvm use
64
+ npm ci
65
+ npm run dev
66
+ ```
67
+
68
+ The development site will be available at `http://apps.local.openedx.io:8080`.
69
+
70
+ ## Migrating an MFE to `frontend-base`
71
+
72
+ See the [Frontend App Migration How To](./docs/how_tos/migrate-frontend-app.md).
73
+
74
+ # Notable changes
75
+
76
+ This is a list of notable changes from the previous paradigm:
77
+
78
+ - Cease using `AUTHN_MINIMAL_HEADER`, replace it with an actual minimal header.
79
+ - No more using `process.env` in runtime code.
80
+ - Removed dotenv. Use `site.config.*.tsx`.
81
+ - Removed Purge CSS. We do not believe that Purge CSS works properly with Paragon in general.
82
+ - Removed `ensureConfig` function. This sort of type safety should happen with TypeScript types in the site config file.
83
+ - Removed `ensureDefinedConfig` function. Similar to ensureConfig, this sort of type safety should be handled by TypeScript.
84
+ - A number of site config variables now have sensible defaults:
85
+ - accessTokenCookieName: 'edx-jwt-cookie-header-payload',
86
+ - csrfTokenApiPath: '/csrf/api/v1/token',
87
+ - languagePreferenceCookieName: 'openedx-language-preference',
88
+ - userInfoCookieName: 'edx-user-info',
89
+ - environment: 'production',
90
+ - the `basename` and export has been replaced by: `getBasename`. This is because it may not be possible to determine the values of the original constants at code initialization time, since our config may arrive asynchronously. This ensures that anyone trying to get these values gets a current value.
91
+ - the `history` export no longer exists. Consumers should be using react-router 6's `useNavigate()` API instead.
92
+ - When using MockAuthService, set the authenticated user by calling setAuthenticatedUser after instantiating the service. It's not okay for us to add arbitrary config values to the site config.
93
+ - `REFRESH_ACCESS_TOKEN_ENDPOINT` has been replaced with `refreshAccessTokenApiPath`. It is now a path that defaults to '/login_refresh'. The Auth service assumes it is an endpoint on the LMS, and joins the path with `lmsBaseUrl`. This change creates more parity with other paths such as `csrfTokenApiPath`.
94
+
95
+ The following config variables have been removed, in favor of defining roles for specific modules, `externalRoutes`, or app-specific custom config as necessary:
96
+
97
+ - ACCOUNT_PROFILE_URL
98
+ - ACCOUNT_SETTINGS_URL
99
+ - LEARNING_BASE_URL
100
+ - ORDER_HISTORY_URL
101
+ - MARKETING_SITE_BASE_URL
102
+ - LEARNER_DASHBOARD_URL
103
+ - STUDIO_BASE_URL
104
+ - ACCESSIBILITY_URL
105
+ - PRIVACY_POLICY_URL
106
+ - TERMS_OF_SERVICE_URL
107
+ - SUPPORT_URL
108
+ - SUPPORT_EMAIL
109
+ - ECOMMERCE_BASE_URL
110
+ - DISCOVERY_API_BASE_URL
111
+ - CREDENTIALS_BASE_URL
112
+ - PUBLISHER_BASE_URL
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * This Babel configuration file is for Jest. The Webpack build does not use Babel.
4
+ */
5
+ module.exports = {
6
+ presets: [
7
+ [
8
+ require.resolve('@babel/preset-env'), {
9
+ targets: { node: 'current' },
10
+ },
11
+ ],
12
+ [
13
+ require.resolve('@babel/preset-react'), {
14
+ runtime: 'automatic',
15
+ },
16
+ ],
17
+ require.resolve('@babel/preset-typescript'),
18
+ ],
19
+ env: {
20
+ i18n: {
21
+ plugins: [
22
+ [
23
+ 'formatjs',
24
+ ],
25
+ ],
26
+ },
27
+ },
28
+ };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = createConfig;
7
+ const webpack_merge_1 = require("webpack-merge");
8
+ const getBaseConfig_1 = __importDefault(require("./getBaseConfig"));
9
+ function createConfig(configType, configFragment = {}) {
10
+ const baseConfig = (0, getBaseConfig_1.default)(configType);
11
+ return (0, webpack_merge_1.merge)(baseConfig, configFragment);
12
+ }
13
+ ;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = createLintConfig;
7
+ const typescript_eslint_1 = __importDefault(require("typescript-eslint"));
8
+ const types_1 = require("../types");
9
+ const getBaseConfig_1 = __importDefault(require("./getBaseConfig"));
10
+ function createLintConfig(...configs) {
11
+ const baseConfig = (0, getBaseConfig_1.default)(types_1.ConfigTypes.LINT);
12
+ return typescript_eslint_1.default.config({
13
+ extends: baseConfig,
14
+ }, ...configs);
15
+ }
16
+ ;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = getBaseConfig;
4
+ const defaultConfigPaths_1 = require("../defaultConfigPaths");
5
+ function getBaseConfig(configType) {
6
+ const configPaths = defaultConfigPaths_1.defaultConfigPaths[configType];
7
+ if (configPaths === undefined) {
8
+ throw new Error(`openedx: ${configType} is not a supported config type.`);
9
+ }
10
+ return require(require.resolve(configPaths[configPaths.length - 1]));
11
+ }
12
+ ;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.defaultConfigPaths = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const types_1 = require("./types");
9
+ // These config paths are tested in the order they're defined, so the last ones are the last fallback.
10
+ exports.defaultConfigPaths = {
11
+ [types_1.ConfigTypes.BABEL]: [
12
+ path_1.default.resolve(process.cwd(), 'babel.config.js'),
13
+ path_1.default.resolve(__dirname, './babel/babel.config.js'),
14
+ ],
15
+ [types_1.ConfigTypes.WEBPACK_BUILD]: [
16
+ path_1.default.resolve(process.cwd(), 'webpack.config.build.js'),
17
+ path_1.default.resolve(__dirname, './webpack/webpack.config.build.js'),
18
+ ],
19
+ [types_1.ConfigTypes.WEBPACK_DEV]: [
20
+ path_1.default.resolve(process.cwd(), 'webpack.config.dev.js'),
21
+ path_1.default.resolve(__dirname, './webpack/webpack.config.dev.js'),
22
+ ],
23
+ [types_1.ConfigTypes.WEBPACK_DEV_SHELL]: [
24
+ path_1.default.resolve(process.cwd(), 'webpack.config.dev.shell.js'),
25
+ path_1.default.resolve(__dirname, './webpack/webpack.config.dev.shell.js'),
26
+ ],
27
+ [types_1.ConfigTypes.LINT]: [
28
+ path_1.default.resolve(process.cwd(), 'eslint.config.js'),
29
+ path_1.default.resolve(__dirname, './eslint/base.eslint.config.js'),
30
+ ],
31
+ [types_1.ConfigTypes.TEST]: [
32
+ path_1.default.resolve(process.cwd(), 'jest.config.js'),
33
+ path_1.default.resolve(__dirname, './jest/jest.config.js'),
34
+ ],
35
+ };
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ // @ts-check
3
+ const { fixupPluginRules } = require('@eslint/compat');
4
+ const eslint = require('@eslint/js');
5
+ const formatjs = require('eslint-plugin-formatjs');
6
+ const jest = require('eslint-plugin-jest');
7
+ const jsxA11y = require('eslint-plugin-jsx-a11y');
8
+ const react = require('eslint-plugin-react');
9
+ const reactHooks = require('eslint-plugin-react-hooks');
10
+ const globals = require('globals');
11
+ const tseslint = require('typescript-eslint');
12
+ const stylistic = require('@stylistic/eslint-plugin');
13
+ module.exports = tseslint.config(eslint.configs.recommended, ...tseslint.configs.stylisticTypeChecked, ...tseslint.configs.recommended, stylistic.configs['recommended-flat'], {
14
+ ignores: [
15
+ 'coverage/*',
16
+ 'dist/*',
17
+ 'node_modules/*',
18
+ '**/__mocks__/*',
19
+ '**/__snapshots__/*',
20
+ ],
21
+ }, {
22
+ languageOptions: {
23
+ parserOptions: {
24
+ projectService: true,
25
+ }
26
+ }
27
+ }, {
28
+ languageOptions: {
29
+ ...(react.configs.flat !== undefined ? react.configs.flat.recommended.languageOptions : {}),
30
+ globals: {
31
+ ...globals.browser,
32
+ ...globals.node,
33
+ ...globals.jest,
34
+ PARAGON_THEME: 'readonly',
35
+ newrelic: 'readonly',
36
+ },
37
+ },
38
+ plugins: {
39
+ jest,
40
+ // Type assertion is workaround for incorrect TypeScript
41
+ // types in eslint-plugin-react
42
+ //
43
+ // TODO: Remove when types are fixed in eslint-plugin-react
44
+ // - https://github.com/jsx-eslint/eslint-plugin-react/issues/3838
45
+ react: /** @type {import('eslint').ESLint.Plugin} */ (react),
46
+ 'react-hooks': fixupPluginRules(reactHooks),
47
+ formatjs,
48
+ 'jsx-a11y': jsxA11y,
49
+ },
50
+ settings: {
51
+ react: {
52
+ version: 'detect',
53
+ }
54
+ }
55
+ }, {
56
+ rules: {
57
+ // For some reasons the 'flat' key in react.configs is optional, so Typescript complains if
58
+ // we don't guard using it. But... it exists in the export, so something's odd with their types.
59
+ ...(react.configs.flat !== undefined ? react.configs.flat.recommended.rules : {}),
60
+ ...(react.configs.flat !== undefined ? react.configs.flat['jsx-runtime'].rules : {}),
61
+ ...reactHooks.configs.recommended.rules,
62
+ '@typescript-eslint/no-explicit-any': 'off',
63
+ '@typescript-eslint/non-nullable-type-assertion-style': 'off',
64
+ 'react/no-array-index-key': 'error',
65
+ 'formatjs/enforce-description': ['error', 'literal'],
66
+ 'jsx-a11y/label-has-associated-control': ['error', {
67
+ labelComponents: [],
68
+ labelAttributes: [],
69
+ controlComponents: [],
70
+ assert: 'htmlFor',
71
+ depth: 25,
72
+ }],
73
+ // https://github.com/evcohen/eslint-plugin-jsx-a11y/issues/340#issuecomment-338424908
74
+ 'jsx-a11y/anchor-is-valid': ['error', {
75
+ components: ['Link'],
76
+ specialLink: ['to'],
77
+ }],
78
+ '@typescript-eslint/no-unused-vars': ['error', {
79
+ caughtErrors: 'none',
80
+ }],
81
+ '@typescript-eslint/no-empty-function': 'off',
82
+ '@stylistic/semi': ['error', 'always', { omitLastInOneLineBlock: true, omitLastInOneLineClassBody: true }],
83
+ '@stylistic/quotes': ['error', 'single', {
84
+ avoidEscape: true,
85
+ allowTemplateLiterals: true,
86
+ }],
87
+ '@stylistic/comma-dangle': 'off',
88
+ '@stylistic/quote-props': ['error', 'as-needed'],
89
+ '@stylistic/arrow-parens': 'off',
90
+ '@stylistic/jsx-one-expression-per-line': 'off',
91
+ '@stylistic/multiline-ternary': 'off',
92
+ '@stylistic/brace-style': ['error', '1tbs'],
93
+ '@stylistic/member-delimiter-style': ['error', {
94
+ multiline: {
95
+ delimiter: 'comma',
96
+ requireLast: true,
97
+ },
98
+ singleline: {
99
+ delimiter: 'comma',
100
+ requireLast: false,
101
+ }
102
+ }],
103
+ },
104
+ }, {
105
+ files: [
106
+ 'babel.config.js',
107
+ 'jest.config.js',
108
+ 'eslint.config.js'
109
+ ],
110
+ rules: {
111
+ '@typescript-eslint/no-require-imports': 'off'
112
+ }
113
+ });
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getBaseConfig = exports.createLintConfig = exports.createConfig = void 0;
7
+ var createConfig_1 = require("./config-helpers/createConfig");
8
+ Object.defineProperty(exports, "createConfig", { enumerable: true, get: function () { return __importDefault(createConfig_1).default; } });
9
+ var createLintConfig_1 = require("./config-helpers/createLintConfig");
10
+ Object.defineProperty(exports, "createLintConfig", { enumerable: true, get: function () { return __importDefault(createLintConfig_1).default; } });
11
+ var getBaseConfig_1 = require("./config-helpers/getBaseConfig");
12
+ Object.defineProperty(exports, "getBaseConfig", { enumerable: true, get: function () { return __importDefault(getBaseConfig_1).default; } });
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ const path = require('path');
3
+ module.exports = {
4
+ testEnvironment: 'jsdom',
5
+ testEnvironmentOptions: {
6
+ url: 'http://localhost/',
7
+ },
8
+ rootDir: process.cwd(),
9
+ moduleNameMapper: {
10
+ '\\.(css|scss)$': require.resolve('identity-obj-proxy'),
11
+ 'site.config': path.resolve(process.cwd(), './site.config.test.tsx'),
12
+ },
13
+ collectCoverageFrom: [
14
+ 'src/**/*.{js,jsx,ts,tsx}',
15
+ ],
16
+ coveragePathIgnorePatterns: [
17
+ '/node_modules/',
18
+ ],
19
+ transformIgnorePatterns: [
20
+ '/node_modules/(?!(@openedx|@edx)/)',
21
+ ],
22
+ modulePathIgnorePatterns: [
23
+ '/dist/',
24
+ ],
25
+ testPathIgnorePatterns: [
26
+ '/site.config.test.tsx',
27
+ '/node_modules/',
28
+ '/dist/',
29
+ ],
30
+ };
@@ -0,0 +1,32 @@
1
+ {
2
+ "compilerOptions": {
3
+ "allowJs": true,
4
+ "allowSyntheticDefaultImports": true,
5
+ "declaration": true,
6
+ "esModuleInterop": true,
7
+ "forceConsistentCasingInFileNames": true,
8
+ "jsx": "react-jsx",
9
+ "lib": [
10
+ "DOM",
11
+ "DOM.Iterable",
12
+ "ESNext",
13
+ "esnext.intl",
14
+ "es2017.intl",
15
+ "es2018.intl"
16
+ ],
17
+ "isolatedModules": true,
18
+ "module": "ESNext",
19
+ "moduleResolution": "node",
20
+ "noEmit": true,
21
+ "noFallthroughCasesInSwitch": true,
22
+ "noImplicitAny": false,
23
+ "noImplicitThis": true,
24
+ "noUnusedParameters": true,
25
+ "resolveJsonModule": true,
26
+ "skipLibCheck": true,
27
+ "sourceMap": true,
28
+ "strict": true,
29
+ "strictFunctionTypes": false,
30
+ "target": "ES6"
31
+ }
32
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CommandTypes = exports.ConfigTypes = void 0;
4
+ var ConfigTypes;
5
+ (function (ConfigTypes) {
6
+ ConfigTypes["BABEL"] = "babel";
7
+ ConfigTypes["WEBPACK_BUILD"] = "webpack-build";
8
+ ConfigTypes["WEBPACK_DEV"] = "webpack-dev";
9
+ ConfigTypes["WEBPACK_DEV_SHELL"] = "webpack-dev-shell";
10
+ ConfigTypes["LINT"] = "lint";
11
+ ConfigTypes["TEST"] = "test";
12
+ })(ConfigTypes || (exports.ConfigTypes = ConfigTypes = {}));
13
+ var CommandTypes;
14
+ (function (CommandTypes) {
15
+ CommandTypes["RELEASE"] = "release";
16
+ CommandTypes["PACK"] = "pack";
17
+ CommandTypes["LINT"] = "lint";
18
+ CommandTypes["TEST"] = "test";
19
+ CommandTypes["BUILD"] = "build";
20
+ CommandTypes["DEV_SHELL"] = "dev:shell";
21
+ CommandTypes["DEV"] = "dev";
22
+ CommandTypes["FORMAT_JS"] = "formatjs";
23
+ CommandTypes["SERVE"] = "serve";
24
+ CommandTypes["HELP"] = "help";
25
+ })(CommandTypes || (exports.CommandTypes = CommandTypes = {}));
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = getCodeRules;
7
+ const ts_transformer_1 = require("@formatjs/ts-transformer");
8
+ const react_refresh_typescript_1 = __importDefault(require("react-refresh-typescript"));
9
+ function getCodeRules(mode, resolvedSiteConfigPath) {
10
+ const rules = [
11
+ {
12
+ test: /\.(js|jsx|ts|tsx)$/,
13
+ include: [
14
+ /src/,
15
+ /node_modules\/@openedx\/frontend-base/,
16
+ resolvedSiteConfigPath,
17
+ ],
18
+ use: {
19
+ loader: require.resolve('ts-loader'),
20
+ options: {
21
+ transpileOnly: true,
22
+ compilerOptions: {
23
+ noEmit: false,
24
+ },
25
+ getCustomTransformers() {
26
+ const before = [
27
+ (0, ts_transformer_1.transform)({
28
+ overrideIdFn: '[sha512:contenthash:base64:6]',
29
+ }),
30
+ ];
31
+ if (mode === 'dev') {
32
+ before.push((0, react_refresh_typescript_1.default)());
33
+ }
34
+ return {
35
+ before,
36
+ };
37
+ },
38
+ },
39
+ },
40
+ },
41
+ ];
42
+ if (mode === 'production') {
43
+ rules.push({
44
+ test: /\.(js|jsx|ts|tsx)$/,
45
+ use: [
46
+ require.resolve('source-map-loader'),
47
+ ],
48
+ enforce: 'pre',
49
+ });
50
+ }
51
+ return rules;
52
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = getFileLoaderRules;
4
+ function getFileLoaderRules() {
5
+ return [
6
+ // Webpack, by default, uses the url-loader for images and fonts that are required/included by
7
+ // files it processes, which just base64 encodes them and inlines them in the javascript
8
+ // bundles. This makes the javascript bundles ginormous and defeats caching so we will use the
9
+ // file-loader instead to copy the files directly to the output directory.
10
+ {
11
+ test: /\.(woff2?|ttf|svg|eot)(\?v=\d+\.\d+\.\d+)?$/,
12
+ loader: require.resolve('file-loader'),
13
+ },
14
+ {
15
+ test: /favicon.ico$/,
16
+ loader: require.resolve('file-loader'),
17
+ options: {
18
+ name: '[name].[ext]', // <-- retain original file name
19
+ },
20
+ },
21
+ {
22
+ test: /\.(jpe?g|png|gif)(\?v=\d+\.\d+\.\d+)?$/,
23
+ loader: require.resolve('file-loader'),
24
+ },
25
+ ];
26
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = getIgnoreWarnings;
4
+ function getIgnoreWarnings() {
5
+ return [
6
+ // Ignore warnings raised by source-map-loader.
7
+ // some third party packages may ship miss-configured sourcemaps, that interrupts the build
8
+ // See: https://github.com/facebook/create-react-app/discussions/11278#discussioncomment-1780169
9
+ (warning) => !!(
10
+ // @ts-expect-error 'resource' is something TypeScript can't find for whatever reason.
11
+ warning.module?.resource.includes('node_modules')
12
+ && warning.details?.includes('source-map-loader')),
13
+ ];
14
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = getImageMinimizer;
7
+ const image_minimizer_webpack_plugin_1 = __importDefault(require("image-minimizer-webpack-plugin"));
8
+ function getImageMinimizer() {
9
+ return [
10
+ '...',
11
+ new image_minimizer_webpack_plugin_1.default({
12
+ minimizer: {
13
+ implementation: image_minimizer_webpack_plugin_1.default.sharpMinify,
14
+ options: {
15
+ encodeOptions: {
16
+ ...['png', 'jpeg', 'jpg'].reduce((accumulator, value) => ({ ...accumulator, [value]: { progressive: true, quality: 65 } }), {}),
17
+ gif: {
18
+ effort: 5,
19
+ },
20
+ },
21
+ },
22
+ },
23
+ }),
24
+ ];
25
+ }