@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.
- package/LICENSE +661 -0
- package/README.md +112 -0
- package/config/babel/babel.config.js +28 -0
- package/config/config-helpers/createConfig.js +13 -0
- package/config/config-helpers/createLintConfig.js +16 -0
- package/config/config-helpers/getBaseConfig.js +12 -0
- package/config/defaultConfigPaths.js +35 -0
- package/config/eslint/base.eslint.config.js +113 -0
- package/config/index.js +12 -0
- package/config/jest/jest.config.js +30 -0
- package/config/tsconfig.json +32 -0
- package/config/types.js +25 -0
- package/config/webpack/common-config/all/getCodeRules.js +52 -0
- package/config/webpack/common-config/all/getFileLoaderRules.js +26 -0
- package/config/webpack/common-config/all/getIgnoreWarnings.js +14 -0
- package/config/webpack/common-config/all/getImageMinimizer.js +25 -0
- package/config/webpack/common-config/all/getStylesheetRule.js +112 -0
- package/config/webpack/common-config/dev/getDevServer.js +38 -0
- package/config/webpack/common-config/index.js +18 -0
- package/config/webpack/common-config/site/getHtmlWebpackPlugin.js +16 -0
- package/config/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js +91 -0
- package/config/webpack/plugins/html-webpack-new-relic-plugin/index.js +7 -0
- package/config/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +3 -0
- package/config/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.js +108 -0
- package/config/webpack/plugins/paragon-webpack-plugin/index.js +7 -0
- package/config/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.js +64 -0
- package/config/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.js +53 -0
- package/config/webpack/plugins/paragon-webpack-plugin/utils/index.js +9 -0
- package/config/webpack/plugins/paragon-webpack-plugin/utils/paragonStylesheetUtils.js +114 -0
- package/config/webpack/plugins/paragon-webpack-plugin/utils/scriptUtils.js +146 -0
- package/config/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.js +126 -0
- package/config/webpack/plugins/paragon-webpack-plugin/utils/tagUtils.js +57 -0
- package/config/webpack/types.js +2 -0
- package/config/webpack/utils/getLocalAliases.js +65 -0
- package/config/webpack/utils/getPublicPath.js +6 -0
- package/config/webpack/utils/getResolvedSiteConfigPath.js +32 -0
- package/config/webpack/utils/paragonUtils.js +138 -0
- package/config/webpack/webpack.config.build.js +80 -0
- package/config/webpack/webpack.config.dev.js +76 -0
- package/config/webpack/webpack.config.dev.shell.js +110 -0
- package/eslint.config.js +18 -0
- package/frontend-base.d.ts +8 -0
- package/index.ts +7 -0
- package/jest.config.js +7 -0
- package/openedx-frontend-base.tgz +0 -0
- package/package.json +149 -0
- package/runtime/analytics/MockAnalyticsService.js +71 -0
- package/runtime/analytics/SegmentAnalyticsService.js +243 -0
- package/runtime/analytics/index.ts +12 -0
- package/runtime/analytics/interface.js +145 -0
- package/runtime/auth/AxiosCsrfTokenService.js +60 -0
- package/runtime/auth/AxiosJwtAuthService.js +363 -0
- package/runtime/auth/AxiosJwtTokenService.js +134 -0
- package/runtime/auth/LocalForageCache.js +76 -0
- package/runtime/auth/MockAuthService.js +278 -0
- package/runtime/auth/index.ts +19 -0
- package/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js +36 -0
- package/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js +37 -0
- package/runtime/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js +20 -0
- package/runtime/auth/interceptors/createRetryInterceptor.js +74 -0
- package/runtime/auth/interface.js +309 -0
- package/runtime/auth/utils.js +105 -0
- package/runtime/babel.config.js +3 -0
- package/runtime/config/index.ts +295 -0
- package/runtime/constants.ts +68 -0
- package/runtime/i18n/index.js +118 -0
- package/runtime/i18n/injectIntlWithShim.jsx +48 -0
- package/runtime/i18n/lib.ts +272 -0
- package/runtime/index.ts +134 -0
- package/runtime/initialize.js +352 -0
- package/runtime/jest.config.js +32 -0
- package/runtime/logging/MockLoggingService.js +31 -0
- package/runtime/logging/NewRelicLoggingService.js +184 -0
- package/runtime/logging/index.ts +9 -0
- package/runtime/logging/interface.js +109 -0
- package/runtime/logging/types.ts +4 -0
- package/runtime/react/AuthenticatedPageRoute.jsx +43 -0
- package/runtime/react/CombinedAppProvider.tsx +46 -0
- package/runtime/react/CurrentAppContext.tsx +25 -0
- package/runtime/react/CurrentAppProvider.tsx +46 -0
- package/runtime/react/Divider.tsx +5 -0
- package/runtime/react/ErrorBoundary.jsx +47 -0
- package/runtime/react/ErrorPage.jsx +72 -0
- package/runtime/react/LoginRedirect.jsx +16 -0
- package/runtime/react/PageWrap.jsx +24 -0
- package/runtime/react/SiteContext.tsx +32 -0
- package/runtime/react/SiteProvider.tsx +78 -0
- package/runtime/react/hooks.ts +106 -0
- package/runtime/react/index.ts +19 -0
- package/runtime/routing/index.ts +1 -0
- package/runtime/routing/utils.ts +34 -0
- package/runtime/scripts/GoogleAnalyticsLoader.ts +59 -0
- package/runtime/scripts/index.ts +1 -0
- package/runtime/setupTest.js +49 -0
- package/runtime/slots/Slot.tsx +32 -0
- package/runtime/slots/SlotContext.tsx +8 -0
- package/runtime/slots/hooks.ts +35 -0
- package/runtime/slots/index.ts +7 -0
- package/runtime/slots/layout/DefaultSlotLayout.tsx +9 -0
- package/runtime/slots/layout/hooks.ts +65 -0
- package/runtime/slots/layout/index.ts +5 -0
- package/runtime/slots/layout/types.ts +45 -0
- package/runtime/slots/layout/utils.ts +14 -0
- package/runtime/slots/types.ts +23 -0
- package/runtime/slots/utils.ts +59 -0
- package/runtime/slots/widget/WidgetContext.tsx +9 -0
- package/runtime/slots/widget/WidgetProvider.tsx +30 -0
- package/runtime/slots/widget/hooks.ts +105 -0
- package/runtime/slots/widget/iframe/IFrameContentWrapper.messages.tsx +16 -0
- package/runtime/slots/widget/iframe/IFrameContentWrapper.tsx +84 -0
- package/runtime/slots/widget/iframe/IFrameWidget.tsx +59 -0
- package/runtime/slots/widget/iframe/constants.ts +19 -0
- package/runtime/slots/widget/iframe/hooks.ts +179 -0
- package/runtime/slots/widget/iframe/index.ts +6 -0
- package/runtime/slots/widget/iframe/types.ts +7 -0
- package/runtime/slots/widget/index.ts +6 -0
- package/runtime/slots/widget/types.ts +134 -0
- package/runtime/slots/widget/utils.tsx +201 -0
- package/runtime/subscriptions.ts +60 -0
- package/runtime/testing/index.ts +9 -0
- package/runtime/testing/initializeMockApp.ts +81 -0
- package/runtime/testing/mockMessages.ts +23 -0
- package/runtime/utils.js +178 -0
- package/shell/DefaultLayout.tsx +18 -0
- package/shell/DefaultMain.tsx +7 -0
- package/shell/Logo.tsx +28 -0
- package/shell/Shell.messages.ts +61 -0
- package/shell/Shell.tsx +18 -0
- package/shell/app.scss +149 -0
- package/shell/app.ts +24 -0
- package/shell/babel.config.js +3 -0
- package/shell/dev/devFooter/app.tsx +43 -0
- package/shell/dev/devFooter/index.ts +1 -0
- package/shell/dev/devHeader/BarContext.tsx +13 -0
- package/shell/dev/devHeader/BarLink.tsx +16 -0
- package/shell/dev/devHeader/BarProvider.tsx +25 -0
- package/shell/dev/devHeader/CoursesLink.tsx +16 -0
- package/shell/dev/devHeader/FooContext.tsx +13 -0
- package/shell/dev/devHeader/FooLink.tsx +16 -0
- package/shell/dev/devHeader/FooProvider.tsx +25 -0
- package/shell/dev/devHeader/app.tsx +53 -0
- package/shell/dev/devHeader/index.ts +1 -0
- package/shell/dev/devHeader/providers.tsx +11 -0
- package/shell/dev/devHome/HomePage.tsx +28 -0
- package/shell/dev/devHome/app.ts +18 -0
- package/shell/dev/devHome/i18n/index.ts +27 -0
- package/shell/dev/devHome/index.ts +1 -0
- package/shell/dev/devHome/messages.ts +11 -0
- package/shell/dev/devUser/app.tsx +24 -0
- package/shell/dev/devUser/index.ts +1 -0
- package/shell/dev/index.ts +5 -0
- package/shell/dev/slotShowcase/HorizontalSlotLayout.tsx +11 -0
- package/shell/dev/slotShowcase/LayoutWithOptions.tsx +17 -0
- package/shell/dev/slotShowcase/SlotShowcasePage.tsx +66 -0
- package/shell/dev/slotShowcase/WidgetWithOptions.tsx +11 -0
- package/shell/dev/slotShowcase/app.tsx +373 -0
- package/shell/dev/slotShowcase/index.ts +1 -0
- package/shell/footer/CenterLinks.tsx +11 -0
- package/shell/footer/CopyrightNotice.tsx +36 -0
- package/shell/footer/Footer.tsx +34 -0
- package/shell/footer/LabeledLinkColumn.tsx +19 -0
- package/shell/footer/LanguageMenu.tsx +35 -0
- package/shell/footer/LanguageMenuItem.tsx +23 -0
- package/shell/footer/LeftLinks.tsx +11 -0
- package/shell/footer/LegalNotices.tsx +17 -0
- package/shell/footer/PoweredBy.tsx +17 -0
- package/shell/footer/RevealLinks.tsx +43 -0
- package/shell/footer/RightLinks.tsx +11 -0
- package/shell/footer/app.tsx +73 -0
- package/shell/footer/data/api.ts +48 -0
- package/shell/footer/index.ts +2 -0
- package/shell/header/AuthenticatedMenu.tsx +32 -0
- package/shell/header/Header.tsx +17 -0
- package/shell/header/anonymous-menu/AnonymousMenu.tsx +14 -0
- package/shell/header/anonymous-menu/LoginButton.tsx +14 -0
- package/shell/header/anonymous-menu/RegisterButton.tsx +15 -0
- package/shell/header/app.tsx +142 -0
- package/shell/header/desktop/DesktopLayout.tsx +22 -0
- package/shell/header/desktop/PrimaryNavLinks.tsx +10 -0
- package/shell/header/desktop/SecondaryNavLinks.tsx +10 -0
- package/shell/header/index.ts +2 -0
- package/shell/header/mobile/MobileLayout.tsx +47 -0
- package/shell/header/mobile/MobileNavLinks.tsx +10 -0
- package/shell/i18n/index.ts +25 -0
- package/shell/index.ts +7 -0
- package/shell/jest.config.js +30 -0
- package/shell/menus/LinkMenuItem.tsx +64 -0
- package/shell/menus/NavDropdownMenuSlot.tsx +29 -0
- package/shell/menus/ProfileLinkMenuItem.tsx +33 -0
- package/shell/menus/data/utils.ts +19 -0
- package/shell/public/index.html +10 -0
- package/shell/router/createRouter.ts +17 -0
- package/shell/router/getAppRoutes.ts +21 -0
- package/shell/setupTest.js +48 -0
- package/shell/site.config.dev.tsx +49 -0
- package/shell/site.tsx +41 -0
- package/test-site/app.d.ts +15 -0
- package/test-site/dist/176.436443549ebb858db483.js +2 -0
- package/test-site/dist/176.436443549ebb858db483.js.map +1 -0
- package/test-site/dist/362.536eff787d2380fe246c.js +2 -0
- package/test-site/dist/362.536eff787d2380fe246c.js.map +1 -0
- package/test-site/dist/653.486966b108d224551296.js +2 -0
- package/test-site/dist/653.486966b108d224551296.js.map +1 -0
- package/test-site/dist/74e025d3fe9a7b7f8503054e2563b353.jpg +0 -0
- package/test-site/dist/806.323cf6496ad0a7fe73a7.js +3 -0
- package/test-site/dist/806.323cf6496ad0a7fe73a7.js.LICENSE.txt +106 -0
- package/test-site/dist/806.323cf6496ad0a7fe73a7.js.map +1 -0
- package/test-site/dist/95ec738c0b7faac5b5c9126794446bbd.svg +4 -0
- package/test-site/dist/app.612058b36c74787759ac.css +61 -0
- package/test-site/dist/app.612058b36c74787759ac.css.map +1 -0
- package/test-site/dist/app.612058b36c74787759ac.js +2 -0
- package/test-site/dist/app.612058b36c74787759ac.js.map +1 -0
- package/test-site/dist/cb28cdb1468c915e27e5cec9af64f22f.svg +1 -0
- package/test-site/dist/index.html +1 -0
- package/test-site/dist/report.html +39 -0
- package/test-site/dist/runtime.c7aeaf7b967496cb076f.js +2 -0
- package/test-site/dist/runtime.c7aeaf7b967496cb076f.js.map +1 -0
- package/test-site/eslint.config.js +12 -0
- package/test-site/package-lock.json +19226 -0
- package/test-site/package.json +29 -0
- package/test-site/public/index.html +10 -0
- package/test-site/site.config.build.tsx +27 -0
- package/test-site/site.config.dev.tsx +27 -0
- package/test-site/src/authenticated-page/AuthenticatedPage.tsx +18 -0
- package/test-site/src/authenticated-page/i18n/index.ts +27 -0
- package/test-site/src/authenticated-page/index.tsx +28 -0
- package/test-site/src/example-page/ExamplePage.tsx +79 -0
- package/test-site/src/example-page/Image.tsx +11 -0
- package/test-site/src/example-page/ParagonPreview.jsx +66 -0
- package/test-site/src/example-page/apple.jpg +0 -0
- package/test-site/src/example-page/apple.svg +1 -0
- package/test-site/src/example-page/index.ts +16 -0
- package/test-site/src/i18n/README.md +3 -0
- package/test-site/src/i18n/messages/frontend-app-sample/ar.json +4 -0
- package/test-site/src/i18n/messages/frontend-app-sample/eo.json +1 -0
- package/test-site/src/i18n/messages/frontend-app-sample/es_419.json +4 -0
- package/test-site/src/i18n/messages/frontend-component-emptylangs/ar.json +1 -0
- package/test-site/src/i18n/messages/frontend-component-singlelang/ar.json +3 -0
- package/test-site/src/iframe-widget/IframeWidget.tsx +14 -0
- package/test-site/src/iframe-widget/index.ts +16 -0
- package/test-site/src/index.tsx +3 -0
- package/test-site/src/messages.js +11 -0
- package/test-site/src/site.scss +11 -0
- package/test-site/tsconfig.json +14 -0
- package/tools/babel/babel.config.js +27 -0
- package/tools/babel.config.js +3 -0
- package/tools/cli/README.md +29 -0
- package/tools/cli/commands/pack.ts +9 -0
- package/tools/cli/commands/release.ts +27 -0
- package/tools/cli/commands/serve.ts +43 -0
- package/tools/cli/intl-imports.ts +274 -0
- package/tools/cli/openedx.ts +101 -0
- package/tools/cli/transifex-utils.ts +75 -0
- package/tools/cli/utils/ensureConfigFilenameOption.ts +40 -0
- package/tools/cli/utils/formatter.ts +10 -0
- package/tools/cli/utils/getResolvedConfigPath.ts +23 -0
- package/tools/cli/utils/prettyPrintTitle.ts +15 -0
- package/tools/cli/utils/printUsage.ts +53 -0
- package/tools/config-helpers/createConfig.ts +8 -0
- package/tools/config-helpers/createLintConfig.ts +14 -0
- package/tools/config-helpers/getBaseConfig.ts +11 -0
- package/tools/defaultConfigPaths.ts +30 -0
- package/tools/dist/babel/babel.config.js +28 -0
- package/tools/dist/cli/commands/pack.js +14 -0
- package/tools/dist/cli/commands/release.js +28 -0
- package/tools/dist/cli/commands/serve.js +44 -0
- package/tools/dist/cli/intl-imports.js +233 -0
- package/tools/dist/cli/openedx.js +100 -0
- package/tools/dist/cli/transifex-utils.js +68 -0
- package/tools/dist/cli/utils/ensureConfigFilenameOption.js +42 -0
- package/tools/dist/cli/utils/formatter.js +10 -0
- package/tools/dist/cli/utils/getResolvedConfigPath.js +28 -0
- package/tools/dist/cli/utils/prettyPrintTitle.js +17 -0
- package/tools/dist/cli/utils/printUsage.js +48 -0
- package/tools/dist/config-helpers/createConfig.js +13 -0
- package/tools/dist/config-helpers/createLintConfig.js +16 -0
- package/tools/dist/config-helpers/getBaseConfig.js +12 -0
- package/tools/dist/defaultConfigPaths.js +35 -0
- package/tools/dist/eslint/base.eslint.config.js +113 -0
- package/tools/dist/eslint.config.js +11 -0
- package/tools/dist/index.js +12 -0
- package/tools/dist/jest/jest.config.js +30 -0
- package/tools/dist/jest.config.js +20 -0
- package/tools/dist/types.js +25 -0
- package/tools/dist/typescript/tsconfig.json +32 -0
- package/tools/dist/webpack/common-config/all/getCodeRules.js +52 -0
- package/tools/dist/webpack/common-config/all/getFileLoaderRules.js +26 -0
- package/tools/dist/webpack/common-config/all/getIgnoreWarnings.js +14 -0
- package/tools/dist/webpack/common-config/all/getImageMinimizer.js +25 -0
- package/tools/dist/webpack/common-config/all/getStylesheetRule.js +112 -0
- package/tools/dist/webpack/common-config/dev/getDevServer.js +38 -0
- package/tools/dist/webpack/common-config/index.js +18 -0
- package/tools/dist/webpack/common-config/site/getHtmlWebpackPlugin.js +16 -0
- package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js +91 -0
- package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/index.js +7 -0
- package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +3 -0
- package/tools/dist/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.js +108 -0
- package/tools/dist/webpack/plugins/paragon-webpack-plugin/index.js +7 -0
- package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.js +64 -0
- package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.js +53 -0
- package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/index.js +9 -0
- package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/paragonStylesheetUtils.js +114 -0
- package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/scriptUtils.js +146 -0
- package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.js +126 -0
- package/tools/dist/webpack/plugins/paragon-webpack-plugin/utils/tagUtils.js +57 -0
- package/tools/dist/webpack/types.js +2 -0
- package/tools/dist/webpack/utils/getLocalAliases.js +65 -0
- package/tools/dist/webpack/utils/getPublicPath.js +6 -0
- package/tools/dist/webpack/utils/getResolvedSiteConfigPath.js +32 -0
- package/tools/dist/webpack/utils/paragonUtils.js +138 -0
- package/tools/dist/webpack/webpack.config.build.js +80 -0
- package/tools/dist/webpack/webpack.config.dev.js +76 -0
- package/tools/dist/webpack/webpack.config.dev.shell.js +110 -0
- package/tools/eslint/base.eslint.config.js +124 -0
- package/tools/eslint/modules.d.ts +5 -0
- package/tools/eslint.config.js +15 -0
- package/tools/index.ts +3 -0
- package/tools/jest/jest.config.js +30 -0
- package/tools/jest.config.js +19 -0
- package/tools/tsconfig.json +24 -0
- package/tools/types.ts +21 -0
- package/tools/typescript/tsconfig.json +32 -0
- package/tools/webpack/common-config/README.md +15 -0
- package/tools/webpack/common-config/all/getCodeRules.ts +51 -0
- package/tools/webpack/common-config/all/getFileLoaderRules.ts +23 -0
- package/tools/webpack/common-config/all/getIgnoreWarnings.ts +13 -0
- package/tools/webpack/common-config/all/getImageMinimizer.ts +26 -0
- package/tools/webpack/common-config/all/getStylesheetRule.ts +111 -0
- package/tools/webpack/common-config/dev/getDevServer.ts +35 -0
- package/tools/webpack/common-config/index.ts +6 -0
- package/tools/webpack/common-config/site/getHtmlWebpackPlugin.ts +11 -0
- package/tools/webpack/modules.d.ts +6 -0
- package/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts +102 -0
- package/tools/webpack/plugins/html-webpack-new-relic-plugin/LICENSE +21 -0
- package/tools/webpack/plugins/html-webpack-new-relic-plugin/README.md +7 -0
- package/tools/webpack/plugins/html-webpack-new-relic-plugin/index.js +3 -0
- package/tools/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +1 -0
- package/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts +134 -0
- package/tools/webpack/plugins/paragon-webpack-plugin/index.ts +3 -0
- package/tools/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.ts +71 -0
- package/tools/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.ts +72 -0
- package/tools/webpack/plugins/paragon-webpack-plugin/utils/index.ts +6 -0
- package/tools/webpack/plugins/paragon-webpack-plugin/utils/paragonStylesheetUtils.ts +131 -0
- package/tools/webpack/plugins/paragon-webpack-plugin/utils/scriptUtils.ts +144 -0
- package/tools/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.ts +106 -0
- package/tools/webpack/plugins/paragon-webpack-plugin/utils/tagUtils.ts +54 -0
- package/tools/webpack/types.ts +69 -0
- package/tools/webpack/utils/getLocalAliases.ts +65 -0
- package/tools/webpack/utils/getPublicPath.ts +3 -0
- package/tools/webpack/utils/getResolvedSiteConfigPath.ts +28 -0
- package/tools/webpack/utils/paragonUtils.ts +152 -0
- package/tools/webpack/webpack.config.build.ts +93 -0
- package/tools/webpack/webpack.config.dev.shell.ts +122 -0
- package/tools/webpack/webpack.config.dev.ts +90 -0
- package/tsconfig.json +23 -0
- 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;
|